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
|
@@ -10,10 +10,11 @@
|
|
|
10
10
|
* delivers).
|
|
11
11
|
*/
|
|
12
12
|
import { productShutro } from '../product/index.js';
|
|
13
|
-
import { purchaseShutro } from '../purchase/index.js';
|
|
13
|
+
import { purchaseShutro, vendorPriceFor } from '../purchase/index.js';
|
|
14
14
|
import { orm } from '../server/orm.js';
|
|
15
15
|
import { defaultLocations, inProductUnit, stockShutro } from '../stock/index.js';
|
|
16
16
|
import { compute, defineModule, extendModel, f } from './.kosh/bindings.js';
|
|
17
|
+
import { vendorScorecard } from './scorecard.js';
|
|
17
18
|
const zero = orm.toDecimal(0);
|
|
18
19
|
export const PickingPurchase = extendModel('stock.picking', {
|
|
19
20
|
fields: {
|
|
@@ -51,17 +52,34 @@ export const MovePurchase = extendModel('stock.move', {
|
|
|
51
52
|
});
|
|
52
53
|
export const LineReceived = extendModel('purchase.order.line', {
|
|
53
54
|
fields: {
|
|
55
|
+
/** What went back to the vendor by validated returns (RFC 0030 §3.2), in the line's unit. */
|
|
56
|
+
qtyReturned: f.decimal({
|
|
57
|
+
scale: 3,
|
|
58
|
+
store: true,
|
|
59
|
+
label: 'Returned',
|
|
60
|
+
help: 'What was sent back to the vendor by validated returns of its receipts.',
|
|
61
|
+
...compute('purchase.order.line', 'qtyReturned', ['moves.quantity', 'moves.quantityDone', 'moves.picking.state', 'moves.returnOf'], (lines) => {
|
|
62
|
+
for (const l of lines)
|
|
63
|
+
l.qtyReturned = [...l.moves]
|
|
64
|
+
.filter((m) => m.picking.state === 'done' && m.returnOf !== null)
|
|
65
|
+
.reduce((s, m) => s.plus(m.quantityDone ?? m.quantity), zero);
|
|
66
|
+
}),
|
|
67
|
+
}),
|
|
54
68
|
moves: f.one2many('stock.move', 'purchaseLine'),
|
|
55
69
|
/** Received by validated receipts, in the line's unit. */
|
|
56
70
|
qtyReceived: f.decimal({
|
|
57
71
|
scale: 3,
|
|
58
72
|
store: true,
|
|
59
73
|
label: 'Received',
|
|
60
|
-
...compute('purchase.order.line', 'qtyReceived', ['moves.quantity', 'moves.quantityDone', 'moves.picking.state'], (lines) => {
|
|
74
|
+
...compute('purchase.order.line', 'qtyReceived', ['moves.quantity', 'moves.quantityDone', 'moves.picking.state', 'moves.returnOf'], (lines) => {
|
|
75
|
+
// What went back to the vendor (a return of a receipt, RFC 0030 §3.2) is not received any more.
|
|
61
76
|
for (const l of lines)
|
|
62
77
|
l.qtyReceived = [...l.moves]
|
|
63
78
|
.filter((m) => m.picking.state === 'done')
|
|
64
|
-
.reduce((s, m) =>
|
|
79
|
+
.reduce((s, m) => {
|
|
80
|
+
const qty = m.quantityDone ?? m.quantity;
|
|
81
|
+
return m.returnOf === null ? s.plus(qty) : s.minus(qty);
|
|
82
|
+
}, zero);
|
|
65
83
|
}),
|
|
66
84
|
}),
|
|
67
85
|
},
|
|
@@ -69,6 +87,24 @@ export const LineReceived = extendModel('purchase.order.line', {
|
|
|
69
87
|
export const OrderReceipts = extendModel('purchase.order', {
|
|
70
88
|
fields: {
|
|
71
89
|
receipts: f.one2many('stock.picking', 'purchaseOrder'),
|
|
90
|
+
/** The vendor's on-time delivery rate (RFC 0030 §3.1), shown beside the expected arrival (RFC 0032 §3.4). */
|
|
91
|
+
vendorOnTime: f.char({
|
|
92
|
+
label: 'On-time delivery',
|
|
93
|
+
help: 'The share of the vendor’s receipts that arrived by their expected date.',
|
|
94
|
+
...compute('purchase.order', 'vendorOnTime', ['partner'], async (orders) => {
|
|
95
|
+
const env = orders.env;
|
|
96
|
+
for (const o of orders) {
|
|
97
|
+
// A new order has no vendor yet.
|
|
98
|
+
if (o.partner === null) {
|
|
99
|
+
o.vendorOnTime = '';
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const card = await vendorScorecard(env, o.partner.id);
|
|
103
|
+
o.vendorOnTime =
|
|
104
|
+
card.onTimeRate === null ? '' : `${card.onTimeRate}% on time (${card.onTime} receipts)`;
|
|
105
|
+
}
|
|
106
|
+
}),
|
|
107
|
+
}),
|
|
72
108
|
/** The vendor delivers to the customer: the order's transfer is a dropship, never received in stock. */
|
|
73
109
|
dropship: f.boolean({ default: false, label: 'Dropship' }),
|
|
74
110
|
/** Where the goods are received (the company's main warehouse when empty). */
|
|
@@ -277,6 +313,19 @@ async function dropship(env, ids) {
|
|
|
277
313
|
async function receivedInto(env, warehouse, company) {
|
|
278
314
|
return warehouse ?? (await defaultLocations(env, 'receipt', null, company)).warehouse;
|
|
279
315
|
}
|
|
316
|
+
/** The vendor price a buying rule would use for `qty`: in the company's currency, arriving within the rule's days. */
|
|
317
|
+
async function chooseVendor(env, r, qty) {
|
|
318
|
+
const today = env.today();
|
|
319
|
+
const needBy = new Date(`${today}T00:00:00Z`);
|
|
320
|
+
needBy.setUTCDate(needBy.getUTCDate() + r.leadDays);
|
|
321
|
+
return vendorPriceFor(env, {
|
|
322
|
+
product: r.product.id,
|
|
323
|
+
quantity: orm.toDecimal(qty),
|
|
324
|
+
date: today,
|
|
325
|
+
currency: r.company.currency.id,
|
|
326
|
+
needBy: needBy.toISOString().slice(0, 10),
|
|
327
|
+
});
|
|
328
|
+
}
|
|
280
329
|
export const ReorderBuy = extendModel('stock.reorder', {
|
|
281
330
|
overrides: {
|
|
282
331
|
// Requests for quotation and orders not received yet (their receipt is still to be made) are on order.
|
|
@@ -308,6 +357,24 @@ export const ReorderBuy = extendModel('stock.reorder', {
|
|
|
308
357
|
}
|
|
309
358
|
return out;
|
|
310
359
|
},
|
|
360
|
+
// The vendor a buying rule would order from, and why (RFC 0030 §3.1).
|
|
361
|
+
sourcing: async function (next, proposed) {
|
|
362
|
+
const out = await next(proposed);
|
|
363
|
+
const rules = this;
|
|
364
|
+
const env = rules.env;
|
|
365
|
+
for (const r of await rules.load({ company: true, vendor: true })) {
|
|
366
|
+
const qty = proposed.get(r.id);
|
|
367
|
+
if (r.method !== 'buy' || qty === undefined)
|
|
368
|
+
continue;
|
|
369
|
+
const choice = await chooseVendor(env, r, qty);
|
|
370
|
+
out.set(r.id, choice === null
|
|
371
|
+
? r.vendor === null
|
|
372
|
+
? ''
|
|
373
|
+
: `Bought from ${String(r.vendor.name)} (the rule’s vendor: no vendor price fits).`
|
|
374
|
+
: `Bought from ${choice.vendorName}: ${choice.explanation}`);
|
|
375
|
+
}
|
|
376
|
+
return out;
|
|
377
|
+
},
|
|
311
378
|
// Buying: one request for quotation per vendor and warehouse — a draft one from replenishment gets the lines.
|
|
312
379
|
procure: async function (next, quantities) {
|
|
313
380
|
const out = await next(quantities);
|
|
@@ -316,21 +383,26 @@ export const ReorderBuy = extendModel('stock.reorder', {
|
|
|
316
383
|
const today = env.today();
|
|
317
384
|
for (const r of await rules.load({ product: { purchaseTaxes: true }, company: true })) {
|
|
318
385
|
const qty = quantities.get(r.id);
|
|
319
|
-
if (r.method !== 'buy' ||
|
|
386
|
+
if (r.method !== 'buy' || qty === undefined)
|
|
387
|
+
continue;
|
|
388
|
+
// The vendor prices choose the vendor (the cheapest that arrives in time); else the rule's vendor.
|
|
389
|
+
const choice = await chooseVendor(env, r, qty);
|
|
390
|
+
const vendor = choice?.vendor ?? r.vendor?.id ?? null;
|
|
391
|
+
if (vendor === null)
|
|
320
392
|
continue;
|
|
321
393
|
const arrival = new Date(`${today}T00:00:00Z`);
|
|
322
|
-
arrival.setUTCDate(arrival.getUTCDate() + r.leadDays);
|
|
394
|
+
arrival.setUTCDate(arrival.getUTCDate() + (choice?.leadDays ?? r.leadDays));
|
|
395
|
+
// The price comes from the vendor's price on the line (or the product's cost).
|
|
323
396
|
const line = {
|
|
324
397
|
product: r.product.id,
|
|
325
398
|
name: r.product.name,
|
|
326
399
|
quantity: qty,
|
|
327
400
|
uom: r.product.uom?.id ?? null,
|
|
328
|
-
priceUnit: r.product.standardPrice,
|
|
329
401
|
taxes: { set: [...r.product.purchaseTaxes.ids] },
|
|
330
402
|
};
|
|
331
403
|
const [open] = await (await env.model('purchase.order').search({
|
|
332
404
|
where: {
|
|
333
|
-
partner:
|
|
405
|
+
partner: vendor,
|
|
334
406
|
company: r.company.id,
|
|
335
407
|
warehouse: r.warehouse.id,
|
|
336
408
|
state: 'draft',
|
|
@@ -346,7 +418,7 @@ export const ReorderBuy = extendModel('stock.reorder', {
|
|
|
346
418
|
}
|
|
347
419
|
const made = await env.model('purchase.order').create([
|
|
348
420
|
{
|
|
349
|
-
partner:
|
|
421
|
+
partner: vendor,
|
|
350
422
|
company: r.company.id,
|
|
351
423
|
currency: r.company.currency.id,
|
|
352
424
|
warehouse: r.warehouse.id,
|
|
@@ -366,7 +438,7 @@ export const ReorderBuy = extendModel('stock.reorder', {
|
|
|
366
438
|
});
|
|
367
439
|
export const purchaseStockShutro = defineModule({
|
|
368
440
|
name: 'purchase_stock',
|
|
369
|
-
version: '0.
|
|
441
|
+
version: '0.3.0',
|
|
370
442
|
depends: [purchaseShutro, stockShutro, productShutro],
|
|
371
443
|
groups: [
|
|
372
444
|
orm.defineGroup({
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A vendor's scorecard (RFC 0030 §3.1), from what actually happened over the last year: the confirmed orders, the
|
|
3
|
+
* receipts done and how many by the order's expected date, the average days from order to receipt, and for the
|
|
4
|
+
* products bought most, the last price against the year's average. Read as the caller (Purchase users).
|
|
5
|
+
*/
|
|
6
|
+
import type { Env } from './.kosh/bindings.js';
|
|
7
|
+
export interface Scorecard {
|
|
8
|
+
readonly orders: number;
|
|
9
|
+
readonly receipts: number;
|
|
10
|
+
readonly onTime: number;
|
|
11
|
+
/** Percent of receipts done by the expected date, or null without receipts. */
|
|
12
|
+
readonly onTimeRate: number | null;
|
|
13
|
+
readonly averageLeadDays: number | null;
|
|
14
|
+
readonly products: readonly {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly lastPrice: string;
|
|
17
|
+
readonly averagePrice: string;
|
|
18
|
+
/** Percent change of the last price against the average. */
|
|
19
|
+
readonly change: number;
|
|
20
|
+
}[];
|
|
21
|
+
}
|
|
22
|
+
export declare function vendorScorecard(env: Env, vendor: number): Promise<Scorecard>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const ref = (env, name) => env.model(name);
|
|
2
|
+
const dayOf = (v) => v instanceof Date ? v.toISOString().slice(0, 10) : String(v ?? '').slice(0, 10);
|
|
3
|
+
const days = (from, to) => Math.round((Date.parse(`${to}T00:00:00Z`) - Date.parse(`${from}T00:00:00Z`)) / 86_400_000);
|
|
4
|
+
const idOf = (v) => typeof v === 'number' ? v : (v?.id ?? null);
|
|
5
|
+
const decimal = (v) => Number(String(v ?? '0'));
|
|
6
|
+
export async function vendorScorecard(env, vendor) {
|
|
7
|
+
const today = env.today();
|
|
8
|
+
const since = new Date(`${today}T00:00:00Z`);
|
|
9
|
+
since.setUTCFullYear(since.getUTCFullYear() - 1);
|
|
10
|
+
const from = since.toISOString().slice(0, 10);
|
|
11
|
+
const orders = (await (await ref(env, 'purchase.order').search({
|
|
12
|
+
where: { partner: vendor, state: { in: ['purchase', 'done'] }, dateOrder: { gte: from } },
|
|
13
|
+
})).load(['dateOrder', 'datePlanned'])).read(['id', 'dateOrder', 'datePlanned']);
|
|
14
|
+
const byOrder = new Map(orders.map((o) => [o['id'], o]));
|
|
15
|
+
const receipts = orders.length === 0
|
|
16
|
+
? []
|
|
17
|
+
: (await (await ref(env, 'stock.picking').search({
|
|
18
|
+
where: { purchaseOrder: { in: [...byOrder.keys()] }, state: 'done' },
|
|
19
|
+
})).load(['doneDate', 'purchaseOrder'])).read(['doneDate', 'purchaseOrder']);
|
|
20
|
+
let onTime = 0;
|
|
21
|
+
let lead = 0;
|
|
22
|
+
let counted = 0;
|
|
23
|
+
for (const r of receipts) {
|
|
24
|
+
const order = byOrder.get(idOf(r['purchaseOrder']) ?? -1);
|
|
25
|
+
if (order === undefined || r['doneDate'] == null)
|
|
26
|
+
continue;
|
|
27
|
+
const done = dayOf(r['doneDate']);
|
|
28
|
+
const expected = order['datePlanned'] == null ? null : dayOf(order['datePlanned']);
|
|
29
|
+
if (expected === null || done <= expected)
|
|
30
|
+
onTime++;
|
|
31
|
+
lead += days(dayOf(order['dateOrder']), done);
|
|
32
|
+
counted++;
|
|
33
|
+
}
|
|
34
|
+
const lines = orders.length === 0
|
|
35
|
+
? []
|
|
36
|
+
: (await (await ref(env, 'purchase.order.line').search({
|
|
37
|
+
where: { order: { in: [...byOrder.keys()] } },
|
|
38
|
+
order: ['id asc'],
|
|
39
|
+
})).load({ product: true })).read(['product', 'priceUnit', 'quantity']);
|
|
40
|
+
const productIds = [...new Set(lines.map((l) => idOf(l['product'])).filter((p) => p !== null))];
|
|
41
|
+
const names = new Map(productIds.length === 0
|
|
42
|
+
? []
|
|
43
|
+
: (await (await ref(env, 'product.product').search({ where: { id: { in: productIds } } })).load(['name']))
|
|
44
|
+
.read(['id', 'name'])
|
|
45
|
+
.map((p) => [p['id'], String(p['name'] ?? '')]));
|
|
46
|
+
const perProduct = new Map();
|
|
47
|
+
for (const l of lines) {
|
|
48
|
+
const id = idOf(l['product']);
|
|
49
|
+
if (id === null)
|
|
50
|
+
continue;
|
|
51
|
+
const entry = perProduct.get(id) ?? { name: names.get(id) ?? '', prices: [], quantity: 0 };
|
|
52
|
+
entry.prices.push(decimal(l['priceUnit']));
|
|
53
|
+
entry.quantity += decimal(l['quantity']);
|
|
54
|
+
perProduct.set(id, entry);
|
|
55
|
+
}
|
|
56
|
+
const products = [...perProduct.values()]
|
|
57
|
+
.sort((a, b) => b.quantity - a.quantity)
|
|
58
|
+
.slice(0, 5)
|
|
59
|
+
.map((e) => {
|
|
60
|
+
const last = e.prices.at(-1) ?? 0;
|
|
61
|
+
const average = e.prices.reduce((s, x) => s + x, 0) / e.prices.length;
|
|
62
|
+
return {
|
|
63
|
+
name: e.name,
|
|
64
|
+
lastPrice: last.toFixed(2),
|
|
65
|
+
averagePrice: average.toFixed(2),
|
|
66
|
+
change: average === 0 ? 0 : Math.round(((last - average) / average) * 1000) / 10,
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
orders: orders.length,
|
|
71
|
+
receipts: counted,
|
|
72
|
+
onTime,
|
|
73
|
+
onTimeRate: counted === 0 ? null : Math.round((onTime / counted) * 1000) / 10,
|
|
74
|
+
averageLeadDays: counted === 0 ? null : Math.round((lead / counted) * 10) / 10,
|
|
75
|
+
products,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The vendor's scorecard on their contact (RFC 0030 §3.1): on-time receipts, average lead days and the price trend
|
|
3
|
+
* of what is bought most, over the last year. Shown to Purchase users for vendors with orders; the server computes.
|
|
4
|
+
*/
|
|
5
|
+
import type { NodeComponentProps } from '../../ui/index.js';
|
|
6
|
+
import { type ReactElement } from 'react';
|
|
7
|
+
export declare function VendorScorecard({ record, api }: NodeComponentProps): ReactElement | null;
|
|
@@ -0,0 +1,22 @@
|
|
|
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 VendorScorecard({ record, api }) {
|
|
6
|
+
const { t } = useTranslation('purchase_stock');
|
|
7
|
+
const id = useId();
|
|
8
|
+
const card = useQuery({
|
|
9
|
+
queryKey: ['purchase', 'scorecard', record?.id],
|
|
10
|
+
queryFn: () => api.call('GET', `/api/v1/purchase/vendors/${record?.id}/scorecard`),
|
|
11
|
+
enabled: record !== null && record['isVendor'] === true,
|
|
12
|
+
retry: false,
|
|
13
|
+
});
|
|
14
|
+
const c = card.data;
|
|
15
|
+
if (c === undefined || c.orders === 0)
|
|
16
|
+
return null;
|
|
17
|
+
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('scorecard.title') }), _jsxs("dl", { className: "grid grid-cols-3 gap-2", children: [_jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground", children: t('scorecard.onTime') }), _jsx("dd", { className: "text-lg font-semibold tabular-nums", children: c.onTimeRate === null ? '—' : `${c.onTimeRate}%` }), _jsx("dd", { className: "text-xs text-muted-foreground", children: t('scorecard.receipts', { onTime: c.onTime, count: c.receipts }) })] }), _jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground", children: t('scorecard.lead') }), _jsx("dd", { className: "text-lg font-semibold tabular-nums", children: c.averageLeadDays === null ? '—' : t('scorecard.days', { count: c.averageLeadDays }) })] }), _jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground", children: t('scorecard.orders') }), _jsx("dd", { className: "text-lg font-semibold tabular-nums", children: c.orders })] })] }), c.products.length === 0 ? null : (_jsx("ul", { className: "grid gap-0.5", children: c.products.map((p) => (_jsxs("li", { className: "flex justify-between gap-2", children: [_jsx("span", { className: "truncate", children: p.name }), _jsx("span", { className: "tabular-nums", children: t('scorecard.price', {
|
|
18
|
+
last: p.lastPrice,
|
|
19
|
+
average: p.averagePrice,
|
|
20
|
+
change: `${p.change > 0 ? '+' : ''}${p.change}`,
|
|
21
|
+
}) })] }, p.name))) }))] }));
|
|
22
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* The web contribution of `shutro-erp/purchase_stock`: the vendor scorecard on contacts (RFC 0030 §3.1).
|
|
4
|
+
*/
|
|
5
|
+
import { type Registry } from '../../ui/index.js';
|
|
6
|
+
import type { i18n } from 'i18next';
|
|
7
|
+
import { messages } from './messages.js';
|
|
8
|
+
export { VendorScorecard } from './Scorecard.js';
|
|
9
|
+
/** Registers the component (and the messages in `i18n`, when given). */
|
|
10
|
+
export declare function registerPurchaseStockWeb(registry: Registry, i18n?: i18n): Registry;
|
|
11
|
+
export { messages as purchaseStockMessages };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* The web contribution of `shutro-erp/purchase_stock`: the vendor scorecard on contacts (RFC 0030 §3.1).
|
|
4
|
+
*/
|
|
5
|
+
import { addMessages } from '../../ui/index.js';
|
|
6
|
+
import { messages } from './messages.js';
|
|
7
|
+
import { VendorScorecard } from './Scorecard.js';
|
|
8
|
+
export { VendorScorecard } from './Scorecard.js';
|
|
9
|
+
/** Registers the component (and the messages in `i18n`, when given). */
|
|
10
|
+
export function registerPurchaseStockWeb(registry, i18n) {
|
|
11
|
+
registry.registerComponent('purchase_stock.Scorecard', VendorScorecard);
|
|
12
|
+
if (i18n !== undefined)
|
|
13
|
+
addMessages(i18n, 'purchase_stock', messages);
|
|
14
|
+
return registry;
|
|
15
|
+
}
|
|
16
|
+
export { messages as purchaseStockMessages };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Messages of the Purchase with receipts components (namespace `purchase_stock`), in English and Bangla. */
|
|
2
|
+
export const messages = {
|
|
3
|
+
en: {
|
|
4
|
+
scorecard: {
|
|
5
|
+
title: 'Vendor scorecard (last 12 months)',
|
|
6
|
+
onTime: 'On time',
|
|
7
|
+
receipts: '{{onTime}} of {{count}} receipts',
|
|
8
|
+
lead: 'Average lead time',
|
|
9
|
+
days_one: '{{count}} day',
|
|
10
|
+
days_other: '{{count}} days',
|
|
11
|
+
orders: 'Orders',
|
|
12
|
+
price: 'last {{last}}, average {{average}} ({{change}}%)',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
bn: {
|
|
16
|
+
scorecard: {
|
|
17
|
+
title: 'সরবরাহকারীর স্কোরকার্ড (গত ১২ মাস)',
|
|
18
|
+
onTime: 'সময়মতো',
|
|
19
|
+
receipts: '{{count}}টি রিসিটের {{onTime}}টি',
|
|
20
|
+
lead: 'গড় সরবরাহ সময়',
|
|
21
|
+
days_one: '{{count}} দিন',
|
|
22
|
+
days_other: '{{count}} দিন',
|
|
23
|
+
orders: 'অর্ডার',
|
|
24
|
+
price: 'শেষ {{last}}, গড় {{average}} ({{change}}%)',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|
|
@@ -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: 70dff6019010b96d
|
|
2
2
|
// Bindings of module `purchase_stock_account`: 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';
|