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,108 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Stockroom › Stock ledger (RFC 0032 §3.3): for a period and the chosen warehouses (or every one), each product's
|
|
4
|
+
* opening, what came in and went out by movement type, and its closing — as a summary or every movement —, and the
|
|
5
|
+
* stock report (on hand, reserved, available, incoming, outgoing per product and location), as the server computes
|
|
6
|
+
* them, with their XLSX and PDF files.
|
|
7
|
+
*/
|
|
8
|
+
import { ApiError, Button, Input, Label, useKosh } from '../../ui/index.js';
|
|
9
|
+
import { useMutation, useQuery } from '@tanstack/react-query';
|
|
10
|
+
import { useId, useState } from 'react';
|
|
11
|
+
import { useTranslation } from 'react-i18next';
|
|
12
|
+
const IN_TYPES = [
|
|
13
|
+
'purchase_receipt',
|
|
14
|
+
'sales_return',
|
|
15
|
+
'production_in',
|
|
16
|
+
'transfer_in',
|
|
17
|
+
'adjustment_in',
|
|
18
|
+
'other_in',
|
|
19
|
+
];
|
|
20
|
+
const OUT_TYPES = [
|
|
21
|
+
'sales_delivery',
|
|
22
|
+
'purchase_return',
|
|
23
|
+
'production_out',
|
|
24
|
+
'transfer_out',
|
|
25
|
+
'consumption',
|
|
26
|
+
'scrap',
|
|
27
|
+
'adjustment_out',
|
|
28
|
+
'other_out',
|
|
29
|
+
];
|
|
30
|
+
const TABS = ['summary', 'details', 'stock'];
|
|
31
|
+
function saveFile(blob, filename) {
|
|
32
|
+
const url = URL.createObjectURL(blob);
|
|
33
|
+
const a = document.createElement('a');
|
|
34
|
+
a.href = url;
|
|
35
|
+
a.download = filename;
|
|
36
|
+
a.click();
|
|
37
|
+
setTimeout(() => URL.revokeObjectURL(url), 1000);
|
|
38
|
+
}
|
|
39
|
+
const firstOfMonth = () => {
|
|
40
|
+
const d = new Date();
|
|
41
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-01`;
|
|
42
|
+
};
|
|
43
|
+
const today = () => new Date().toISOString().slice(0, 10);
|
|
44
|
+
const cell = 'px-2 py-1 whitespace-nowrap';
|
|
45
|
+
const num = `${cell} text-end tabular-nums`;
|
|
46
|
+
export function Ledger({ api }) {
|
|
47
|
+
const { t } = useTranslation('stock');
|
|
48
|
+
const { format } = useKosh();
|
|
49
|
+
const id = useId();
|
|
50
|
+
const [tab, setTab] = useState('summary');
|
|
51
|
+
const [from, setFrom] = useState(firstOfMonth);
|
|
52
|
+
const [to, setTo] = useState(today);
|
|
53
|
+
const [warehouses, setWarehouses] = useState([]);
|
|
54
|
+
const [categories, setCategories] = useState([]);
|
|
55
|
+
const warehouseList = useQuery({
|
|
56
|
+
queryKey: ['stock', 'ledger', 'warehouses'],
|
|
57
|
+
queryFn: async () => (await api.list('stock.warehouse', {
|
|
58
|
+
fields: ['id', 'name'],
|
|
59
|
+
order: ['name asc'],
|
|
60
|
+
limit: 200,
|
|
61
|
+
})).items,
|
|
62
|
+
});
|
|
63
|
+
const categoryList = useQuery({
|
|
64
|
+
queryKey: ['stock', 'ledger', 'categories'],
|
|
65
|
+
queryFn: async () => (await api.list('product.category', {
|
|
66
|
+
fields: ['id', 'name'],
|
|
67
|
+
order: ['name asc'],
|
|
68
|
+
limit: 500,
|
|
69
|
+
})).items,
|
|
70
|
+
});
|
|
71
|
+
const scope = `warehouses=${warehouses.join(',')}&categories=${categories.join(',')}`;
|
|
72
|
+
const path = tab === 'stock'
|
|
73
|
+
? `/api/v1/stockroom/stock?${scope}`
|
|
74
|
+
: `/api/v1/stockroom/ledger?from=${from}&to=${to}&mode=${tab}&${scope}`;
|
|
75
|
+
const valid = /^\d{4}-\d{2}-\d{2}$/.test(from) && /^\d{4}-\d{2}-\d{2}$/.test(to) && from <= to;
|
|
76
|
+
const data = useQuery({
|
|
77
|
+
queryKey: ['stock', 'ledger', tab, from, to, warehouses, categories],
|
|
78
|
+
queryFn: () => api.call('GET', path),
|
|
79
|
+
enabled: tab === 'stock' || valid,
|
|
80
|
+
});
|
|
81
|
+
const download = useMutation({
|
|
82
|
+
mutationFn: async (kind) => {
|
|
83
|
+
const { blob, filename } = await api.download(`${path}&format=${kind}`, undefined, 'GET');
|
|
84
|
+
saveFile(blob, filename);
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
const error = data.error ?? download.error;
|
|
88
|
+
const chosen = (e) => [...e.target.selectedOptions].map((o) => Number(o.value));
|
|
89
|
+
return (_jsxs("div", { className: "grid gap-4 p-4", children: [_jsx("h1", { className: "text-xl font-semibold", children: t('ledger.title') }), _jsxs("div", { className: "flex flex-wrap items-end gap-2", children: [_jsxs("fieldset", { className: "flex flex-wrap gap-1", children: [_jsx("legend", { className: "sr-only", children: t('ledger.tab') }), TABS.map((k) => (_jsx(Button, { variant: tab === k ? 'primary' : 'secondary', "aria-pressed": tab === k, onClick: () => setTab(k), children: t(`ledger.tabs.${k}`) }, k)))] }), tab === 'stock' ? null : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-from`, children: t('ledger.from') }), _jsx(Input, { id: `${id}-from`, type: "date", value: from, onChange: (e) => setFrom(e.target.value) })] }), _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-to`, children: t('ledger.to') }), _jsx(Input, { id: `${id}-to`, type: "date", value: to, onChange: (e) => setTo(e.target.value) })] })] })), _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-warehouses`, children: t('ledger.warehouses') }), _jsx("select", { id: `${id}-warehouses`, multiple: true, className: "min-w-48 rounded-md border bg-background px-2 py-1 text-sm", value: warehouses.map(String), onChange: (e) => setWarehouses(chosen(e)), children: (warehouseList.data ?? []).map((w) => (_jsx("option", { value: w.id, children: w.name }, w.id))) })] }), _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-categories`, children: t('ledger.categories') }), _jsx("select", { id: `${id}-categories`, multiple: true, className: "min-w-48 rounded-md border bg-background px-2 py-1 text-sm", value: categories.map(String), onChange: (e) => setCategories(chosen(e)), children: (categoryList.data ?? []).map((c) => (_jsx("option", { value: c.id, children: c.name }, c.id))) })] }), _jsx(Button, { variant: "secondary", disabled: download.isPending, onClick: () => download.mutate('xlsx'), children: t('ledger.xlsx') }), _jsx(Button, { variant: "secondary", disabled: download.isPending, onClick: () => download.mutate('pdf'), children: t('ledger.pdf') })] }), _jsx("p", { className: "text-sm text-muted-foreground", children: t(`ledger.hints.${tab}`) }), error === null ? null : (_jsx("p", { role: "alert", className: "text-sm text-danger", children: error instanceof ApiError ? error.message : String(error) })), data.data === undefined ? null : tab === 'stock' ? (_jsx(StockTable, { rows: data.data.rows })) : tab === 'details' ? (_jsx(Details, { data: data.data })) : (_jsx(Summary, { data: data.data }))] }));
|
|
90
|
+
function Summary({ data }) {
|
|
91
|
+
const rows = data.rows;
|
|
92
|
+
if (rows.length === 0)
|
|
93
|
+
return _jsx("p", { className: "text-sm text-muted-foreground", children: t('ledger.empty') });
|
|
94
|
+
const q = (f) => format.decimal(f.qty, 3);
|
|
95
|
+
return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted", children: _jsxs("tr", { children: [_jsx("th", { className: `${cell} text-start`, children: t('ledger.product') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.unit') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.opening') }), IN_TYPES.map((k) => (_jsx("th", { className: `${cell} text-end`, children: t(`ledger.types.${k}`) }, k))), _jsx("th", { className: `${cell} text-end font-semibold`, children: t('ledger.totalIn') }), OUT_TYPES.map((k) => (_jsx("th", { className: `${cell} text-end`, children: t(`ledger.types.${k}`) }, k))), _jsx("th", { className: `${cell} text-end font-semibold`, children: t('ledger.totalOut') }), _jsx("th", { className: `${cell} text-end font-semibold`, children: t('ledger.closing') }), data.valued ? (_jsx("th", { className: `${cell} text-end`, children: t('ledger.closingValue') })) : null] }) }), _jsx("tbody", { children: rows.map((r) => (_jsxs("tr", { className: "border-b", children: [_jsx("td", { className: cell, children: r.product.name }), _jsx("td", { className: cell, children: r.product.uom }), _jsx("td", { className: num, children: q(r.opening) }), IN_TYPES.map((k) => (_jsx("td", { className: num, children: q(r.in[k]) }, k))), _jsx("td", { className: `${num} font-semibold`, children: q(r.totalIn) }), OUT_TYPES.map((k) => (_jsx("td", { className: num, children: q(r.out[k]) }, k))), _jsx("td", { className: `${num} font-semibold`, children: q(r.totalOut) }), _jsx("td", { className: `${num} font-semibold`, children: q(r.closing) }), data.valued ? _jsx("td", { className: num, children: format.decimal(r.closing.value, 2) }) : null] }, r.product.id))) })] }) }));
|
|
96
|
+
}
|
|
97
|
+
function Details({ data }) {
|
|
98
|
+
const rows = data.rows;
|
|
99
|
+
if (rows.length === 0)
|
|
100
|
+
return _jsx("p", { className: "text-sm text-muted-foreground", children: t('ledger.empty') });
|
|
101
|
+
return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted", children: _jsxs("tr", { children: [_jsx("th", { className: `${cell} text-start`, children: t('ledger.date') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.reference') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.origin') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.product') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.fromPlace') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.toPlace') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.movement') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.quantity') }), data.valued ? _jsx("th", { className: `${cell} text-end`, children: t('ledger.value') }) : null] }) }), _jsx("tbody", { children: rows.map((r, i) => (_jsxs("tr", { className: "border-b", children: [_jsx("td", { className: cell, children: format.date(r.date) }), _jsx("td", { className: cell, children: r.reference }), _jsx("td", { className: cell, children: r.origin ?? '' }), _jsxs("td", { className: cell, children: [r.product.name, " ", _jsx("span", { className: "text-muted-foreground", children: r.product.uom })] }), _jsx("td", { className: cell, children: r.from }), _jsx("td", { className: cell, children: r.to }), _jsx("td", { className: cell, children: t(`ledger.types.${r.type}`) }), _jsx("td", { className: num, children: format.decimal(r.qty, 3) }), data.valued ? _jsx("td", { className: num, children: format.decimal(r.value, 2) }) : null] }, i))) })] }) }));
|
|
102
|
+
}
|
|
103
|
+
function StockTable({ rows }) {
|
|
104
|
+
if (rows.length === 0)
|
|
105
|
+
return _jsx("p", { className: "text-sm text-muted-foreground", children: t('ledger.empty') });
|
|
106
|
+
return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted", children: _jsxs("tr", { children: [_jsx("th", { className: `${cell} text-start`, children: t('ledger.product') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.unit') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.location') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.onHand') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.reserved') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.available') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.incoming') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.outgoing') })] }) }), _jsx("tbody", { children: rows.map((r) => (_jsxs("tr", { className: "border-b", children: [_jsx("td", { className: cell, children: r.product.name }), _jsx("td", { className: cell, children: r.product.uom }), _jsx("td", { className: cell, children: r.location.name }), _jsx("td", { className: num, children: format.decimal(r.onHand, 3) }), _jsx("td", { className: num, children: format.decimal(r.reserved, 3) }), _jsx("td", { className: num, children: format.decimal(r.available, 3) }), _jsx("td", { className: num, children: format.decimal(r.incoming, 3) }), _jsx("td", { className: num, children: format.decimal(r.outgoing, 3) })] }, `${r.product.id}-${r.location.id}`))) })] }) }));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stockroom › My operations (RFC 0032 §3.3): a card per warehouse and kind of transfer — receipts, deliveries,
|
|
3
|
+
* internal moves — with what is ready, waiting and late. The server counts (`GET /api/v1/stockroom/operations`);
|
|
4
|
+
* each count opens the transfers it counts.
|
|
5
|
+
*/
|
|
6
|
+
import { type PageProps } from '../../ui/index.js';
|
|
7
|
+
import type { ReactElement } from 'react';
|
|
8
|
+
export declare function Operations({ api, app }: PageProps): ReactElement;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Stockroom › My operations (RFC 0032 §3.3): a card per warehouse and kind of transfer — receipts, deliveries,
|
|
4
|
+
* internal moves — with what is ready, waiting and late. The server counts (`GET /api/v1/stockroom/operations`);
|
|
5
|
+
* each count opens the transfers it counts.
|
|
6
|
+
*/
|
|
7
|
+
import { Alert } from '../../ui/index.js';
|
|
8
|
+
import { useQuery } from '@tanstack/react-query';
|
|
9
|
+
import { useTranslation } from 'react-i18next';
|
|
10
|
+
/** A link to an action's list filtered by `domain`, labelled in its search bar. */
|
|
11
|
+
function hrefOf(app, action, domain, label) {
|
|
12
|
+
const q = JSON.stringify({ c: domain, cl: label });
|
|
13
|
+
// The router reads search values as JSON: a string is quoted.
|
|
14
|
+
return `/${app}/a/${action}?q=${encodeURIComponent(JSON.stringify(q))}`;
|
|
15
|
+
}
|
|
16
|
+
export function Operations({ api, app = 'stockroom' }) {
|
|
17
|
+
const { t } = useTranslation('stock');
|
|
18
|
+
const operations = useQuery({
|
|
19
|
+
queryKey: ['stock', 'operations'],
|
|
20
|
+
queryFn: () => api.call('GET', '/api/v1/stockroom/operations'),
|
|
21
|
+
refetchInterval: 60_000,
|
|
22
|
+
});
|
|
23
|
+
if (operations.isError)
|
|
24
|
+
return _jsx(Alert, { tone: "danger", children: operations.error.message });
|
|
25
|
+
const list = operations.data?.operations ?? [];
|
|
26
|
+
return (_jsxs("div", { className: "grid gap-4 p-4", children: [_jsx("h1", { className: "text-xl font-semibold", children: t('operations.title') }), _jsx("p", { className: "max-w-3xl text-sm text-muted-foreground", children: t('operations.hint') }), operations.isLoading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('operations.loading') })) : list.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('operations.empty') })) : (_jsx("ul", { className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3", children: list.map((o) => {
|
|
27
|
+
const title = `${o.warehouse.name}: ${t(`operations.kind.${o.kind}`)}`;
|
|
28
|
+
const link = (count, which) => (_jsxs("a", { href: hrefOf(app, o.action, count.domain, `${title} · ${t(`operations.${which}`)}`), className: which === 'late' && count.count > 0
|
|
29
|
+
? 'rounded-md border border-destructive/40 px-3 py-2 text-destructive hover:bg-destructive/10'
|
|
30
|
+
: 'rounded-md border px-3 py-2 hover:bg-accent', "aria-label": t(`operations.${which}Of`, { count: count.count, title }), children: [_jsx("span", { className: "block text-2xl font-semibold tabular-nums", children: count.count }), _jsx("span", { className: "text-xs text-muted-foreground", children: t(`operations.${which}`) })] }));
|
|
31
|
+
return (_jsx("li", { children: _jsxs("section", { "aria-label": title, className: "space-y-3 rounded-lg border bg-card p-4 text-card-foreground", children: [_jsx("h2", { className: "font-medium", children: title }), _jsxs("div", { className: "grid grid-cols-3 gap-2", children: [link(o.ready, 'ready'), link(o.waiting, 'waiting'), link(o.late, 'late')] })] }) }, `${o.warehouse.id}-${o.kind}`));
|
|
32
|
+
}) }))] }));
|
|
33
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stockroom › Replenishment (RFC 0024 §2.6): every reorder rule with its forecast, what it proposes and why, in
|
|
3
|
+
* words. Quantities can be changed before ordering; the chosen rules are ordered by their method (a transfer, a
|
|
4
|
+
* request for quotation, a production order) or snoozed. The server reckons and orders; this page only shows it.
|
|
5
|
+
*/
|
|
6
|
+
import { type PageProps } from '../../ui/index.js';
|
|
7
|
+
import { type ReactElement } from 'react';
|
|
8
|
+
export declare function Replenishment({ api }: PageProps): ReactElement;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Stockroom › Replenishment (RFC 0024 §2.6): every reorder rule with its forecast, what it proposes and why, in
|
|
4
|
+
* words. Quantities can be changed before ordering; the chosen rules are ordered by their method (a transfer, a
|
|
5
|
+
* request for quotation, a production order) or snoozed. The server reckons and orders; this page only shows it.
|
|
6
|
+
*/
|
|
7
|
+
import { Alert, Button, Checkbox, Input, Label, useKosh } from '../../ui/index.js';
|
|
8
|
+
import { useMutation, useQuery } from '@tanstack/react-query';
|
|
9
|
+
import { useId, useState } from 'react';
|
|
10
|
+
import { useTranslation } from 'react-i18next';
|
|
11
|
+
const FIELDS = [
|
|
12
|
+
'id',
|
|
13
|
+
'name',
|
|
14
|
+
'method',
|
|
15
|
+
'minimum',
|
|
16
|
+
'maximum',
|
|
17
|
+
'onHand',
|
|
18
|
+
'forecast',
|
|
19
|
+
'proposed',
|
|
20
|
+
'explanation',
|
|
21
|
+
'snoozedUntil',
|
|
22
|
+
'lastOrder',
|
|
23
|
+
];
|
|
24
|
+
export function Replenishment({ api }) {
|
|
25
|
+
const { t } = useTranslation('stock');
|
|
26
|
+
const { format } = useKosh();
|
|
27
|
+
const id = useId();
|
|
28
|
+
const [all, setAll] = useState(false);
|
|
29
|
+
const [selected, setSelected] = useState(new Set());
|
|
30
|
+
const [quantities, setQuantities] = useState({});
|
|
31
|
+
const [message, setMessage] = useState(null);
|
|
32
|
+
const [error, setError] = useState(null);
|
|
33
|
+
const rules = useQuery({
|
|
34
|
+
queryKey: ['stock', 'replenishment', all],
|
|
35
|
+
queryFn: async () => (await api.list('stock.reorder', {
|
|
36
|
+
...(all ? {} : { filter: { proposed: { gt: 0 } } }),
|
|
37
|
+
fields: FIELDS,
|
|
38
|
+
order: ['name asc'],
|
|
39
|
+
limit: 500,
|
|
40
|
+
})).items,
|
|
41
|
+
});
|
|
42
|
+
const done = async (text) => {
|
|
43
|
+
setError(null);
|
|
44
|
+
setMessage(text);
|
|
45
|
+
setSelected(new Set());
|
|
46
|
+
setQuantities({});
|
|
47
|
+
await rules.refetch();
|
|
48
|
+
};
|
|
49
|
+
const refresh = useMutation({
|
|
50
|
+
mutationFn: () => api.call('POST', '/api/v1/stockroom/replenishment/refresh', {}),
|
|
51
|
+
onSuccess: (r) => done(t('replenish.refreshed', { count: r.rules })),
|
|
52
|
+
onError: (e) => setError(e.message),
|
|
53
|
+
});
|
|
54
|
+
const order = useMutation({
|
|
55
|
+
mutationFn: () => api.call('POST', '/api/v1/stockroom/replenishment/order', {
|
|
56
|
+
rules: [...selected],
|
|
57
|
+
quantities: Object.fromEntries(Object.entries(quantities).filter(([id, q]) => selected.has(Number(id)) && q !== '')),
|
|
58
|
+
}),
|
|
59
|
+
onSuccess: (r) => done([
|
|
60
|
+
...r.ordered.map((o) => t('replenish.ordered', { quantity: o.quantity, document: o.document })),
|
|
61
|
+
...r.skipped.map((s) => s.reason),
|
|
62
|
+
].join(' ')),
|
|
63
|
+
onError: (e) => setError(e.message),
|
|
64
|
+
});
|
|
65
|
+
const snooze = useMutation({
|
|
66
|
+
mutationFn: () => api.call('POST', '/api/v1/stockroom/replenishment/snooze', {
|
|
67
|
+
rules: [...selected],
|
|
68
|
+
days: 7,
|
|
69
|
+
}),
|
|
70
|
+
onSuccess: (r) => done(t('replenish.snoozed', { count: r.rules })),
|
|
71
|
+
onError: (e) => setError(e.message),
|
|
72
|
+
});
|
|
73
|
+
const rows = rules.data ?? [];
|
|
74
|
+
const busy = refresh.isPending || order.isPending || snooze.isPending;
|
|
75
|
+
const toggle = (id, on) => setSelected((s) => {
|
|
76
|
+
const next = new Set(s);
|
|
77
|
+
if (on)
|
|
78
|
+
next.add(id);
|
|
79
|
+
else
|
|
80
|
+
next.delete(id);
|
|
81
|
+
return next;
|
|
82
|
+
});
|
|
83
|
+
return (_jsxs("div", { className: "grid gap-4 p-4", children: [_jsx("h1", { className: "text-xl font-semibold", children: t('replenish.title') }), _jsx("p", { className: "text-sm text-muted-foreground", children: t('replenish.hint') }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Button, { variant: "primary", disabled: busy || selected.size === 0, onClick: () => order.mutate(), children: t('replenish.order', { count: selected.size }) }), _jsx(Button, { disabled: busy || selected.size === 0, onClick: () => snooze.mutate(), children: t('replenish.snooze') }), _jsx(Button, { disabled: busy, onClick: () => refresh.mutate(), children: t('replenish.refresh') }), _jsxs("div", { className: "ms-auto flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { id: `${id}-all`, checked: all, onCheckedChange: (c) => setAll(c === true) }), _jsx(Label, { htmlFor: `${id}-all`, children: t('replenish.all') })] })] }), message === null ? null : _jsx(Alert, { tone: "info", children: message }), error === null ? null : _jsx(Alert, { tone: "danger", children: error }), rows.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: rules.isLoading ? t('replenish.loading') : t('replenish.empty') })) : (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted", children: _jsxs("tr", { children: [_jsx("th", { className: "w-10 px-2 py-1" }), _jsx("th", { className: "px-2 py-1 text-start", children: t('replenish.rule') }), _jsx("th", { className: "px-2 py-1 text-start", children: t('replenish.method') }), _jsx("th", { className: "px-2 py-1 text-end", children: t('replenish.onHand') }), _jsx("th", { className: "px-2 py-1 text-end", children: t('replenish.forecast') }), _jsx("th", { className: "px-2 py-1 text-end", children: t('replenish.minMax') }), _jsx("th", { className: "px-2 py-1 text-end", children: t('replenish.toOrder') })] }) }), _jsx("tbody", { children: rows.map((r) => (_jsxs("tr", { className: "border-b align-top", children: [_jsx("td", { className: "px-2 py-2", children: _jsx(Checkbox, { "aria-label": r.name, checked: selected.has(r.id), onCheckedChange: (c) => toggle(r.id, c === true) }) }), _jsxs("td", { className: "px-2 py-2", children: [_jsx("div", { className: "font-medium", children: r.name }), _jsx("div", { className: "text-xs text-muted-foreground", children: r.explanation ?? '' }), r.snoozedUntil === null ? null : (_jsx("div", { className: "text-xs text-muted-foreground", children: t('replenish.snoozedUntil', { date: format.date(r.snoozedUntil) }) })), r.lastOrder === null ? null : (_jsx("div", { className: "text-xs text-muted-foreground", children: t('replenish.last', { document: r.lastOrder }) }))] }), _jsx("td", { className: "px-2 py-2", children: t(`replenish.${r.method}`) }), _jsx("td", { className: "px-2 py-2 text-end tabular-nums", children: format.decimal(r.onHand ?? '0') }), _jsx("td", { className: "px-2 py-2 text-end tabular-nums", children: format.decimal(r.forecast ?? '0') }), _jsxs("td", { className: "px-2 py-2 text-end tabular-nums", children: [format.decimal(r.minimum), " \u2013 ", format.decimal(r.maximum)] }), _jsx("td", { className: "px-2 py-2 text-end", children: _jsx(Input, { "aria-label": t('replenish.quantityOf', { name: r.name }), inputMode: "decimal", className: "ms-auto w-24 text-end", value: quantities[r.id] ?? String(Number(r.proposed ?? 0)), onChange: (e) => setQuantities((q) => ({ ...q, [r.id]: e.target.value })) }) })] }, r.id))) })] }) }))] }));
|
|
84
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Return" on a done delivery or receipt (RFC 0030 §3.2): the lines with what can still come back, a quantity for
|
|
3
|
+
* each, the reason and a note; the server makes the linked return, confirmed, and refuses more than was done.
|
|
4
|
+
*/
|
|
5
|
+
import { type NodeComponentProps } from '../../ui/index.js';
|
|
6
|
+
import { type ReactElement } from 'react';
|
|
7
|
+
export declare function ReturnButton({ record, api, reload }: NodeComponentProps): ReactElement | null;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* "Return" on a done delivery or receipt (RFC 0030 §3.2): the lines with what can still come back, a quantity for
|
|
4
|
+
* each, the reason and a note; the server makes the linked return, confirmed, and refuses more than was done.
|
|
5
|
+
*/
|
|
6
|
+
import { Alert, ApiError, Button, Dialog, Input, Label, Select, } from '../../ui/index.js';
|
|
7
|
+
import { useMutation, useQuery } from '@tanstack/react-query';
|
|
8
|
+
import { useId, useState } from 'react';
|
|
9
|
+
import { useTranslation } from 'react-i18next';
|
|
10
|
+
export function ReturnButton({ record, api, reload }) {
|
|
11
|
+
const { t } = useTranslation('stock');
|
|
12
|
+
const id = useId();
|
|
13
|
+
const [open, setOpen] = useState(false);
|
|
14
|
+
const [quantities, setQuantities] = useState({});
|
|
15
|
+
const [reason, setReason] = useState(null);
|
|
16
|
+
const [note, setNote] = useState('');
|
|
17
|
+
const [made, setMade] = useState(null);
|
|
18
|
+
const eligible = record !== null &&
|
|
19
|
+
record['state'] === 'done' &&
|
|
20
|
+
(record['kind'] === 'delivery' || record['kind'] === 'receipt');
|
|
21
|
+
const lines = useQuery({
|
|
22
|
+
queryKey: ['stock', 'returnable', record?.id],
|
|
23
|
+
queryFn: () => api.call('GET', `/api/v1/stockroom/pickings/${record?.id}/returnable`),
|
|
24
|
+
enabled: eligible && open,
|
|
25
|
+
});
|
|
26
|
+
const reasons = useQuery({
|
|
27
|
+
queryKey: ['stock', 'return-reasons'],
|
|
28
|
+
queryFn: () => api.list('stock.return.reason', {
|
|
29
|
+
fields: ['id', 'name'],
|
|
30
|
+
order: ['sequence asc'],
|
|
31
|
+
limit: 50,
|
|
32
|
+
}),
|
|
33
|
+
enabled: eligible && open,
|
|
34
|
+
});
|
|
35
|
+
const send = useMutation({
|
|
36
|
+
mutationFn: () => api.call('POST', `/api/v1/stockroom/pickings/${record?.id}/return`, {
|
|
37
|
+
lines: Object.entries(quantities)
|
|
38
|
+
.filter(([, q]) => q !== '' && Number(q) > 0)
|
|
39
|
+
.map(([move, quantity]) => ({ move: Number(move), quantity })),
|
|
40
|
+
reason: Number(reason),
|
|
41
|
+
note,
|
|
42
|
+
}),
|
|
43
|
+
onSuccess: (r) => {
|
|
44
|
+
setOpen(false);
|
|
45
|
+
setMade(r.name);
|
|
46
|
+
reload?.();
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
if (!eligible)
|
|
50
|
+
return null;
|
|
51
|
+
const rows = lines.data?.lines ?? [];
|
|
52
|
+
const any = Object.values(quantities).some((q) => q !== '' && Number(q) > 0);
|
|
53
|
+
return (_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Button, { size: "sm", onClick: () => {
|
|
54
|
+
setQuantities({});
|
|
55
|
+
setReason(null);
|
|
56
|
+
setNote('');
|
|
57
|
+
setOpen(true);
|
|
58
|
+
}, children: t('returns.button') }), made === null ? null : (_jsx("span", { role: "status", className: "text-xs text-muted-foreground", children: t('returns.made', { name: made }) })), _jsx(Dialog, { open: open, onOpenChange: setOpen, title: t('returns.title'), description: t('returns.intro'), footer: _jsx(Button, { variant: "primary", disabled: !any || reason === null, busy: send.isPending, onClick: () => send.mutate(), children: t('returns.confirm') }), children: _jsxs("div", { className: "space-y-3", children: [rows.map((l) => (_jsxs("div", { className: "grid grid-cols-[1fr_8rem] items-end gap-2", children: [_jsxs(Label, { htmlFor: `${id}-q-${l.move}`, children: [l.name, _jsx("span", { className: "block text-xs text-muted-foreground", children: t('returns.left', { done: l.done, left: l.returnable }) })] }), _jsx(Input, { id: `${id}-q-${l.move}`, inputMode: "decimal", disabled: Number(l.returnable) <= 0, value: quantities[l.move] ?? '', onChange: (e) => setQuantities({ ...quantities, [l.move]: e.target.value }) })] }, l.move))), _jsx(Select, { id: `${id}-reason`, label: t('returns.reason'), value: reason, options: (reasons.data?.items ?? []).map((r) => ({
|
|
59
|
+
value: String(r.id),
|
|
60
|
+
label: r.name,
|
|
61
|
+
})), onChange: setReason }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: `${id}-note`, children: t('returns.note') }), _jsx(Input, { id: `${id}-note`, value: note, onChange: (e) => setNote(e.target.value) })] }), send.error === null ? null : (_jsx(Alert, { children: send.error instanceof ApiError ? send.error.message : String(send.error) }))] }) })] }));
|
|
62
|
+
}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @packageDocumentation
|
|
3
|
-
* The web contribution of `shutro-erp/stock`: the scan box of counts (a barcode scanner, the keyboard or the camera)
|
|
3
|
+
* The web contribution of `shutro-erp/stock`: the scan box of counts (a barcode scanner, the keyboard or the camera) and
|
|
4
|
+
* the Replenishment page.
|
|
4
5
|
*/
|
|
5
6
|
import { type Registry } from '../../ui/index.js';
|
|
6
7
|
import type { i18n } from 'i18next';
|
|
7
8
|
import { messages } from './messages.js';
|
|
9
|
+
export { Ledger } from './Ledger.js';
|
|
10
|
+
export { Operations } from './Operations.js';
|
|
11
|
+
export { Replenishment } from './Replenishment.js';
|
|
12
|
+
export { ReturnButton } from './ReturnButton.js';
|
|
8
13
|
export { ScanBox } from './ScanBox.js';
|
|
9
|
-
/** Registers the component (and the messages in `i18n`, when given). */
|
|
14
|
+
/** Registers the component and the page (and the messages in `i18n`, when given). */
|
|
10
15
|
export declare function registerStockWeb(registry: Registry, i18n?: i18n): Registry;
|
|
11
16
|
export { messages as stockMessages };
|
package/dist/stock/web/index.js
CHANGED
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @packageDocumentation
|
|
3
|
-
* The web contribution of `shutro-erp/stock`: the scan box of counts (a barcode scanner, the keyboard or the camera)
|
|
3
|
+
* The web contribution of `shutro-erp/stock`: the scan box of counts (a barcode scanner, the keyboard or the camera) and
|
|
4
|
+
* the Replenishment page.
|
|
4
5
|
*/
|
|
5
6
|
import { addMessages } from '../../ui/index.js';
|
|
7
|
+
import { Ledger } from './Ledger.js';
|
|
6
8
|
import { messages } from './messages.js';
|
|
9
|
+
import { Operations } from './Operations.js';
|
|
10
|
+
import { Replenishment } from './Replenishment.js';
|
|
11
|
+
import { ReturnButton } from './ReturnButton.js';
|
|
7
12
|
import { ScanBox } from './ScanBox.js';
|
|
13
|
+
export { Ledger } from './Ledger.js';
|
|
14
|
+
export { Operations } from './Operations.js';
|
|
15
|
+
export { Replenishment } from './Replenishment.js';
|
|
16
|
+
export { ReturnButton } from './ReturnButton.js';
|
|
8
17
|
export { ScanBox } from './ScanBox.js';
|
|
9
|
-
/** Registers the component (and the messages in `i18n`, when given). */
|
|
18
|
+
/** Registers the component and the page (and the messages in `i18n`, when given). */
|
|
10
19
|
export function registerStockWeb(registry, i18n) {
|
|
11
20
|
registry.registerComponent('stock.Scan', ScanBox);
|
|
21
|
+
registry.registerComponent('stock.Return', ReturnButton);
|
|
22
|
+
registry.registerPage('stock.Replenishment', Replenishment);
|
|
23
|
+
registry.registerPage('stock.Operations', Operations);
|
|
24
|
+
registry.registerPage('stock.Ledger', Ledger);
|
|
12
25
|
if (i18n !== undefined)
|
|
13
26
|
addMessages(i18n, 'stock', messages);
|
|
14
27
|
return registry;
|
|
@@ -1,6 +1,109 @@
|
|
|
1
1
|
/** Messages of the Stockroom screens (namespace `stock`), in English and Bangla. */
|
|
2
2
|
export const messages = {
|
|
3
3
|
en: {
|
|
4
|
+
ledger: {
|
|
5
|
+
title: 'Stock ledger',
|
|
6
|
+
tab: 'Report',
|
|
7
|
+
tabs: { summary: 'Summary', details: 'Movements', stock: 'Stock' },
|
|
8
|
+
from: 'From',
|
|
9
|
+
to: 'To',
|
|
10
|
+
warehouses: 'Warehouses (all when none is chosen)',
|
|
11
|
+
categories: 'Product categories (all when none is chosen)',
|
|
12
|
+
xlsx: 'XLSX',
|
|
13
|
+
pdf: 'PDF',
|
|
14
|
+
hints: {
|
|
15
|
+
summary: 'Per product: what the chosen warehouses held at the start of the period, what came in and went out by movement type — from where the goods came from and went to —, and what they hold at the end. Values with Accounting, for those who read the valuation.',
|
|
16
|
+
details: 'Every movement of the period in or out of the chosen warehouses, with its transfer and source document.',
|
|
17
|
+
stock: 'What the chosen warehouses hold now, per product and location: on hand, reserved, available, and what confirmed transfers will bring in or take out.',
|
|
18
|
+
},
|
|
19
|
+
empty: 'Nothing in this period and scope.',
|
|
20
|
+
product: 'Product',
|
|
21
|
+
unit: 'Unit',
|
|
22
|
+
opening: 'Opening',
|
|
23
|
+
totalIn: 'Total in',
|
|
24
|
+
totalOut: 'Total out',
|
|
25
|
+
closing: 'Closing',
|
|
26
|
+
closingValue: 'Closing value',
|
|
27
|
+
date: 'Date',
|
|
28
|
+
reference: 'Reference',
|
|
29
|
+
origin: 'Source document',
|
|
30
|
+
fromPlace: 'From',
|
|
31
|
+
toPlace: 'To',
|
|
32
|
+
movement: 'Movement',
|
|
33
|
+
quantity: 'Quantity',
|
|
34
|
+
value: 'Value',
|
|
35
|
+
location: 'Location',
|
|
36
|
+
onHand: 'On hand',
|
|
37
|
+
reserved: 'Reserved',
|
|
38
|
+
available: 'Available',
|
|
39
|
+
incoming: 'Incoming',
|
|
40
|
+
outgoing: 'Outgoing',
|
|
41
|
+
types: {
|
|
42
|
+
purchase_receipt: 'Purchase receipt',
|
|
43
|
+
sales_return: 'Sales return',
|
|
44
|
+
production_in: 'Production in',
|
|
45
|
+
transfer_in: 'Transfer in',
|
|
46
|
+
adjustment_in: 'Adjustment in',
|
|
47
|
+
other_in: 'Other in',
|
|
48
|
+
sales_delivery: 'Sales delivery',
|
|
49
|
+
purchase_return: 'Purchase return',
|
|
50
|
+
production_out: 'Production out',
|
|
51
|
+
transfer_out: 'Transfer out',
|
|
52
|
+
consumption: 'Internal use',
|
|
53
|
+
scrap: 'Scrap',
|
|
54
|
+
adjustment_out: 'Adjustment out',
|
|
55
|
+
other_out: 'Other out',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
operations: {
|
|
59
|
+
title: 'My operations',
|
|
60
|
+
hint: 'Each warehouse’s receipts, deliveries and internal moves: ready to process, waiting for stock, and late against their scheduled date. Each count opens its transfers.',
|
|
61
|
+
loading: 'Loading…',
|
|
62
|
+
empty: 'Nothing to do: no transfer waits in any warehouse.',
|
|
63
|
+
ready: 'Ready',
|
|
64
|
+
waiting: 'Waiting',
|
|
65
|
+
late: 'Late',
|
|
66
|
+
readyOf: '{{count}} ready: {{title}}',
|
|
67
|
+
waitingOf: '{{count}} waiting: {{title}}',
|
|
68
|
+
lateOf: '{{count}} late: {{title}}',
|
|
69
|
+
kind: { receipt: 'Receipts', delivery: 'Deliveries', internal: 'Internal moves' },
|
|
70
|
+
},
|
|
71
|
+
returns: {
|
|
72
|
+
button: 'Return',
|
|
73
|
+
title: 'Return goods',
|
|
74
|
+
intro: 'How much of each line comes back, and why. The return is linked to this transfer and confirmed; validate it when the goods move.',
|
|
75
|
+
left: '{{done}} done, {{left}} can come back',
|
|
76
|
+
reason: 'Reason',
|
|
77
|
+
note: 'Note',
|
|
78
|
+
confirm: 'Make the return',
|
|
79
|
+
made: 'Return {{name}} made.',
|
|
80
|
+
},
|
|
81
|
+
replenish: {
|
|
82
|
+
title: 'Replenishment',
|
|
83
|
+
hint: 'Each rule keeps a product between its minimum and maximum in a warehouse. The forecast counts what is on hand, going out, coming in and on order; below the minimum, it proposes enough to reach the maximum.',
|
|
84
|
+
order: 'Order ({{count}})',
|
|
85
|
+
snooze: 'Snooze for a week',
|
|
86
|
+
refresh: 'Refresh the forecast',
|
|
87
|
+
all: 'Show every rule',
|
|
88
|
+
loading: 'Loading…',
|
|
89
|
+
empty: 'Nothing to order: every forecast is at or above its minimum.',
|
|
90
|
+
rule: 'Product and warehouse',
|
|
91
|
+
method: 'Replenish by',
|
|
92
|
+
onHand: 'On hand',
|
|
93
|
+
forecast: 'Forecast',
|
|
94
|
+
minMax: 'Minimum – maximum',
|
|
95
|
+
toOrder: 'To order',
|
|
96
|
+
quantityOf: 'Quantity to order for {{name}}',
|
|
97
|
+
buy: 'Buy',
|
|
98
|
+
make: 'Make',
|
|
99
|
+
transfer: 'Transfer',
|
|
100
|
+
dropship: 'Dropship',
|
|
101
|
+
refreshed: '{{count}} rules refreshed.',
|
|
102
|
+
ordered: '{{quantity}} on {{document}}.',
|
|
103
|
+
snoozed: '{{count}} rules snoozed for a week.',
|
|
104
|
+
snoozedUntil: 'Snoozed until {{date}}',
|
|
105
|
+
last: 'Last ordered on {{document}}',
|
|
106
|
+
},
|
|
4
107
|
scan: {
|
|
5
108
|
title: 'Scan',
|
|
6
109
|
barcode: 'Barcode',
|
|
@@ -12,6 +115,109 @@ export const messages = {
|
|
|
12
115
|
},
|
|
13
116
|
},
|
|
14
117
|
bn: {
|
|
118
|
+
ledger: {
|
|
119
|
+
title: 'স্টক লেজার',
|
|
120
|
+
tab: 'রিপোর্ট',
|
|
121
|
+
tabs: { summary: 'সারসংক্ষেপ', details: 'গতিবিধি', stock: 'স্টক' },
|
|
122
|
+
from: 'থেকে',
|
|
123
|
+
to: 'পর্যন্ত',
|
|
124
|
+
warehouses: 'গুদাম (কিছু না বাছলে সব)',
|
|
125
|
+
categories: 'পণ্যের ক্যাটাগরি (কিছু না বাছলে সব)',
|
|
126
|
+
xlsx: 'XLSX',
|
|
127
|
+
pdf: 'PDF',
|
|
128
|
+
hints: {
|
|
129
|
+
summary: 'পণ্য অনুযায়ী: বাছাই করা গুদামে সময়কালের শুরুতে কী ছিল, গতিবিধির ধরন অনুযায়ী কী এলো ও গেল — পণ্য কোথা থেকে এলো ও কোথায় গেল তা থেকে —, এবং শেষে কী আছে। হিসাব থাকলে মূল্যসহ, যাঁরা মূল্যায়ন পড়তে পারেন তাঁদের জন্য।',
|
|
130
|
+
details: 'সময়কালে বাছাই করা গুদামে ঢোকা বা বেরোনো প্রতিটি গতিবিধি, তার স্থানান্তর ও উৎস দলিলসহ।',
|
|
131
|
+
stock: 'বাছাই করা গুদামে এখন কী আছে, পণ্য ও লোকেশন অনুযায়ী: মজুত, সংরক্ষিত, প্রাপ্য, এবং নিশ্চিত স্থানান্তর কী আনবে বা নেবে।',
|
|
132
|
+
},
|
|
133
|
+
empty: 'এই সময়কাল ও পরিসরে কিছু নেই।',
|
|
134
|
+
product: 'পণ্য',
|
|
135
|
+
unit: 'একক',
|
|
136
|
+
opening: 'প্রারম্ভিক',
|
|
137
|
+
totalIn: 'মোট আগমন',
|
|
138
|
+
totalOut: 'মোট নির্গমন',
|
|
139
|
+
closing: 'সমাপনী',
|
|
140
|
+
closingValue: 'সমাপনী মূল্য',
|
|
141
|
+
date: 'তারিখ',
|
|
142
|
+
reference: 'রেফারেন্স',
|
|
143
|
+
origin: 'উৎস দলিল',
|
|
144
|
+
fromPlace: 'থেকে',
|
|
145
|
+
toPlace: 'যেখানে',
|
|
146
|
+
movement: 'গতিবিধি',
|
|
147
|
+
quantity: 'পরিমাণ',
|
|
148
|
+
value: 'মূল্য',
|
|
149
|
+
location: 'লোকেশন',
|
|
150
|
+
onHand: 'মজুত',
|
|
151
|
+
reserved: 'সংরক্ষিত',
|
|
152
|
+
available: 'প্রাপ্য',
|
|
153
|
+
incoming: 'আসছে',
|
|
154
|
+
outgoing: 'যাচ্ছে',
|
|
155
|
+
types: {
|
|
156
|
+
purchase_receipt: 'ক্রয় রিসিপ্ট',
|
|
157
|
+
sales_return: 'বিক্রয় ফেরত',
|
|
158
|
+
production_in: 'উৎপাদন থেকে',
|
|
159
|
+
transfer_in: 'স্থানান্তরে আগমন',
|
|
160
|
+
adjustment_in: 'সমন্বয়ে আগমন',
|
|
161
|
+
other_in: 'অন্যান্য আগমন',
|
|
162
|
+
sales_delivery: 'বিক্রয় ডেলিভারি',
|
|
163
|
+
purchase_return: 'ক্রয় ফেরত',
|
|
164
|
+
production_out: 'উৎপাদনে',
|
|
165
|
+
transfer_out: 'স্থানান্তরে নির্গমন',
|
|
166
|
+
consumption: 'অভ্যন্তরীণ ব্যবহার',
|
|
167
|
+
scrap: 'স্ক্র্যাপ',
|
|
168
|
+
adjustment_out: 'সমন্বয়ে নির্গমন',
|
|
169
|
+
other_out: 'অন্যান্য নির্গমন',
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
operations: {
|
|
173
|
+
title: 'আমার কার্যক্রম',
|
|
174
|
+
hint: 'প্রতিটি গুদামের রিসিপ্ট, ডেলিভারি ও অভ্যন্তরীণ স্থানান্তর: প্রক্রিয়ার জন্য প্রস্তুত, স্টকের অপেক্ষায়, এবং নির্ধারিত তারিখের চেয়ে দেরিতে। প্রতিটি সংখ্যা তার স্থানান্তরগুলো খোলে।',
|
|
175
|
+
loading: 'লোড হচ্ছে…',
|
|
176
|
+
empty: 'কিছু করার নেই: কোনো গুদামে কোনো স্থানান্তর অপেক্ষায় নেই।',
|
|
177
|
+
ready: 'প্রস্তুত',
|
|
178
|
+
waiting: 'অপেক্ষমাণ',
|
|
179
|
+
late: 'দেরি',
|
|
180
|
+
readyOf: '{{count}}টি প্রস্তুত: {{title}}',
|
|
181
|
+
waitingOf: '{{count}}টি অপেক্ষমাণ: {{title}}',
|
|
182
|
+
lateOf: '{{count}}টি দেরিতে: {{title}}',
|
|
183
|
+
kind: { receipt: 'রিসিপ্ট', delivery: 'ডেলিভারি', internal: 'অভ্যন্তরীণ স্থানান্তর' },
|
|
184
|
+
},
|
|
185
|
+
returns: {
|
|
186
|
+
button: 'ফেরত',
|
|
187
|
+
title: 'পণ্য ফেরত',
|
|
188
|
+
intro: 'প্রতিটি লাইনের কতটা ফেরত আসে এবং কেন। ফেরতটি এই ট্রান্সফারের সঙ্গে যুক্ত ও নিশ্চিত হয়; পণ্য সরলে তা যাচাই করুন।',
|
|
189
|
+
left: '{{done}} সম্পন্ন, {{left}} ফেরত আসতে পারে',
|
|
190
|
+
reason: 'কারণ',
|
|
191
|
+
note: 'নোট',
|
|
192
|
+
confirm: 'ফেরত তৈরি করুন',
|
|
193
|
+
made: 'ফেরত {{name}} তৈরি হয়েছে।',
|
|
194
|
+
},
|
|
195
|
+
replenish: {
|
|
196
|
+
title: 'পুনঃপূরণ',
|
|
197
|
+
hint: 'প্রতিটি নিয়ম একটি গুদামে পণ্যকে সর্বনিম্ন ও সর্বোচ্চ পরিমাণের মধ্যে রাখে। পূর্বাভাসে মজুত, বেরিয়ে যাওয়া, আসছে এবং অর্ডারে থাকা পরিমাণ গোনা হয়; সর্বনিম্নের নিচে নামলে সর্বোচ্চ পর্যন্ত পৌঁছাতে যতটুকু লাগে তা প্রস্তাব করে।',
|
|
198
|
+
order: 'অর্ডার করুন ({{count}})',
|
|
199
|
+
snooze: 'এক সপ্তাহের জন্য স্থগিত',
|
|
200
|
+
refresh: 'পূর্বাভাস হালনাগাদ করুন',
|
|
201
|
+
all: 'সব নিয়ম দেখান',
|
|
202
|
+
loading: 'লোড হচ্ছে…',
|
|
203
|
+
empty: 'অর্ডারের কিছু নেই: প্রতিটি পূর্বাভাস সর্বনিম্নে বা তার উপরে।',
|
|
204
|
+
rule: 'পণ্য ও গুদাম',
|
|
205
|
+
method: 'পূরণের উপায়',
|
|
206
|
+
onHand: 'মজুত',
|
|
207
|
+
forecast: 'পূর্বাভাস',
|
|
208
|
+
minMax: 'সর্বনিম্ন – সর্বোচ্চ',
|
|
209
|
+
toOrder: 'অর্ডার করতে হবে',
|
|
210
|
+
quantityOf: '{{name}}-এর অর্ডারের পরিমাণ',
|
|
211
|
+
buy: 'কেনা',
|
|
212
|
+
make: 'তৈরি',
|
|
213
|
+
transfer: 'স্থানান্তর',
|
|
214
|
+
dropship: 'সরাসরি সরবরাহ',
|
|
215
|
+
refreshed: '{{count}}টি নিয়ম হালনাগাদ হয়েছে।',
|
|
216
|
+
ordered: '{{document}}-এ {{quantity}}।',
|
|
217
|
+
snoozed: '{{count}}টি নিয়ম এক সপ্তাহের জন্য স্থগিত।',
|
|
218
|
+
snoozedUntil: '{{date}} পর্যন্ত স্থগিত',
|
|
219
|
+
last: 'সর্বশেষ অর্ডার {{document}}',
|
|
220
|
+
},
|
|
15
221
|
scan: {
|
|
16
222
|
title: 'স্ক্যান',
|
|
17
223
|
barcode: 'বারকোড',
|
|
@@ -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: 69f9bf8c989c1bd6
|
|
2
2
|
// Bindings of module `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';
|