shutro-erp 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -67
- package/dist/account_portal/.kosh/bindings.d.ts +22 -0
- package/dist/account_portal/.kosh/bindings.js +15 -0
- package/dist/account_portal/.kosh/schema.d.ts +1380 -0
- package/dist/account_portal/index.d.ts +3 -0
- package/dist/account_portal/index.js +73 -0
- package/dist/account_portal/module.d.ts +5983 -0
- package/dist/account_portal/module.js +18 -0
- package/dist/accounting/.kosh/bindings.js +1 -1
- package/dist/accounting/.kosh/schema.d.ts +172 -9
- package/dist/accounting/chart.d.ts +40 -8
- package/dist/accounting/chart.js +124 -30
- package/dist/accounting/closing.d.ts +6 -1
- package/dist/accounting/closing.js +5 -1
- package/dist/accounting/demo.js +6 -5
- package/dist/accounting/index.d.ts +3 -3
- package/dist/accounting/index.js +200 -23
- package/dist/accounting/module.d.ts +3326 -1086
- package/dist/accounting/module.js +408 -66
- package/dist/accounting/payments.d.ts +25 -0
- package/dist/accounting/payments.js +96 -4
- package/dist/accounting/web/RegisterPayment.d.ts +3 -2
- package/dist/accounting/web/RegisterPayment.js +39 -6
- package/dist/accounting/web/SettingsPage.js +5 -1
- package/dist/accounting/web/messages.js +10 -0
- package/dist/assistant/routes.js +1 -1
- package/dist/automation/engine.js +1 -1
- package/dist/automation/web/messages.js +2 -2
- package/dist/cli/apps.d.ts +1 -1
- package/dist/cli/apps.js +14 -14
- package/dist/cli/bin.js +3 -0
- package/dist/cli/index.js +11 -11
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +224 -78
- package/dist/cli/launch.d.ts +16 -0
- package/dist/cli/launch.js +138 -0
- package/dist/cli/project.d.ts +7 -7
- package/dist/cli/project.js +25 -25
- package/dist/cli/prompt.d.ts +35 -0
- package/dist/cli/prompt.js +48 -2
- package/dist/cli/templates.d.ts +14 -6
- package/dist/cli/templates.js +61 -34
- package/dist/cli/tui.d.ts +7 -0
- package/dist/cli/tui.js +254 -0
- package/dist/cli/ui.d.ts +21 -8
- package/dist/cli/ui.js +65 -19
- package/dist/contacts/.kosh/bindings.js +1 -1
- package/dist/contacts/.kosh/schema.d.ts +33 -1
- package/dist/contacts/index.js +24 -1
- package/dist/contacts/module.d.ts +42 -0
- package/dist/contacts/module.js +3 -1
- package/dist/import/convert.d.ts +55 -0
- package/dist/import/convert.js +224 -0
- package/dist/import/csv.d.ts +28 -0
- package/dist/import/csv.js +115 -0
- package/dist/import/index.d.ts +33 -0
- package/dist/import/index.js +60 -0
- package/dist/import/mapping.d.ts +15 -0
- package/dist/import/mapping.js +33 -0
- package/dist/import/match.d.ts +24 -0
- package/dist/import/match.js +60 -0
- package/dist/import/models.d.ts +2 -0
- package/dist/import/models.js +102 -0
- package/dist/import/routes.d.ts +13 -0
- package/dist/import/routes.js +392 -0
- package/dist/import/run.d.ts +131 -0
- package/dist/import/run.js +568 -0
- package/dist/import/service.d.ts +153 -0
- package/dist/import/service.js +367 -0
- package/dist/import/web/ImportButton.d.ts +7 -0
- package/dist/import/web/ImportButton.js +31 -0
- package/dist/import/web/ImportWizard.d.ts +75 -0
- package/dist/import/web/ImportWizard.js +217 -0
- package/dist/import/web/index.d.ts +13 -0
- package/dist/import/web/index.js +18 -0
- package/dist/import/web/messages.d.ts +2 -0
- package/dist/import/web/messages.js +139 -0
- package/dist/import/worker.d.ts +3 -0
- package/dist/import/worker.js +52 -0
- package/dist/import/xlsx.d.ts +20 -0
- package/dist/import/xlsx.js +192 -0
- package/dist/l10n_bd/.kosh/bindings.d.ts +22 -0
- package/dist/l10n_bd/.kosh/bindings.js +15 -0
- package/dist/l10n_bd/.kosh/schema.d.ts +1311 -0
- package/dist/l10n_bd/documents.d.ts +8 -0
- package/dist/l10n_bd/documents.js +183 -0
- package/dist/l10n_bd/index.d.ts +8 -0
- package/dist/l10n_bd/index.js +156 -0
- package/dist/l10n_bd/module.d.ts +5705 -0
- package/dist/l10n_bd/module.js +163 -0
- package/dist/l10n_bd/mushak.d.ts +67 -0
- package/dist/l10n_bd/mushak.js +139 -0
- package/dist/l10n_bd/routes.d.ts +3 -0
- package/dist/l10n_bd/routes.js +205 -0
- package/dist/l10n_bd/web/MushakPage.d.ts +7 -0
- package/dist/l10n_bd/web/MushakPage.js +53 -0
- package/dist/l10n_bd/web/index.d.ts +13 -0
- package/dist/l10n_bd/web/index.js +18 -0
- package/dist/l10n_bd/web/messages.d.ts +2 -0
- package/dist/l10n_bd/web/messages.js +101 -0
- package/dist/l10n_in/.kosh/bindings.d.ts +22 -0
- package/dist/l10n_in/.kosh/bindings.js +15 -0
- package/dist/l10n_in/.kosh/schema.d.ts +1373 -0
- package/dist/l10n_in/documents.d.ts +8 -0
- package/dist/l10n_in/documents.js +114 -0
- package/dist/l10n_in/einvoice.d.ts +253 -0
- package/dist/l10n_in/einvoice.js +485 -0
- package/dist/l10n_in/gstr.d.ts +109 -0
- package/dist/l10n_in/gstr.js +430 -0
- package/dist/l10n_in/index.d.ts +20 -0
- package/dist/l10n_in/index.js +232 -0
- package/dist/l10n_in/module.d.ts +7823 -0
- package/dist/l10n_in/module.js +427 -0
- package/dist/l10n_in/routes-einvoice.d.ts +15 -0
- package/dist/l10n_in/routes-einvoice.js +124 -0
- package/dist/l10n_in/routes.d.ts +17 -0
- package/dist/l10n_in/routes.js +282 -0
- package/dist/l10n_in/web/EInvoicePanel.d.ts +8 -0
- package/dist/l10n_in/web/EInvoicePanel.js +63 -0
- package/dist/l10n_in/web/GstPage.d.ts +7 -0
- package/dist/l10n_in/web/GstPage.js +57 -0
- package/dist/l10n_in/web/GstSettings.d.ts +10 -0
- package/dist/l10n_in/web/GstSettings.js +36 -0
- package/dist/l10n_in/web/index.d.ts +15 -0
- package/dist/l10n_in/web/index.js +22 -0
- package/dist/l10n_in/web/messages.d.ts +2 -0
- package/dist/l10n_in/web/messages.js +166 -0
- package/dist/mail/index.js +2 -2
- package/dist/modules-sdk/demo.d.ts +2 -0
- package/dist/modules-sdk/demo.js +7 -3
- package/dist/modules-sdk/index.d.ts +2 -2
- package/dist/modules-sdk/index.js +1 -1
- package/dist/modules-sdk/loader.js +2 -2
- package/dist/modules-sdk/manifest.d.ts +132 -0
- package/dist/modules-sdk/manifest.js +22 -0
- package/dist/notify/inbox.js +21 -0
- package/dist/notify/messages.js +7 -3
- package/dist/notify/models.d.ts +1 -1
- package/dist/notify/models.js +2 -0
- package/dist/notify/routes.js +1 -1
- package/dist/notify/web/messages.js +5 -1
- package/dist/portal/.kosh/bindings.d.ts +22 -0
- package/dist/portal/.kosh/bindings.js +15 -0
- package/dist/portal/.kosh/schema.d.ts +376 -0
- package/dist/portal/announce.d.ts +16 -0
- package/dist/portal/announce.js +117 -0
- package/dist/portal/documents.d.ts +17 -0
- package/dist/portal/documents.js +61 -0
- package/dist/portal/index.d.ts +20 -0
- package/dist/portal/index.js +65 -0
- package/dist/portal/module.d.ts +1405 -0
- package/dist/portal/module.js +84 -0
- package/dist/portal/routes-documents.d.ts +2 -0
- package/dist/portal/routes-documents.js +391 -0
- package/dist/portal/routes.d.ts +13 -0
- package/dist/portal/routes.js +313 -0
- package/dist/portal/rules.d.ts +11 -0
- package/dist/portal/rules.js +25 -0
- package/dist/portal/web/PortalAccess.d.ts +8 -0
- package/dist/portal/web/PortalAccess.js +66 -0
- package/dist/portal/web/index.d.ts +12 -0
- package/dist/portal/web/index.js +17 -0
- package/dist/portal/web/messages.d.ts +2 -0
- package/dist/portal/web/messages.js +33 -0
- package/dist/product/.kosh/bindings.js +1 -1
- package/dist/product/.kosh/schema.d.ts +42 -3
- package/dist/product/demo.js +6 -5
- package/dist/product/index.d.ts +1 -0
- package/dist/product/index.js +17 -4
- package/dist/product/module.d.ts +346 -14
- package/dist/product/module.js +48 -18
- package/dist/product/taxes.d.ts +59 -0
- package/dist/product/taxes.js +61 -0
- package/dist/project/.kosh/bindings.js +1 -1
- package/dist/project/.kosh/schema.d.ts +33 -1
- package/dist/project/module.d.ts +20 -0
- package/dist/project_portal/.kosh/bindings.d.ts +22 -0
- package/dist/project_portal/.kosh/bindings.js +15 -0
- package/dist/project_portal/.kosh/schema.d.ts +701 -0
- package/dist/project_portal/index.d.ts +9 -0
- package/dist/project_portal/index.js +42 -0
- package/dist/project_portal/module.d.ts +2142 -0
- package/dist/project_portal/module.js +22 -0
- package/dist/purchase/.kosh/bindings.js +1 -1
- package/dist/purchase/.kosh/schema.d.ts +45 -4
- package/dist/purchase/demo.js +3 -3
- package/dist/purchase/index.js +1 -1
- package/dist/purchase/module.d.ts +232 -8
- package/dist/purchase/module.js +51 -9
- package/dist/purchase_account/.kosh/bindings.js +1 -1
- package/dist/purchase_account/.kosh/schema.d.ts +174 -10
- package/dist/purchase_account/module.d.ts +2008 -641
- package/dist/purchase_account/module.js +2 -2
- package/dist/purchase_portal/.kosh/bindings.d.ts +22 -0
- package/dist/purchase_portal/.kosh/bindings.js +15 -0
- package/dist/purchase_portal/.kosh/schema.d.ts +852 -0
- package/dist/purchase_portal/index.d.ts +9 -0
- package/dist/purchase_portal/index.js +53 -0
- package/dist/purchase_portal/module.d.ts +2758 -0
- package/dist/purchase_portal/module.js +18 -0
- package/dist/reporting/documents.js +20 -3
- package/dist/reporting/index.d.ts +1 -0
- package/dist/reporting/index.js +1 -0
- package/dist/reporting/routes-documents.js +9 -2
- package/dist/reporting/words.d.ts +11 -0
- package/dist/reporting/words.js +229 -0
- package/dist/sale_account/.kosh/bindings.js +1 -1
- package/dist/sale_account/.kosh/schema.d.ts +174 -10
- package/dist/sale_account/module.d.ts +2008 -641
- package/dist/sale_account/module.js +3 -3
- package/dist/sale_portal/.kosh/bindings.d.ts +22 -0
- package/dist/sale_portal/.kosh/bindings.js +15 -0
- package/dist/sale_portal/.kosh/schema.d.ts +766 -0
- package/dist/sale_portal/index.d.ts +9 -0
- package/dist/sale_portal/index.js +71 -0
- package/dist/sale_portal/module.d.ts +2718 -0
- package/dist/sale_portal/module.js +19 -0
- package/dist/sale_project/.kosh/bindings.js +1 -1
- package/dist/sale_project/.kosh/schema.d.ts +45 -4
- package/dist/sale_project/module.d.ts +390 -10
- package/dist/sales/.kosh/bindings.js +1 -1
- package/dist/sales/.kosh/schema.d.ts +45 -4
- package/dist/sales/demo.js +3 -3
- package/dist/sales/index.js +67 -1
- package/dist/sales/module.d.ts +232 -8
- package/dist/sales/module.js +51 -12
- package/dist/server/api/client.js +1 -1
- package/dist/server/api/openapi.js +17 -1
- package/dist/server/apps.js +5 -5
- package/dist/server/auth/api-keys.d.ts +13 -0
- package/dist/server/auth/api-keys.js +65 -0
- package/dist/server/auth/base.js +26 -0
- package/dist/server/auth/crypto.js +1 -1
- package/dist/server/auth/scopes.d.ts +12 -0
- package/dist/server/auth/scopes.js +51 -0
- package/dist/server/auth/service.d.ts +59 -1
- package/dist/server/auth/service.js +236 -6
- package/dist/server/demo.d.ts +1 -1
- package/dist/server/demo.js +1 -1
- package/dist/server/env-names.d.ts +2 -0
- package/dist/server/env-names.js +16 -0
- package/dist/server/host.js +5 -1
- package/dist/server/identity.d.ts +7 -0
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.js +2 -1
- package/dist/server/registry.js +1 -1
- package/dist/server/server.d.ts +5 -0
- package/dist/server/server.js +71 -6
- package/dist/settings/routes.js +1 -1
- package/dist/settings/web/ApiKeysPage.d.ts +8 -0
- package/dist/settings/web/ApiKeysPage.js +70 -0
- package/dist/settings/web/index.d.ts +1 -0
- package/dist/settings/web/index.js +4 -0
- package/dist/settings/web/messages.js +62 -0
- package/dist/storage/routes.js +1 -1
- package/dist/studio/build.js +1 -1
- package/dist/studio/generate.js +4 -4
- package/dist/studio/module.js +5 -5
- package/dist/studio/web/messages.js +2 -2
- package/dist/ui/api.d.ts +2 -0
- package/dist/ui/app.js +27 -4
- package/dist/ui/context.d.ts +3 -1
- package/dist/ui/context.js +2 -2
- package/dist/ui/i18n/messages.js +2 -2
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -1
- package/dist/ui/lib/format.d.ts +2 -0
- package/dist/ui/lib/format.js +3 -1
- package/dist/ui/pwa/worker.js +2 -2
- package/dist/ui/registry.d.ts +15 -0
- package/dist/ui/registry.js +20 -0
- package/dist/ui/views/FormView.js +19 -6
- package/package.json +52 -4
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/** Messages of the India screens (namespace `l10n_in`), in English and Bangla. */
|
|
2
|
+
export const messages = {
|
|
3
|
+
en: {
|
|
4
|
+
einvoice: {
|
|
5
|
+
title: 'E-invoice (IRP)',
|
|
6
|
+
noProvider: 'E-invoicing is not set up for this installation (no IRP provider).',
|
|
7
|
+
status: 'Status',
|
|
8
|
+
states: {
|
|
9
|
+
none: 'Not registered',
|
|
10
|
+
registered: 'Registered',
|
|
11
|
+
failed: 'Not registered: see why below',
|
|
12
|
+
cancelled: 'Cancelled at the IRP',
|
|
13
|
+
},
|
|
14
|
+
ack: 'Acknowledgement',
|
|
15
|
+
register: 'Register with the IRP',
|
|
16
|
+
reason: 'Reason',
|
|
17
|
+
reasons: {
|
|
18
|
+
'1': 'Duplicate',
|
|
19
|
+
'2': 'Data entry mistake',
|
|
20
|
+
'3': 'Order cancelled',
|
|
21
|
+
'4': 'Other',
|
|
22
|
+
},
|
|
23
|
+
cancel: 'Cancel the IRN',
|
|
24
|
+
ewayBill: 'E-way bill',
|
|
25
|
+
ewbNumber: 'No. {{number}} · valid until {{until}} · vehicle {{vehicle}}',
|
|
26
|
+
ewbCancel: 'Cancel the e-way bill',
|
|
27
|
+
ewbCancelled: 'The e-way bill was cancelled.',
|
|
28
|
+
ewbGenerate: 'Generate the e-way bill',
|
|
29
|
+
mode: 'Mode',
|
|
30
|
+
modes: { road: 'Road', rail: 'Rail', air: 'Air', ship: 'Ship' },
|
|
31
|
+
distance: 'Distance (km)',
|
|
32
|
+
vehicle: 'Vehicle number',
|
|
33
|
+
transporter: 'Transporter ID (optional)',
|
|
34
|
+
},
|
|
35
|
+
settings: {
|
|
36
|
+
title: 'Company GST settings',
|
|
37
|
+
gstin: 'GSTIN',
|
|
38
|
+
pan: 'PAN',
|
|
39
|
+
street: 'Address',
|
|
40
|
+
city: 'City',
|
|
41
|
+
zip: 'PIN code',
|
|
42
|
+
einvoice: 'Register customer invoices with the IRP when posted (e-invoicing)',
|
|
43
|
+
save: 'Save',
|
|
44
|
+
saved: 'Saved.',
|
|
45
|
+
provider: 'IRP provider: {{provider}}',
|
|
46
|
+
noProvider: 'No IRP provider is set up (SHUTRO_ERP_GST_PROVIDER): e-invoicing is unavailable.',
|
|
47
|
+
},
|
|
48
|
+
gst: {
|
|
49
|
+
title: 'GST returns',
|
|
50
|
+
form: 'Return',
|
|
51
|
+
forms: { '1': 'GSTR-1', '3b': 'GSTR-3B' },
|
|
52
|
+
month: 'Month',
|
|
53
|
+
xlsx: 'Download XLSX',
|
|
54
|
+
pdf: 'Download PDF',
|
|
55
|
+
portal: 'JSON for the GST portal',
|
|
56
|
+
hint: 'GSTIN {{gstin}} · from the posted invoices, notes and bills of the month, in rupees. File on the GST portal.',
|
|
57
|
+
section: 'Section',
|
|
58
|
+
table: 'Table',
|
|
59
|
+
unclassified_one: '{{count}} line has a GST tax without a GST treatment: it is in no section.',
|
|
60
|
+
unclassified_other: '{{count}} lines have a GST tax without a GST treatment: they are in no section.',
|
|
61
|
+
heads: { txval: 'Taxable value', iamt: 'IGST', camt: 'CGST', samt: 'SGST', csamt: 'Cess' },
|
|
62
|
+
sections: {
|
|
63
|
+
b2b: '4A B2B invoices',
|
|
64
|
+
b2cl: '5 B2C large invoices',
|
|
65
|
+
exp: '6A Exports',
|
|
66
|
+
b2cs: '7 B2C others',
|
|
67
|
+
cdnr: '9B Credit / debit notes (registered)',
|
|
68
|
+
cdnur: '9B Credit / debit notes (unregistered)',
|
|
69
|
+
},
|
|
70
|
+
r3b: {
|
|
71
|
+
outwardTaxable: '3.1 (a) Outward taxable supplies',
|
|
72
|
+
outwardZeroRated: '3.1 (b) Outward zero-rated supplies',
|
|
73
|
+
outwardNilExempt: '3.1 (c) Nil-rated and exempt outward supplies',
|
|
74
|
+
inwardReverseCharge: '3.1 (d) Inward supplies liable to reverse charge',
|
|
75
|
+
outwardNonGst: '3.1 (e) Non-GST outward supplies',
|
|
76
|
+
itcReverseCharge: '4 (A)(3) ITC: inward supplies under reverse charge',
|
|
77
|
+
itcOther: '4 (A)(5) ITC: all other',
|
|
78
|
+
inwardExemptInter: '5 Exempt, nil and non-GST inward supplies: from another state',
|
|
79
|
+
inwardExemptIntra: '5 Exempt, nil and non-GST inward supplies: within the state',
|
|
80
|
+
payable: '6.1 Payment of tax',
|
|
81
|
+
tax: 'Tax payable',
|
|
82
|
+
credit: 'Input tax credit',
|
|
83
|
+
net: 'To pay (negative: carried forward)',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
bn: {
|
|
88
|
+
einvoice: {
|
|
89
|
+
title: 'ই-চালান (IRP)',
|
|
90
|
+
noProvider: 'এই ইনস্টলেশনে ই-চালান চালু নেই (কোনো IRP প্রদানকারী নেই)।',
|
|
91
|
+
status: 'অবস্থা',
|
|
92
|
+
states: {
|
|
93
|
+
none: 'নিবন্ধিত নয়',
|
|
94
|
+
registered: 'নিবন্ধিত',
|
|
95
|
+
failed: 'নিবন্ধিত হয়নি: কারণ নিচে দেখুন',
|
|
96
|
+
cancelled: 'IRP-তে বাতিল',
|
|
97
|
+
},
|
|
98
|
+
ack: 'প্রাপ্তিস্বীকার',
|
|
99
|
+
register: 'IRP-তে নিবন্ধন করুন',
|
|
100
|
+
reason: 'কারণ',
|
|
101
|
+
reasons: { '1': 'দ্বৈত', '2': 'তথ্য প্রবেশে ভুল', '3': 'অর্ডার বাতিল', '4': 'অন্যান্য' },
|
|
102
|
+
cancel: 'IRN বাতিল করুন',
|
|
103
|
+
ewayBill: 'ই-ওয়ে বিল',
|
|
104
|
+
ewbNumber: 'নং {{number}} · বৈধ {{until}} পর্যন্ত · যান {{vehicle}}',
|
|
105
|
+
ewbCancel: 'ই-ওয়ে বিল বাতিল করুন',
|
|
106
|
+
ewbCancelled: 'ই-ওয়ে বিল বাতিল হয়েছে।',
|
|
107
|
+
ewbGenerate: 'ই-ওয়ে বিল তৈরি করুন',
|
|
108
|
+
mode: 'মাধ্যম',
|
|
109
|
+
modes: { road: 'সড়ক', rail: 'রেল', air: 'আকাশ', ship: 'জাহাজ' },
|
|
110
|
+
distance: 'দূরত্ব (কিমি)',
|
|
111
|
+
vehicle: 'যানের নম্বর',
|
|
112
|
+
transporter: 'পরিবহনকারীর আইডি (ঐচ্ছিক)',
|
|
113
|
+
},
|
|
114
|
+
settings: {
|
|
115
|
+
title: 'প্রতিষ্ঠানের জিএসটি সেটিংস',
|
|
116
|
+
gstin: 'GSTIN',
|
|
117
|
+
pan: 'PAN',
|
|
118
|
+
street: 'ঠিকানা',
|
|
119
|
+
city: 'শহর',
|
|
120
|
+
zip: 'পিন কোড',
|
|
121
|
+
einvoice: 'পোস্ট করার সময় ক্রেতার চালান IRP-তে নিবন্ধন করুন (ই-চালান)',
|
|
122
|
+
save: 'সংরক্ষণ',
|
|
123
|
+
saved: 'সংরক্ষিত।',
|
|
124
|
+
provider: 'IRP প্রদানকারী: {{provider}}',
|
|
125
|
+
noProvider: 'কোনো IRP প্রদানকারী নেই (SHUTRO_ERP_GST_PROVIDER): ই-চালান অনুপলব্ধ।',
|
|
126
|
+
},
|
|
127
|
+
gst: {
|
|
128
|
+
title: 'জিএসটি রিটার্ন',
|
|
129
|
+
form: 'রিটার্ন',
|
|
130
|
+
forms: { '1': 'GSTR-1', '3b': 'GSTR-3B' },
|
|
131
|
+
month: 'মাস',
|
|
132
|
+
xlsx: 'XLSX নামান',
|
|
133
|
+
pdf: 'PDF নামান',
|
|
134
|
+
portal: 'জিএসটি পোর্টালের জন্য JSON',
|
|
135
|
+
hint: 'GSTIN {{gstin}} · মাসের পোস্ট করা চালান, নোট ও বিল থেকে, রুপিতে। জিএসটি পোর্টালে দাখিল করুন।',
|
|
136
|
+
section: 'অংশ',
|
|
137
|
+
table: 'সারণি',
|
|
138
|
+
unclassified_one: '{{count}}টি লাইনের জিএসটি করের কোনো জিএসটি ধরন নেই: সেটি কোনো অংশে নেই।',
|
|
139
|
+
unclassified_other: '{{count}}টি লাইনের জিএসটি করের কোনো জিএসটি ধরন নেই: সেগুলো কোনো অংশে নেই।',
|
|
140
|
+
heads: { txval: 'করযোগ্য মূল্য', iamt: 'IGST', camt: 'CGST', samt: 'SGST', csamt: 'সেস' },
|
|
141
|
+
sections: {
|
|
142
|
+
b2b: '4A B2B চালান',
|
|
143
|
+
b2cl: '5 B2C বড় চালান',
|
|
144
|
+
exp: '6A রপ্তানি',
|
|
145
|
+
b2cs: '7 অন্যান্য B2C',
|
|
146
|
+
cdnr: '9B ক্রেডিট / ডেবিট নোট (নিবন্ধিত)',
|
|
147
|
+
cdnur: '9B ক্রেডিট / ডেবিট নোট (অনিবন্ধিত)',
|
|
148
|
+
},
|
|
149
|
+
r3b: {
|
|
150
|
+
outwardTaxable: '3.1 (a) করযোগ্য বহির্মুখী সরবরাহ',
|
|
151
|
+
outwardZeroRated: '3.1 (b) শূন্য হারের বহির্মুখী সরবরাহ',
|
|
152
|
+
outwardNilExempt: '3.1 (c) শূন্য ও অব্যাহতিপ্রাপ্ত বহির্মুখী সরবরাহ',
|
|
153
|
+
inwardReverseCharge: '3.1 (d) রিভার্স চার্জযোগ্য আন্তর্মুখী সরবরাহ',
|
|
154
|
+
outwardNonGst: '3.1 (e) জিএসটি-বহির্ভূত বহির্মুখী সরবরাহ',
|
|
155
|
+
itcReverseCharge: '4 (A)(3) ITC: রিভার্স চার্জের আন্তর্মুখী সরবরাহ',
|
|
156
|
+
itcOther: '4 (A)(5) ITC: অন্যান্য সব',
|
|
157
|
+
inwardExemptInter: '5 অব্যাহতিপ্রাপ্ত, শূন্য ও জিএসটি-বহির্ভূত আন্তর্মুখী সরবরাহ: অন্য রাজ্য থেকে',
|
|
158
|
+
inwardExemptIntra: '5 অব্যাহতিপ্রাপ্ত, শূন্য ও জিএসটি-বহির্ভূত আন্তর্মুখী সরবরাহ: রাজ্যের ভেতরে',
|
|
159
|
+
payable: '6.1 কর পরিশোধ',
|
|
160
|
+
tax: 'প্রদেয় কর',
|
|
161
|
+
credit: 'উপকরণ কর ক্রেডিট',
|
|
162
|
+
net: 'পরিশোধ করতে হবে (ঋণাত্মক: পরবর্তী মাসে জের)',
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
};
|
package/dist/mail/index.js
CHANGED
|
@@ -40,14 +40,14 @@ export function mailerFromEnv(env = process.env) {
|
|
|
40
40
|
const url = env['SMTP_URL'];
|
|
41
41
|
if (url === undefined || url === '')
|
|
42
42
|
return undefined;
|
|
43
|
-
return createSmtpMailer({ url, from: env['MAIL_FROM'] ?? '
|
|
43
|
+
return createSmtpMailer({ url, from: env['MAIL_FROM'] ?? 'Shutro ERP <shutro-erp@localhost>' });
|
|
44
44
|
}
|
|
45
45
|
/** A mailer that keeps what it is given (tests, dry runs). */
|
|
46
46
|
export function createMemoryMailer() {
|
|
47
47
|
const sent = [];
|
|
48
48
|
return {
|
|
49
49
|
name: 'memory',
|
|
50
|
-
from: '
|
|
50
|
+
from: 'Shutro ERP <shutro-erp@localhost>',
|
|
51
51
|
sent,
|
|
52
52
|
async send(mail) {
|
|
53
53
|
sent.push(mail);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
/** Helpers for module demo seeders (RFC 0008 §5.8). */
|
|
2
|
+
/** The id of the record of `model` named `name`, or null (data another module may ship: a country's taxes). */
|
|
3
|
+
export declare function maybeIdByName(env: unknown, model: string, name: string): Promise<number | null>;
|
|
2
4
|
/** The id of the record of `model` named `name` (the module's own data, or an earlier seeder's). */
|
|
3
5
|
export declare function idByName(env: unknown, model: string, name: string): Promise<number>;
|
package/dist/modules-sdk/demo.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/** Helpers for module demo seeders (RFC 0008 §5.8). */
|
|
2
|
+
/** The id of the record of `model` named `name`, or null (data another module may ship: a country's taxes). */
|
|
3
|
+
export async function maybeIdByName(env, model, name) {
|
|
4
|
+
const found = await env.model(model).search({ where: { name }, limit: 1 });
|
|
5
|
+
return found.ids[0] ?? null;
|
|
6
|
+
}
|
|
2
7
|
/** The id of the record of `model` named `name` (the module's own data, or an earlier seeder's). */
|
|
3
8
|
export async function idByName(env, model, name) {
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
if (id === undefined)
|
|
9
|
+
const id = await maybeIdByName(env, model, name);
|
|
10
|
+
if (id === null)
|
|
7
11
|
throw new Error(`Demo data: no ${model} named "${name}".`);
|
|
8
12
|
return id;
|
|
9
13
|
}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* `shutro-erp/modules-sdk`: module manifests (`defineModule`) and the module loader (RFC 0001).
|
|
4
4
|
*/
|
|
5
5
|
export { type AppChange, type AppPlan, AppPlanError, type AppReason, type AppState, catalogueOf, type InstalledApp, outdatedApps, planApps, servedModules, } from './apps.js';
|
|
6
|
-
export { idByName } from './demo.js';
|
|
6
|
+
export { idByName, maybeIdByName } from './demo.js';
|
|
7
7
|
export { ModuleDefinitionError, ModuleLoadError } from './errors.js';
|
|
8
8
|
export { type LoadedModules, type LoadOptions, loadModules } from './loader.js';
|
|
9
|
-
export { type AccessLevel, type ApprovalLevelSpec, type ApprovalSpec, type AppSpec, type AutomationActionSpec, type AutomationRuleSpec, type DemoContext, type DemoUser, type DocumentSpec, defineModule, type InboundAliasSpec, type KoshModule, type MenuSpec, type ModuleHooks, type ModuleInput, type ShutroModuleShape, } from './manifest.js';
|
|
9
|
+
export { type AccessLevel, type ApprovalLevelSpec, type ApprovalSpec, type AppSpec, type AutomationActionSpec, type AutomationRuleSpec, type DemoContext, type DemoUser, type DocumentSpec, defineModule, type ImportTemplateSpec, type InboundAliasSpec, type KoshModule, type LocalizationSpec, type MenuSpec, type ModuleHooks, type ModuleInput, type PortalActionSpec, type PortalDocumentSpec, type ShutroModuleShape, } from './manifest.js';
|
|
10
10
|
export { compareVersions, satisfies } from './semver.js';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* `shutro-erp/modules-sdk`: module manifests (`defineModule`) and the module loader (RFC 0001).
|
|
4
4
|
*/
|
|
5
5
|
export { AppPlanError, catalogueOf, outdatedApps, planApps, servedModules, } from './apps.js';
|
|
6
|
-
export { idByName } from './demo.js';
|
|
6
|
+
export { idByName, maybeIdByName } from './demo.js';
|
|
7
7
|
export { ModuleDefinitionError, ModuleLoadError } from './errors.js';
|
|
8
8
|
export { loadModules } from './loader.js';
|
|
9
9
|
export { defineModule, } from './manifest.js';
|
|
@@ -63,11 +63,11 @@ export function loadModules(roots, options) {
|
|
|
63
63
|
const actions = new Map();
|
|
64
64
|
for (const m of modules) {
|
|
65
65
|
if (!satisfies(options.koshVersion, m.kosh))
|
|
66
|
-
fail(`Module '${m.name}' needs
|
|
66
|
+
fail(`Module '${m.name}' needs Shutro ERP ${m.kosh}; this is Shutro ERP ${options.koshVersion}.`, 'Upgrade the module or the framework.');
|
|
67
67
|
const deps = closure(m);
|
|
68
68
|
for (const sd of m.shutro.depends)
|
|
69
69
|
if (!deps.has(sd.name))
|
|
70
|
-
fail(`Module '${m.name}' uses the Shutro module '${sd.name}' but no
|
|
70
|
+
fail(`Module '${m.name}' uses the Shutro module '${sd.name}' but no Shutro ERP module it depends on provides it.`, `Add the Shutro ERP module '${sd.name}' to depends.`);
|
|
71
71
|
// Groups an access level may grant: this module's and its dependencies'.
|
|
72
72
|
const groups = new Set(m.shutro.groups.map((g) => g.code));
|
|
73
73
|
for (const d of deps)
|
|
@@ -107,6 +107,124 @@ export interface DocumentSpec {
|
|
|
107
107
|
/** One record (default) or a list of records. */
|
|
108
108
|
readonly scope?: 'record' | 'list';
|
|
109
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* An import template a module ships (RFC 0014 §5.4): the columns of a file for one of its models, offered on the
|
|
112
|
+
* import screen and downloadable as a sample workbook. Read-only for users, who save their own mappings beside it.
|
|
113
|
+
*/
|
|
114
|
+
export interface ImportTemplateSpec {
|
|
115
|
+
/** Unique within the module (`customers`); the template's id is `module.key`. */
|
|
116
|
+
readonly key: string;
|
|
117
|
+
readonly model: string;
|
|
118
|
+
readonly label: string;
|
|
119
|
+
/** The columns in order: the header the file has, and the field path it fills (`name`, `lines.product`). */
|
|
120
|
+
readonly columns: readonly {
|
|
121
|
+
readonly header: string;
|
|
122
|
+
readonly field: string;
|
|
123
|
+
}[];
|
|
124
|
+
/** Conversion options and the mode (`mode`, `key`, `dateOrder`, `decimal`…), as an import takes them. */
|
|
125
|
+
readonly options?: Readonly<Record<string, unknown>>;
|
|
126
|
+
}
|
|
127
|
+
/** An action a portal user may take on a document (RFC 0015 §5.3): accept a quotation, decline it. */
|
|
128
|
+
export interface PortalActionSpec {
|
|
129
|
+
/** Unique within the document (`accept`). */
|
|
130
|
+
readonly key: string;
|
|
131
|
+
readonly label: string;
|
|
132
|
+
/** The state transition it runs, once the portal checked the record is the user's and `when` holds. */
|
|
133
|
+
readonly transition: string;
|
|
134
|
+
/** When it is offered: a domain on the record (`{ state: 'sent' }`). */
|
|
135
|
+
readonly when: Readonly<Record<string, unknown>>;
|
|
136
|
+
/** The user signs: a typed name and a drawn signature, kept with the document's hash. */
|
|
137
|
+
readonly signature?: boolean;
|
|
138
|
+
/** The user writes why (a reason to decline): posted on the document's thread. */
|
|
139
|
+
readonly message?: boolean;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* A document type the portal shows its customers or vendors (RFC 0015 §5.3): which records (theirs by `partner`,
|
|
143
|
+
* narrowed by `domain`), which fields, its lines, its PDF, its actions and its thread. The model must give
|
|
144
|
+
* `portal.user` read access with a record rule (the portal checks at start); only the declared fields are ever read.
|
|
145
|
+
*/
|
|
146
|
+
export interface PortalDocumentSpec {
|
|
147
|
+
/** Unique across modules (`quotations`): the portal's path. */
|
|
148
|
+
readonly key: string;
|
|
149
|
+
readonly model: string;
|
|
150
|
+
readonly label: string;
|
|
151
|
+
/** Whose document it is: a many2one to `res.partner`, or a path to one (`project.partner`). */
|
|
152
|
+
readonly partner: string;
|
|
153
|
+
/** Which records show (drafts stay internal): a domain. */
|
|
154
|
+
readonly domain?: Readonly<Record<string, unknown>>;
|
|
155
|
+
/** Fields of the list, in order. */
|
|
156
|
+
readonly list: readonly string[];
|
|
157
|
+
/** Fields of the document's page, in order. */
|
|
158
|
+
readonly fields: readonly string[];
|
|
159
|
+
/** Its lines: a one2many and the fields of each line. */
|
|
160
|
+
readonly lines?: {
|
|
161
|
+
readonly field: string;
|
|
162
|
+
readonly fields: readonly string[];
|
|
163
|
+
};
|
|
164
|
+
/** A document template (`module.key`, RFC 0005) printed as the PDF. */
|
|
165
|
+
readonly pdf?: string;
|
|
166
|
+
readonly actions?: readonly PortalActionSpec[];
|
|
167
|
+
/** The document's comments, both ways. */
|
|
168
|
+
readonly thread?: boolean;
|
|
169
|
+
/** What needs the user, shown on the portal's home (`{ state: 'sent' }`). */
|
|
170
|
+
readonly attention?: Readonly<Record<string, unknown>>;
|
|
171
|
+
/** The list's order (default: the model's). */
|
|
172
|
+
readonly order?: readonly string[];
|
|
173
|
+
/**
|
|
174
|
+
* When a record enters this domain (a quotation sent, an invoice posted), its customer's portal users get an
|
|
175
|
+
* email with a link, once. The model's writes must reach the portal: list it in the module's `changeEvents`.
|
|
176
|
+
*/
|
|
177
|
+
readonly announce?: Readonly<Record<string, unknown>>;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* A country localization (RFC 0016 §5.2): what installing it sets up for a company, once — its chart of accounts,
|
|
181
|
+
* the accounts of the taxes it ships, its withholdings, its fiscal year and number grouping. The shapes are
|
|
182
|
+
* Accounting's (`account.account` types, `account.withholding` fields); Accounting installs them.
|
|
183
|
+
*/
|
|
184
|
+
export interface LocalizationSpec {
|
|
185
|
+
/** The chart's code (`bd`), stored on the company. */
|
|
186
|
+
readonly key: string;
|
|
187
|
+
/** ISO 3166 code (`BD`). */
|
|
188
|
+
readonly country: string;
|
|
189
|
+
readonly label: string;
|
|
190
|
+
readonly chart: {
|
|
191
|
+
readonly accounts: readonly {
|
|
192
|
+
readonly code: string;
|
|
193
|
+
readonly name: string;
|
|
194
|
+
readonly type: string;
|
|
195
|
+
readonly reconcile?: boolean;
|
|
196
|
+
}[];
|
|
197
|
+
/** The company's default accounts, by code. */
|
|
198
|
+
readonly defaults: Readonly<Record<'receivable' | 'payable' | 'exchangeGain' | 'exchangeLoss' | 'retainedEarnings' | 'bank' | 'cash' | 'income' | 'expense', string>>;
|
|
199
|
+
/** The account of any tax without one, by use. */
|
|
200
|
+
readonly taxAccounts: {
|
|
201
|
+
readonly sale: string;
|
|
202
|
+
readonly purchase: string;
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
/** The account of each tax the module ships (`module.name` external id → account code). */
|
|
206
|
+
readonly taxes?: Readonly<Record<string, string>>;
|
|
207
|
+
/**
|
|
208
|
+
* The accounts of the module's tax components (RFC 0016 step 5), by external id: the account code, or the account
|
|
209
|
+
* and the reverse-charge (payable) account.
|
|
210
|
+
*/
|
|
211
|
+
readonly components?: Readonly<Record<string, string | {
|
|
212
|
+
readonly account: string;
|
|
213
|
+
readonly reverseCharge?: string;
|
|
214
|
+
}>>;
|
|
215
|
+
readonly withholdings?: readonly {
|
|
216
|
+
readonly name: string;
|
|
217
|
+
readonly direction: 'vendor' | 'customer';
|
|
218
|
+
readonly base: 'untaxed' | 'tax' | 'total';
|
|
219
|
+
readonly rate: string;
|
|
220
|
+
readonly threshold?: string;
|
|
221
|
+
/** An account code of the chart. */
|
|
222
|
+
readonly account: string;
|
|
223
|
+
}[];
|
|
224
|
+
/** The first month of the fiscal year (1–12). */
|
|
225
|
+
readonly fiscalYearStart?: number;
|
|
226
|
+
readonly grouping?: 'international' | 'lakh';
|
|
227
|
+
}
|
|
110
228
|
/** A user the demo data is made by: created on first use with these groups (added to an existing one). */
|
|
111
229
|
export interface DemoUser {
|
|
112
230
|
readonly login: string;
|
|
@@ -241,6 +359,20 @@ export interface ModuleInput {
|
|
|
241
359
|
readonly automationRules?: Readonly<Record<string, AutomationRuleSpec>>;
|
|
242
360
|
/** Default document templates (RFC 0005), installed as data (`key` = `module.name`) and editable by designers. */
|
|
243
361
|
readonly documents?: readonly DocumentSpec[];
|
|
362
|
+
/**
|
|
363
|
+
* Groups of users from outside the company: the customers and vendors of the portal (RFC 0015 §5.1). A user whose
|
|
364
|
+
* groups are all external reaches only the sign-in routes and `/api/portal/`; every other route answers 403. An
|
|
365
|
+
* external group may not imply `base.user` (checked when the server starts).
|
|
366
|
+
*/
|
|
367
|
+
readonly externalGroups?: readonly string[];
|
|
368
|
+
/** The country this module localizes (RFC 0016): set up for each company when the module is installed. */
|
|
369
|
+
readonly localization?: LocalizationSpec;
|
|
370
|
+
/** What the module shows in the customer and vendor portal (RFC 0015), when `portal` is installed. */
|
|
371
|
+
readonly portal?: {
|
|
372
|
+
readonly documents: readonly PortalDocumentSpec[];
|
|
373
|
+
};
|
|
374
|
+
/** Import templates for the module's models (RFC 0014 §5.4), offered when `import` is installed. */
|
|
375
|
+
readonly importTemplates?: readonly ImportTemplateSpec[];
|
|
244
376
|
/**
|
|
245
377
|
* Server routes of this module (admin APIs, custom endpoints). Called once at startup with the server context
|
|
246
378
|
* (`ModuleContext` of `shutro-erp`); typed by the server, so modules declare the parameter type they use.
|
|
@@ -73,6 +73,28 @@ export function defineModule(input) {
|
|
|
73
73
|
for (const id of Object.keys(input.actions ?? {}))
|
|
74
74
|
if (!ID.test(id))
|
|
75
75
|
fail(`action id '${id}' is not '<module>.<name>'.`, `Use e.g. '${name}.action_list'.`);
|
|
76
|
+
const documentKeys = new Set();
|
|
77
|
+
for (const document of input.portal?.documents ?? []) {
|
|
78
|
+
if (!LEVEL.test(document.key) || documentKeys.has(document.key))
|
|
79
|
+
fail(`portal document key '${document.key}' is not a unique snake_case name.`, "Use e.g. key: 'quotations'.");
|
|
80
|
+
documentKeys.add(document.key);
|
|
81
|
+
if (document.fields.length === 0 || document.list.length === 0)
|
|
82
|
+
fail(`portal document '${document.key}' shows no field.`, 'List its fields and list columns.');
|
|
83
|
+
const actionKeys = new Set();
|
|
84
|
+
for (const action of document.actions ?? []) {
|
|
85
|
+
if (!LEVEL.test(action.key) || actionKeys.has(action.key))
|
|
86
|
+
fail(`portal action '${action.key}' of '${document.key}' is not a unique snake_case name.`, "Use e.g. key: 'accept'.");
|
|
87
|
+
actionKeys.add(action.key);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const templateKeys = new Set();
|
|
91
|
+
for (const template of input.importTemplates ?? []) {
|
|
92
|
+
if (!LEVEL.test(template.key) || templateKeys.has(template.key))
|
|
93
|
+
fail(`import template key '${template.key}' is not a unique snake_case name.`, "Use e.g. key: 'customers'.");
|
|
94
|
+
templateKeys.add(template.key);
|
|
95
|
+
if (template.columns.length === 0)
|
|
96
|
+
fail(`import template '${template.key}' has no columns.`, 'List the columns of the file.');
|
|
97
|
+
}
|
|
76
98
|
return Object.freeze({
|
|
77
99
|
...input,
|
|
78
100
|
name,
|
package/dist/notify/inbox.js
CHANGED
|
@@ -161,6 +161,26 @@ async function draftsOf(context, su, topic, payload, by, company) {
|
|
|
161
161
|
})),
|
|
162
162
|
};
|
|
163
163
|
}
|
|
164
|
+
case 'import.finished': {
|
|
165
|
+
// A background import or check ended (RFC 0014 §5.3): its user hears how it went.
|
|
166
|
+
const dry = payload['dry'] === true;
|
|
167
|
+
return {
|
|
168
|
+
model,
|
|
169
|
+
id,
|
|
170
|
+
drafts: [
|
|
171
|
+
{
|
|
172
|
+
user: by,
|
|
173
|
+
kind: dry ? 'import.checked' : 'import.finished',
|
|
174
|
+
params: {
|
|
175
|
+
file: String(payload['file'] ?? ''),
|
|
176
|
+
created: Number(payload['created'] ?? 0),
|
|
177
|
+
updated: Number(payload['updated'] ?? 0),
|
|
178
|
+
errors: Number(payload['errors'] ?? 0),
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
};
|
|
183
|
+
}
|
|
164
184
|
case 'mail.activity.assigned': {
|
|
165
185
|
const assignee = Number(payload['assignee']);
|
|
166
186
|
if (!Number.isSafeInteger(assignee) || assignee === by)
|
|
@@ -190,6 +210,7 @@ export const TOPICS = [
|
|
|
190
210
|
'approval.requested',
|
|
191
211
|
'approval.decided',
|
|
192
212
|
'mail.activity.assigned',
|
|
213
|
+
'import.finished',
|
|
193
214
|
];
|
|
194
215
|
/**
|
|
195
216
|
* Handles one delivered event in the subscriber's transaction: writes the recipients' notifications (as the
|
package/dist/notify/messages.js
CHANGED
|
@@ -8,12 +8,14 @@ export const TEXTS = {
|
|
|
8
8
|
'chat.direct': '{{actor}}: {{preview}}',
|
|
9
9
|
'email.bounced': 'The email to {{recipient}} ({{address}}) about {{record}} bounced',
|
|
10
10
|
automation: '{{text}}',
|
|
11
|
+
'import.finished': 'Your import of {{file}} finished: {{created}} created, {{updated}} updated, {{errors}} errors',
|
|
12
|
+
'import.checked': 'The check of {{file}} finished: {{errors}} errors',
|
|
11
13
|
},
|
|
12
14
|
states: { approved: 'approved', rejected: 'rejected' },
|
|
13
15
|
email: {
|
|
14
|
-
open: 'Open in
|
|
15
|
-
why: 'You receive this email because of your notification settings in
|
|
16
|
-
digestSubject: 'Your
|
|
16
|
+
open: 'Open in Shutro ERP',
|
|
17
|
+
why: 'You receive this email because of your notification settings in Shutro ERP.',
|
|
18
|
+
digestSubject: 'Your Shutro ERP summary: {{count}} notifications',
|
|
17
19
|
digestIntro: 'What happened since your last summary, by record.',
|
|
18
20
|
},
|
|
19
21
|
},
|
|
@@ -26,6 +28,8 @@ export const TEXTS = {
|
|
|
26
28
|
'chat.direct': '{{actor}}: {{preview}}',
|
|
27
29
|
'email.bounced': '{{record}} সম্পর্কে {{recipient}} ({{address}})-কে পাঠানো ইমেইল ফেরত এসেছে',
|
|
28
30
|
automation: '{{text}}',
|
|
31
|
+
'import.finished': '{{file}} ইমপোর্ট শেষ হয়েছে: {{created}}টি তৈরি, {{updated}}টি হালনাগাদ, {{errors}}টি ত্রুটি',
|
|
32
|
+
'import.checked': '{{file}} যাচাই শেষ হয়েছে: {{errors}}টি ত্রুটি',
|
|
29
33
|
},
|
|
30
34
|
states: { approved: 'অনুমোদন করেছেন', rejected: 'প্রত্যাখ্যান করেছেন' },
|
|
31
35
|
email: {
|
package/dist/notify/models.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { orm } from '../server/orm.js';
|
|
2
2
|
/** What a notification is about; the client translates `notify.kinds.<kind>` with the `params`. */
|
|
3
|
-
export declare const KINDS: readonly ['mention', 'approval.requested', 'approval.decided', 'activity.assigned', 'chat.direct', 'email.bounced', 'automation'];
|
|
3
|
+
export declare const KINDS: readonly ['mention', 'approval.requested', 'approval.decided', 'activity.assigned', 'chat.direct', 'email.bounced', 'automation', 'import.finished', 'import.checked'];
|
|
4
4
|
export type Kind = (typeof KINDS)[number];
|
|
5
5
|
/** Delivery channels; `inapp` is the inbox, the others come with their adapters (SMS and WhatsApp opt in). */
|
|
6
6
|
export declare const CHANNELS: readonly ['inapp', 'email', 'webpush', 'sms', 'whatsapp'];
|
package/dist/notify/models.js
CHANGED
|
@@ -16,6 +16,8 @@ export const KINDS = [
|
|
|
16
16
|
'chat.direct',
|
|
17
17
|
'email.bounced',
|
|
18
18
|
'automation',
|
|
19
|
+
'import.finished',
|
|
20
|
+
'import.checked',
|
|
19
21
|
];
|
|
20
22
|
/** Delivery channels; `inapp` is the inbox, the others come with their adapters (SMS and WhatsApp opt in). */
|
|
21
23
|
export const CHANNELS = ['inapp', 'email', 'webpush', 'sms', 'whatsapp'];
|
package/dist/notify/routes.js
CHANGED
|
@@ -50,7 +50,7 @@ export function registerNotifyRoutes({ app }, options = {}) {
|
|
|
50
50
|
app.get('/api/v1/notifications/push/key', async (request) => {
|
|
51
51
|
await request.env(async () => undefined); // signed in
|
|
52
52
|
if (options.pusher === undefined)
|
|
53
|
-
throw new HttpProblem(404, 'push-not-configured', 'Push is not set up', 'This installation has no VAPID keys.', 'Set VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY and VAPID_SUBJECT (
|
|
53
|
+
throw new HttpProblem(404, 'push-not-configured', 'Push is not set up', 'This installation has no VAPID keys.', 'Set VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY and VAPID_SUBJECT (shutro-erp init writes them).');
|
|
54
54
|
return { publicKey: options.pusher.publicKey };
|
|
55
55
|
});
|
|
56
56
|
app.post('/api/v1/notifications/push', async (request) => {
|
|
@@ -11,7 +11,7 @@ export const messages = {
|
|
|
11
11
|
push: {
|
|
12
12
|
off: 'Push notifications on this device are off',
|
|
13
13
|
on: 'Push notifications on this device are on',
|
|
14
|
-
denied: 'This browser blocks notifications from
|
|
14
|
+
denied: 'This browser blocks notifications from Shutro ERP',
|
|
15
15
|
busy: 'One moment…',
|
|
16
16
|
turnOn: 'Turn on',
|
|
17
17
|
turnOff: 'Turn off',
|
|
@@ -53,6 +53,8 @@ export const messages = {
|
|
|
53
53
|
'chat.direct': 'Direct messages',
|
|
54
54
|
'email.bounced': 'Bounced emails',
|
|
55
55
|
automation: 'Automation rules',
|
|
56
|
+
'import.finished': 'Finished imports',
|
|
57
|
+
'import.checked': 'Finished import checks',
|
|
56
58
|
},
|
|
57
59
|
kinds: TEXTS['en']?.kinds,
|
|
58
60
|
states: TEXTS['en']?.states,
|
|
@@ -109,6 +111,8 @@ export const messages = {
|
|
|
109
111
|
'chat.direct': 'সরাসরি বার্তা',
|
|
110
112
|
'email.bounced': 'ফেরত আসা ইমেইল',
|
|
111
113
|
automation: 'অটোমেশন নিয়ম',
|
|
114
|
+
'import.finished': 'শেষ হওয়া ইমপোর্ট',
|
|
115
|
+
'import.checked': 'শেষ হওয়া ইমপোর্ট যাচাই',
|
|
112
116
|
},
|
|
113
117
|
kinds: TEXTS['bn']?.kinds,
|
|
114
118
|
states: TEXTS['bn']?.states,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
|
|
2
|
+
import { type DefinitionHelpers } from '../../server/orm.js';
|
|
3
|
+
import type { DefaultLoaded, Env as CoreEnv, RecordSet as CoreRecordSet, Shutro as CoreShutro } from '../../server/orm.js';
|
|
4
|
+
import type { SchemaView } from './schema.js';
|
|
5
|
+
export type { SchemaView };
|
|
6
|
+
/** Every model visible in this view. */
|
|
7
|
+
export type ModelName = keyof SchemaView & string;
|
|
8
|
+
/** `Env` typed to this view. */
|
|
9
|
+
export type Env = CoreEnv<SchemaView>;
|
|
10
|
+
/** `Shutro` typed to this view. */
|
|
11
|
+
export type Shutro = CoreShutro<SchemaView>;
|
|
12
|
+
/** A recordset of `M`, with the default loaded shape unless `L` is given. */
|
|
13
|
+
export type Records<M extends ModelName, L = DefaultLoaded<SchemaView, M>> = CoreRecordSet<SchemaView, M, L>;
|
|
14
|
+
export declare const compute: DefinitionHelpers<SchemaView>['compute'];
|
|
15
|
+
export declare const check: DefinitionHelpers<SchemaView>['check'];
|
|
16
|
+
export declare const onchange: DefinitionHelpers<SchemaView>['onchange'];
|
|
17
|
+
export declare const records: DefinitionHelpers<SchemaView>['records'];
|
|
18
|
+
export declare const method: DefinitionHelpers<SchemaView>['method'];
|
|
19
|
+
/** Module data (RFC 0017): records, overrides of dependencies' records, and references, typed like creates. */
|
|
20
|
+
export declare const record: DefinitionHelpers<SchemaView>['record'];
|
|
21
|
+
export declare const override: DefinitionHelpers<SchemaView>['override'];
|
|
22
|
+
export declare const ref: DefinitionHelpers<SchemaView>['ref'];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: bae647ca883975a1
|
|
2
|
+
// Bindings of module `portal`: import the definition API from here to get types scoped to what it can see.
|
|
3
|
+
export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
|
|
4
|
+
import { definitions } from '../../server/orm.js';
|
|
5
|
+
/** Definition callbacks typed against this module's view: no casts in computes, checks, onchange, methods. */
|
|
6
|
+
const helpers = definitions();
|
|
7
|
+
export const compute = helpers.compute;
|
|
8
|
+
export const check = helpers.check;
|
|
9
|
+
export const onchange = helpers.onchange;
|
|
10
|
+
export const records = helpers.records;
|
|
11
|
+
export const method = helpers.method;
|
|
12
|
+
/** Module data (RFC 0017): records, overrides of dependencies' records, and references, typed like creates. */
|
|
13
|
+
export const record = helpers.record;
|
|
14
|
+
export const override = helpers.override;
|
|
15
|
+
export const ref = helpers.ref;
|