shutro-erp 0.3.6 → 0.3.7
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/dist/account_asset/.kosh/bindings.js +1 -1
- package/dist/account_asset/.kosh/schema.d.ts +530 -8
- package/dist/account_asset/i18n/bn.d.ts +2 -0
- package/dist/account_asset/i18n/bn.js +97 -0
- package/dist/account_asset/index.js +2 -0
- package/dist/account_asset/module.d.ts +4899 -1445
- package/dist/account_budget/.kosh/bindings.js +1 -1
- package/dist/account_budget/.kosh/schema.d.ts +1130 -56
- package/dist/account_budget/i18n/bn.d.ts +2 -0
- package/dist/account_budget/i18n/bn.js +63 -0
- package/dist/account_budget/index.js +14 -0
- package/dist/account_budget/module.d.ts +17958 -4532
- package/dist/account_budget/module.js +15 -0
- package/dist/account_portal/.kosh/bindings.js +1 -1
- package/dist/account_portal/.kosh/schema.d.ts +530 -8
- package/dist/account_portal/i18n/bn.d.ts +2 -0
- package/dist/account_portal/i18n/bn.js +6 -0
- package/dist/account_portal/index.js +2 -0
- package/dist/account_portal/module.d.ts +5167 -1693
- package/dist/accounting/.kosh/bindings.js +1 -1
- package/dist/accounting/.kosh/schema.d.ts +530 -8
- package/dist/accounting/closing.js +1 -0
- package/dist/accounting/fiscal.d.ts +578 -0
- package/dist/accounting/fiscal.js +401 -0
- package/dist/accounting/followups.d.ts +618 -0
- package/dist/accounting/followups.js +420 -0
- package/dist/accounting/i18n/bn.d.ts +2 -0
- package/dist/accounting/i18n/bn.js +425 -0
- package/dist/accounting/index.d.ts +2 -0
- package/dist/accounting/index.js +649 -2
- package/dist/accounting/module.d.ts +4998 -1451
- package/dist/accounting/module.js +124 -18
- package/dist/accounting/statements.d.ts +878 -0
- package/dist/accounting/statements.js +728 -0
- package/dist/accounting/web/BankReconcilePage.d.ts +9 -0
- package/dist/accounting/web/BankReconcilePage.js +138 -0
- package/dist/accounting/web/FollowupsPage.d.ts +8 -0
- package/dist/accounting/web/FollowupsPage.js +54 -0
- package/dist/accounting/web/PostingPreview.d.ts +8 -0
- package/dist/accounting/web/PostingPreview.js +26 -0
- package/dist/accounting/web/index.d.ts +3 -0
- package/dist/accounting/web/index.js +9 -0
- package/dist/accounting/web/messages.js +140 -0
- package/dist/approvals/.kosh/bindings.js +1 -1
- package/dist/approvals/.kosh/schema.d.ts +272 -4
- package/dist/approvals/demo.d.ts +7 -0
- package/dist/approvals/demo.js +41 -0
- package/dist/approvals/i18n/bn.d.ts +2 -0
- package/dist/approvals/i18n/bn.js +133 -0
- package/dist/approvals/index.d.ts +19 -1
- package/dist/approvals/index.js +477 -7
- package/dist/approvals/mails.d.ts +7 -2
- package/dist/approvals/mails.js +8 -3
- package/dist/approvals/module.d.ts +2930 -1
- package/dist/approvals/module.js +468 -7
- package/dist/approvals/web/Config.d.ts +12 -0
- package/dist/approvals/web/Config.js +60 -0
- package/dist/approvals/web/Matrix.d.ts +9 -0
- package/dist/approvals/web/Matrix.js +26 -0
- package/dist/approvals/web/index.d.ts +3 -1
- package/dist/approvals/web/index.js +8 -1
- package/dist/approvals/web/messages.js +92 -0
- package/dist/approvals_purchase/.kosh/bindings.js +15 -0
- package/dist/approvals_purchase/.kosh/schema.d.ts +1997 -0
- package/dist/approvals_purchase/i18n/bn.d.ts +2 -0
- package/dist/approvals_purchase/i18n/bn.js +5 -0
- package/dist/approvals_purchase/index.d.ts +3 -0
- package/dist/approvals_purchase/index.js +47 -0
- package/dist/approvals_purchase/module.d.ts +12670 -0
- package/dist/approvals_purchase/module.js +84 -0
- package/dist/attendance/.kosh/bindings.js +1 -1
- package/dist/attendance/.kosh/schema.d.ts +59 -1
- package/dist/attendance/i18n/bn.d.ts +2 -0
- package/dist/attendance/i18n/bn.js +147 -0
- package/dist/attendance/index.js +3 -1
- package/dist/attendance/module.d.ts +452 -8
- package/dist/automation/engine.js +1 -1
- package/dist/calendar/.kosh/bindings.js +1 -1
- package/dist/calendar/.kosh/schema.d.ts +2 -1
- package/dist/calendar/i18n/bn.d.ts +2 -0
- package/dist/calendar/i18n/bn.js +80 -0
- package/dist/calendar/index.js +77 -0
- package/dist/calendar/module.d.ts +26 -0
- package/dist/calendar/module.js +14 -4
- package/dist/cli/apps.js +25 -5
- package/dist/cli/init.js +14 -4
- package/dist/cli/templates.d.ts +1 -1
- package/dist/cli/templates.js +34 -5
- package/dist/contacts/.kosh/bindings.js +1 -1
- package/dist/contacts/.kosh/schema.d.ts +2 -1
- package/dist/contacts/i18n/bn.d.ts +2 -0
- package/dist/contacts/i18n/bn.js +67 -0
- package/dist/contacts/index.js +3 -0
- package/dist/contacts/module.d.ts +42 -0
- package/dist/contacts/module.js +6 -1
- package/dist/crm/.kosh/bindings.js +1 -1
- package/dist/crm/.kosh/schema.d.ts +2 -1
- package/dist/crm/i18n/bn.d.ts +2 -0
- package/dist/crm/i18n/bn.js +80 -0
- package/dist/crm/index.js +22 -0
- package/dist/crm/module.d.ts +20 -0
- package/dist/crm/module.js +4 -2
- package/dist/documents/.kosh/bindings.js +1 -1
- package/dist/documents/.kosh/schema.d.ts +2 -1
- package/dist/documents/i18n/bn.d.ts +2 -0
- package/dist/documents/i18n/bn.js +83 -0
- package/dist/documents/index.js +128 -1
- package/dist/documents/module.d.ts +20 -0
- package/dist/documents/module.js +1 -0
- package/dist/event/.kosh/bindings.js +1 -1
- package/dist/event/.kosh/schema.d.ts +2 -1
- package/dist/event/i18n/bn.d.ts +2 -0
- package/dist/event/i18n/bn.js +101 -0
- package/dist/event/index.js +66 -0
- package/dist/event/module.d.ts +20 -0
- package/dist/event/module.js +8 -1
- package/dist/event_account/.kosh/bindings.js +1 -1
- package/dist/event_account/.kosh/schema.d.ts +530 -8
- package/dist/event_account/i18n/bn.d.ts +2 -0
- package/dist/event_account/i18n/bn.js +5 -0
- package/dist/event_account/index.js +2 -0
- package/dist/event_account/module.d.ts +4905 -1431
- package/dist/expense/.kosh/bindings.js +1 -1
- package/dist/expense/.kosh/schema.d.ts +323 -2
- package/dist/expense/i18n/bn.d.ts +2 -0
- package/dist/expense/i18n/bn.js +155 -0
- package/dist/expense/index.js +8 -1
- package/dist/expense/module.d.ts +2715 -694
- package/dist/expense/module.js +3 -1
- package/dist/expense_account/.kosh/bindings.js +1 -1
- package/dist/expense_account/.kosh/schema.d.ts +587 -8
- package/dist/expense_account/i18n/bn.d.ts +2 -0
- package/dist/expense_account/i18n/bn.js +15 -0
- package/dist/expense_account/index.js +2 -0
- package/dist/expense_account/module.d.ts +8094 -2619
- package/dist/helpdesk/.kosh/bindings.js +1 -1
- package/dist/helpdesk/.kosh/schema.d.ts +2 -1
- package/dist/helpdesk/i18n/bn.d.ts +2 -0
- package/dist/helpdesk/i18n/bn.js +127 -0
- package/dist/helpdesk/index.js +2 -0
- package/dist/helpdesk/module.d.ts +20 -0
- package/dist/hr/.kosh/bindings.js +1 -1
- package/dist/hr/.kosh/schema.d.ts +59 -1
- package/dist/hr/demo.js +11 -1
- package/dist/hr/i18n/bn.d.ts +2 -0
- package/dist/hr/i18n/bn.js +126 -0
- package/dist/hr/index.d.ts +1 -1
- package/dist/hr/index.js +158 -12
- package/dist/hr/module.d.ts +932 -59
- package/dist/hr/module.js +114 -17
- package/dist/{mrp → indent}/.kosh/bindings.js +2 -2
- package/dist/indent/.kosh/schema.d.ts +2084 -0
- package/dist/indent/demo.d.ts +7 -0
- package/dist/indent/demo.js +48 -0
- package/dist/indent/i18n/bn.d.ts +2 -0
- package/dist/indent/i18n/bn.js +143 -0
- package/dist/indent/index.d.ts +3 -0
- package/dist/indent/index.js +450 -0
- package/dist/{mrp → indent}/module.d.ts +7164 -3075
- package/dist/indent/module.js +792 -0
- package/dist/indent_purchase/.kosh/bindings.d.ts +22 -0
- package/dist/indent_purchase/.kosh/bindings.js +15 -0
- package/dist/indent_purchase/.kosh/schema.d.ts +2710 -0
- package/dist/indent_purchase/i18n/bn.d.ts +2 -0
- package/dist/indent_purchase/i18n/bn.js +13 -0
- package/dist/indent_purchase/index.d.ts +3 -0
- package/dist/indent_purchase/index.js +61 -0
- package/dist/indent_purchase/module.d.ts +27950 -0
- package/dist/indent_purchase/module.js +163 -0
- package/dist/l10n_bd/.kosh/bindings.js +1 -1
- package/dist/l10n_bd/.kosh/schema.d.ts +530 -8
- package/dist/l10n_bd/i18n/bn.d.ts +2 -0
- package/dist/l10n_bd/i18n/bn.js +69 -0
- package/dist/l10n_bd/index.js +2 -0
- package/dist/l10n_bd/module.d.ts +5167 -1693
- package/dist/l10n_bd_payroll/.kosh/bindings.js +1 -1
- package/dist/l10n_bd_payroll/.kosh/schema.d.ts +587 -8
- package/dist/l10n_bd_payroll/i18n/bn.d.ts +2 -0
- package/dist/l10n_bd_payroll/i18n/bn.js +4 -0
- package/dist/l10n_bd_payroll/index.js +2 -0
- package/dist/l10n_bd_payroll/module.d.ts +5910 -1548
- package/dist/l10n_bd_pos/.kosh/bindings.d.ts +22 -0
- package/dist/{mrp_account → l10n_bd_pos}/.kosh/bindings.js +2 -2
- package/dist/{mrp_account → l10n_bd_pos}/.kosh/schema.d.ts +693 -651
- package/dist/l10n_bd_pos/i18n/bn.d.ts +2 -0
- package/dist/l10n_bd_pos/i18n/bn.js +32 -0
- package/dist/l10n_bd_pos/index.d.ts +3 -0
- package/dist/l10n_bd_pos/index.js +111 -0
- package/dist/{mrp_account → l10n_bd_pos}/module.d.ts +7402 -7647
- package/dist/l10n_bd_pos/module.js +43 -0
- package/dist/l10n_in/.kosh/bindings.js +1 -1
- package/dist/l10n_in/.kosh/schema.d.ts +530 -8
- package/dist/l10n_in/i18n/bn.d.ts +2 -0
- package/dist/l10n_in/i18n/bn.js +95 -0
- package/dist/l10n_in/index.js +2 -0
- package/dist/l10n_in/module.d.ts +6703 -1652
- package/dist/l10n_in/module.js +25 -5
- package/dist/l10n_in/web/GstSettings.js +2 -2
- package/dist/mail/inbound/handle.js +2 -4
- package/dist/mail/inbound/models.js +5 -3
- package/dist/mail/index.d.ts +12 -1
- package/dist/mail/index.js +139 -2
- package/dist/mail/send.d.ts +56 -0
- package/dist/mail/send.js +394 -0
- package/dist/mail/web/SendButton.d.ts +9 -0
- package/dist/mail/web/SendButton.js +71 -0
- package/dist/mail/web/SendSelected.d.ts +8 -0
- package/dist/mail/web/SendSelected.js +33 -0
- package/dist/mail/web/index.d.ts +2 -0
- package/dist/mail/web/index.js +6 -0
- package/dist/mail/web/messages.js +36 -0
- package/dist/maintenance/.kosh/bindings.js +1 -1
- package/dist/maintenance/.kosh/schema.d.ts +2 -1
- package/dist/maintenance/i18n/bn.d.ts +2 -0
- package/dist/maintenance/i18n/bn.js +132 -0
- package/dist/maintenance/index.js +85 -0
- package/dist/maintenance/module.d.ts +25 -0
- package/dist/maintenance/module.js +27 -9
- package/dist/maintenance_stock/.kosh/bindings.js +1 -1
- package/dist/maintenance_stock/.kosh/schema.d.ts +298 -2
- package/dist/maintenance_stock/i18n/bn.d.ts +2 -0
- package/dist/maintenance_stock/i18n/bn.js +21 -0
- package/dist/maintenance_stock/index.js +2 -0
- package/dist/maintenance_stock/module.d.ts +5302 -1256
- package/dist/maintenance_stock/module.js +1 -0
- package/dist/modules-sdk/apps.d.ts +10 -0
- package/dist/modules-sdk/apps.js +32 -0
- package/dist/modules-sdk/index.d.ts +1 -1
- package/dist/modules-sdk/manifest.d.ts +68 -2
- package/dist/payment/.kosh/bindings.js +1 -1
- package/dist/payment/.kosh/schema.d.ts +530 -8
- package/dist/payment/i18n/bn.d.ts +2 -0
- package/dist/payment/i18n/bn.js +59 -0
- package/dist/payment/index.js +85 -0
- package/dist/payment/module.d.ts +5134 -1660
- package/dist/payment/module.js +17 -3
- package/dist/payment/settle.js +1 -0
- package/dist/payroll/.kosh/bindings.js +1 -1
- package/dist/payroll/.kosh/schema.d.ts +59 -1
- package/dist/payroll/i18n/bn.d.ts +2 -0
- package/dist/payroll/i18n/bn.js +206 -0
- package/dist/payroll/index.js +2 -0
- package/dist/payroll/module.d.ts +936 -48
- package/dist/payroll_account/.kosh/bindings.js +1 -1
- package/dist/payroll_account/.kosh/schema.d.ts +587 -8
- package/dist/payroll_account/i18n/bn.d.ts +2 -0
- package/dist/payroll_account/i18n/bn.js +10 -0
- package/dist/payroll_account/index.js +2 -0
- package/dist/payroll_account/module.d.ts +7534 -3192
- package/dist/permissions/approvals.d.ts +97 -4
- package/dist/permissions/approvals.js +780 -31
- package/dist/permissions/index.d.ts +1 -1
- package/dist/permissions/index.js +2 -2
- package/dist/permissions/models.js +177 -5
- package/dist/permissions/routes.d.ts +3 -0
- package/dist/permissions/routes.js +36 -2
- package/dist/permissions/web/ApprovalPanel.js +43 -5
- package/dist/permissions/web/messages.js +52 -0
- package/dist/portal/.kosh/bindings.js +1 -1
- package/dist/portal/.kosh/schema.d.ts +2 -1
- package/dist/portal/documents.d.ts +3 -0
- package/dist/portal/documents.js +21 -1
- package/dist/portal/i18n/bn.d.ts +2 -0
- package/dist/portal/i18n/bn.js +33 -0
- package/dist/portal/index.js +2 -0
- package/dist/portal/module.d.ts +20 -0
- package/dist/portal/routes-documents.js +76 -0
- package/dist/pos/.kosh/bindings.js +1 -1
- package/dist/pos/.kosh/schema.d.ts +531 -8
- package/dist/pos/i18n/bn.d.ts +2 -0
- package/dist/pos/i18n/bn.js +133 -0
- package/dist/pos/index.js +83 -1
- package/dist/pos/module.d.ts +6888 -1777
- package/dist/pos/module.js +49 -5
- package/dist/pos/routes.js +80 -7
- package/dist/pos/web/Register.js +2 -5
- package/dist/pos_stock/.kosh/bindings.js +1 -1
- package/dist/pos_stock/.kosh/schema.d.ts +626 -9
- package/dist/pos_stock/i18n/bn.d.ts +2 -0
- package/dist/pos_stock/i18n/bn.js +6 -0
- package/dist/pos_stock/index.js +2 -0
- package/dist/pos_stock/module.d.ts +10798 -3276
- package/dist/product/.kosh/bindings.js +1 -1
- package/dist/product/.kosh/schema.d.ts +202 -1
- package/dist/product/i18n/bn.d.ts +2 -0
- package/dist/product/i18n/bn.js +175 -0
- package/dist/product/index.d.ts +1 -0
- package/dist/product/index.js +288 -1
- package/dist/product/module.d.ts +1725 -0
- package/dist/product/module.js +66 -6
- package/dist/product/pricelist.d.ts +575 -0
- package/dist/product/pricelist.js +257 -0
- package/dist/product/variants.d.ts +908 -0
- package/dist/product/variants.js +251 -0
- package/dist/production/.kosh/bindings.d.ts +22 -0
- package/dist/production/.kosh/bindings.js +15 -0
- package/dist/production/.kosh/schema.d.ts +2345 -0
- package/dist/{mrp → production}/demo.d.ts +1 -1
- package/dist/{mrp → production}/demo.js +5 -5
- package/dist/production/depth.d.ts +790 -0
- package/dist/production/depth.js +262 -0
- package/dist/production/i18n/bn.d.ts +2 -0
- package/dist/production/i18n/bn.js +350 -0
- package/dist/production/index.d.ts +6 -0
- package/dist/production/index.js +1256 -0
- package/dist/production/module.d.ts +17327 -0
- package/dist/production/module.js +1333 -0
- package/dist/production/plan.d.ts +921 -0
- package/dist/production/plan.js +511 -0
- package/dist/production/schedule.d.ts +656 -0
- package/dist/production/schedule.js +309 -0
- package/dist/production_account/.kosh/bindings.d.ts +22 -0
- package/dist/production_account/.kosh/bindings.js +15 -0
- package/dist/production_account/.kosh/schema.d.ts +3496 -0
- package/dist/production_account/i18n/bn.d.ts +2 -0
- package/dist/production_account/i18n/bn.js +93 -0
- package/dist/production_account/index.d.ts +4 -0
- package/dist/production_account/index.js +246 -0
- package/dist/production_account/module.d.ts +1192 -0
- package/dist/{mrp_account → production_account}/module.js +72 -18
- package/dist/production_account/overhead.d.ts +1195 -0
- package/dist/production_account/overhead.js +554 -0
- package/dist/project/.kosh/bindings.js +1 -1
- package/dist/project/.kosh/schema.d.ts +65 -2
- package/dist/project/i18n/bn.d.ts +2 -0
- package/dist/project/i18n/bn.js +383 -0
- package/dist/project/index.js +123 -0
- package/dist/project/module.d.ts +20 -0
- package/dist/project/module.js +73 -14
- package/dist/project_account/.kosh/bindings.js +1 -1
- package/dist/project_account/.kosh/schema.d.ts +530 -8
- package/dist/project_account/i18n/bn.d.ts +2 -0
- package/dist/project_account/i18n/bn.js +6 -0
- package/dist/project_account/index.js +2 -0
- package/dist/project_account/module.d.ts +4926 -1452
- package/dist/project_portal/.kosh/bindings.js +1 -1
- package/dist/project_portal/.kosh/schema.d.ts +65 -2
- package/dist/project_portal/i18n/bn.d.ts +2 -0
- package/dist/project_portal/i18n/bn.js +6 -0
- package/dist/project_portal/index.js +2 -0
- package/dist/project_portal/module.d.ts +40 -0
- package/dist/project_purchase/.kosh/bindings.js +1 -1
- package/dist/project_purchase/.kosh/schema.d.ts +1126 -53
- package/dist/project_purchase/i18n/bn.d.ts +2 -0
- package/dist/project_purchase/i18n/bn.js +4 -0
- package/dist/project_purchase/index.js +2 -0
- package/dist/project_purchase/module.d.ts +17912 -4446
- package/dist/purchase/.kosh/bindings.js +1 -1
- package/dist/purchase/.kosh/schema.d.ts +813 -3
- package/dist/purchase/comparison.d.ts +993 -0
- package/dist/purchase/comparison.js +415 -0
- package/dist/purchase/extras.d.ts +1509 -0
- package/dist/purchase/extras.js +445 -0
- package/dist/purchase/i18n/bn.d.ts +2 -0
- package/dist/purchase/i18n/bn.js +413 -0
- package/dist/purchase/index.d.ts +5 -0
- package/dist/purchase/index.js +1280 -4
- package/dist/purchase/module.d.ts +7139 -398
- package/dist/purchase/module.js +295 -11
- package/dist/purchase/request.d.ts +696 -0
- package/dist/purchase/request.js +446 -0
- package/dist/purchase/tender.d.ts +1208 -0
- package/dist/purchase/tender.js +507 -0
- package/dist/purchase/vendorprice.d.ts +340 -0
- package/dist/purchase/vendorprice.js +153 -0
- package/dist/purchase_account/.kosh/bindings.js +1 -1
- package/dist/purchase_account/.kosh/schema.d.ts +1130 -57
- package/dist/purchase_account/i18n/bn.d.ts +2 -0
- package/dist/purchase_account/i18n/bn.js +22 -0
- package/dist/purchase_account/index.js +19 -0
- package/dist/purchase_account/module.d.ts +12276 -2247
- package/dist/purchase_account/module.js +241 -9
- package/dist/purchase_portal/.kosh/bindings.js +1 -1
- package/dist/purchase_portal/.kosh/schema.d.ts +813 -3
- package/dist/purchase_portal/i18n/bn.d.ts +2 -0
- package/dist/purchase_portal/i18n/bn.js +5 -0
- package/dist/purchase_portal/index.js +2 -0
- package/dist/purchase_portal/module.d.ts +6849 -353
- package/dist/purchase_stock/.kosh/bindings.js +1 -1
- package/dist/purchase_stock/.kosh/schema.d.ts +910 -4
- package/dist/purchase_stock/i18n/bn.d.ts +2 -0
- package/dist/purchase_stock/i18n/bn.js +19 -0
- package/dist/purchase_stock/index.d.ts +1 -1
- package/dist/purchase_stock/index.js +29 -0
- package/dist/purchase_stock/module.d.ts +12410 -1864
- package/dist/purchase_stock/module.js +81 -9
- package/dist/purchase_stock/scorecard.d.ts +22 -0
- package/dist/purchase_stock/scorecard.js +77 -0
- package/dist/purchase_stock/web/Scorecard.d.ts +7 -0
- package/dist/purchase_stock/web/Scorecard.js +22 -0
- package/dist/purchase_stock/web/index.d.ts +11 -0
- package/dist/purchase_stock/web/index.js +16 -0
- package/dist/purchase_stock/web/messages.d.ts +2 -0
- package/dist/purchase_stock/web/messages.js +27 -0
- package/dist/purchase_stock_account/.kosh/bindings.js +1 -1
- package/dist/purchase_stock_account/.kosh/schema.d.ts +1286 -58
- package/dist/purchase_stock_account/i18n/bn.d.ts +2 -0
- package/dist/purchase_stock_account/i18n/bn.js +8 -0
- package/dist/purchase_stock_account/index.js +18 -0
- package/dist/purchase_stock_account/module.d.ts +7 -37995
- package/dist/purchase_stock_account/module.js +24 -3
- package/dist/recruitment/.kosh/bindings.js +1 -1
- package/dist/recruitment/.kosh/schema.d.ts +59 -1
- package/dist/recruitment/i18n/bn.d.ts +2 -0
- package/dist/recruitment/i18n/bn.js +93 -0
- package/dist/recruitment/index.js +64 -0
- package/dist/recruitment/module.d.ts +458 -8
- package/dist/recruitment/module.js +11 -3
- package/dist/reporting/documents.d.ts +5 -0
- package/dist/reporting/documents.js +11 -1
- package/dist/reporting/index.d.ts +1 -1
- package/dist/reporting/index.js +1 -1
- package/dist/reporting/web/CalendarView.d.ts +18 -5
- package/dist/reporting/web/CalendarView.js +163 -29
- package/dist/reporting/web/messages.js +18 -0
- package/dist/sale_account/.kosh/bindings.js +1 -1
- package/dist/sale_account/.kosh/schema.d.ts +642 -16
- package/dist/sale_account/i18n/bn.d.ts +2 -0
- package/dist/sale_account/i18n/bn.js +48 -0
- package/dist/sale_account/index.d.ts +1 -1
- package/dist/sale_account/index.js +102 -4
- package/dist/sale_account/module.d.ts +8254 -2212
- package/dist/sale_account/module.js +535 -46
- package/dist/sale_crm/.kosh/bindings.d.ts +22 -0
- package/dist/sale_crm/.kosh/bindings.js +15 -0
- package/dist/{mrp → sale_crm}/.kosh/schema.d.ts +389 -567
- package/dist/sale_crm/i18n/bn.d.ts +2 -0
- package/dist/sale_crm/i18n/bn.js +9 -0
- package/dist/sale_crm/index.d.ts +7 -0
- package/dist/sale_crm/index.js +104 -0
- package/dist/sale_crm/module.d.ts +5609 -0
- package/dist/sale_crm/module.js +73 -0
- package/dist/sale_portal/.kosh/bindings.js +1 -1
- package/dist/sale_portal/.kosh/schema.d.ts +291 -4
- package/dist/sale_portal/i18n/bn.d.ts +2 -0
- package/dist/sale_portal/i18n/bn.js +7 -0
- package/dist/sale_portal/index.js +10 -0
- package/dist/sale_portal/module.d.ts +2564 -294
- package/dist/sale_project/.kosh/bindings.js +1 -1
- package/dist/sale_project/.kosh/schema.d.ts +354 -5
- package/dist/sale_project/i18n/bn.d.ts +2 -0
- package/dist/sale_project/i18n/bn.js +12 -0
- package/dist/sale_project/index.js +2 -0
- package/dist/sale_project/module.d.ts +6249 -2402
- package/dist/sale_stock/.kosh/bindings.js +1 -1
- package/dist/sale_stock/.kosh/schema.d.ts +387 -5
- package/dist/sale_stock/i18n/bn.d.ts +2 -0
- package/dist/sale_stock/i18n/bn.js +15 -0
- package/dist/sale_stock/index.js +2 -0
- package/dist/sale_stock/module.d.ts +8057 -1759
- package/dist/sale_stock/module.js +20 -3
- package/dist/sales/.kosh/bindings.js +1 -1
- package/dist/sales/.kosh/schema.d.ts +291 -4
- package/dist/sales/i18n/bn.d.ts +2 -0
- package/dist/sales/i18n/bn.js +128 -0
- package/dist/sales/index.js +120 -5
- package/dist/sales/module.d.ts +3567 -633
- package/dist/sales/module.js +306 -11
- package/dist/server/api/duplicate.d.ts +14 -0
- package/dist/server/api/duplicate.js +75 -0
- package/dist/server/api/explain.d.ts +70 -0
- package/dist/server/api/explain.js +111 -0
- package/dist/server/api/metadata.d.ts +2 -0
- package/dist/server/api/metadata.js +9 -0
- package/dist/server/api/openapi.js +15 -0
- package/dist/server/api/rest.d.ts +1 -0
- package/dist/server/api/rest.js +76 -12
- package/dist/server/api/views.js +1 -1
- package/dist/server/apps.d.ts +16 -1
- package/dist/server/apps.js +164 -2
- package/dist/server/auth/base.js +2 -0
- package/dist/server/auth/service.d.ts +8 -0
- package/dist/server/auth/service.js +19 -0
- package/dist/server/events.d.ts +13 -0
- package/dist/server/events.js +22 -0
- package/dist/server/i18n.d.ts +27 -0
- package/dist/server/i18n.js +143 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +2 -0
- package/dist/server/server.js +6 -0
- package/dist/settings/company.d.ts +3 -1
- package/dist/settings/company.js +26 -5
- package/dist/settings/routes.d.ts +10 -0
- package/dist/settings/routes.js +19 -3
- package/dist/settings/web/AppsPage.d.ts +3 -2
- package/dist/settings/web/AppsPage.js +26 -8
- package/dist/settings/web/CompaniesPage.js +91 -6
- package/dist/settings/web/messages.js +64 -0
- package/dist/sign/.kosh/bindings.js +1 -1
- package/dist/sign/.kosh/schema.d.ts +2 -1
- package/dist/sign/i18n/bn.d.ts +2 -0
- package/dist/sign/i18n/bn.js +97 -0
- package/dist/sign/index.d.ts +15 -0
- package/dist/sign/index.js +129 -1
- package/dist/sign/module.d.ts +40 -0
- package/dist/sign/module.js +11 -2
- package/dist/stock/.kosh/bindings.js +1 -1
- package/dist/stock/.kosh/schema.d.ts +298 -2
- package/dist/stock/i18n/bn.d.ts +2 -0
- package/dist/stock/i18n/bn.js +311 -0
- package/dist/stock/index.d.ts +3 -1
- package/dist/stock/index.js +442 -3
- package/dist/stock/ledger.d.ts +78 -0
- package/dist/stock/ledger.js +582 -0
- package/dist/stock/module.d.ts +5280 -2044
- package/dist/stock/module.js +222 -23
- package/dist/stock/replenish.js +16 -1
- package/dist/stock/returns.d.ts +157 -0
- package/dist/stock/returns.js +163 -0
- package/dist/stock/web/Ledger.d.ts +9 -0
- package/dist/stock/web/Ledger.js +108 -0
- package/dist/stock/web/Operations.d.ts +8 -0
- package/dist/stock/web/Operations.js +33 -0
- package/dist/stock/web/ReturnButton.d.ts +7 -0
- package/dist/stock/web/ReturnButton.js +62 -0
- package/dist/stock/web/index.d.ts +3 -0
- package/dist/stock/web/index.js +9 -0
- package/dist/stock/web/messages.js +154 -0
- package/dist/stock_account/.kosh/bindings.js +1 -1
- package/dist/stock_account/.kosh/schema.d.ts +682 -9
- package/dist/stock_account/i18n/bn.d.ts +2 -0
- package/dist/stock_account/i18n/bn.js +73 -0
- package/dist/stock_account/index.d.ts +1 -0
- package/dist/stock_account/index.js +131 -3
- package/dist/stock_account/landed.d.ts +429 -0
- package/dist/stock_account/landed.js +335 -0
- package/dist/stock_account/module.d.ts +11247 -3363
- package/dist/stock_account/module.js +135 -6
- package/dist/stock_account/web/LandedPreview.d.ts +7 -0
- package/dist/stock_account/web/LandedPreview.js +23 -0
- package/dist/stock_account/web/index.d.ts +11 -0
- package/dist/stock_account/web/index.js +16 -0
- package/dist/stock_account/web/messages.d.ts +2 -0
- package/dist/stock_account/web/messages.js +27 -0
- package/dist/todo/i18n/bn.d.ts +2 -0
- package/dist/todo/i18n/bn.js +66 -0
- package/dist/todo/index.js +59 -0
- package/dist/todo/module.d.ts +5 -0
- package/dist/todo/module.js +5 -3
- package/dist/trade_finance/.kosh/bindings.js +1 -1
- package/dist/trade_finance/.kosh/schema.d.ts +2 -1
- package/dist/trade_finance/i18n/bn.d.ts +2 -0
- package/dist/trade_finance/i18n/bn.js +162 -0
- package/dist/trade_finance/index.js +93 -0
- package/dist/trade_finance/module.d.ts +26 -0
- package/dist/trade_finance/module.js +27 -8
- package/dist/trade_finance_account/.kosh/bindings.js +1 -1
- package/dist/trade_finance_account/.kosh/schema.d.ts +530 -8
- package/dist/trade_finance_account/i18n/bn.d.ts +2 -0
- package/dist/trade_finance_account/i18n/bn.js +27 -0
- package/dist/trade_finance_account/index.js +2 -0
- package/dist/trade_finance_account/module.d.ts +4906 -1432
- package/dist/trade_finance_account/module.js +1 -0
- package/dist/trade_finance_purchase/.kosh/bindings.js +1 -1
- package/dist/trade_finance_purchase/.kosh/schema.d.ts +813 -3
- package/dist/trade_finance_purchase/i18n/bn.d.ts +2 -0
- package/dist/trade_finance_purchase/i18n/bn.js +6 -0
- package/dist/trade_finance_purchase/index.js +2 -0
- package/dist/trade_finance_purchase/module.d.ts +6909 -413
- package/dist/trade_finance_sale/.kosh/bindings.js +1 -1
- package/dist/trade_finance_sale/.kosh/schema.d.ts +291 -4
- package/dist/trade_finance_sale/i18n/bn.d.ts +2 -0
- package/dist/trade_finance_sale/i18n/bn.js +6 -0
- package/dist/trade_finance_sale/index.js +2 -0
- package/dist/trade_finance_sale/module.d.ts +2601 -331
- package/dist/ui/api.d.ts +2 -0
- package/dist/ui/app.d.ts +9 -0
- package/dist/ui/app.js +24 -4
- package/dist/ui/components/AppIcon.js +2 -2
- package/dist/ui/components/Explain.d.ts +69 -0
- package/dist/ui/components/Explain.js +62 -0
- package/dist/ui/context.d.ts +8 -1
- package/dist/ui/context.js +34 -1
- package/dist/ui/i18n/messages.d.ts +36 -0
- package/dist/ui/i18n/messages.js +72 -0
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +1 -0
- package/dist/ui/registry.d.ts +14 -0
- package/dist/ui/registry.js +10 -0
- package/dist/ui/views/FormView.d.ts +6 -0
- package/dist/ui/views/FormView.js +47 -10
- package/dist/ui/views/ListView.d.ts +8 -0
- package/dist/ui/views/ListView.js +10 -3
- package/dist/ui/views/StatsRow.js +2 -1
- package/dist/views/extend.js +12 -0
- package/dist/views/types.d.ts +13 -2
- package/dist/views/validate.js +8 -1
- package/dist/website/.kosh/bindings.js +1 -1
- package/dist/website/.kosh/schema.d.ts +2 -1
- package/dist/website/i18n/bn.d.ts +2 -0
- package/dist/website/i18n/bn.js +113 -0
- package/dist/website/index.js +36 -0
- package/dist/website/module.d.ts +20 -0
- package/dist/website/module.js +29 -5
- package/dist/website_crm/.kosh/bindings.js +1 -1
- package/dist/website_crm/.kosh/schema.d.ts +2 -1
- package/dist/website_crm/i18n/bn.d.ts +2 -0
- package/dist/website_crm/i18n/bn.js +5 -0
- package/dist/website_crm/index.js +2 -0
- package/dist/website_crm/module.d.ts +40 -0
- package/dist/website_sale/.kosh/bindings.js +1 -1
- package/dist/website_sale/.kosh/schema.d.ts +642 -17
- package/dist/website_sale/i18n/bn.d.ts +2 -0
- package/dist/website_sale/i18n/bn.js +132 -0
- package/dist/website_sale/index.js +83 -1
- package/dist/website_sale/module.d.ts +18705 -5550
- package/dist/website_sale/module.js +32 -10
- package/dist/website_sale/shop.js +22 -9
- package/dist/website_sale_stock/.kosh/bindings.js +1 -1
- package/dist/website_sale_stock/.kosh/schema.d.ts +737 -18
- package/dist/website_sale_stock/i18n/bn.d.ts +2 -0
- package/dist/website_sale_stock/i18n/bn.js +4 -0
- package/dist/website_sale_stock/index.js +2 -0
- package/dist/website_sale_stock/module.d.ts +10 -24997
- package/dist/website_sale_stock/module.js +7 -3
- package/package.json +36 -8
- package/dist/mrp/index.d.ts +0 -3
- package/dist/mrp/index.js +0 -393
- package/dist/mrp/module.js +0 -757
- package/dist/mrp_account/index.d.ts +0 -3
- package/dist/mrp_account/index.js +0 -22
- /package/dist/{mrp → approvals_purchase}/.kosh/bindings.d.ts +0 -0
- /package/dist/{mrp_account → indent}/.kosh/bindings.d.ts +0 -0
package/dist/l10n_in/module.js
CHANGED
|
@@ -262,7 +262,10 @@ export const GstEinvoice = defineModel('l10n_in.einvoice', {
|
|
|
262
262
|
fields: {
|
|
263
263
|
move: f.many2one('account.move', { required: true, ondelete: 'cascade' }),
|
|
264
264
|
/** E-invoicing (RFC 0016 step 5, part 4): the IRP's answer, written only by the registration. */
|
|
265
|
-
einvoiceStatus: f.selection(EINVOICE_STATES, {
|
|
265
|
+
einvoiceStatus: f.selection(EINVOICE_STATES, {
|
|
266
|
+
label: 'E-invoice',
|
|
267
|
+
help: 'Whether the invoice was registered at the Invoice Registration Portal and got its IRN, failed, or was cancelled there.',
|
|
268
|
+
}),
|
|
266
269
|
irn: f.char({ size: 64, label: 'IRN' }),
|
|
267
270
|
irnAckNo: f.char({ size: 20, label: 'Acknowledgement number' }),
|
|
268
271
|
irnAckDate: f.datetime({ label: 'Acknowledged at' }),
|
|
@@ -274,9 +277,15 @@ export const GstEinvoice = defineModel('l10n_in.einvoice', {
|
|
|
274
277
|
ewbNo: f.char({ size: 12, label: 'E-way bill' }),
|
|
275
278
|
ewbDate: f.datetime({ label: 'E-way bill generated at' }),
|
|
276
279
|
ewbValidUntil: f.datetime({ label: 'E-way bill valid until' }),
|
|
277
|
-
ewbStatus: f.selection({ generated: 'Generated', failed: 'Not generated: see the error', cancelled: 'Cancelled' }, {
|
|
280
|
+
ewbStatus: f.selection({ generated: 'Generated', failed: 'Not generated: see the error', cancelled: 'Cancelled' }, {
|
|
281
|
+
label: 'E-way bill status',
|
|
282
|
+
help: 'Whether the e-way bill for moving the goods was generated, failed or was cancelled.',
|
|
283
|
+
}),
|
|
278
284
|
ewbError: f.text({ label: 'E-way bill error' }),
|
|
279
|
-
ewbMode: f.selection({ road: 'Road', rail: 'Rail', air: 'Air', ship: 'Ship' }, {
|
|
285
|
+
ewbMode: f.selection({ road: 'Road', rail: 'Rail', air: 'Air', ship: 'Ship' }, {
|
|
286
|
+
label: 'Transport mode',
|
|
287
|
+
help: 'How the goods travel under the e-way bill: by road, rail, air or ship.',
|
|
288
|
+
}),
|
|
280
289
|
ewbVehicleNo: f.char({ size: 15, label: 'Vehicle number' }),
|
|
281
290
|
ewbTransporterId: f.char({ size: 15, label: 'Transporter ID' }),
|
|
282
291
|
ewbDistanceKm: f.integer({ label: 'Distance (km)' }),
|
|
@@ -332,6 +341,7 @@ export const MoveGst = extendModel('account.move', {
|
|
|
332
341
|
/** E-invoicing (RFC 0016 step 5, part 4): the IRP's answer (its record's). */
|
|
333
342
|
einvoiceStatus: f.selection(EINVOICE_STATES, {
|
|
334
343
|
label: 'E-invoice',
|
|
344
|
+
help: 'Whether the invoice was registered at the Invoice Registration Portal and got its IRN, failed, or was cancelled there.',
|
|
335
345
|
store: true,
|
|
336
346
|
...fromEinvoice,
|
|
337
347
|
}),
|
|
@@ -346,9 +356,19 @@ export const MoveGst = extendModel('account.move', {
|
|
|
346
356
|
ewbNo: f.char({ size: 12, label: 'E-way bill', store: true, ...fromEinvoice }),
|
|
347
357
|
ewbDate: f.datetime({ label: 'E-way bill generated at', store: true, ...fromEinvoice }),
|
|
348
358
|
ewbValidUntil: f.datetime({ label: 'E-way bill valid until', store: true, ...fromEinvoice }),
|
|
349
|
-
ewbStatus: f.selection({ generated: 'Generated', failed: 'Not generated: see the error', cancelled: 'Cancelled' }, {
|
|
359
|
+
ewbStatus: f.selection({ generated: 'Generated', failed: 'Not generated: see the error', cancelled: 'Cancelled' }, {
|
|
360
|
+
label: 'E-way bill status',
|
|
361
|
+
help: 'Whether the e-way bill for moving the goods was generated, failed or was cancelled.',
|
|
362
|
+
store: true,
|
|
363
|
+
...fromEinvoice,
|
|
364
|
+
}),
|
|
350
365
|
ewbError: f.text({ label: 'E-way bill error', store: true, ...fromEinvoice }),
|
|
351
|
-
ewbMode: f.selection({ road: 'Road', rail: 'Rail', air: 'Air', ship: 'Ship' }, {
|
|
366
|
+
ewbMode: f.selection({ road: 'Road', rail: 'Rail', air: 'Air', ship: 'Ship' }, {
|
|
367
|
+
label: 'Transport mode',
|
|
368
|
+
help: 'How the goods travel under the e-way bill: by road, rail, air or ship.',
|
|
369
|
+
store: true,
|
|
370
|
+
...fromEinvoice,
|
|
371
|
+
}),
|
|
352
372
|
ewbVehicleNo: f.char({ size: 15, label: 'Vehicle number', store: true, ...fromEinvoice }),
|
|
353
373
|
ewbTransporterId: f.char({ size: 15, label: 'Transporter ID', store: true, ...fromEinvoice }),
|
|
354
374
|
ewbDistanceKm: f.integer({ label: 'Distance (km)', store: true, ...fromEinvoice }),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* The company's GST settings (RFC 0016 step 5, part 4), on the GST returns page: GSTIN, PAN, the address and PIN code
|
|
4
4
|
* the IRP needs, and e-invoicing on or off. Managers change them; the server checks the GSTIN against the company's
|
|
@@ -27,7 +27,7 @@ export function GstSettings({ api }) {
|
|
|
27
27
|
});
|
|
28
28
|
const current = settings.data;
|
|
29
29
|
if (current === undefined)
|
|
30
|
-
return _jsx(
|
|
30
|
+
return _jsx("div", {});
|
|
31
31
|
const value = (key) => String(edits[key] ?? current[key] ?? '');
|
|
32
32
|
const einvoice = Boolean(edits.einvoiceEnabled ?? current.einvoiceEnabled);
|
|
33
33
|
return (_jsxs("section", { className: "grid max-w-3xl gap-3 rounded-lg border p-4", "aria-labelledby": `${id}-title`, children: [_jsx("h2", { id: `${id}-title`, className: "font-medium", children: t('settings.title') }), _jsx("p", { className: "text-sm text-muted-foreground", children: current.provider === null
|
|
@@ -236,9 +236,7 @@ export async function processInbound(context, logId, mail) {
|
|
|
236
236
|
message: null,
|
|
237
237
|
});
|
|
238
238
|
const recipientEmail = await context.shutro.bootstrap({ reason: 'inbound email' }, async (su) => {
|
|
239
|
-
const [user] = await rows(su, 'res.users', { id: target.uid
|
|
240
|
-
'email',
|
|
241
|
-
]);
|
|
239
|
+
const [user] = await rows(su.withFlags({ activeTest: false }), 'res.users', { id: target.uid }, ['email']);
|
|
242
240
|
return typeof user?.['email'] === 'string' ? user['email'].toLowerCase() : '';
|
|
243
241
|
});
|
|
244
242
|
if (sender !== '' && sender === recipientEmail) {
|
|
@@ -377,7 +375,7 @@ async function recordBounce(context, mail) {
|
|
|
377
375
|
]);
|
|
378
376
|
if (n === undefined || typeof n['actor'] !== 'number' || n['actor'] === n['user'])
|
|
379
377
|
continue;
|
|
380
|
-
const [recipient] = await rows(su, 'res.users', { id: n['user']
|
|
378
|
+
const [recipient] = await rows(su.withFlags({ activeTest: false }), 'res.users', { id: n['user'] }, ['name', 'email']);
|
|
381
379
|
const [record] = (await ref(su, String(n['resModel']))
|
|
382
380
|
.browse([n['resId']])
|
|
383
381
|
.load(['displayName'])).read(['displayName']);
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { messagingShutro } from '../../messaging/index.js';
|
|
8
8
|
import { orm } from '../../server/orm.js';
|
|
9
|
+
import { storageShutro } from '../../storage/index.js';
|
|
10
|
+
import { SEND_MODELS } from '../send.js';
|
|
9
11
|
const { defineGroup, defineModel, defineModule, f } = orm;
|
|
10
12
|
export const INBOUND_STATES = [
|
|
11
13
|
'received',
|
|
@@ -53,8 +55,8 @@ const InboundMessage = defineModel('mail.inbound_message', {
|
|
|
53
55
|
});
|
|
54
56
|
export const mailShutro = defineModule({
|
|
55
57
|
name: 'mail',
|
|
56
|
-
version: '0.
|
|
57
|
-
depends: [messagingShutro],
|
|
58
|
+
version: '0.2.0',
|
|
59
|
+
depends: [messagingShutro, storageShutro],
|
|
58
60
|
groups: [
|
|
59
61
|
defineGroup({
|
|
60
62
|
code: 'mail.manager',
|
|
@@ -62,5 +64,5 @@ export const mailShutro = defineModule({
|
|
|
62
64
|
implies: ['base.user', 'messaging.user'],
|
|
63
65
|
}),
|
|
64
66
|
],
|
|
65
|
-
models: [InboundMessage],
|
|
67
|
+
models: [InboundMessage, ...SEND_MODELS],
|
|
66
68
|
});
|
package/dist/mail/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { defineModule } from '../modules-sdk/index.js';
|
|
2
2
|
import { type ImapConfig } from './inbound/index.js';
|
|
3
|
+
export { type BatchResult, type Composition, installMailTemplates, type SendEngine, sendablesOf, } from './send.js';
|
|
3
4
|
import { type InboundConfig } from './inbound/token.js';
|
|
4
5
|
export * from './inbound/index.js';
|
|
5
6
|
/** One outbound message. */
|
|
@@ -10,6 +11,14 @@ export interface OutboundMail {
|
|
|
10
11
|
readonly text: string;
|
|
11
12
|
readonly html: string;
|
|
12
13
|
readonly replyTo?: string;
|
|
14
|
+
/** Copies (RFC 0029 §3.3). */
|
|
15
|
+
readonly cc?: readonly string[];
|
|
16
|
+
/** Files sent with it: a document's PDF. */
|
|
17
|
+
readonly attachments?: readonly {
|
|
18
|
+
readonly filename: string;
|
|
19
|
+
readonly content: Uint8Array;
|
|
20
|
+
readonly contentType: string;
|
|
21
|
+
}[];
|
|
13
22
|
}
|
|
14
23
|
/** Sends messages; the provider's id of each, when it gives one. */
|
|
15
24
|
export interface Mailer {
|
|
@@ -68,8 +77,10 @@ export interface MailOptions {
|
|
|
68
77
|
readonly webhookSecret?: string | undefined;
|
|
69
78
|
/** The mailbox to poll; default `IMAP_URL`. Without one, no poller runs. */
|
|
70
79
|
readonly imap?: ImapConfig | undefined;
|
|
71
|
-
/** Start the poller (default: unless `KOSH_SCHEDULES=off`). */
|
|
80
|
+
/** Start the poller and the sender (default: unless `KOSH_SCHEDULES=off`). */
|
|
72
81
|
readonly workers?: boolean | undefined;
|
|
82
|
+
/** The mailer documents are sent with (RFC 0029 §3.3); default: `SMTP_URL`. `null`: none. */
|
|
83
|
+
readonly mailer?: Mailer | null | undefined;
|
|
73
84
|
}
|
|
74
85
|
/** The mail module with explicit settings. */
|
|
75
86
|
export declare function mailModule(options?: MailOptions): ReturnType<typeof defineModule>;
|
package/dist/mail/index.js
CHANGED
|
@@ -9,11 +9,14 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { chatterContext, messaging } from '../messaging/index.js';
|
|
11
11
|
import { defineModule } from '../modules-sdk/index.js';
|
|
12
|
-
import { base } from '../server/index.js';
|
|
12
|
+
import { base, HttpProblem } from '../server/index.js';
|
|
13
13
|
import { storage, storageOf } from '../storage/index.js';
|
|
14
|
+
import { form, list } from '../views/index.js';
|
|
14
15
|
import nodemailer from 'nodemailer';
|
|
15
16
|
import { imapConfigFromEnv, registerInboundRoutes, startPoller, } from './inbound/index.js';
|
|
16
17
|
import { mailShutro } from './inbound/models.js';
|
|
18
|
+
import { installMailTemplates, sendEngine } from './send.js';
|
|
19
|
+
export { installMailTemplates, sendablesOf, } from './send.js';
|
|
17
20
|
import { inboundConfigFromEnv } from './inbound/token.js';
|
|
18
21
|
export * from './inbound/index.js';
|
|
19
22
|
/** The SMTP mailer: `url` is `smtp://user:pass@host:port` (or `smtps://` for implicit TLS). */
|
|
@@ -30,6 +33,16 @@ export function createSmtpMailer(options) {
|
|
|
30
33
|
text: mail.text,
|
|
31
34
|
html: mail.html,
|
|
32
35
|
...(mail.replyTo === undefined ? {} : { replyTo: mail.replyTo }),
|
|
36
|
+
...(mail.cc === undefined || mail.cc.length === 0 ? {} : { cc: [...mail.cc] }),
|
|
37
|
+
...(mail.attachments === undefined
|
|
38
|
+
? {}
|
|
39
|
+
: {
|
|
40
|
+
attachments: mail.attachments.map((a) => ({
|
|
41
|
+
filename: a.filename,
|
|
42
|
+
content: Buffer.from(a.content),
|
|
43
|
+
contentType: a.contentType,
|
|
44
|
+
})),
|
|
45
|
+
}),
|
|
33
46
|
});
|
|
34
47
|
return { id: typeof info.messageId === 'string' ? info.messageId : null };
|
|
35
48
|
},
|
|
@@ -126,19 +139,79 @@ export function mailModule(options = {}) {
|
|
|
126
139
|
icon: 'mail',
|
|
127
140
|
sequence: 950,
|
|
128
141
|
category: 'Administration',
|
|
129
|
-
summary: '
|
|
142
|
+
summary: 'Documents sent with their PDF, email templates, and replies posted on records or quarantined',
|
|
130
143
|
},
|
|
131
144
|
accessLevels: {
|
|
132
145
|
manager: { label: 'Email manager (the inbound log)', groups: ['mail.manager'] },
|
|
133
146
|
},
|
|
134
147
|
actions: {
|
|
135
148
|
'mail.action_inbound': { type: 'client', page: 'mail.Inbound', label: 'Inbound email' },
|
|
149
|
+
'mail.action_templates': {
|
|
150
|
+
model: 'mail.template',
|
|
151
|
+
label: 'Email templates',
|
|
152
|
+
views: ['list', 'form'],
|
|
153
|
+
},
|
|
154
|
+
'mail.action_outgoing': { model: 'mail.outgoing', label: 'Sent', views: ['list', 'form'] },
|
|
136
155
|
},
|
|
137
156
|
menus: [
|
|
138
157
|
{ id: 'mail.root', label: 'Email', app: 'mail' },
|
|
139
158
|
{ id: 'mail.inbound', parent: 'mail.root', label: 'Inbound', action: 'mail.action_inbound' },
|
|
159
|
+
{
|
|
160
|
+
id: 'mail.outgoing',
|
|
161
|
+
parent: 'mail.root',
|
|
162
|
+
label: 'Sent',
|
|
163
|
+
action: 'mail.action_outgoing',
|
|
164
|
+
sequence: 2,
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: 'mail.templates',
|
|
168
|
+
parent: 'mail.root',
|
|
169
|
+
label: 'Email templates',
|
|
170
|
+
action: 'mail.action_templates',
|
|
171
|
+
sequence: 3,
|
|
172
|
+
},
|
|
140
173
|
],
|
|
174
|
+
views: {
|
|
175
|
+
'mail.template.list': list('mail.template', {
|
|
176
|
+
columns: ['name', 'targetModel', 'subject', 'document'],
|
|
177
|
+
}),
|
|
178
|
+
'mail.template.form': form('mail.template', (k) => ({
|
|
179
|
+
header: { buttons: [] },
|
|
180
|
+
sheet: [
|
|
181
|
+
k.group('main', ['name', 'targetModel', 'subject', 'body', 'document'], {
|
|
182
|
+
columns: 1,
|
|
183
|
+
description: 'Placeholders like {{name}} or {{partner.name}} are filled from the document; each language keeps its own text.',
|
|
184
|
+
}),
|
|
185
|
+
],
|
|
186
|
+
})),
|
|
187
|
+
'mail.outgoing.list': list('mail.outgoing', {
|
|
188
|
+
columns: ['createdAt', 'to', 'subject', 'resModel', 'author', 'state'],
|
|
189
|
+
}),
|
|
190
|
+
'mail.outgoing.form': form('mail.outgoing', (k) => ({
|
|
191
|
+
header: { buttons: [], statusbar: 'state' },
|
|
192
|
+
sheet: [
|
|
193
|
+
k.group('main', ['to', 'cc', 'subject', 'resModel', 'resId', 'author', 'sentAt']),
|
|
194
|
+
k.group('content', ['text', 'attachments', 'error', 'providerId'], { columns: 1 }),
|
|
195
|
+
],
|
|
196
|
+
})),
|
|
197
|
+
},
|
|
198
|
+
search: {
|
|
199
|
+
'mail.template': {
|
|
200
|
+
fields: ['name', 'targetModel', 'subject'],
|
|
201
|
+
},
|
|
202
|
+
'mail.outgoing': {
|
|
203
|
+
fields: ['to', 'subject'],
|
|
204
|
+
filters: {
|
|
205
|
+
failed: { label: 'Failed', domain: { state: 'failed' }, group: 'state' },
|
|
206
|
+
queued: { label: 'Queued', domain: { state: 'queued' }, group: 'state' },
|
|
207
|
+
},
|
|
208
|
+
groupBy: ['state', 'resModel'],
|
|
209
|
+
},
|
|
210
|
+
},
|
|
141
211
|
privateModels: ['mail.inbound_message'],
|
|
212
|
+
hooks: {
|
|
213
|
+
defaults: async (env, modules) => `${await installMailTemplates(env, modules)} email template(s) installed`,
|
|
214
|
+
},
|
|
142
215
|
routes: (context) => {
|
|
143
216
|
const inbound = {
|
|
144
217
|
shutro: context.shutro,
|
|
@@ -152,9 +225,73 @@ export function mailModule(options = {}) {
|
|
|
152
225
|
registerInboundRoutes(context, inbound, {
|
|
153
226
|
webhookSecret: options.webhookSecret ?? process.env['MAIL_INBOUND_WEBHOOK_SECRET'],
|
|
154
227
|
});
|
|
228
|
+
// Sending documents (RFC 0029 §3.3).
|
|
229
|
+
const outbound = options.mailer === undefined ? mailerFromEnv() : (options.mailer ?? undefined);
|
|
230
|
+
const engine = sendEngine(context, () => outbound);
|
|
231
|
+
const target = (params) => {
|
|
232
|
+
const p = params;
|
|
233
|
+
const id = Number(p.id);
|
|
234
|
+
if (typeof p.model !== 'string' || !Number.isSafeInteger(id) || id <= 0)
|
|
235
|
+
throw new HttpProblem(400, 'invalid-path', 'Invalid record', 'A model and a record id.');
|
|
236
|
+
return { model: p.model, id };
|
|
237
|
+
};
|
|
238
|
+
context.app.get('/api/v1/mail/sendable', async () => ({
|
|
239
|
+
models: [...engine.sendables.keys()],
|
|
240
|
+
mailer: outbound !== undefined,
|
|
241
|
+
}));
|
|
242
|
+
context.app.get('/api/v1/mail/compose/:model/:id', async (request) => {
|
|
243
|
+
const { model, id } = target(request.params);
|
|
244
|
+
return request.env((env) => engine.compose(env, model, id));
|
|
245
|
+
});
|
|
246
|
+
context.app.post('/api/v1/mail/send/:model/:id', async (request) => {
|
|
247
|
+
const { model, id } = target(request.params);
|
|
248
|
+
return request.env((env) => engine.send(env, model, id, (request.body ?? {})), { write: true });
|
|
249
|
+
});
|
|
250
|
+
context.app.post('/api/v1/mail/send-many/:model', async (request) => {
|
|
251
|
+
const model = request.params.model;
|
|
252
|
+
const ids = request.body?.ids;
|
|
253
|
+
if (typeof model !== 'string' ||
|
|
254
|
+
!Array.isArray(ids) ||
|
|
255
|
+
!ids.every((i) => Number.isSafeInteger(i) && i > 0))
|
|
256
|
+
throw new HttpProblem(400, 'invalid-body', 'Invalid batch', '{ ids: [record ids] }.');
|
|
257
|
+
return request.env((env) => engine.sendMany(env, model, ids), {
|
|
258
|
+
write: true,
|
|
259
|
+
});
|
|
260
|
+
});
|
|
155
261
|
// Background work is off in the CLI (kosh init, migrate), like the schedules.
|
|
156
262
|
if (!(options.workers ?? process.env['KOSH_SCHEDULES'] !== 'off'))
|
|
157
263
|
return;
|
|
264
|
+
// Documents sent by themselves (`autoSend`): as the user whose change emitted the event.
|
|
265
|
+
for (const [model, spec] of engine.sendables) {
|
|
266
|
+
if (spec.autoSend === undefined)
|
|
267
|
+
continue;
|
|
268
|
+
const worker = context.shutro.subscribe(`mail.auto.${model}`, spec.autoSend.topic, async (event, env) => {
|
|
269
|
+
const id = Number(event.payload?.id);
|
|
270
|
+
if (!Number.isSafeInteger(id))
|
|
271
|
+
return;
|
|
272
|
+
try {
|
|
273
|
+
await engine.autoSend(env, model, id);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
// A document that cannot be sent (no template, no storage) is logged, never retried forever.
|
|
277
|
+
context.app.log.warn({ err: error, model, id }, 'automatic email not sent');
|
|
278
|
+
}
|
|
279
|
+
}, { pollMs: 2000 });
|
|
280
|
+
worker.start();
|
|
281
|
+
context.app.addHook('onClose', async () => {
|
|
282
|
+
await worker.stop();
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
const sender = context.shutro.subscribe('mail.send', 'mail.outgoing.queued', async (event, env) => {
|
|
286
|
+
const id = Number(event.payload?.outgoing);
|
|
287
|
+
if (!Number.isSafeInteger(id))
|
|
288
|
+
return;
|
|
289
|
+
await env.asSuperuser({ reason: 'email sent from a record' }, (su) => engine.deliver(su, id));
|
|
290
|
+
}, { pollMs: 2000 });
|
|
291
|
+
sender.start();
|
|
292
|
+
context.app.addHook('onClose', async () => {
|
|
293
|
+
await sender.stop();
|
|
294
|
+
});
|
|
158
295
|
const imap = options.imap ?? imapConfigFromEnv();
|
|
159
296
|
if (imap === undefined)
|
|
160
297
|
return;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { KoshModule, SendableSpec } from '../modules-sdk/index.js';
|
|
2
|
+
import { type ModuleContext } from '../server/index.js';
|
|
3
|
+
import { type Env } from '../server/orm.js';
|
|
4
|
+
import { type Mailer } from './index.js';
|
|
5
|
+
/** The models of sending documents, added to the mail module's. */
|
|
6
|
+
export declare const SEND_MODELS: readonly unknown[];
|
|
7
|
+
/** The sendable documents of the loaded modules, by model. */
|
|
8
|
+
export declare function sendablesOf(modules: readonly KoshModule[]): Map<string, SendableSpec>;
|
|
9
|
+
/** Installs the manifests' email templates that do not exist yet (by `module.key`). */
|
|
10
|
+
export declare function installMailTemplates(env: Env, modules: readonly KoshModule[]): Promise<number>;
|
|
11
|
+
/** What the Send dialog shows, filled in the partner's language. */
|
|
12
|
+
export interface Composition {
|
|
13
|
+
readonly to: readonly {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly email: string | null;
|
|
16
|
+
}[];
|
|
17
|
+
readonly subject: string;
|
|
18
|
+
readonly body: string;
|
|
19
|
+
/** The PDF that goes with it, or none. */
|
|
20
|
+
readonly attachment: string | null;
|
|
21
|
+
readonly lang: string;
|
|
22
|
+
/** Emails sent from this record so far, and the last one's date. */
|
|
23
|
+
readonly sent: number;
|
|
24
|
+
readonly lastSentAt: string | null;
|
|
25
|
+
}
|
|
26
|
+
/** The send engine of one server. */
|
|
27
|
+
export interface SendEngine {
|
|
28
|
+
readonly sendables: ReadonlyMap<string, SendableSpec>;
|
|
29
|
+
compose(env: Env, model: string, id: number): Promise<Composition>;
|
|
30
|
+
send(env: Env, model: string, id: number, input: {
|
|
31
|
+
to?: unknown;
|
|
32
|
+
cc?: unknown;
|
|
33
|
+
subject?: unknown;
|
|
34
|
+
body?: unknown;
|
|
35
|
+
attach?: unknown;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
outgoing: number;
|
|
38
|
+
message: number;
|
|
39
|
+
attachment: number | null;
|
|
40
|
+
}>;
|
|
41
|
+
deliver(su: Env, outgoing: number): Promise<void>;
|
|
42
|
+
/** Sends each record as its template says, to its partner; the ones that cannot be sent are said why. */
|
|
43
|
+
sendMany(env: Env, model: string, ids: readonly number[]): Promise<BatchResult>;
|
|
44
|
+
/** Sends a record by itself (an `autoSend` event) when its partner asked for it; whether it was sent. */
|
|
45
|
+
autoSend(env: Env, model: string, id: number): Promise<boolean>;
|
|
46
|
+
}
|
|
47
|
+
/** What a batch send did. */
|
|
48
|
+
export interface BatchResult {
|
|
49
|
+
readonly sent: number;
|
|
50
|
+
readonly skipped: readonly {
|
|
51
|
+
readonly id: number;
|
|
52
|
+
readonly reason: string;
|
|
53
|
+
}[];
|
|
54
|
+
}
|
|
55
|
+
/** The send engine of one server: the sendable documents, the models' metadata, the mailer. */
|
|
56
|
+
export declare function sendEngine(context: ModuleContext, mailer: () => Mailer | undefined): SendEngine;
|