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
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accounting › Reconcile bank (RFC 0029 §3.1): statements imported (CSV with its columns, OFX, CAMT.053), then the
|
|
3
|
+
* open lines one by one — the documents each may pay, proposed by the server with why, matched in one click; a line
|
|
4
|
+
* that pays nothing written off to an account. J / K move between lines. Reconciliation rules (§3.2) run on import
|
|
5
|
+
* or with Run rules; recently matched lines can be undone. The server proposes, matches and refuses.
|
|
6
|
+
*/
|
|
7
|
+
import { type PageProps } from '../../ui/index.js';
|
|
8
|
+
import { type ReactElement } from 'react';
|
|
9
|
+
export declare function BankReconcilePage({ api, label }: PageProps): ReactElement;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Accounting › Reconcile bank (RFC 0029 §3.1): statements imported (CSV with its columns, OFX, CAMT.053), then the
|
|
4
|
+
* open lines one by one — the documents each may pay, proposed by the server with why, matched in one click; a line
|
|
5
|
+
* that pays nothing written off to an account. J / K move between lines. Reconciliation rules (§3.2) run on import
|
|
6
|
+
* or with Run rules; recently matched lines can be undone. The server proposes, matches and refuses.
|
|
7
|
+
*/
|
|
8
|
+
import { Alert, Button, Checkbox, Input, Label, Select, useKosh } from '../../ui/index.js';
|
|
9
|
+
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
10
|
+
import { useEffect, useId, useState } from 'react';
|
|
11
|
+
import { useTranslation } from 'react-i18next';
|
|
12
|
+
export function BankReconcilePage({ api, label }) {
|
|
13
|
+
const { t } = useTranslation('accounting');
|
|
14
|
+
const { format } = useKosh();
|
|
15
|
+
const id = useId();
|
|
16
|
+
const queryClient = useQueryClient();
|
|
17
|
+
const [current, setCurrent] = useState(0);
|
|
18
|
+
const [chosen, setChosen] = useState(new Set());
|
|
19
|
+
const [account, setAccount] = useState(null);
|
|
20
|
+
const [message, setMessage] = useState(null);
|
|
21
|
+
// Import
|
|
22
|
+
const [journal, setJournal] = useState(null);
|
|
23
|
+
const [fileFormat, setFileFormat] = useState('csv');
|
|
24
|
+
const [columns, setColumns] = useState({ date: 'Date', label: 'Details', amount: 'Amount' });
|
|
25
|
+
const journals = useQuery({
|
|
26
|
+
queryKey: ['accounting', 'journals', 'bank'],
|
|
27
|
+
queryFn: () => api.list('account.journal', {
|
|
28
|
+
filter: { type: { in: ['bank', 'cash'] } },
|
|
29
|
+
fields: ['id', 'code', 'name'],
|
|
30
|
+
limit: 50,
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
const accounts = useQuery({
|
|
34
|
+
queryKey: ['accounting', 'accounts', 'all'],
|
|
35
|
+
queryFn: () => api.list('account.account', {
|
|
36
|
+
fields: ['id', 'code', 'name'],
|
|
37
|
+
order: ['code asc'],
|
|
38
|
+
limit: 500,
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
const lines = useQuery({
|
|
42
|
+
queryKey: ['accounting', 'statement-lines', 'open'],
|
|
43
|
+
queryFn: () => api.list('account.bank.statement.line', {
|
|
44
|
+
filter: { state: 'open' },
|
|
45
|
+
fields: ['id', 'date', 'label', 'reference', 'amount'],
|
|
46
|
+
order: ['date asc', 'id asc'],
|
|
47
|
+
limit: 200,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
const recent = useQuery({
|
|
51
|
+
queryKey: ['accounting', 'statement-lines', 'matched'],
|
|
52
|
+
queryFn: () => api.list('account.bank.statement.line', {
|
|
53
|
+
filter: { state: 'matched' },
|
|
54
|
+
fields: ['id', 'date', 'label', 'reference', 'amount'],
|
|
55
|
+
order: ['updatedAt desc', 'id desc'],
|
|
56
|
+
limit: 10,
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
const open = (lines.data?.items ?? []);
|
|
60
|
+
const line = open[Math.min(current, Math.max(0, open.length - 1))];
|
|
61
|
+
const proposals = useQuery({
|
|
62
|
+
queryKey: ['accounting', 'proposals', line?.id],
|
|
63
|
+
queryFn: () => api.call('GET', `/api/v1/accounting/statement-lines/${line?.id}/proposals`),
|
|
64
|
+
enabled: line !== undefined,
|
|
65
|
+
});
|
|
66
|
+
// A new line: the best proposal chosen, the rest not.
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
const best = proposals.data?.proposals[0];
|
|
69
|
+
setChosen(new Set(best === undefined ? [] : [best.move]));
|
|
70
|
+
}, [proposals.data]);
|
|
71
|
+
// J / K: the next and the previous line.
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
const onKey = (e) => {
|
|
74
|
+
if (e.target?.closest('input, textarea, select'))
|
|
75
|
+
return;
|
|
76
|
+
if (e.key === 'j')
|
|
77
|
+
setCurrent((c) => Math.min(c + 1, Math.max(0, open.length - 1)));
|
|
78
|
+
if (e.key === 'k')
|
|
79
|
+
setCurrent((c) => Math.max(c - 1, 0));
|
|
80
|
+
};
|
|
81
|
+
window.addEventListener('keydown', onKey);
|
|
82
|
+
return () => window.removeEventListener('keydown', onKey);
|
|
83
|
+
}, [open.length]);
|
|
84
|
+
const done = async (text) => {
|
|
85
|
+
setMessage(text);
|
|
86
|
+
await queryClient.invalidateQueries({ queryKey: ['accounting'] });
|
|
87
|
+
};
|
|
88
|
+
const match = useMutation({
|
|
89
|
+
mutationFn: () => api.call('POST', `/api/v1/accounting/statement-lines/${line?.id}/match`, {
|
|
90
|
+
moves: [...chosen],
|
|
91
|
+
}),
|
|
92
|
+
onSuccess: () => done(t('bank.matched')),
|
|
93
|
+
});
|
|
94
|
+
const writeOff = useMutation({
|
|
95
|
+
mutationFn: () => api.call('POST', `/api/v1/accounting/statement-lines/${line?.id}/write-off`, {
|
|
96
|
+
account: Number(account),
|
|
97
|
+
}),
|
|
98
|
+
onSuccess: () => done(t('bank.writtenOff')),
|
|
99
|
+
});
|
|
100
|
+
const undo = useMutation({
|
|
101
|
+
mutationFn: (lineId) => api.call('POST', `/api/v1/accounting/statement-lines/${lineId}/undo`),
|
|
102
|
+
onSuccess: () => done(t('bank.undone')),
|
|
103
|
+
});
|
|
104
|
+
const runRules = useMutation({
|
|
105
|
+
mutationFn: () => api.call('POST', '/api/v1/accounting/reconcile-rules/run'),
|
|
106
|
+
onSuccess: (r) => done(t('bank.rulesRun', { count: r.results.filter((x) => x.outcome !== 'suggest').length })),
|
|
107
|
+
});
|
|
108
|
+
const importFile = useMutation({
|
|
109
|
+
mutationFn: async (file) => api.call('POST', '/api/v1/accounting/statements/import', {
|
|
110
|
+
journal: Number(journal),
|
|
111
|
+
format: fileFormat,
|
|
112
|
+
content: await file.text(),
|
|
113
|
+
...(fileFormat === 'csv' ? { mapping: columns } : {}),
|
|
114
|
+
}),
|
|
115
|
+
onSuccess: (r) => done(t('bank.imported', { created: r.created, skipped: r.skipped }) +
|
|
116
|
+
(r.applied > 0 ? ` ${t('bank.rulesRun', { count: r.applied })}` : '')),
|
|
117
|
+
});
|
|
118
|
+
const error = match.error ?? writeOff.error ?? importFile.error ?? undo.error ?? runRules.error;
|
|
119
|
+
const matched = (recent.data?.items ?? []);
|
|
120
|
+
return (_jsxs("section", { "aria-labelledby": `${id}-title`, className: "grid gap-4", children: [_jsx("h1", { id: `${id}-title`, className: "text-lg font-semibold", children: label ?? t('bank.title') }), _jsxs("details", { className: "rounded-md border p-3", children: [_jsx("summary", { className: "cursor-pointer font-medium", children: t('bank.import') }), _jsxs("div", { className: "mt-3 grid gap-3 sm:grid-cols-2", children: [_jsx(Select, { id: `${id}-journal`, label: t('bank.journal'), value: journal, options: (journals.data?.items ?? []).map((j) => ({ value: String(j.id), label: `${j.code} ${j.name}` })), onChange: setJournal }), _jsx(Select, { id: `${id}-format`, label: t('bank.format'), value: fileFormat, options: [
|
|
121
|
+
{ value: 'csv', label: 'CSV' },
|
|
122
|
+
{ value: 'ofx', label: 'OFX' },
|
|
123
|
+
{ value: 'camt', label: 'CAMT.053' },
|
|
124
|
+
], onChange: setFileFormat }), fileFormat === 'csv'
|
|
125
|
+
? ['date', 'label', 'amount'].map((key) => (_jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-${key}`, children: t(`bank.column.${key}`) }), _jsx(Input, { id: `${id}-${key}`, value: columns[key], onChange: (e) => setColumns({ ...columns, [key]: e.target.value }) })] }, key)))
|
|
126
|
+
: null, _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-file`, children: t('bank.file') }), _jsx("input", { id: `${id}-file`, type: "file", disabled: journal === null || importFile.isPending, onChange: (e) => {
|
|
127
|
+
const file = e.target.files?.[0];
|
|
128
|
+
if (file !== undefined)
|
|
129
|
+
importFile.mutate(file);
|
|
130
|
+
} })] })] })] }), _jsx("div", { children: _jsx(Button, { busy: runRules.isPending, onClick: () => runRules.mutate(), children: t('bank.runRules') }) }), message === null ? null : _jsx(Alert, { tone: "info", children: message }), error === null ? null : _jsx(Alert, { children: error.message }), line === undefined ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('bank.nothingOpen') })) : (_jsxs("div", { className: "grid gap-4 lg:grid-cols-[18rem_1fr]", children: [_jsx("ol", { "aria-label": t('bank.lines'), className: "grid content-start gap-1", children: open.map((l, i) => (_jsx("li", { children: _jsxs("button", { type: "button", "aria-current": l.id === line.id, className: `w-full rounded-md px-2 py-1 text-start text-sm ${l.id === line.id ? 'bg-muted font-medium' : 'hover:bg-muted'}`, onClick: () => setCurrent(i), children: [_jsx("span", { className: "block truncate", children: l.label }), _jsxs("span", { className: "text-xs text-muted-foreground tabular-nums", children: [format.date(l.date), " \u00B7 ", l.amount] })] }) }, l.id))) }), _jsxs("div", { className: "grid content-start gap-3", children: [_jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "font-medium", children: line.label }), _jsxs("p", { className: "text-sm text-muted-foreground tabular-nums", children: [format.date(line.date), " \u00B7 ", line.reference ?? '', " \u00B7 ", line.amount] })] }), _jsxs("fieldset", { className: "grid gap-2", children: [_jsx("legend", { className: "font-medium", children: t('bank.proposals') }), (proposals.data?.proposals ?? []).length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('bank.noProposal') })) : ((proposals.data?.proposals ?? []).map((p) => (_jsxs("div", { className: "flex items-start gap-2 rounded-md border p-2 text-sm", children: [_jsx(Checkbox, { id: `${id}-proposal-${p.move}`, checked: chosen.has(p.move), onCheckedChange: (on) => {
|
|
131
|
+
const next = new Set(chosen);
|
|
132
|
+
if (on === true)
|
|
133
|
+
next.add(p.move);
|
|
134
|
+
else
|
|
135
|
+
next.delete(p.move);
|
|
136
|
+
setChosen(next);
|
|
137
|
+
} }), _jsxs("label", { htmlFor: `${id}-proposal-${p.move}`, className: "grid gap-0.5", children: [_jsxs("span", { className: "font-medium", children: [p.name, " \u00B7 ", p.partner ?? '', " \u00B7", ' ', _jsx("span", { className: "tabular-nums", children: p.residual })] }), _jsx("span", { className: "text-xs text-muted-foreground", children: t('bank.because', { reasons: p.reasons.join(', ') }) })] })] }, p.move)))), _jsx("div", { children: _jsx(Button, { variant: "primary", disabled: chosen.size === 0, busy: match.isPending, onClick: () => match.mutate(), children: t('bank.match') }) })] }), _jsxs("fieldset", { className: "grid gap-2 sm:grid-cols-[1fr_auto] sm:items-end", children: [_jsx("legend", { className: "font-medium", children: t('bank.writeOff') }), _jsx(Select, { id: `${id}-account`, label: t('bank.account'), value: account, options: (accounts.data?.items ?? []).map((a) => ({ value: String(a.id), label: `${a.code} ${a.name}` })), onChange: setAccount }), _jsx(Button, { disabled: account === null, busy: writeOff.isPending, onClick: () => writeOff.mutate(), children: t('bank.writeOffConfirm') })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: t('bank.keys') })] })] })), matched.length === 0 ? null : (_jsxs("section", { "aria-labelledby": `${id}-recent`, className: "grid gap-1", children: [_jsx("h2", { id: `${id}-recent`, className: "font-medium", children: t('bank.recent') }), _jsx("ul", { className: "grid gap-1", children: matched.map((l) => (_jsxs("li", { className: "flex items-center justify-between gap-2 text-sm", children: [_jsxs("span", { className: "truncate", children: [format.date(l.date), " \u00B7 ", l.label, " \u00B7", ' ', _jsx("span", { className: "tabular-nums", children: l.amount })] }), _jsx(Button, { size: "sm", variant: "ghost", busy: undo.isPending && undo.variables === l.id, onClick: () => undo.mutate(l.id), children: t('bank.undo') })] }, l.id))) })] }))] }));
|
|
138
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accounting › Follow-ups (RFC 0029 §3.4): every customer with overdue invoices — how much, how late, the level
|
|
3
|
+
* reached and the last one sent, a pause with its promise. Send now sends the reminder of the level reached; Pause
|
|
4
|
+
* holds reminders until a date. The server decides what is due, sends and refuses.
|
|
5
|
+
*/
|
|
6
|
+
import { type PageProps } from '../../ui/index.js';
|
|
7
|
+
import { type ReactElement } from 'react';
|
|
8
|
+
export declare function FollowupsPage({ api, label }: PageProps): ReactElement;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Accounting › Follow-ups (RFC 0029 §3.4): every customer with overdue invoices — how much, how late, the level
|
|
4
|
+
* reached and the last one sent, a pause with its promise. Send now sends the reminder of the level reached; Pause
|
|
5
|
+
* holds reminders until a date. The server decides what is due, sends and refuses.
|
|
6
|
+
*/
|
|
7
|
+
import { Alert, Button, Input, Label, useKosh } from '../../ui/index.js';
|
|
8
|
+
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
9
|
+
import { useId, useState } from 'react';
|
|
10
|
+
import { useTranslation } from 'react-i18next';
|
|
11
|
+
export function FollowupsPage({ api, label }) {
|
|
12
|
+
const { t } = useTranslation('accounting');
|
|
13
|
+
const { format } = useKosh();
|
|
14
|
+
const id = useId();
|
|
15
|
+
const queryClient = useQueryClient();
|
|
16
|
+
const [message, setMessage] = useState(null);
|
|
17
|
+
const [pausing, setPausing] = useState(null);
|
|
18
|
+
const [until, setUntil] = useState('');
|
|
19
|
+
const [note, setNote] = useState('');
|
|
20
|
+
const rows = useQuery({
|
|
21
|
+
queryKey: ['accounting', 'followups'],
|
|
22
|
+
queryFn: () => api.call('GET', '/api/v1/accounting/followups'),
|
|
23
|
+
});
|
|
24
|
+
const done = async (text) => {
|
|
25
|
+
setMessage(text);
|
|
26
|
+
await queryClient.invalidateQueries({ queryKey: ['accounting', 'followups'] });
|
|
27
|
+
};
|
|
28
|
+
const send = useMutation({
|
|
29
|
+
mutationFn: (partner) => api.call('POST', `/api/v1/accounting/followups/${partner}/send`),
|
|
30
|
+
onSuccess: (r) => done(t('followups.sent', { level: r.level, channels: r.channels.join(', ') })),
|
|
31
|
+
});
|
|
32
|
+
const pause = useMutation({
|
|
33
|
+
mutationFn: (input) => api.call('POST', `/api/v1/accounting/followups/${input.partner}/pause`, {
|
|
34
|
+
until: input.until,
|
|
35
|
+
note,
|
|
36
|
+
}),
|
|
37
|
+
onSuccess: (_r, input) => {
|
|
38
|
+
setPausing(null);
|
|
39
|
+
return done(input.until === null ? t('followups.resumed') : t('followups.paused'));
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
const error = send.error ?? pause.error;
|
|
43
|
+
const list = rows.data?.rows ?? [];
|
|
44
|
+
return (_jsxs("section", { "aria-labelledby": `${id}-title`, className: "grid gap-4", children: [_jsx("h1", { id: `${id}-title`, className: "text-lg font-semibold", children: label ?? t('followups.title') }), _jsx("p", { className: "text-sm text-muted-foreground", children: t('followups.intro') }), message === null ? null : _jsx(Alert, { tone: "info", children: message }), error === null ? null : _jsx(Alert, { children: error.message }), list.length === 0 && !rows.isPending ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('followups.nobody') })) : (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "text-start text-muted-foreground", children: _jsxs("tr", { children: [_jsx("th", { className: "py-1 text-start font-medium", children: t('followups.customer') }), _jsx("th", { className: "py-1 text-end font-medium", children: t('followups.overdue') }), _jsx("th", { className: "py-1 text-end font-medium", children: t('followups.late') }), _jsx("th", { className: "py-1 text-start font-medium", children: t('followups.level') }), _jsx("th", { className: "py-1 text-start font-medium", children: t('followups.lastSent') }), _jsx("th", { className: "py-1", children: _jsx("span", { className: "sr-only", children: t('followups.actions') }) })] }) }), _jsx("tbody", { children: list.map((r) => (_jsxs("tr", { className: "border-t align-top", children: [_jsxs("td", { className: "py-2", children: [_jsx("span", { className: "font-medium", children: r.name }), _jsx("span", { className: "block text-xs text-muted-foreground", children: r.invoices.map((i) => i.name).join(', ') }), r.pausedUntil === null ? null : (_jsx("span", { className: "block text-xs text-muted-foreground", children: t('followups.pausedUntil', {
|
|
45
|
+
date: format.date(r.pausedUntil),
|
|
46
|
+
note: r.pauseNote ?? '',
|
|
47
|
+
}) }))] }), _jsx("td", { className: "py-2 text-end tabular-nums", children: r.amount }), _jsx("td", { className: "py-2 text-end tabular-nums", children: t('followups.days', { count: r.days }) }), _jsx("td", { className: "py-2", children: r.due?.name ?? t('followups.none') }), _jsx("td", { className: "py-2", children: r.sent === null
|
|
48
|
+
? t('followups.never')
|
|
49
|
+
: `${r.sent.name}${r.sentAt === null ? '' : ` · ${format.date(r.sentAt)}`}` }), _jsxs("td", { className: "py-2", children: [_jsxs("div", { className: "flex flex-wrap justify-end gap-2", children: [_jsx(Button, { size: "sm", disabled: r.due === null, busy: send.isPending && send.variables === r.partner, onClick: () => send.mutate(r.partner), children: t('followups.sendNow') }), r.pausedUntil === null ? (_jsx(Button, { size: "sm", variant: "ghost", onClick: () => {
|
|
50
|
+
setPausing(r.partner);
|
|
51
|
+
setUntil('');
|
|
52
|
+
setNote('');
|
|
53
|
+
}, children: t('followups.pause') })) : (_jsx(Button, { size: "sm", variant: "ghost", busy: pause.isPending, onClick: () => pause.mutate({ partner: r.partner, until: null }), children: t('followups.resume') }))] }), pausing !== r.partner ? null : (_jsxs("div", { className: "mt-2 grid gap-2 sm:grid-cols-[auto_1fr_auto] sm:items-end", children: [_jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-until`, children: t('followups.until') }), _jsx(Input, { id: `${id}-until`, type: "date", value: until, onChange: (e) => setUntil(e.target.value) })] }), _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-note`, children: t('followups.promise') }), _jsx(Input, { id: `${id}-note`, value: note, onChange: (e) => setNote(e.target.value) })] }), _jsx(Button, { size: "sm", variant: "primary", disabled: until === '', busy: pause.isPending, onClick: () => pause.mutate({ partner: r.partner, until }), children: t('followups.confirmPause') })] }))] })] }, r.partner))) })] }) }))] }));
|
|
54
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* On a draft invoice or bill (RFC 0029 §3.5): what posting will do — the fiscal position and why it applies, each
|
|
3
|
+
* line's taxes after the mapping and its account with where it came from (the line, the product, its category, the
|
|
4
|
+
* journal), and the receivable or payable account. The server decides; this only shows it.
|
|
5
|
+
*/
|
|
6
|
+
import type { NodeComponentProps } from '../../ui/index.js';
|
|
7
|
+
import type { ReactElement } from 'react';
|
|
8
|
+
export declare function PostingPreview({ record, api, version }: NodeComponentProps): ReactElement | null;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useQuery } from '@tanstack/react-query';
|
|
3
|
+
import { useId } from 'react';
|
|
4
|
+
import { useTranslation } from 'react-i18next';
|
|
5
|
+
export function PostingPreview({ record, api, version }) {
|
|
6
|
+
const { t } = useTranslation('accounting');
|
|
7
|
+
const id = useId();
|
|
8
|
+
const draft = record !== null && record['state'] === 'draft' && record['kind'] !== 'entry';
|
|
9
|
+
const preview = useQuery({
|
|
10
|
+
queryKey: ['accounting', 'preview', record?.id, version],
|
|
11
|
+
queryFn: () => api.call('GET', `/api/v1/accounting/moves/${record?.id}/preview`),
|
|
12
|
+
enabled: draft,
|
|
13
|
+
});
|
|
14
|
+
const p = preview.data;
|
|
15
|
+
if (!draft || p === undefined || p.lines.length === 0)
|
|
16
|
+
return null;
|
|
17
|
+
const source = (s) => t(`preview.source.${s}`, { defaultValue: s });
|
|
18
|
+
return (_jsxs("section", { "aria-labelledby": `${id}-title`, className: "grid gap-2 rounded-md border p-3 text-sm", children: [_jsx("h3", { id: `${id}-title`, className: "font-medium", children: t('preview.title') }), _jsx("p", { className: "text-muted-foreground", children: p.position === null
|
|
19
|
+
? t('preview.noPosition')
|
|
20
|
+
: t('preview.position', { name: p.position.name, why: p.why }) }), _jsx("ul", { className: "grid gap-1", children: p.lines.map((l) => (_jsxs("li", { children: [_jsx("span", { className: "font-medium", children: l.name }), ' · ', l.taxesBefore.join(', ') === l.taxesAfter.join(', ')
|
|
21
|
+
? l.taxesAfter.join(', ') || t('preview.noTax')
|
|
22
|
+
: `${l.taxesBefore.join(', ') || t('preview.noTax')} → ${l.taxesAfter.join(', ') || t('preview.noTax')}`, ' · ', l.account ?? t('preview.noAccount'), ' ', _jsxs("span", { className: "text-muted-foreground", children: ["(", source(l.source), l.mapped ? `, ${t('preview.mapped')}` : '', ")"] })] }, l.id))) }), _jsxs("p", { className: "text-muted-foreground", children: [t('preview.counterpart', {
|
|
23
|
+
account: p.counterpart.account ?? t('preview.noAccount'),
|
|
24
|
+
source: source(p.counterpart.source),
|
|
25
|
+
}), p.counterpart.mapped ? `, ${t('preview.mapped')}` : ''] })] }));
|
|
26
|
+
}
|
|
@@ -7,6 +7,9 @@ import { type Registry } from '../../ui/index.js';
|
|
|
7
7
|
import type { i18n } from 'i18next';
|
|
8
8
|
import { messages } from './messages.js';
|
|
9
9
|
export { AgingPage } from './AgingPage.js';
|
|
10
|
+
export { BankReconcilePage } from './BankReconcilePage.js';
|
|
11
|
+
export { FollowupsPage } from './FollowupsPage.js';
|
|
12
|
+
export { PostingPreview } from './PostingPreview.js';
|
|
10
13
|
export { ReconcilePage } from './ReconcilePage.js';
|
|
11
14
|
export { RegisterPayment } from './RegisterPayment.js';
|
|
12
15
|
export { SettingsPage } from './SettingsPage.js';
|
|
@@ -5,11 +5,17 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { addMessages } from '../../ui/index.js';
|
|
7
7
|
import { AgingPage } from './AgingPage.js';
|
|
8
|
+
import { BankReconcilePage } from './BankReconcilePage.js';
|
|
9
|
+
import { FollowupsPage } from './FollowupsPage.js';
|
|
8
10
|
import { messages } from './messages.js';
|
|
11
|
+
import { PostingPreview } from './PostingPreview.js';
|
|
9
12
|
import { ReconcilePage } from './ReconcilePage.js';
|
|
10
13
|
import { RegisterPayment } from './RegisterPayment.js';
|
|
11
14
|
import { SettingsPage } from './SettingsPage.js';
|
|
12
15
|
export { AgingPage } from './AgingPage.js';
|
|
16
|
+
export { BankReconcilePage } from './BankReconcilePage.js';
|
|
17
|
+
export { FollowupsPage } from './FollowupsPage.js';
|
|
18
|
+
export { PostingPreview } from './PostingPreview.js';
|
|
13
19
|
export { ReconcilePage } from './ReconcilePage.js';
|
|
14
20
|
export { RegisterPayment } from './RegisterPayment.js';
|
|
15
21
|
export { SettingsPage } from './SettingsPage.js';
|
|
@@ -18,7 +24,10 @@ export function registerAccountingWeb(registry, i18n) {
|
|
|
18
24
|
registry.registerPage('accounting.Settings', SettingsPage);
|
|
19
25
|
registry.registerPage('accounting.Reconcile', ReconcilePage);
|
|
20
26
|
registry.registerPage('accounting.Aging', AgingPage);
|
|
27
|
+
registry.registerPage('accounting.BankReconcile', BankReconcilePage);
|
|
28
|
+
registry.registerPage('accounting.Followups', FollowupsPage);
|
|
21
29
|
registry.registerComponent('accounting.RegisterPayment', RegisterPayment);
|
|
30
|
+
registry.registerComponent('accounting.PostingPreview', PostingPreview);
|
|
22
31
|
if (i18n !== undefined)
|
|
23
32
|
addMessages(i18n, 'accounting', messages);
|
|
24
33
|
return registry;
|
|
@@ -1,6 +1,76 @@
|
|
|
1
1
|
/** Messages of the accounting screens (namespace `accounting`), in English and Bangla. */
|
|
2
2
|
export const messages = {
|
|
3
3
|
en: {
|
|
4
|
+
preview: {
|
|
5
|
+
title: 'When confirmed',
|
|
6
|
+
noPosition: 'No fiscal position: taxes and accounts as they are.',
|
|
7
|
+
position: 'Fiscal position {{name}}: {{why}}.',
|
|
8
|
+
noTax: 'no tax',
|
|
9
|
+
noAccount: 'no account',
|
|
10
|
+
mapped: 'mapped by the fiscal position',
|
|
11
|
+
counterpart: 'Owed on {{account}} ({{source}})',
|
|
12
|
+
source: {
|
|
13
|
+
line: 'set on the line',
|
|
14
|
+
app: 'from the order',
|
|
15
|
+
product: 'the product’s',
|
|
16
|
+
category: 'the category’s',
|
|
17
|
+
journal: 'the journal’s',
|
|
18
|
+
partner: 'the partner’s',
|
|
19
|
+
company: 'the company’s',
|
|
20
|
+
none: 'none',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
followups: {
|
|
24
|
+
title: 'Follow-ups',
|
|
25
|
+
intro: 'Customers with invoices past their due date. Each day they get one reminder for the highest level reached; Send now sends it at once, Pause holds reminders until a promised date.',
|
|
26
|
+
nobody: 'Nobody is late.',
|
|
27
|
+
customer: 'Customer',
|
|
28
|
+
overdue: 'Overdue',
|
|
29
|
+
late: 'Late',
|
|
30
|
+
level: 'Level reached',
|
|
31
|
+
lastSent: 'Last sent',
|
|
32
|
+
actions: 'Actions',
|
|
33
|
+
days_one: '{{count}} day',
|
|
34
|
+
days_other: '{{count}} days',
|
|
35
|
+
none: 'Not yet',
|
|
36
|
+
never: 'Never',
|
|
37
|
+
sendNow: 'Send now',
|
|
38
|
+
pause: 'Pause',
|
|
39
|
+
resume: 'Resume',
|
|
40
|
+
until: 'Until',
|
|
41
|
+
promise: 'Promise',
|
|
42
|
+
confirmPause: 'Pause',
|
|
43
|
+
pausedUntil: 'Paused until {{date}} {{note}}',
|
|
44
|
+
sent: 'Reminder "{{level}}" sent by {{channels}}.',
|
|
45
|
+
paused: 'Paused.',
|
|
46
|
+
resumed: 'Reminders resumed.',
|
|
47
|
+
},
|
|
48
|
+
bank: {
|
|
49
|
+
title: 'Reconcile bank',
|
|
50
|
+
import: 'Import a statement',
|
|
51
|
+
journal: 'Journal',
|
|
52
|
+
format: 'Format',
|
|
53
|
+
file: 'File',
|
|
54
|
+
column: { date: 'Date column', label: 'Label column', amount: 'Amount column' },
|
|
55
|
+
imported: '{{created}} lines imported, {{skipped}} already there.',
|
|
56
|
+
nothingOpen: 'Every statement line is matched.',
|
|
57
|
+
lines: 'Open lines',
|
|
58
|
+
proposals: 'What it may pay',
|
|
59
|
+
noProposal: 'No open document looks like it: write it off, or leave it for later.',
|
|
60
|
+
because: 'Because of {{reasons}}.',
|
|
61
|
+
match: 'Match',
|
|
62
|
+
matched: 'Matched: the payment is posted and reconciled.',
|
|
63
|
+
writeOff: 'Or write it off',
|
|
64
|
+
account: 'Account',
|
|
65
|
+
writeOffConfirm: 'Write off',
|
|
66
|
+
writtenOff: 'Written off.',
|
|
67
|
+
keys: 'J / K: the next and the previous line.',
|
|
68
|
+
runRules: 'Run rules',
|
|
69
|
+
rulesRun: 'Rules matched or wrote off {{count}} lines.',
|
|
70
|
+
recent: 'Recently matched',
|
|
71
|
+
undo: 'Undo',
|
|
72
|
+
undone: 'Undone: the line is open again.',
|
|
73
|
+
},
|
|
4
74
|
settings: {
|
|
5
75
|
title: 'Accounting settings',
|
|
6
76
|
chart: 'Chart of accounts',
|
|
@@ -63,6 +133,76 @@ export const messages = {
|
|
|
63
133
|
},
|
|
64
134
|
},
|
|
65
135
|
bn: {
|
|
136
|
+
preview: {
|
|
137
|
+
title: 'নিশ্চিত করলে',
|
|
138
|
+
noPosition: 'কোনো ফিসকাল পজিশন নেই: কর ও হিসাব যেমন আছে।',
|
|
139
|
+
position: 'ফিসকাল পজিশন {{name}}: {{why}}।',
|
|
140
|
+
noTax: 'কর নেই',
|
|
141
|
+
noAccount: 'হিসাব নেই',
|
|
142
|
+
mapped: 'ফিসকাল পজিশনে বদলানো',
|
|
143
|
+
counterpart: 'পাওনা {{account}}-এ ({{source}})',
|
|
144
|
+
source: {
|
|
145
|
+
line: 'লাইনে দেওয়া',
|
|
146
|
+
app: 'অর্ডার থেকে',
|
|
147
|
+
product: 'পণ্যের',
|
|
148
|
+
category: 'শ্রেণির',
|
|
149
|
+
journal: 'জার্নালের',
|
|
150
|
+
partner: 'পার্টনারের',
|
|
151
|
+
company: 'প্রতিষ্ঠানের',
|
|
152
|
+
none: 'কিছু নেই',
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
followups: {
|
|
156
|
+
title: 'তাগাদা',
|
|
157
|
+
intro: 'যেসব গ্রাহকের ইনভয়েস নির্ধারিত তারিখ পেরিয়েছে। প্রতিদিন তারা পৌঁছানো সর্বোচ্চ স্তরের একটি অনুস্মারক পান; এখনই পাঠান সঙ্গে সঙ্গে পাঠায়, বিরতি প্রতিশ্রুত তারিখ পর্যন্ত অনুস্মারক থামায়।',
|
|
158
|
+
nobody: 'কেউ দেরি করেননি।',
|
|
159
|
+
customer: 'গ্রাহক',
|
|
160
|
+
overdue: 'বকেয়া',
|
|
161
|
+
late: 'দেরি',
|
|
162
|
+
level: 'পৌঁছানো স্তর',
|
|
163
|
+
lastSent: 'শেষ পাঠানো',
|
|
164
|
+
actions: 'কাজ',
|
|
165
|
+
days_one: '{{count}} দিন',
|
|
166
|
+
days_other: '{{count}} দিন',
|
|
167
|
+
none: 'এখনো নয়',
|
|
168
|
+
never: 'কখনো নয়',
|
|
169
|
+
sendNow: 'এখনই পাঠান',
|
|
170
|
+
pause: 'বিরতি',
|
|
171
|
+
resume: 'আবার চালু করুন',
|
|
172
|
+
until: 'পর্যন্ত',
|
|
173
|
+
promise: 'প্রতিশ্রুতি',
|
|
174
|
+
confirmPause: 'বিরতি দিন',
|
|
175
|
+
pausedUntil: '{{date}} পর্যন্ত বিরতি {{note}}',
|
|
176
|
+
sent: '"{{level}}" অনুস্মারক {{channels}} দিয়ে পাঠানো হয়েছে।',
|
|
177
|
+
paused: 'বিরতি দেওয়া হয়েছে।',
|
|
178
|
+
resumed: 'অনুস্মারক আবার চালু।',
|
|
179
|
+
},
|
|
180
|
+
bank: {
|
|
181
|
+
title: 'ব্যাংক মিলান',
|
|
182
|
+
import: 'স্টেটমেন্ট আমদানি',
|
|
183
|
+
journal: 'জার্নাল',
|
|
184
|
+
format: 'ফরম্যাট',
|
|
185
|
+
file: 'ফাইল',
|
|
186
|
+
column: { date: 'তারিখের কলাম', label: 'বিবরণের কলাম', amount: 'অঙ্কের কলাম' },
|
|
187
|
+
imported: '{{created}}টি লাইন আমদানি হয়েছে, {{skipped}}টি আগেই ছিল।',
|
|
188
|
+
nothingOpen: 'স্টেটমেন্টের প্রতিটি লাইন মিলেছে।',
|
|
189
|
+
lines: 'খোলা লাইন',
|
|
190
|
+
proposals: 'যা পরিশোধ হতে পারে',
|
|
191
|
+
noProposal: 'কোনো খোলা নথি এর মতো নয়: খরচ হিসেবে লিখুন, বা পরে দেখুন।',
|
|
192
|
+
because: 'কারণ: {{reasons}}।',
|
|
193
|
+
match: 'মেলান',
|
|
194
|
+
matched: 'মিলেছে: পেমেন্ট পোস্ট ও মিলান হয়েছে।',
|
|
195
|
+
writeOff: 'অথবা খরচ হিসেবে লিখুন',
|
|
196
|
+
account: 'হিসাব',
|
|
197
|
+
writeOffConfirm: 'খরচ হিসেবে লিখুন',
|
|
198
|
+
runRules: 'নিয়ম চালান',
|
|
199
|
+
rulesRun: 'নিয়মগুলো {{count}}টি লাইন মিলিয়েছে বা খরচ লিখেছে।',
|
|
200
|
+
recent: 'সম্প্রতি মেলানো',
|
|
201
|
+
undo: 'ফিরিয়ে নিন',
|
|
202
|
+
undone: 'ফিরিয়ে নেওয়া হয়েছে: লাইনটি আবার খোলা।',
|
|
203
|
+
writtenOff: 'খরচ হিসেবে লেখা হয়েছে।',
|
|
204
|
+
keys: 'J / K: পরের ও আগের লাইন।',
|
|
205
|
+
},
|
|
66
206
|
settings: {
|
|
67
207
|
title: 'হিসাবরক্ষণ সেটিংস',
|
|
68
208
|
chart: 'হিসাবের ছক',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash:
|
|
1
|
+
// GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 727ae347ccaee3be
|
|
2
2
|
// Bindings of module `approvals`: import the definition API from here to get types scoped to what it can see.
|
|
3
3
|
export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
|
|
4
4
|
import { definitions } from '../../server/orm.js';
|