shutro-erp 0.3.5 → 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 +15 -0
- package/dist/{mrp_account → account_asset}/.kosh/schema.d.ts +785 -614
- package/dist/account_asset/board.d.ts +61 -0
- package/dist/account_asset/board.js +86 -0
- package/dist/account_asset/books.d.ts +42 -0
- package/dist/account_asset/books.js +398 -0
- package/dist/account_asset/demo.d.ts +7 -0
- package/dist/account_asset/demo.js +72 -0
- package/dist/account_asset/i18n/bn.d.ts +2 -0
- package/dist/account_asset/i18n/bn.js +97 -0
- package/dist/account_asset/index.d.ts +9 -0
- package/dist/account_asset/index.js +337 -0
- package/dist/account_asset/module.d.ts +11076 -0
- package/dist/account_asset/module.js +230 -0
- package/dist/account_budget/.kosh/bindings.js +15 -0
- package/dist/account_budget/.kosh/schema.d.ts +2841 -0
- package/dist/account_budget/budget.d.ts +5 -0
- package/dist/account_budget/budget.js +142 -0
- package/dist/account_budget/demo.d.ts +6 -0
- package/dist/account_budget/demo.js +30 -0
- package/dist/account_budget/i18n/bn.d.ts +2 -0
- package/dist/account_budget/i18n/bn.js +63 -0
- package/dist/account_budget/index.d.ts +4 -0
- package/dist/account_budget/index.js +237 -0
- package/dist/account_budget/module.d.ts +27289 -0
- package/dist/account_budget/module.js +182 -0
- package/dist/account_portal/.kosh/bindings.js +1 -1
- package/dist/account_portal/.kosh/schema.d.ts +651 -10
- 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 +5212 -1592
- package/dist/accounting/.kosh/bindings.js +1 -1
- package/dist/accounting/.kosh/schema.d.ts +651 -10
- 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 +3 -1
- package/dist/accounting/index.js +780 -5
- package/dist/accounting/module.d.ts +5386 -1543
- package/dist/accounting/module.js +155 -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.d.ts +22 -0
- package/dist/approvals/.kosh/bindings.js +15 -0
- package/dist/approvals/.kosh/schema.d.ts +879 -0
- 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 +36 -0
- package/dist/approvals/index.js +772 -0
- package/dist/approvals/mails.d.ts +30 -0
- package/dist/approvals/mails.js +87 -0
- package/dist/approvals/module.d.ts +2930 -0
- package/dist/approvals/module.js +473 -0
- package/dist/approvals/web/Config.d.ts +12 -0
- package/dist/approvals/web/Config.js +60 -0
- package/dist/approvals/web/History.d.ts +4 -0
- package/dist/approvals/web/History.js +13 -0
- package/dist/approvals/web/Inbox.d.ts +9 -0
- package/dist/approvals/web/Inbox.js +114 -0
- package/dist/approvals/web/Matrix.d.ts +9 -0
- package/dist/approvals/web/Matrix.js +26 -0
- package/dist/approvals/web/Mine.d.ts +7 -0
- package/dist/approvals/web/Mine.js +27 -0
- package/dist/approvals/web/index.d.ts +15 -0
- package/dist/approvals/web/index.js +29 -0
- package/dist/approvals/web/messages.d.ts +2 -0
- package/dist/approvals/web/messages.js +211 -0
- package/dist/approvals/web/shared.d.ts +59 -0
- package/dist/approvals/web/shared.js +46 -0
- package/dist/approvals_purchase/.kosh/bindings.d.ts +22 -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.d.ts +22 -0
- package/dist/attendance/.kosh/bindings.js +15 -0
- package/dist/attendance/.kosh/schema.d.ts +1106 -0
- package/dist/attendance/days.d.ts +96 -0
- package/dist/attendance/days.js +430 -0
- package/dist/attendance/demo.d.ts +7 -0
- package/dist/attendance/demo.js +58 -0
- package/dist/attendance/i18n/bn.d.ts +2 -0
- package/dist/attendance/i18n/bn.js +147 -0
- package/dist/attendance/index.d.ts +4 -0
- package/dist/attendance/index.js +515 -0
- package/dist/attendance/module.d.ts +4413 -0
- package/dist/attendance/module.js +412 -0
- package/dist/attendance/routes.d.ts +16 -0
- package/dist/attendance/routes.js +266 -0
- package/dist/attendance/web/Check.d.ts +8 -0
- package/dist/attendance/web/Check.js +40 -0
- package/dist/attendance/web/Kiosk.d.ts +8 -0
- package/dist/attendance/web/Kiosk.js +62 -0
- package/dist/attendance/web/PinButton.d.ts +7 -0
- package/dist/attendance/web/PinButton.js +29 -0
- package/dist/attendance/web/index.d.ts +13 -0
- package/dist/attendance/web/index.js +22 -0
- package/dist/attendance/web/messages.d.ts +2 -0
- package/dist/attendance/web/messages.js +61 -0
- 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 +46 -4
- package/dist/cli/templates.d.ts +1 -1
- package/dist/cli/templates.js +123 -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 +19 -3
- package/dist/crm/.kosh/bindings.js +1 -1
- package/dist/crm/.kosh/schema.d.ts +3 -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 +22 -0
- package/dist/crm/module.js +6 -3
- package/dist/documents/.kosh/bindings.d.ts +22 -0
- package/dist/documents/.kosh/bindings.js +15 -0
- package/dist/documents/.kosh/schema.d.ts +863 -0
- package/dist/documents/demo.d.ts +6 -0
- package/dist/documents/demo.js +22 -0
- package/dist/documents/documents.d.ts +98 -0
- package/dist/documents/documents.js +318 -0
- package/dist/documents/i18n/bn.d.ts +2 -0
- package/dist/documents/i18n/bn.js +83 -0
- package/dist/documents/index.d.ts +30 -0
- package/dist/documents/index.js +569 -0
- package/dist/documents/module.d.ts +2801 -0
- package/dist/documents/module.js +215 -0
- package/dist/documents/web/Versions.d.ts +7 -0
- package/dist/documents/web/Versions.js +45 -0
- package/dist/documents/web/index.d.ts +11 -0
- package/dist/documents/web/index.js +16 -0
- package/dist/documents/web/messages.d.ts +2 -0
- package/dist/documents/web/messages.js +21 -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 +651 -10
- 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 +5133 -1513
- package/dist/expense/.kosh/bindings.d.ts +22 -0
- package/dist/expense/.kosh/bindings.js +15 -0
- package/dist/expense/.kosh/schema.d.ts +1620 -0
- package/dist/expense/demo.d.ts +7 -0
- package/dist/expense/demo.js +69 -0
- package/dist/expense/i18n/bn.d.ts +2 -0
- package/dist/expense/i18n/bn.js +155 -0
- package/dist/expense/index.d.ts +3 -0
- package/dist/expense/index.js +502 -0
- package/dist/expense/module.d.ts +6768 -0
- package/dist/expense/module.js +649 -0
- package/dist/expense_account/.kosh/bindings.d.ts +22 -0
- package/dist/expense_account/.kosh/bindings.js +15 -0
- package/dist/expense_account/.kosh/schema.d.ts +2515 -0
- package/dist/expense_account/i18n/bn.d.ts +2 -0
- package/dist/expense_account/i18n/bn.js +15 -0
- package/dist/expense_account/index.d.ts +3 -0
- package/dist/expense_account/index.js +76 -0
- package/dist/expense_account/module.d.ts +14628 -0
- package/dist/expense_account/module.js +318 -0
- package/dist/helpdesk/.kosh/bindings.d.ts +22 -0
- package/dist/helpdesk/.kosh/bindings.js +15 -0
- package/dist/helpdesk/.kosh/schema.d.ts +886 -0
- package/dist/helpdesk/demo.d.ts +7 -0
- package/dist/helpdesk/demo.js +65 -0
- package/dist/helpdesk/hours.d.ts +17 -0
- package/dist/helpdesk/hours.js +94 -0
- package/dist/helpdesk/i18n/bn.d.ts +2 -0
- package/dist/helpdesk/i18n/bn.js +127 -0
- package/dist/helpdesk/index.d.ts +10 -0
- package/dist/helpdesk/index.js +463 -0
- package/dist/helpdesk/module.d.ts +2960 -0
- package/dist/helpdesk/module.js +326 -0
- package/dist/helpdesk/routes.d.ts +12 -0
- package/dist/helpdesk/routes.js +132 -0
- package/dist/helpdesk/sla.d.ts +37 -0
- package/dist/helpdesk/sla.js +226 -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/indent/.kosh/bindings.d.ts +22 -0
- package/dist/indent/.kosh/bindings.js +15 -0
- 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/indent/module.d.ts +13424 -0
- 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 +651 -10
- 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 +5212 -1592
- package/dist/l10n_bd_payroll/.kosh/bindings.d.ts +22 -0
- package/dist/l10n_bd_payroll/.kosh/bindings.js +15 -0
- package/dist/l10n_bd_payroll/.kosh/schema.d.ts +2891 -0
- package/dist/l10n_bd_payroll/data.d.ts +47 -0
- package/dist/l10n_bd_payroll/data.js +347 -0
- 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.d.ts +4 -0
- package/dist/l10n_bd_payroll/index.js +26 -0
- package/dist/l10n_bd_payroll/module.d.ts +17294 -0
- package/dist/l10n_bd_payroll/module.js +86 -0
- 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/l10n_bd_pos/.kosh/schema.d.ts +2341 -0
- 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 +9047 -6981
- 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 +651 -10
- 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 +6778 -1580
- package/dist/l10n_in/module.js +25 -5
- package/dist/l10n_in/web/GstSettings.js +2 -2
- package/dist/mail/inbound/handle.js +8 -5
- 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 +374 -3
- 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 +6095 -1327
- 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 +105 -2
- package/dist/payment/.kosh/bindings.js +1 -1
- package/dist/payment/.kosh/schema.d.ts +653 -11
- package/dist/payment/i18n/bn.d.ts +2 -0
- package/dist/payment/i18n/bn.js +59 -0
- package/dist/payment/index.d.ts +41 -0
- package/dist/payment/index.js +216 -74
- package/dist/payment/module.d.ts +5353 -1675
- package/dist/payment/module.js +36 -6
- package/dist/payment/settle.js +11 -1
- package/dist/payroll/.kosh/bindings.d.ts +22 -0
- package/dist/payroll/.kosh/bindings.js +15 -0
- package/dist/payroll/.kosh/schema.d.ts +1448 -0
- package/dist/payroll/compute.d.ts +35 -0
- package/dist/payroll/compute.js +398 -0
- package/dist/payroll/demo.d.ts +55 -0
- package/dist/payroll/demo.js +121 -0
- package/dist/payroll/formula.d.ts +62 -0
- package/dist/payroll/formula.js +320 -0
- package/dist/payroll/i18n/bn.d.ts +2 -0
- package/dist/payroll/i18n/bn.js +206 -0
- package/dist/payroll/index.d.ts +230 -0
- package/dist/payroll/index.js +715 -0
- package/dist/{mrp → payroll}/module.d.ts +4294 -2624
- package/dist/payroll/module.js +606 -0
- package/dist/payroll/routes.d.ts +10 -0
- package/dist/payroll/routes.js +112 -0
- package/dist/payroll_account/.kosh/bindings.d.ts +22 -0
- package/dist/payroll_account/.kosh/bindings.js +15 -0
- package/dist/payroll_account/.kosh/schema.d.ts +2887 -0
- package/dist/payroll_account/i18n/bn.d.ts +2 -0
- package/dist/payroll_account/i18n/bn.js +10 -0
- package/dist/payroll_account/index.d.ts +3 -0
- package/dist/payroll_account/index.js +42 -0
- package/dist/payroll_account/module.d.ts +16738 -0
- package/dist/payroll_account/module.js +256 -0
- package/dist/permissions/approvals.d.ts +227 -12
- package/dist/permissions/approvals.js +1421 -67
- package/dist/permissions/index.d.ts +1 -1
- package/dist/permissions/index.js +2 -2
- package/dist/permissions/models.js +364 -13
- package/dist/permissions/routes.d.ts +9 -1
- package/dist/permissions/routes.js +72 -5
- package/dist/permissions/web/ApprovalPanel.d.ts +5 -4
- package/dist/permissions/web/ApprovalPanel.js +75 -11
- package/dist/permissions/web/index.d.ts +6 -4
- package/dist/permissions/web/index.js +13 -4
- package/dist/permissions/web/messages.d.ts +2 -0
- package/dist/permissions/web/messages.js +95 -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 +3 -1
- 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 +652 -10
- package/dist/pos/i18n/bn.d.ts +2 -0
- package/dist/pos/i18n/bn.js +133 -0
- package/dist/pos/index.js +87 -1
- package/dist/pos/module.d.ts +6967 -1709
- 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 +822 -12
- 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 +11241 -2851
- package/dist/product/.kosh/bindings.js +1 -1
- package/dist/product/.kosh/schema.d.ts +203 -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 +301 -1
- package/dist/product/module.d.ts +1727 -0
- package/dist/product/module.js +67 -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 +735 -1
- package/dist/project/i18n/bn.d.ts +2 -0
- package/dist/project/i18n/bn.js +383 -0
- package/dist/project/index.d.ts +3 -1
- package/dist/project/index.js +1024 -14
- package/dist/project/module.d.ts +9912 -390
- package/dist/project/module.js +1590 -14
- package/dist/project/routes.d.ts +44 -0
- package/dist/project/routes.js +314 -0
- package/dist/project/schedule.d.ts +72 -0
- package/dist/project/schedule.js +192 -0
- package/dist/project/web/Refresh.d.ts +8 -0
- package/dist/project/web/Refresh.js +29 -0
- package/dist/project/web/Schedule.d.ts +9 -0
- package/dist/project/web/Schedule.js +93 -0
- package/dist/project/web/Structure.d.ts +8 -0
- package/dist/project/web/Structure.js +86 -0
- package/dist/project/web/Workload.d.ts +8 -0
- package/dist/project/web/Workload.js +43 -0
- package/dist/project/web/index.d.ts +14 -0
- package/dist/project/web/index.js +25 -0
- package/dist/project/web/messages.d.ts +2 -0
- package/dist/project/web/messages.js +85 -0
- package/dist/project_account/.kosh/bindings.d.ts +22 -0
- package/dist/project_account/.kosh/bindings.js +15 -0
- package/dist/project_account/.kosh/schema.d.ts +2763 -0
- package/dist/project_account/i18n/bn.d.ts +2 -0
- package/dist/project_account/i18n/bn.js +6 -0
- package/dist/project_account/index.d.ts +3 -0
- package/dist/project_account/index.js +29 -0
- package/dist/project_account/module.d.ts +15013 -0
- package/dist/project_account/module.js +76 -0
- package/dist/project_portal/.kosh/bindings.js +1 -1
- package/dist/project_portal/.kosh/schema.d.ts +735 -1
- 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 +4796 -87
- package/dist/project_purchase/.kosh/bindings.d.ts +22 -0
- package/dist/project_purchase/.kosh/bindings.js +15 -0
- package/dist/project_purchase/.kosh/schema.d.ts +3393 -0
- package/dist/project_purchase/i18n/bn.d.ts +2 -0
- package/dist/project_purchase/i18n/bn.js +4 -0
- package/dist/project_purchase/index.d.ts +9 -0
- package/dist/project_purchase/index.js +24 -0
- package/dist/project_purchase/module.d.ts +38613 -0
- package/dist/project_purchase/module.js +56 -0
- package/dist/purchase/.kosh/bindings.js +1 -1
- package/dist/purchase/.kosh/schema.d.ts +908 -5
- 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 +7147 -395
- package/dist/purchase/module.js +303 -10
- 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 +1209 -16
- 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 +20 -0
- package/dist/purchase_account/module.d.ts +12232 -2028
- package/dist/purchase_account/module.js +252 -9
- package/dist/purchase_portal/.kosh/bindings.js +1 -1
- package/dist/purchase_portal/.kosh/schema.d.ts +908 -5
- 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 +6853 -352
- package/dist/purchase_stock/.kosh/bindings.js +1 -1
- package/dist/purchase_stock/.kosh/schema.d.ts +1096 -21
- 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 +2 -2
- package/dist/purchase_stock/index.js +38 -2
- package/dist/purchase_stock/module.d.ts +12930 -1612
- package/dist/purchase_stock/module.js +317 -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 +1444 -20
- 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 -35346
- package/dist/purchase_stock_account/module.js +35 -8
- package/dist/recruitment/.kosh/bindings.js +1 -1
- package/dist/recruitment/.kosh/schema.d.ts +60 -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 +460 -8
- package/dist/recruitment/module.js +13 -4
- 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 +763 -18
- 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 +8241 -2052
- 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 +391 -494
- 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 +292 -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 +2563 -292
- package/dist/sale_project/.kosh/bindings.js +1 -1
- package/dist/sale_project/.kosh/schema.d.ts +1025 -4
- 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 +9280 -762
- package/dist/sale_project/module.js +17 -1
- package/dist/sale_stock/.kosh/bindings.js +1 -1
- package/dist/sale_stock/.kosh/schema.d.ts +463 -6
- 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 +8355 -1334
- package/dist/sale_stock/module.js +20 -3
- package/dist/sales/.kosh/bindings.js +1 -1
- package/dist/sales/.kosh/schema.d.ts +292 -4
- package/dist/sales/i18n/bn.d.ts +2 -0
- package/dist/sales/i18n/bn.js +128 -0
- package/dist/sales/index.js +124 -5
- package/dist/sales/module.d.ts +3568 -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.d.ts +22 -0
- package/dist/{mrp → sign}/.kosh/bindings.js +2 -2
- package/dist/sign/.kosh/schema.d.ts +991 -0
- package/dist/sign/i18n/bn.d.ts +2 -0
- package/dist/sign/i18n/bn.js +97 -0
- package/dist/sign/index.d.ts +29 -0
- package/dist/sign/index.js +478 -0
- package/dist/sign/module.d.ts +4518 -0
- package/dist/sign/module.js +167 -0
- package/dist/sign/sign.d.ts +82 -0
- package/dist/sign/sign.js +474 -0
- package/dist/stock/.kosh/bindings.js +1 -1
- package/dist/stock/.kosh/schema.d.ts +374 -3
- package/dist/stock/demo.d.ts +2 -1
- package/dist/stock/demo.js +28 -1
- package/dist/stock/i18n/bn.d.ts +2 -0
- package/dist/stock/i18n/bn.js +311 -0
- package/dist/stock/index.d.ts +4 -1
- package/dist/stock/index.js +674 -6
- package/dist/stock/ledger.d.ts +78 -0
- package/dist/stock/ledger.js +582 -0
- package/dist/stock/module.d.ts +6142 -1380
- package/dist/stock/module.js +780 -26
- package/dist/stock/replenish.d.ts +38 -0
- package/dist/stock/replenish.js +191 -0
- 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/Replenishment.d.ts +8 -0
- package/dist/stock/web/Replenishment.js +84 -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 +7 -2
- package/dist/stock/web/index.js +15 -2
- package/dist/stock/web/messages.js +206 -0
- package/dist/stock_account/.kosh/bindings.js +1 -1
- package/dist/stock_account/.kosh/schema.d.ts +878 -12
- 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 +141 -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 +12143 -3391
- 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 +95 -0
- package/dist/trade_finance/module.d.ts +26 -0
- package/dist/trade_finance/module.js +29 -8
- package/dist/trade_finance_account/.kosh/bindings.js +1 -1
- package/dist/trade_finance_account/.kosh/schema.d.ts +651 -10
- 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 +3 -0
- package/dist/trade_finance_account/module.d.ts +5129 -1509
- package/dist/trade_finance_account/module.js +2 -0
- package/dist/trade_finance_purchase/.kosh/bindings.js +1 -1
- package/dist/trade_finance_purchase/.kosh/schema.d.ts +908 -5
- 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 -408
- package/dist/trade_finance_sale/.kosh/bindings.js +1 -1
- package/dist/trade_finance_sale/.kosh/schema.d.ts +292 -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 +2602 -331
- package/dist/ui/api.d.ts +2 -0
- package/dist/ui/app.d.ts +9 -0
- package/dist/ui/app.js +47 -15
- package/dist/ui/components/AppIcon.js +9 -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 +40 -0
- package/dist/ui/i18n/messages.js +80 -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 +51 -12
- package/dist/ui/views/KanbanView.js +9 -1
- package/dist/ui/views/ListView.d.ts +8 -0
- package/dist/ui/views/ListView.js +14 -5
- package/dist/ui/views/StatsRow.js +2 -1
- package/dist/ui/views/widgets.js +7 -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 +37 -0
- package/dist/website/module.d.ts +20 -0
- package/dist/website/module.js +30 -5
- package/dist/website_crm/.kosh/bindings.js +1 -1
- package/dist/website_crm/.kosh/schema.d.ts +3 -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 +41 -0
- package/dist/website_sale/.kosh/bindings.d.ts +22 -0
- package/dist/website_sale/.kosh/bindings.js +15 -0
- package/dist/website_sale/.kosh/schema.d.ts +2909 -0
- package/dist/website_sale/couriers.d.ts +50 -0
- package/dist/website_sale/couriers.js +59 -0
- package/dist/website_sale/demo.d.ts +7 -0
- package/dist/website_sale/demo.js +90 -0
- package/dist/website_sale/growth.d.ts +31 -0
- package/dist/website_sale/growth.js +163 -0
- package/dist/website_sale/i18n/bn.d.ts +2 -0
- package/dist/website_sale/i18n/bn.js +132 -0
- package/dist/website_sale/index.d.ts +49 -0
- package/dist/website_sale/index.js +620 -0
- package/dist/website_sale/module.d.ts +35182 -0
- package/dist/website_sale/module.js +419 -0
- package/dist/website_sale/shipments.d.ts +16 -0
- package/dist/website_sale/shipments.js +113 -0
- package/dist/website_sale/shop.d.ts +81 -0
- package/dist/website_sale/shop.js +662 -0
- package/dist/website_sale_stock/.kosh/bindings.d.ts +22 -0
- package/dist/website_sale_stock/.kosh/bindings.js +15 -0
- package/dist/website_sale_stock/.kosh/schema.d.ts +3400 -0
- 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.d.ts +9 -0
- package/dist/website_sale_stock/index.js +22 -0
- package/dist/website_sale_stock/module.d.ts +11 -0
- package/dist/website_sale_stock/module.js +32 -0
- package/package.json +117 -8
- package/dist/mrp/index.d.ts +0 -3
- package/dist/mrp/index.js +0 -392
- package/dist/mrp/module.js +0 -695
- package/dist/mrp_account/index.d.ts +0 -3
- package/dist/mrp_account/index.js +0 -22
- /package/dist/{mrp → account_asset}/.kosh/bindings.d.ts +0 -0
- /package/dist/{mrp_account → account_budget}/.kosh/bindings.d.ts +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replenishment (RFC 0024 §2.6): each reorder rule's forecast in its warehouse — on hand in the warehouse's stock
|
|
3
|
+
* location and those inside it, less what confirmed transfers take out, plus what they bring in and what other apps
|
|
4
|
+
* have on order (`pending()`: requests for quotation, production orders) — and, below the minimum, what to order to
|
|
5
|
+
* reach the maximum, rounded up to the rule's step. Every figure is written on the rule with the reckoning in words,
|
|
6
|
+
* so the screen can say why it proposes what it does. Ordering goes through the rules' `procure()`, by method.
|
|
7
|
+
*/
|
|
8
|
+
import { type Decimal } from '../server/orm.js';
|
|
9
|
+
import type { Env } from './.kosh/bindings.js';
|
|
10
|
+
export interface Reckoning {
|
|
11
|
+
readonly onHand: Decimal;
|
|
12
|
+
readonly forecast: Decimal;
|
|
13
|
+
readonly proposed: Decimal;
|
|
14
|
+
readonly explanation: string;
|
|
15
|
+
}
|
|
16
|
+
/** The forecast and proposal of each rule of `ids` (or every active rule of the user's companies). */
|
|
17
|
+
export declare function reckon(env: Env, ids?: readonly number[]): Promise<Map<number, Reckoning>>;
|
|
18
|
+
/** Writes each rule's figures (those of `ids`, or every rule); returns how many were refreshed. */
|
|
19
|
+
export declare function refreshRules(env: Env, ids?: readonly number[]): Promise<number>;
|
|
20
|
+
export interface Ordered {
|
|
21
|
+
readonly ordered: {
|
|
22
|
+
rule: number;
|
|
23
|
+
document: string;
|
|
24
|
+
quantity: string;
|
|
25
|
+
}[];
|
|
26
|
+
readonly skipped: {
|
|
27
|
+
rule: number;
|
|
28
|
+
reason: string;
|
|
29
|
+
}[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Orders the rules of `ids`: `quantities` where given, else what each proposes now. Rules with nothing to order are
|
|
33
|
+
* skipped with the reason; the others are ordered by their method, their last order written, their figures
|
|
34
|
+
* refreshed (what is now on order counts).
|
|
35
|
+
*/
|
|
36
|
+
export declare function orderRules(env: Env, ids: readonly number[], quantities?: ReadonlyMap<number, Decimal>): Promise<Ordered>;
|
|
37
|
+
/** The rules to order on their own: automatic, not snoozed, with something to order once refreshed. */
|
|
38
|
+
export declare function orderAutomatic(env: Env): Promise<Ordered>;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replenishment (RFC 0024 §2.6): each reorder rule's forecast in its warehouse — on hand in the warehouse's stock
|
|
3
|
+
* location and those inside it, less what confirmed transfers take out, plus what they bring in and what other apps
|
|
4
|
+
* have on order (`pending()`: requests for quotation, production orders) — and, below the minimum, what to order to
|
|
5
|
+
* reach the maximum, rounded up to the rule's step. Every figure is written on the rule with the reckoning in words,
|
|
6
|
+
* so the screen can say why it proposes what it does. Ordering goes through the rules' `procure()`, by method.
|
|
7
|
+
*/
|
|
8
|
+
import { orm } from '../server/orm.js';
|
|
9
|
+
import { warehouseStock } from './module.js';
|
|
10
|
+
const zero = orm.toDecimal(0);
|
|
11
|
+
/** A quantity as people read it: `12`, `2.5`. */
|
|
12
|
+
const n = (d) => d.toDecimalPlaces(4).toString();
|
|
13
|
+
/** "12 (TR/2026/00004, TR/2026/00009)": the documents, the first three. */
|
|
14
|
+
function withDocuments(quantity, documents) {
|
|
15
|
+
const unique = [...new Set(documents.filter((d) => d !== ''))];
|
|
16
|
+
if (unique.length === 0)
|
|
17
|
+
return n(quantity);
|
|
18
|
+
const shown = unique.slice(0, 3).join(', ');
|
|
19
|
+
return `${n(quantity)} (${shown}${unique.length > 3 ? ', …' : ''})`;
|
|
20
|
+
}
|
|
21
|
+
/** The forecast and proposal of each rule of `ids` (or every active rule of the user's companies). */
|
|
22
|
+
export async function reckon(env, ids) {
|
|
23
|
+
const found = env
|
|
24
|
+
.model('stock.reorder')
|
|
25
|
+
.browse((ids ?? (await env.model('stock.reorder').search({})).ids));
|
|
26
|
+
const rules = await found.load({ product: true });
|
|
27
|
+
const pending = await found.pending();
|
|
28
|
+
const out = new Map();
|
|
29
|
+
const proposals = new Map();
|
|
30
|
+
for (const r of rules) {
|
|
31
|
+
const { root, inside } = await warehouseStock(env, r.warehouse.id, r.company.id);
|
|
32
|
+
if (root === null)
|
|
33
|
+
continue;
|
|
34
|
+
const quants = await (await env.model('stock.quant').search({
|
|
35
|
+
where: { product: r.product.id, location: { in: [...inside] } },
|
|
36
|
+
})).load(['quantity']);
|
|
37
|
+
const onHand = [...quants].reduce((s, q) => s.plus(q.quantity), zero);
|
|
38
|
+
const moves = await (await env.model('stock.move').search({
|
|
39
|
+
where: {
|
|
40
|
+
product: r.product.id,
|
|
41
|
+
'picking.state': 'confirmed',
|
|
42
|
+
or: [
|
|
43
|
+
{ 'picking.source': { in: [...inside] } },
|
|
44
|
+
{ 'picking.destination': { in: [...inside] } },
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
})).load({ picking: true });
|
|
48
|
+
let outgoing = zero;
|
|
49
|
+
let incoming = zero;
|
|
50
|
+
const outDocs = [];
|
|
51
|
+
const inDocs = [];
|
|
52
|
+
for (const m of moves) {
|
|
53
|
+
const from = inside.has(m.picking.source.id);
|
|
54
|
+
const to = inside.has(m.picking.destination.id);
|
|
55
|
+
if (from === to)
|
|
56
|
+
continue; // inside the warehouse: neither in nor out
|
|
57
|
+
const qty = m.productQty ?? m.quantity;
|
|
58
|
+
if (from) {
|
|
59
|
+
outgoing = outgoing.plus(qty);
|
|
60
|
+
outDocs.push(m.picking.name);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
incoming = incoming.plus(qty);
|
|
64
|
+
inDocs.push(m.picking.name);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const onOrder = pending.get(r.id) ?? [];
|
|
68
|
+
const ordered = onOrder.reduce((s, p) => s.plus(orm.toDecimal(p.quantity)), zero);
|
|
69
|
+
const forecast = onHand.minus(outgoing).plus(incoming).plus(ordered);
|
|
70
|
+
let sum = `On hand ${n(onHand)}`;
|
|
71
|
+
if (outgoing.gt(0))
|
|
72
|
+
sum += ` − going out ${withDocuments(outgoing, outDocs)}`;
|
|
73
|
+
if (incoming.gt(0))
|
|
74
|
+
sum += ` + coming in ${withDocuments(incoming, inDocs)}`;
|
|
75
|
+
if (ordered.gt(0))
|
|
76
|
+
sum += ` + on order ${withDocuments(ordered, onOrder.map((p) => p.document))}`;
|
|
77
|
+
let proposed = zero;
|
|
78
|
+
let verdict;
|
|
79
|
+
if (r.trigger === 'order')
|
|
80
|
+
verdict =
|
|
81
|
+
r.method === 'dropship'
|
|
82
|
+
? 'dropshipped: the vendor delivers each order to the customer'
|
|
83
|
+
: 'ordered for each delivery (make to order)';
|
|
84
|
+
else if (forecast.lt(r.minimum)) {
|
|
85
|
+
const need = r.maximum.minus(forecast);
|
|
86
|
+
proposed = need.div(r.multiple).ceil().times(r.multiple);
|
|
87
|
+
verdict = `below the minimum ${n(r.minimum)}: ${n(need)} to reach the maximum ${n(r.maximum)}`;
|
|
88
|
+
if (!proposed.eq(need))
|
|
89
|
+
verdict += `, ordered in steps of ${n(r.multiple)}: ${n(proposed)}`;
|
|
90
|
+
}
|
|
91
|
+
else
|
|
92
|
+
verdict = `not below the minimum ${n(r.minimum)}: nothing to order`;
|
|
93
|
+
out.set(r.id, {
|
|
94
|
+
onHand,
|
|
95
|
+
forecast,
|
|
96
|
+
proposed,
|
|
97
|
+
explanation: `${sum} = forecast ${n(forecast)}; ${verdict}.`,
|
|
98
|
+
});
|
|
99
|
+
if (proposed.gt(0))
|
|
100
|
+
proposals.set(r.id, proposed.toString());
|
|
101
|
+
}
|
|
102
|
+
// Where it would come from (a bridge says: the vendor and why).
|
|
103
|
+
if (proposals.size > 0) {
|
|
104
|
+
const sources = await env
|
|
105
|
+
.model('stock.reorder')
|
|
106
|
+
.browse([...proposals.keys()])
|
|
107
|
+
.sourcing(proposals);
|
|
108
|
+
for (const [id, text] of sources) {
|
|
109
|
+
const r = out.get(id);
|
|
110
|
+
if (r !== undefined && text !== '')
|
|
111
|
+
out.set(id, { ...r, explanation: `${r.explanation} ${text}` });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
/** Writes each rule's figures (those of `ids`, or every rule); returns how many were refreshed. */
|
|
117
|
+
export async function refreshRules(env, ids) {
|
|
118
|
+
const figures = await reckon(env, ids);
|
|
119
|
+
const now = new Date();
|
|
120
|
+
for (const [id, f] of figures)
|
|
121
|
+
await env
|
|
122
|
+
.model('stock.reorder')
|
|
123
|
+
.browse([id])
|
|
124
|
+
.write({
|
|
125
|
+
onHand: f.onHand,
|
|
126
|
+
forecast: f.forecast,
|
|
127
|
+
proposed: f.proposed,
|
|
128
|
+
explanation: f.explanation,
|
|
129
|
+
refreshedAt: now,
|
|
130
|
+
});
|
|
131
|
+
await env.flush();
|
|
132
|
+
return figures.size;
|
|
133
|
+
}
|
|
134
|
+
const NO_APP = {
|
|
135
|
+
buy: 'Buying needs Purchase with receipts (purchase_stock) installed.',
|
|
136
|
+
make: 'Making needs Production (production) installed.',
|
|
137
|
+
transfer: 'The warehouses have no stock location.',
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Orders the rules of `ids`: `quantities` where given, else what each proposes now. Rules with nothing to order are
|
|
141
|
+
* skipped with the reason; the others are ordered by their method, their last order written, their figures
|
|
142
|
+
* refreshed (what is now on order counts).
|
|
143
|
+
*/
|
|
144
|
+
export async function orderRules(env, ids, quantities = new Map()) {
|
|
145
|
+
const figures = await reckon(env, ids);
|
|
146
|
+
const wanted = new Map();
|
|
147
|
+
const skipped = [];
|
|
148
|
+
for (const id of ids) {
|
|
149
|
+
const qty = quantities.get(id) ?? figures.get(id)?.proposed ?? zero;
|
|
150
|
+
if (qty.gt(0))
|
|
151
|
+
wanted.set(id, qty);
|
|
152
|
+
else
|
|
153
|
+
skipped.push({
|
|
154
|
+
rule: id,
|
|
155
|
+
reason: 'Nothing to order: the forecast is not below the minimum.',
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (wanted.size === 0)
|
|
159
|
+
return { ordered: [], skipped };
|
|
160
|
+
const rules = env.model('stock.reorder').browse([...wanted.keys()]);
|
|
161
|
+
const made = await rules.procure(new Map([...wanted].map(([id, q]) => [id, q.toString()])));
|
|
162
|
+
const ordered = [];
|
|
163
|
+
for (const r of await rules.load({})) {
|
|
164
|
+
const document = made.get(r.id);
|
|
165
|
+
if (document === undefined) {
|
|
166
|
+
skipped.push({ rule: r.id, reason: NO_APP[r.method] ?? 'No app orders this method.' });
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
ordered.push({ rule: r.id, document, quantity: n(wanted.get(r.id) ?? zero) });
|
|
170
|
+
await env
|
|
171
|
+
.model('stock.reorder')
|
|
172
|
+
.browse([r.id])
|
|
173
|
+
.write({ lastOrder: document });
|
|
174
|
+
}
|
|
175
|
+
await env.flush();
|
|
176
|
+
await refreshRules(env, ordered.map((o) => o.rule));
|
|
177
|
+
return { ordered, skipped };
|
|
178
|
+
}
|
|
179
|
+
/** The rules to order on their own: automatic, not snoozed, with something to order once refreshed. */
|
|
180
|
+
export async function orderAutomatic(env) {
|
|
181
|
+
await refreshRules(env);
|
|
182
|
+
const today = env.today();
|
|
183
|
+
const due = await env.model('stock.reorder').search({
|
|
184
|
+
where: {
|
|
185
|
+
auto: true,
|
|
186
|
+
proposed: { gt: 0 },
|
|
187
|
+
or: [{ snoozedUntil: { isNull: true } }, { snoozedUntil: { lt: today } }],
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
return due.length === 0 ? { ordered: [], skipped: [] } : orderRules(env, due.ids);
|
|
191
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { type Env } from './.kosh/bindings.js';
|
|
2
|
+
/** Why goods come back: reported by product and partner. */
|
|
3
|
+
export declare const StockReturnReason: import("../server/orm.js").Model<"stock.return.reason", {
|
|
4
|
+
readonly id: import("../server/orm.js").IdField<"stock.return.reason">;
|
|
5
|
+
readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
|
|
6
|
+
required: true;
|
|
7
|
+
readonly: true;
|
|
8
|
+
computed: false;
|
|
9
|
+
inverse: false;
|
|
10
|
+
hasDefault: false;
|
|
11
|
+
sequence: false;
|
|
12
|
+
}>;
|
|
13
|
+
readonly updatedAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
|
|
14
|
+
required: true;
|
|
15
|
+
readonly: true;
|
|
16
|
+
computed: false;
|
|
17
|
+
inverse: false;
|
|
18
|
+
hasDefault: false;
|
|
19
|
+
sequence: false;
|
|
20
|
+
}>;
|
|
21
|
+
readonly createdBy: import("../server/orm.js").Many2oneField<'res.users', {
|
|
22
|
+
required: false;
|
|
23
|
+
readonly: true;
|
|
24
|
+
computed: false;
|
|
25
|
+
inverse: false;
|
|
26
|
+
hasDefault: false;
|
|
27
|
+
sequence: false;
|
|
28
|
+
}>;
|
|
29
|
+
readonly updatedBy: import("../server/orm.js").Many2oneField<'res.users', {
|
|
30
|
+
required: false;
|
|
31
|
+
readonly: true;
|
|
32
|
+
computed: false;
|
|
33
|
+
inverse: false;
|
|
34
|
+
hasDefault: false;
|
|
35
|
+
sequence: false;
|
|
36
|
+
}>;
|
|
37
|
+
readonly displayName: import("../server/orm.js").CharField<{
|
|
38
|
+
required: true;
|
|
39
|
+
readonly: true;
|
|
40
|
+
computed: true;
|
|
41
|
+
inverse: false;
|
|
42
|
+
hasDefault: false;
|
|
43
|
+
sequence: false;
|
|
44
|
+
}>;
|
|
45
|
+
readonly active: import("../server/orm.js").ActiveField;
|
|
46
|
+
readonly name: import("../server/orm.js").CharField<{
|
|
47
|
+
readonly required: true;
|
|
48
|
+
readonly computed: false;
|
|
49
|
+
readonly inverse: false;
|
|
50
|
+
readonly sequence: false;
|
|
51
|
+
readonly computeName: undefined;
|
|
52
|
+
readonly store: true;
|
|
53
|
+
readonly hasDefault: false;
|
|
54
|
+
readonly readonly: false;
|
|
55
|
+
}, string | Readonly<Record<string, string>>>;
|
|
56
|
+
readonly sequence: import("../server/orm.js").ScalarField<"integer", number, number, {
|
|
57
|
+
readonly required: false;
|
|
58
|
+
readonly computed: false;
|
|
59
|
+
readonly inverse: false;
|
|
60
|
+
readonly sequence: false;
|
|
61
|
+
readonly computeName: undefined;
|
|
62
|
+
readonly store: true;
|
|
63
|
+
readonly hasDefault: true;
|
|
64
|
+
readonly readonly: false;
|
|
65
|
+
}>;
|
|
66
|
+
readonly code: import("../server/orm.js").CharField<{
|
|
67
|
+
readonly required: false;
|
|
68
|
+
readonly computed: false;
|
|
69
|
+
readonly inverse: false;
|
|
70
|
+
readonly sequence: false;
|
|
71
|
+
readonly computeName: undefined;
|
|
72
|
+
readonly store: true;
|
|
73
|
+
readonly hasDefault: false;
|
|
74
|
+
readonly readonly: false;
|
|
75
|
+
}, string>;
|
|
76
|
+
}, {} & import("../server/orm.js").TransitionMethods<{
|
|
77
|
+
readonly name: import("../server/orm.js").CharField<{
|
|
78
|
+
readonly required: true;
|
|
79
|
+
readonly computed: false;
|
|
80
|
+
readonly inverse: false;
|
|
81
|
+
readonly sequence: false;
|
|
82
|
+
readonly computeName: undefined;
|
|
83
|
+
readonly store: true;
|
|
84
|
+
readonly hasDefault: false;
|
|
85
|
+
readonly readonly: false;
|
|
86
|
+
}, string | Readonly<Record<string, string>>>;
|
|
87
|
+
readonly sequence: import("../server/orm.js").ScalarField<"integer", number, number, {
|
|
88
|
+
readonly required: false;
|
|
89
|
+
readonly computed: false;
|
|
90
|
+
readonly inverse: false;
|
|
91
|
+
readonly sequence: false;
|
|
92
|
+
readonly computeName: undefined;
|
|
93
|
+
readonly store: true;
|
|
94
|
+
readonly hasDefault: true;
|
|
95
|
+
readonly readonly: false;
|
|
96
|
+
}>;
|
|
97
|
+
readonly code: import("../server/orm.js").CharField<{
|
|
98
|
+
readonly required: false;
|
|
99
|
+
readonly computed: false;
|
|
100
|
+
readonly inverse: false;
|
|
101
|
+
readonly sequence: false;
|
|
102
|
+
readonly computeName: undefined;
|
|
103
|
+
readonly store: true;
|
|
104
|
+
readonly hasDefault: false;
|
|
105
|
+
readonly readonly: false;
|
|
106
|
+
}, string>;
|
|
107
|
+
}>>;
|
|
108
|
+
/** The reasons a database starts with. */
|
|
109
|
+
export declare const DEFAULT_RETURN_REASONS: readonly [{
|
|
110
|
+
readonly code: 'damaged';
|
|
111
|
+
readonly en: 'Damaged';
|
|
112
|
+
readonly bn: 'ক্ষতিগ্রস্ত';
|
|
113
|
+
}, {
|
|
114
|
+
readonly code: 'wrong_item';
|
|
115
|
+
readonly en: 'Wrong item';
|
|
116
|
+
readonly bn: 'ভুল পণ্য';
|
|
117
|
+
}, {
|
|
118
|
+
readonly code: 'not_as_ordered';
|
|
119
|
+
readonly en: 'Not as ordered';
|
|
120
|
+
readonly bn: 'অর্ডার অনুযায়ী নয়';
|
|
121
|
+
}, {
|
|
122
|
+
readonly code: 'surplus';
|
|
123
|
+
readonly en: 'Surplus';
|
|
124
|
+
readonly bn: 'অতিরিক্ত';
|
|
125
|
+
}, {
|
|
126
|
+
readonly code: 'quality';
|
|
127
|
+
readonly en: 'Quality';
|
|
128
|
+
readonly bn: 'মানের সমস্যা';
|
|
129
|
+
}];
|
|
130
|
+
export declare function installReturnReasons(env: Env): Promise<number>;
|
|
131
|
+
/** What each line of a done transfer can still return. */
|
|
132
|
+
export interface Returnable {
|
|
133
|
+
readonly move: number;
|
|
134
|
+
readonly product: number;
|
|
135
|
+
readonly name: string;
|
|
136
|
+
readonly done: string;
|
|
137
|
+
readonly returned: string;
|
|
138
|
+
readonly returnable: string;
|
|
139
|
+
}
|
|
140
|
+
/** The lines of a done delivery or receipt with what is left to return (in the product's unit). */
|
|
141
|
+
export declare function returnableLines(env: Env, pickingId: number): Promise<Returnable[]>;
|
|
142
|
+
/**
|
|
143
|
+
* Makes and confirms the return of `lines` (move and quantity, in the product's unit) with a reason; `location`
|
|
144
|
+
* receives it instead of where the goods came from (a damaged-goods location). Returns the new transfer.
|
|
145
|
+
*/
|
|
146
|
+
export declare function createReturn(env: Env, pickingId: number, input: {
|
|
147
|
+
readonly lines: readonly {
|
|
148
|
+
readonly move: number;
|
|
149
|
+
readonly quantity: string;
|
|
150
|
+
}[];
|
|
151
|
+
readonly reason: number;
|
|
152
|
+
readonly note?: string | null;
|
|
153
|
+
readonly location?: number | null;
|
|
154
|
+
}): Promise<{
|
|
155
|
+
picking: number;
|
|
156
|
+
name: string;
|
|
157
|
+
}>;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns (RFC 0030 §3.2). A done delivery or receipt can be returned, in part: each line up to what was done and
|
|
3
|
+
* not returned yet (returns in progress count), with a reason. The return is a transfer of the other way — a
|
|
4
|
+
* customer's goods back in, goods back to the vendor —, linked to the original (`returnOf`) and line by line, with
|
|
5
|
+
* the original's links carried (an order's, through `backorderValues`), and lots taken back from the original's.
|
|
6
|
+
* It is confirmed, and validated like any transfer; `stock_account` values it at the original cost.
|
|
7
|
+
*/
|
|
8
|
+
import { HttpProblem } from '../server/index.js';
|
|
9
|
+
import { orm } from '../server/orm.js';
|
|
10
|
+
import { defineModel, f } from './.kosh/bindings.js';
|
|
11
|
+
const ALL = ['read', 'write', 'create', 'unlink', 'export', 'import'];
|
|
12
|
+
const zero = orm.toDecimal('0');
|
|
13
|
+
/** Why goods come back: reported by product and partner. */
|
|
14
|
+
export const StockReturnReason = defineModel('stock.return.reason', {
|
|
15
|
+
label: 'Return reason',
|
|
16
|
+
archivable: true,
|
|
17
|
+
order: ['sequence asc', 'id asc'],
|
|
18
|
+
access: { 'stock.user': ['read'], 'stock.manager': ALL },
|
|
19
|
+
fields: {
|
|
20
|
+
name: f.char({ required: true, translate: true, label: 'Reason' }),
|
|
21
|
+
sequence: f.integer({ default: 10 }),
|
|
22
|
+
code: f.char({ index: 'unique', label: 'Code' }),
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
/** The reasons a database starts with. */
|
|
26
|
+
export const DEFAULT_RETURN_REASONS = [
|
|
27
|
+
{ code: 'damaged', en: 'Damaged', bn: 'ক্ষতিগ্রস্ত' },
|
|
28
|
+
{ code: 'wrong_item', en: 'Wrong item', bn: 'ভুল পণ্য' },
|
|
29
|
+
{ code: 'not_as_ordered', en: 'Not as ordered', bn: 'অর্ডার অনুযায়ী নয়' },
|
|
30
|
+
{ code: 'surplus', en: 'Surplus', bn: 'অতিরিক্ত' },
|
|
31
|
+
{ code: 'quality', en: 'Quality', bn: 'মানের সমস্যা' },
|
|
32
|
+
];
|
|
33
|
+
export async function installReturnReasons(env) {
|
|
34
|
+
let made = 0;
|
|
35
|
+
const model = env.withFlags({ activeTest: false }).model('stock.return.reason');
|
|
36
|
+
for (const [i, r] of DEFAULT_RETURN_REASONS.entries()) {
|
|
37
|
+
if ((await model.search({ where: { code: r.code } })).ids.length > 0)
|
|
38
|
+
continue;
|
|
39
|
+
await model.create([
|
|
40
|
+
{ code: r.code, name: { en_US: r.en, bn_BD: r.bn }, sequence: (i + 1) * 10 },
|
|
41
|
+
]);
|
|
42
|
+
made++;
|
|
43
|
+
}
|
|
44
|
+
return made;
|
|
45
|
+
}
|
|
46
|
+
const OTHER_WAY = {
|
|
47
|
+
delivery: 'receipt',
|
|
48
|
+
receipt: 'delivery',
|
|
49
|
+
};
|
|
50
|
+
async function loadDone(env, pickingId) {
|
|
51
|
+
const [picking] = await env
|
|
52
|
+
.model('stock.picking')
|
|
53
|
+
.browse([pickingId])
|
|
54
|
+
.load({
|
|
55
|
+
moves: { product: true, returns: { picking: true } },
|
|
56
|
+
source: true,
|
|
57
|
+
destination: true,
|
|
58
|
+
});
|
|
59
|
+
if (picking === undefined)
|
|
60
|
+
throw new HttpProblem(404, 'missing-record', 'Not found', 'No such transfer.');
|
|
61
|
+
if (picking.state !== 'done')
|
|
62
|
+
throw new HttpProblem(409, 'not-done', 'Not done', 'Only a done transfer can be returned.');
|
|
63
|
+
if (OTHER_WAY[picking.kind] === undefined)
|
|
64
|
+
throw new HttpProblem(409, 'not-returnable', 'Not returnable', 'Deliveries and receipts are returned; other transfers are moved back by hand.');
|
|
65
|
+
return picking;
|
|
66
|
+
}
|
|
67
|
+
/** The lines of a done delivery or receipt with what is left to return (in the product's unit). */
|
|
68
|
+
export async function returnableLines(env, pickingId) {
|
|
69
|
+
const picking = await loadDone(env, pickingId);
|
|
70
|
+
return [...picking.moves].map((m) => {
|
|
71
|
+
const done = m.doneQty ?? zero;
|
|
72
|
+
const returned = [...m.returns]
|
|
73
|
+
.filter((r) => r.picking.state !== 'cancel')
|
|
74
|
+
.reduce((s, r) => s.plus(r.quantity), zero);
|
|
75
|
+
const left = done.minus(returned);
|
|
76
|
+
return {
|
|
77
|
+
move: m.id,
|
|
78
|
+
product: m.product.id,
|
|
79
|
+
name: String(m.name ?? m.product.name),
|
|
80
|
+
done: done.toString(),
|
|
81
|
+
returned: returned.toString(),
|
|
82
|
+
returnable: (left.gt(0) ? left : zero).toString(),
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Makes and confirms the return of `lines` (move and quantity, in the product's unit) with a reason; `location`
|
|
88
|
+
* receives it instead of where the goods came from (a damaged-goods location). Returns the new transfer.
|
|
89
|
+
*/
|
|
90
|
+
export async function createReturn(env, pickingId, input) {
|
|
91
|
+
const picking = await loadDone(env, pickingId);
|
|
92
|
+
const left = new Map((await returnableLines(env, pickingId)).map((l) => [l.move, l]));
|
|
93
|
+
const wanted = input.lines
|
|
94
|
+
.map((l) => ({ move: l.move, quantity: orm.toDecimal(l.quantity || '0') }))
|
|
95
|
+
.filter((l) => l.quantity.gt(0));
|
|
96
|
+
if (wanted.length === 0)
|
|
97
|
+
throw new HttpProblem(400, 'invalid-body', 'Nothing to return', 'Give a quantity to return.');
|
|
98
|
+
for (const w of wanted) {
|
|
99
|
+
const l = left.get(w.move);
|
|
100
|
+
if (l === undefined)
|
|
101
|
+
throw new HttpProblem(400, 'invalid-body', 'Unknown line', 'A line of this transfer.');
|
|
102
|
+
if (w.quantity.gt(orm.toDecimal(l.returnable)))
|
|
103
|
+
throw new HttpProblem(409, 'too-much', 'More than can be returned', `${l.name}: ${l.returnable} can still be returned.`);
|
|
104
|
+
}
|
|
105
|
+
const [reason] = await env
|
|
106
|
+
.model('stock.return.reason')
|
|
107
|
+
.browse([input.reason])
|
|
108
|
+
.load(['name']);
|
|
109
|
+
if (reason === undefined)
|
|
110
|
+
throw new HttpProblem(400, 'invalid-body', 'Reason required', 'Give the reason of the return.');
|
|
111
|
+
// The original's links (an order's) carried, the way reversed.
|
|
112
|
+
const base = (await env
|
|
113
|
+
.model('stock.picking')
|
|
114
|
+
.browse([pickingId])
|
|
115
|
+
.backorderValues()).get(pickingId) ?? {};
|
|
116
|
+
const moveValues = await env
|
|
117
|
+
.model('stock.move')
|
|
118
|
+
.browse(wanted.map((w) => w.move))
|
|
119
|
+
.backorderValues();
|
|
120
|
+
const made = await env.model('stock.picking').create([
|
|
121
|
+
{
|
|
122
|
+
...base,
|
|
123
|
+
kind: OTHER_WAY[picking.kind],
|
|
124
|
+
source: picking.destination.id,
|
|
125
|
+
destination: input.location ?? picking.source.id,
|
|
126
|
+
origin: `Return of ${picking.name}`,
|
|
127
|
+
scheduledDate: env.today(),
|
|
128
|
+
next: null,
|
|
129
|
+
returnOf: picking.id,
|
|
130
|
+
returnReason: input.reason,
|
|
131
|
+
...(input.note == null || input.note.trim() === '' ? {} : { note: input.note.trim() }),
|
|
132
|
+
moves: {
|
|
133
|
+
create: wanted.map((w) => ({
|
|
134
|
+
...(moveValues.get(w.move) ?? {}),
|
|
135
|
+
// In the product's unit: what was done is counted that way.
|
|
136
|
+
uom: [...picking.moves].find((m) => m.id === w.move)?.product.uom?.id ?? null,
|
|
137
|
+
quantity: w.quantity.toString(),
|
|
138
|
+
returnOf: w.move,
|
|
139
|
+
})),
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
]);
|
|
143
|
+
const id = made.ids[0];
|
|
144
|
+
// The lots taken back are the original's, as far as the quantities go.
|
|
145
|
+
const lots = await (await env.model('stock.lot.line').search({ where: { picking: pickingId } })).load({ product: true, lot: true });
|
|
146
|
+
const rows = [];
|
|
147
|
+
for (const w of wanted) {
|
|
148
|
+
const product = [...picking.moves].find((m) => m.id === w.move)?.product.id;
|
|
149
|
+
let rest = w.quantity;
|
|
150
|
+
for (const l of lots) {
|
|
151
|
+
if (rest.lte(0) || l.product.id !== product || l.lot === null)
|
|
152
|
+
continue;
|
|
153
|
+
const take = rest.lt(l.quantity) ? rest : l.quantity;
|
|
154
|
+
rows.push({ picking: id, product, lot: l.lot.id, quantity: take.toString() });
|
|
155
|
+
rest = rest.minus(take);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (rows.length > 0)
|
|
159
|
+
await env.model('stock.lot.line').create(rows);
|
|
160
|
+
await made.confirm();
|
|
161
|
+
const [row] = await made.load(['name']);
|
|
162
|
+
return { picking: id, name: String(row?.name ?? '') };
|
|
163
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stockroom › Stock ledger (RFC 0032 §3.3): for a period and the chosen warehouses (or every one), each product's
|
|
3
|
+
* opening, what came in and went out by movement type, and its closing — as a summary or every movement —, and the
|
|
4
|
+
* stock report (on hand, reserved, available, incoming, outgoing per product and location), as the server computes
|
|
5
|
+
* them, with their XLSX and PDF files.
|
|
6
|
+
*/
|
|
7
|
+
import { type PageProps } from '../../ui/index.js';
|
|
8
|
+
import { type ReactElement } from 'react';
|
|
9
|
+
export declare function Ledger({ api }: PageProps): ReactElement;
|