@endora-commerce/mod-invoices 0.0.0-stage → 0.100.0
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/LICENSE +21 -0
- package/README.md +59 -2
- package/dist/admin/components/InvoiceSectionTabs.d.ts +22 -0
- package/dist/admin/components/InvoiceSectionTabs.d.ts.map +1 -0
- package/dist/admin/components/InvoiceSectionTabs.js +34 -0
- package/dist/admin/components/InvoiceSectionTabs.js.map +1 -0
- package/dist/admin/index.d.ts +34 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +69 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/InvoiceDetail.d.ts +10 -0
- package/dist/admin/pages/InvoiceDetail.d.ts.map +1 -0
- package/dist/admin/pages/InvoiceDetail.js +111 -0
- package/dist/admin/pages/InvoiceDetail.js.map +1 -0
- package/dist/admin/pages/InvoiceTemplateEditor.d.ts +11 -0
- package/dist/admin/pages/InvoiceTemplateEditor.d.ts.map +1 -0
- package/dist/admin/pages/InvoiceTemplateEditor.js +188 -0
- package/dist/admin/pages/InvoiceTemplateEditor.js.map +1 -0
- package/dist/admin/pages/InvoiceTemplatesPage.d.ts +10 -0
- package/dist/admin/pages/InvoiceTemplatesPage.d.ts.map +1 -0
- package/dist/admin/pages/InvoiceTemplatesPage.js +60 -0
- package/dist/admin/pages/InvoiceTemplatesPage.js.map +1 -0
- package/dist/admin/pages/InvoicesList.d.ts +9 -0
- package/dist/admin/pages/InvoicesList.d.ts.map +1 -0
- package/dist/admin/pages/InvoicesList.js +116 -0
- package/dist/admin/pages/InvoicesList.js.map +1 -0
- package/dist/admin/templates/described-blocks.d.ts +67 -0
- package/dist/admin/templates/described-blocks.d.ts.map +1 -0
- package/dist/admin/templates/described-blocks.js +83 -0
- package/dist/admin/templates/described-blocks.js.map +1 -0
- package/dist/admin/templates/invoice-builder-plugin.d.ts +4 -0
- package/dist/admin/templates/invoice-builder-plugin.d.ts.map +1 -0
- package/dist/admin/templates/invoice-builder-plugin.js +12 -0
- package/dist/admin/templates/invoice-builder-plugin.js.map +1 -0
- package/dist/admin/templates/invoice-puck-config.d.ts +37 -0
- package/dist/admin/templates/invoice-puck-config.d.ts.map +1 -0
- package/dist/admin/templates/invoice-puck-config.js +733 -0
- package/dist/admin/templates/invoice-puck-config.js.map +1 -0
- package/dist/backend/email-templates/invoice-issued.default.d.ts +10 -0
- package/dist/backend/email-templates/invoice-issued.default.d.ts.map +1 -0
- package/dist/backend/email-templates/invoice-issued.default.js +45 -0
- package/dist/backend/email-templates/invoice-issued.default.js.map +1 -0
- package/dist/backend/entities/invoice-external-attachment.entity.d.ts +20 -0
- package/dist/backend/entities/invoice-external-attachment.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice-external-attachment.entity.js +77 -0
- package/dist/backend/entities/invoice-external-attachment.entity.js.map +1 -0
- package/dist/backend/entities/invoice-line.entity.d.ts +20 -0
- package/dist/backend/entities/invoice-line.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice-line.entity.js +82 -0
- package/dist/backend/entities/invoice-line.entity.js.map +1 -0
- package/dist/backend/entities/invoice-number-counter.entity.d.ts +18 -0
- package/dist/backend/entities/invoice-number-counter.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice-number-counter.entity.js +63 -0
- package/dist/backend/entities/invoice-number-counter.entity.js.map +1 -0
- package/dist/backend/entities/invoice-template.entity.d.ts +22 -0
- package/dist/backend/entities/invoice-template.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice-template.entity.js +84 -0
- package/dist/backend/entities/invoice-template.entity.js.map +1 -0
- package/dist/backend/entities/invoice.entity.d.ts +64 -0
- package/dist/backend/entities/invoice.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice.entity.js +202 -0
- package/dist/backend/entities/invoice.entity.js.map +1 -0
- package/dist/backend/index.d.ts +111 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +291 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/pdf-components/descriptor.d.ts +29 -0
- package/dist/backend/pdf-components/descriptor.d.ts.map +1 -0
- package/dist/backend/pdf-components/descriptor.js +227 -0
- package/dist/backend/pdf-components/descriptor.js.map +1 -0
- package/dist/backend/pdf-components/embed-logo-images.d.ts +35 -0
- package/dist/backend/pdf-components/embed-logo-images.d.ts.map +1 -0
- package/dist/backend/pdf-components/embed-logo-images.js +101 -0
- package/dist/backend/pdf-components/embed-logo-images.js.map +1 -0
- package/dist/backend/pdf-components/sample.d.ts +4 -0
- package/dist/backend/pdf-components/sample.d.ts.map +1 -0
- package/dist/backend/pdf-components/sample.js +75 -0
- package/dist/backend/pdf-components/sample.js.map +1 -0
- package/dist/backend/pdf-components/sections.d.ts +34 -0
- package/dist/backend/pdf-components/sections.d.ts.map +1 -0
- package/dist/backend/pdf-components/sections.js +445 -0
- package/dist/backend/pdf-components/sections.js.map +1 -0
- package/dist/backend/pdf-components/tree-mapper.d.ts +37 -0
- package/dist/backend/pdf-components/tree-mapper.d.ts.map +1 -0
- package/dist/backend/pdf-components/tree-mapper.js +76 -0
- package/dist/backend/pdf-components/tree-mapper.js.map +1 -0
- package/dist/backend/plugin.d.ts +124 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +87 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +41 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +219 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.customer.d.ts +33 -0
- package/dist/backend/routes.customer.d.ts.map +1 -0
- package/dist/backend/routes.customer.js +124 -0
- package/dist/backend/routes.customer.js.map +1 -0
- package/dist/backend/seeds/generic-invoice-template.d.ts +18 -0
- package/dist/backend/seeds/generic-invoice-template.d.ts.map +1 -0
- package/dist/backend/seeds/generic-invoice-template.js +174 -0
- package/dist/backend/seeds/generic-invoice-template.js.map +1 -0
- package/dist/backend/services/amount-to-words.d.ts +20 -0
- package/dist/backend/services/amount-to-words.d.ts.map +1 -0
- package/dist/backend/services/amount-to-words.js +232 -0
- package/dist/backend/services/amount-to-words.js.map +1 -0
- package/dist/backend/services/auto-issue-reactor.d.ts +53 -0
- package/dist/backend/services/auto-issue-reactor.d.ts.map +1 -0
- package/dist/backend/services/auto-issue-reactor.js +122 -0
- package/dist/backend/services/auto-issue-reactor.js.map +1 -0
- package/dist/backend/services/corrective-invoice.d.ts +38 -0
- package/dist/backend/services/corrective-invoice.d.ts.map +1 -0
- package/dist/backend/services/corrective-invoice.js +257 -0
- package/dist/backend/services/corrective-invoice.js.map +1 -0
- package/dist/backend/services/cross-module-context.d.ts +82 -0
- package/dist/backend/services/cross-module-context.d.ts.map +1 -0
- package/dist/backend/services/cross-module-context.js +93 -0
- package/dist/backend/services/cross-module-context.js.map +1 -0
- package/dist/backend/services/duplicate-number-refusal.d.ts +33 -0
- package/dist/backend/services/duplicate-number-refusal.d.ts.map +1 -0
- package/dist/backend/services/duplicate-number-refusal.js +92 -0
- package/dist/backend/services/duplicate-number-refusal.js.map +1 -0
- package/dist/backend/services/erp-sale-document-write-port.d.ts +37 -0
- package/dist/backend/services/erp-sale-document-write-port.d.ts.map +1 -0
- package/dist/backend/services/erp-sale-document-write-port.js +192 -0
- package/dist/backend/services/erp-sale-document-write-port.js.map +1 -0
- package/dist/backend/services/invoice-attachment-fetch-registry.d.ts +75 -0
- package/dist/backend/services/invoice-attachment-fetch-registry.d.ts.map +1 -0
- package/dist/backend/services/invoice-attachment-fetch-registry.js +81 -0
- package/dist/backend/services/invoice-attachment-fetch-registry.js.map +1 -0
- package/dist/backend/services/invoice-copy-host.service.d.ts +9 -0
- package/dist/backend/services/invoice-copy-host.service.d.ts.map +1 -0
- package/dist/backend/services/invoice-copy-host.service.js +52 -0
- package/dist/backend/services/invoice-copy-host.service.js.map +1 -0
- package/dist/backend/services/invoice-email-dispatch.d.ts +89 -0
- package/dist/backend/services/invoice-email-dispatch.d.ts.map +1 -0
- package/dist/backend/services/invoice-email-dispatch.js +138 -0
- package/dist/backend/services/invoice-email-dispatch.js.map +1 -0
- package/dist/backend/services/invoice-line-builder.d.ts +29 -0
- package/dist/backend/services/invoice-line-builder.d.ts.map +1 -0
- package/dist/backend/services/invoice-line-builder.js +46 -0
- package/dist/backend/services/invoice-line-builder.js.map +1 -0
- package/dist/backend/services/invoice-number-collisions.d.ts +17 -0
- package/dist/backend/services/invoice-number-collisions.d.ts.map +1 -0
- package/dist/backend/services/invoice-number-collisions.js +154 -0
- package/dist/backend/services/invoice-number-collisions.js.map +1 -0
- package/dist/backend/services/invoice-number-generator.d.ts +96 -0
- package/dist/backend/services/invoice-number-generator.d.ts.map +1 -0
- package/dist/backend/services/invoice-number-generator.js +157 -0
- package/dist/backend/services/invoice-number-generator.js.map +1 -0
- package/dist/backend/services/invoice-pdf-block-registry.d.ts +65 -0
- package/dist/backend/services/invoice-pdf-block-registry.d.ts.map +1 -0
- package/dist/backend/services/invoice-pdf-block-registry.js +94 -0
- package/dist/backend/services/invoice-pdf-block-registry.js.map +1 -0
- package/dist/backend/services/invoice-pdf-renderer.d.ts +57 -0
- package/dist/backend/services/invoice-pdf-renderer.d.ts.map +1 -0
- package/dist/backend/services/invoice-pdf-renderer.js +158 -0
- package/dist/backend/services/invoice-pdf-renderer.js.map +1 -0
- package/dist/backend/services/invoice-pdf.d.ts +24 -0
- package/dist/backend/services/invoice-pdf.d.ts.map +1 -0
- package/dist/backend/services/invoice-pdf.js +52 -0
- package/dist/backend/services/invoice-pdf.js.map +1 -0
- package/dist/backend/services/invoice-placement-apply-port.d.ts +29 -0
- package/dist/backend/services/invoice-placement-apply-port.d.ts.map +1 -0
- package/dist/backend/services/invoice-placement-apply-port.js +40 -0
- package/dist/backend/services/invoice-placement-apply-port.js.map +1 -0
- package/dist/backend/services/invoice-read-port.d.ts +44 -0
- package/dist/backend/services/invoice-read-port.d.ts.map +1 -0
- package/dist/backend/services/invoice-read-port.js +95 -0
- package/dist/backend/services/invoice-read-port.js.map +1 -0
- package/dist/backend/services/invoice-service.d.ts +94 -0
- package/dist/backend/services/invoice-service.d.ts.map +1 -0
- package/dist/backend/services/invoice-service.js +374 -0
- package/dist/backend/services/invoice-service.js.map +1 -0
- package/dist/backend/services/invoice-template-service.d.ts +43 -0
- package/dist/backend/services/invoice-template-service.d.ts.map +1 -0
- package/dist/backend/services/invoice-template-service.js +147 -0
- package/dist/backend/services/invoice-template-service.js.map +1 -0
- package/dist/backend/services/numbering-configuration.d.ts +76 -0
- package/dist/backend/services/numbering-configuration.d.ts.map +1 -0
- package/dist/backend/services/numbering-configuration.js +176 -0
- package/dist/backend/services/numbering-configuration.js.map +1 -0
- package/dist/backend/services/numbering-write-validator.d.ts +22 -0
- package/dist/backend/services/numbering-write-validator.d.ts.map +1 -0
- package/dist/backend/services/numbering-write-validator.js +82 -0
- package/dist/backend/services/numbering-write-validator.js.map +1 -0
- package/dist/backend/services/seller-settings.d.ts +24 -0
- package/dist/backend/services/seller-settings.d.ts.map +1 -0
- package/dist/backend/services/seller-settings.js +38 -0
- package/dist/backend/services/seller-settings.js.map +1 -0
- package/dist/backend/services/vendor-number-hold.d.ts +10 -0
- package/dist/backend/services/vendor-number-hold.d.ts.map +1 -0
- package/dist/backend/services/vendor-number-hold.js +14 -0
- package/dist/backend/services/vendor-number-hold.js.map +1 -0
- package/dist/manifest.d.ts +203 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +390 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260629T125121_invoices_module.d.ts +17 -0
- package/dist/migrations/20260629T125121_invoices_module.d.ts.map +1 -0
- package/dist/migrations/20260629T125121_invoices_module.js +117 -0
- package/dist/migrations/20260629T125121_invoices_module.js.map +1 -0
- package/dist/migrations/20260801T111000_invoices_generic_template_reseed.d.ts +6 -0
- package/dist/migrations/20260801T111000_invoices_generic_template_reseed.d.ts.map +1 -0
- package/dist/migrations/20260801T111000_invoices_generic_template_reseed.js +25 -0
- package/dist/migrations/20260801T111000_invoices_generic_template_reseed.js.map +1 -0
- package/dist/migrations/20260817T201110_invoices_correction_idempotency_key.d.ts +20 -0
- package/dist/migrations/20260817T201110_invoices_correction_idempotency_key.d.ts.map +1 -0
- package/dist/migrations/20260817T201110_invoices_correction_idempotency_key.js +33 -0
- package/dist/migrations/20260817T201110_invoices_correction_idempotency_key.js.map +1 -0
- package/dist/migrations/20260903T101756_invoices_namespace_block_names.d.ts +6 -0
- package/dist/migrations/20260903T101756_invoices_namespace_block_names.d.ts.map +1 -0
- package/dist/migrations/20260903T101756_invoices_namespace_block_names.js +56 -0
- package/dist/migrations/20260903T101756_invoices_namespace_block_names.js.map +1 -0
- package/dist/migrations/20260914T133603_invoices_erp_imported_sale_documents.d.ts +12 -0
- package/dist/migrations/20260914T133603_invoices_erp_imported_sale_documents.d.ts.map +1 -0
- package/dist/migrations/20260914T133603_invoices_erp_imported_sale_documents.js +87 -0
- package/dist/migrations/20260914T133603_invoices_erp_imported_sale_documents.js.map +1 -0
- package/dist/migrations/20260926T230239_invoices_import_identity.d.ts +33 -0
- package/dist/migrations/20260926T230239_invoices_import_identity.d.ts.map +1 -0
- package/dist/migrations/20260926T230239_invoices_import_identity.js +83 -0
- package/dist/migrations/20260926T230239_invoices_import_identity.js.map +1 -0
- package/dist/migrations/index.d.ts +32 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +39 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/ports/index.d.ts +93 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +2 -0
- package/dist/ports/index.js.map +1 -0
- package/docs/invoices.md +113 -0
- package/i18n/en.json +45 -0
- package/i18n/pl.json +45 -0
- package/package.json +119 -3
- package/tailwind.css +14 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice-pdf.js","sourceRoot":"","sources":["../../../src/backend/services/invoice-pdf.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,UAAU,sBAAsB,CAAC,MAItC;IACC,OAAO,YAAY,CAAC,CAAC,WAAW,MAAM,CAAC,aAAa,EAAE,EAAE,UAAU,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACxG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAA2E;IAE3E,MAAM,KAAK,GACT,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,CAAC,uBAAuB,CAAC;QAC3B,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,aAAa,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,OAAO,YAAY,CAAC,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,wEAAwE;AACxE,SAAS,YAAY,CAAC,KAAe;IACnC,yEAAyE;IACzE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GACX,yBAAyB;QACzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC/E,KAAK,CAAC;IAER,0EAA0E;IAC1E,MAAM,OAAO,GAAa;QACxB,sDAAsD;QACtD,8DAA8D;QAC9D,mIAAmI;QACnI,uBAAuB,OAAO,CAAC,MAAM,gBAAgB,OAAO,uBAAuB;QACnF,2EAA2E;KAC5E,CAAC;IAEF,IAAI,IAAI,GAAG,YAAY,CAAC;IACxB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI,GAAG,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,IAAI,WAAW,OAAO,CAAC,MAAM,GAAG,CAAC,yBAAyB,CAAC;IAC/D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,aAAa,CAAC;IAC3D,CAAC;IACD,IAAI,IAAI,qBAAqB,OAAO,CAAC,MAAM,GAAG,CAAC,+BAA+B,UAAU,WAAW,CAAC;IAEpG,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql';
|
|
2
|
+
import type { InvoicePlacementApplyPort, ProformaInvoiceOpened } from '../../ports/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* `invoicePlacementApplyPort` — the proforma an order is placed with, written
|
|
5
|
+
* on the caller's `EntityManager` (feature 080, T048; D-169).
|
|
6
|
+
*
|
|
7
|
+
* `orders` held this module's `Invoice` class for it until T048 and did the
|
|
8
|
+
* `tx.create` itself. D-168 leaves a packaged `invoices` no entity class for
|
|
9
|
+
* `orders` to name, so the reach had to go before this module moves; the
|
|
10
|
+
* transaction it runs in did not change, and `invoices_order_fk` is untouched.
|
|
11
|
+
* The port's own doc block states the constraint.
|
|
12
|
+
*
|
|
13
|
+
* **The number is derived here, and the expression is the one that moved.**
|
|
14
|
+
* `orders` computed `<YYYY-MM-DD>/<first 8 of the order id>` and passed the
|
|
15
|
+
* string in; both of its inputs are already parameters of this call, so keeping
|
|
16
|
+
* the derivation on the consumer's side would have published a parameter only
|
|
17
|
+
* the consumer knows how to fill. It is deliberately the *same* expression:
|
|
18
|
+
* this is a proforma, which the numbering sequence this module owns does not
|
|
19
|
+
* govern — `status` stays `pending` until an issuance path takes it further,
|
|
20
|
+
* and `InvoiceNumberingService` is what assigns a real number then.
|
|
21
|
+
*/
|
|
22
|
+
export declare class InvoicePlacementApplyService implements InvoicePlacementApplyPort {
|
|
23
|
+
createProformaForOrder(em: EntityManager, input: {
|
|
24
|
+
orderId: string;
|
|
25
|
+
currency: string;
|
|
26
|
+
total: string;
|
|
27
|
+
}): Promise<ProformaInvoiceOpened>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=invoice-placement-apply-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice-placement-apply-port.d.ts","sourceRoot":"","sources":["../../../src/backend/services/invoice-placement-apply-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EACV,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,4BAA6B,YAAW,yBAAyB;IACtE,sBAAsB,CAC1B,EAAE,EAAE,aAAa,EACjB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAC1D,OAAO,CAAC,qBAAqB,CAAC;CAiBlC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Invoice } from '../entities/invoice.entity.js';
|
|
2
|
+
/**
|
|
3
|
+
* `invoicePlacementApplyPort` — the proforma an order is placed with, written
|
|
4
|
+
* on the caller's `EntityManager` (feature 080, T048; D-169).
|
|
5
|
+
*
|
|
6
|
+
* `orders` held this module's `Invoice` class for it until T048 and did the
|
|
7
|
+
* `tx.create` itself. D-168 leaves a packaged `invoices` no entity class for
|
|
8
|
+
* `orders` to name, so the reach had to go before this module moves; the
|
|
9
|
+
* transaction it runs in did not change, and `invoices_order_fk` is untouched.
|
|
10
|
+
* The port's own doc block states the constraint.
|
|
11
|
+
*
|
|
12
|
+
* **The number is derived here, and the expression is the one that moved.**
|
|
13
|
+
* `orders` computed `<YYYY-MM-DD>/<first 8 of the order id>` and passed the
|
|
14
|
+
* string in; both of its inputs are already parameters of this call, so keeping
|
|
15
|
+
* the derivation on the consumer's side would have published a parameter only
|
|
16
|
+
* the consumer knows how to fill. It is deliberately the *same* expression:
|
|
17
|
+
* this is a proforma, which the numbering sequence this module owns does not
|
|
18
|
+
* govern — `status` stays `pending` until an issuance path takes it further,
|
|
19
|
+
* and `InvoiceNumberingService` is what assigns a real number then.
|
|
20
|
+
*/
|
|
21
|
+
export class InvoicePlacementApplyService {
|
|
22
|
+
async createProformaForOrder(em, input) {
|
|
23
|
+
// command-coverage-ignore: the proforma an audited order placement opens,
|
|
24
|
+
// inside that placement's own transaction. `orders` records the placement
|
|
25
|
+
// as one operation through its own Command; a second audit entry for the
|
|
26
|
+
// document it opened would record the same decision twice.
|
|
27
|
+
const invoice = em.create(Invoice, {
|
|
28
|
+
orderId: input.orderId,
|
|
29
|
+
kind: 'proforma',
|
|
30
|
+
number: `${new Date().toISOString().slice(0, 10)}/${input.orderId.slice(0, 8)}`,
|
|
31
|
+
currency: input.currency,
|
|
32
|
+
total: input.total,
|
|
33
|
+
status: 'pending',
|
|
34
|
+
});
|
|
35
|
+
await em.persistAndFlush(invoice);
|
|
36
|
+
// A published record, never the managed entity (D-77's first narrowing).
|
|
37
|
+
return { id: invoice.id, orderId: invoice.orderId, number: invoice.number };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=invoice-placement-apply-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice-placement-apply-port.js","sourceRoot":"","sources":["../../../src/backend/services/invoice-placement-apply-port.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAMxD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,4BAA4B;IACvC,KAAK,CAAC,sBAAsB,CAC1B,EAAiB,EACjB,KAA2D;QAE3D,0EAA0E;QAC1E,0EAA0E;QAC1E,yEAAyE;QACzE,2DAA2D;QAC3D,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE;YACjC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAC/E,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,MAAM,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAClC,yEAAyE;QACzE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IAC/E,CAAC;CACF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql';
|
|
2
|
+
import type { InvoicePdfPort, InvoiceReadPort, InvoiceRecord } from '@endora-commerce/contracts';
|
|
3
|
+
import { Invoice } from '../entities/invoice.entity.js';
|
|
4
|
+
/**
|
|
5
|
+
* The row-level read model and the PDF surface `invoices` publishes
|
|
6
|
+
* (feature 075, Phase P).
|
|
7
|
+
*
|
|
8
|
+
* Four inbound sites read the `Invoice` entity: `orders` listing an order's
|
|
9
|
+
* invoices on the order screen and again at cancellation, and `ksef` resolving
|
|
10
|
+
* the invoice behind a submission — one of those two from inside its entity
|
|
11
|
+
* file, where the reference is a `@TransitivelyScoped` tenancy classification
|
|
12
|
+
* rather than a query, and needs its own remedy (R-05) that no port can give.
|
|
13
|
+
*
|
|
14
|
+
* The seller and buyer snapshots do not survive the mapping. They are the
|
|
15
|
+
* document's frozen copy of two other modules' rows; no cross-module caller
|
|
16
|
+
* reads them, and publishing them would invite one to.
|
|
17
|
+
*/
|
|
18
|
+
export declare class InvoiceReadService implements InvoiceReadPort {
|
|
19
|
+
private readonly emFactory;
|
|
20
|
+
constructor(emFactory: () => EntityManager);
|
|
21
|
+
findById(id: string): Promise<InvoiceRecord | null>;
|
|
22
|
+
findByIds(ids: readonly string[]): Promise<InvoiceRecord[]>;
|
|
23
|
+
findByNumber(number: string): Promise<InvoiceRecord | null>;
|
|
24
|
+
listForOrder(orderId: string): Promise<InvoiceRecord[]>;
|
|
25
|
+
listForOrders(orderIds: readonly string[]): Promise<InvoiceRecord[]>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The PDF surface, as a **port** even though both builders behind it are pure.
|
|
29
|
+
*
|
|
30
|
+
* FR-013's test — "does switching the owner off change the answer?" — asks
|
|
31
|
+
* whether the bytes would differ, and they would not. The question that
|
|
32
|
+
* settles this one is Constitution XVII's: should the platform produce an
|
|
33
|
+
* invoice document for a business that has switched invoicing off? An order
|
|
34
|
+
* screen offering an invoice PDF is a surface this module owns, and a surface
|
|
35
|
+
* a switched-off module owns must disappear.
|
|
36
|
+
*
|
|
37
|
+
* `hashPassword` is the contrast that makes the line a line: it is
|
|
38
|
+
* platform-generic, reachable from five modules and the dev seed, and nobody
|
|
39
|
+
* would call hashing "an `auth` surface". A VAT document is an `invoices`
|
|
40
|
+
* surface.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createInvoicePdfPort(): InvoicePdfPort;
|
|
43
|
+
export declare function toInvoiceRecord(invoice: Invoice): InvoiceRecord;
|
|
44
|
+
//# sourceMappingURL=invoice-read-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice-read-port.d.ts","sourceRoot":"","sources":["../../../src/backend/services/invoice-read-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAGxD;;;;;;;;;;;;;GAaG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM,aAAa;IAErD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAKnD,SAAS,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAM3D,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAK3D,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IASvD,aAAa,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAS3E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAKrD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CA0B/D"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Invoice } from '../entities/invoice.entity.js';
|
|
2
|
+
import { buildBulkInvoicesPdf, buildMinimalInvoicePdf } from './invoice-pdf.js';
|
|
3
|
+
/**
|
|
4
|
+
* The row-level read model and the PDF surface `invoices` publishes
|
|
5
|
+
* (feature 075, Phase P).
|
|
6
|
+
*
|
|
7
|
+
* Four inbound sites read the `Invoice` entity: `orders` listing an order's
|
|
8
|
+
* invoices on the order screen and again at cancellation, and `ksef` resolving
|
|
9
|
+
* the invoice behind a submission — one of those two from inside its entity
|
|
10
|
+
* file, where the reference is a `@TransitivelyScoped` tenancy classification
|
|
11
|
+
* rather than a query, and needs its own remedy (R-05) that no port can give.
|
|
12
|
+
*
|
|
13
|
+
* The seller and buyer snapshots do not survive the mapping. They are the
|
|
14
|
+
* document's frozen copy of two other modules' rows; no cross-module caller
|
|
15
|
+
* reads them, and publishing them would invite one to.
|
|
16
|
+
*/
|
|
17
|
+
export class InvoiceReadService {
|
|
18
|
+
emFactory;
|
|
19
|
+
constructor(emFactory) {
|
|
20
|
+
this.emFactory = emFactory;
|
|
21
|
+
}
|
|
22
|
+
async findById(id) {
|
|
23
|
+
const invoice = await this.emFactory().findOne(Invoice, { id });
|
|
24
|
+
return invoice ? toInvoiceRecord(invoice) : null;
|
|
25
|
+
}
|
|
26
|
+
async findByIds(ids) {
|
|
27
|
+
if (ids.length === 0)
|
|
28
|
+
return [];
|
|
29
|
+
const invoices = await this.emFactory().find(Invoice, { id: { $in: [...ids] } });
|
|
30
|
+
return invoices.map(toInvoiceRecord);
|
|
31
|
+
}
|
|
32
|
+
async findByNumber(number) {
|
|
33
|
+
const invoice = await this.emFactory().findOne(Invoice, { number });
|
|
34
|
+
return invoice ? toInvoiceRecord(invoice) : null;
|
|
35
|
+
}
|
|
36
|
+
async listForOrder(orderId) {
|
|
37
|
+
const invoices = await this.emFactory().find(Invoice, { orderId }, { orderBy: { issuedAt: 'desc', id: 'desc' } });
|
|
38
|
+
return invoices.map(toInvoiceRecord);
|
|
39
|
+
}
|
|
40
|
+
async listForOrders(orderIds) {
|
|
41
|
+
if (orderIds.length === 0)
|
|
42
|
+
return [];
|
|
43
|
+
const invoices = await this.emFactory().find(Invoice, { orderId: { $in: [...orderIds] } }, { orderBy: { issuedAt: 'desc', id: 'desc' } });
|
|
44
|
+
return invoices.map(toInvoiceRecord);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The PDF surface, as a **port** even though both builders behind it are pure.
|
|
49
|
+
*
|
|
50
|
+
* FR-013's test — "does switching the owner off change the answer?" — asks
|
|
51
|
+
* whether the bytes would differ, and they would not. The question that
|
|
52
|
+
* settles this one is Constitution XVII's: should the platform produce an
|
|
53
|
+
* invoice document for a business that has switched invoicing off? An order
|
|
54
|
+
* screen offering an invoice PDF is a surface this module owns, and a surface
|
|
55
|
+
* a switched-off module owns must disappear.
|
|
56
|
+
*
|
|
57
|
+
* `hashPassword` is the contrast that makes the line a line: it is
|
|
58
|
+
* platform-generic, reachable from five modules and the dev seed, and nobody
|
|
59
|
+
* would call hashing "an `auth` surface". A VAT document is an `invoices`
|
|
60
|
+
* surface.
|
|
61
|
+
*/
|
|
62
|
+
export function createInvoicePdfPort() {
|
|
63
|
+
return {
|
|
64
|
+
renderMinimal: (params) => buildMinimalInvoicePdf(params),
|
|
65
|
+
renderBulk: (invoices) => buildBulkInvoicesPdf([...invoices]),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function toInvoiceRecord(invoice) {
|
|
69
|
+
return {
|
|
70
|
+
id: invoice.id,
|
|
71
|
+
orderId: invoice.orderId ?? null,
|
|
72
|
+
salesChannelId: invoice.salesChannelId ?? null,
|
|
73
|
+
kind: invoice.kind,
|
|
74
|
+
number: invoice.number,
|
|
75
|
+
issuedAt: invoice.issuedAt,
|
|
76
|
+
saleDate: invoice.saleDate ?? null,
|
|
77
|
+
paymentDueDate: invoice.paymentDueDate ?? null,
|
|
78
|
+
paymentMethod: invoice.paymentMethod ?? null,
|
|
79
|
+
currency: invoice.currency,
|
|
80
|
+
netTotal: invoice.netTotal ?? null,
|
|
81
|
+
taxTotal: invoice.taxTotal ?? null,
|
|
82
|
+
total: invoice.total,
|
|
83
|
+
paidTotal: invoice.paidTotal,
|
|
84
|
+
originalInvoiceId: invoice.originalInvoiceId ?? null,
|
|
85
|
+
templateId: invoice.templateId ?? null,
|
|
86
|
+
ksefReferenceNumber: invoice.ksefReferenceNumber ?? null,
|
|
87
|
+
ksefProcessedAt: invoice.ksefProcessedAt ?? null,
|
|
88
|
+
issuedBy: invoice.issuedBy ?? null,
|
|
89
|
+
pdfAssetId: invoice.pdfAssetId ?? null,
|
|
90
|
+
status: invoice.status,
|
|
91
|
+
createdAt: invoice.createdAt,
|
|
92
|
+
updatedAt: invoice.updatedAt,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=invoice-read-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice-read-port.js","sourceRoot":"","sources":["../../../src/backend/services/invoice-read-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql';
|
|
2
|
+
import { type InvoiceDetail, type InvoiceKind, type OrderReadPort } from '@endora-commerce/contracts';
|
|
3
|
+
import type { InvoiceNumberGenerator } from './invoice-number-generator.js';
|
|
4
|
+
import type { SellerSettingsResolver } from './seller-settings.js';
|
|
5
|
+
import { type LedgerNumberingLookup } from './vendor-number-hold.js';
|
|
6
|
+
export interface IssueInvoiceOptions {
|
|
7
|
+
saleDate?: string;
|
|
8
|
+
paymentDueDate?: string;
|
|
9
|
+
issuedBy?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Minimal audit-log seam (FR-035). */
|
|
12
|
+
export interface InvoiceAuditRecorder {
|
|
13
|
+
record(input: {
|
|
14
|
+
actorAdminUserId?: string | null;
|
|
15
|
+
action: string;
|
|
16
|
+
objectType: string;
|
|
17
|
+
objectId: string;
|
|
18
|
+
stateAfter?: Record<string, unknown> | null;
|
|
19
|
+
}): Promise<unknown>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Domain-event seam (feature 059, contracts/invoices-integration.md §1).
|
|
23
|
+
* Emissions are inert without a subscriber — the KSeF module (or any other
|
|
24
|
+
* consumer) subscribes; removing it changes nothing here.
|
|
25
|
+
*/
|
|
26
|
+
export interface InvoiceDomainEventEmitter {
|
|
27
|
+
emit(eventName: string, payload: {
|
|
28
|
+
eventId: string;
|
|
29
|
+
occurredAt: string;
|
|
30
|
+
} & Record<string, unknown>): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Core invoice issuance + read service (feature 047, US1). Issues invoices /
|
|
34
|
+
* proformas (and is reused by the corrective-invoice provider for credit
|
|
35
|
+
* notes). Numbers are drawn inside the issuing transaction; lines and the
|
|
36
|
+
* seller/buyer snapshot are frozen at issuance. Immutable once `ready`.
|
|
37
|
+
*
|
|
38
|
+
* The order and its lines are read over {@link OrderReadPort} (feature 075,
|
|
39
|
+
* Phase C). They were `em.findOne(Order, …)` and `em.find(OrderItem, …)` here,
|
|
40
|
+
* which is a query against another module's tables that no gate can see:
|
|
41
|
+
* deactivation drops no tables, so an invoice went on being drawn from an
|
|
42
|
+
* `orders` an operator had switched off. Over the port the same read answers
|
|
43
|
+
* 503 `MODULE_DISABLED`, which is the binding dependency this manifest already
|
|
44
|
+
* declares — issuing a legal document about an order the platform will not read
|
|
45
|
+
* is worse than refusing to issue one.
|
|
46
|
+
*/
|
|
47
|
+
export declare class InvoiceService {
|
|
48
|
+
private readonly emFactory;
|
|
49
|
+
/** `orders`' read model. Not optional: an invoice is about an order. */
|
|
50
|
+
private readonly orders;
|
|
51
|
+
private readonly numbers;
|
|
52
|
+
private readonly sellerSettings;
|
|
53
|
+
private readonly audit?;
|
|
54
|
+
private readonly events?;
|
|
55
|
+
private readonly emailOnReady?;
|
|
56
|
+
private readonly ledgerRouting?;
|
|
57
|
+
constructor(emFactory: () => EntityManager,
|
|
58
|
+
/** `orders`' read model. Not optional: an invoice is about an order. */
|
|
59
|
+
orders: OrderReadPort, numbers: InvoiceNumberGenerator, sellerSettings: SellerSettingsResolver, audit?: InvoiceAuditRecorder | undefined, events?: InvoiceDomainEventEmitter | undefined, emailOnReady?: ((invoiceId: string) => Promise<void>) | undefined, ledgerRouting?: LedgerNumberingLookup | undefined);
|
|
60
|
+
/** Issue an invoice/proforma for an order. Idempotent per (order, kind). */
|
|
61
|
+
issue(orderId: string, kind: Exclude<InvoiceKind, 'correction' | 'wz'>, opts?: IssueInvoiceOptions): Promise<InvoiceDetail>;
|
|
62
|
+
/**
|
|
63
|
+
* Run the issuing transaction, translating a duplicated invoice number into
|
|
64
|
+
* `409 INVOICE_NUMBER_ALREADY_ISSUED` (feature 078, D-95.2).
|
|
65
|
+
*
|
|
66
|
+
* `rethrowIfModuleDisabled` is the **first** line of the catch, before any
|
|
67
|
+
* other test. `ModuleDisabledError` is an `HttpError`, so a status-code or
|
|
68
|
+
* class test would let it through by accident rather than by decision, and
|
|
69
|
+
* everything inside the callback can reach a port.
|
|
70
|
+
*/
|
|
71
|
+
private issueInTransaction;
|
|
72
|
+
/**
|
|
73
|
+
* Record the KSeF identity assigned to an invoice (feature 059,
|
|
74
|
+
* contracts/invoices-integration.md §2). The invoices module is the SOLE
|
|
75
|
+
* writer of these columns. Idempotent for the same number; a different
|
|
76
|
+
* non-null number is refused — an accepted KSeF number is immutable.
|
|
77
|
+
*/
|
|
78
|
+
recordKsefAssignment(invoiceId: string, assignment: {
|
|
79
|
+
ksefReferenceNumber: string;
|
|
80
|
+
ksefProcessedAt: Date;
|
|
81
|
+
}): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Mode B: overwrite the Endora-drawn number with the vendor's, then ready.
|
|
84
|
+
* No-op when the invoice already carries that number and is ready.
|
|
85
|
+
*/
|
|
86
|
+
applyVendorAssignedNumber(invoiceId: string, number: string): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Infakt `invoice_paid` → stamp paidTotal to the invoice gross. Never Payments.
|
|
89
|
+
*/
|
|
90
|
+
recordPaidFromLedger(invoiceId: string): Promise<void>;
|
|
91
|
+
/** Load an invoice as a render-ready detail (lines + derived VAT summary). */
|
|
92
|
+
buildDetail(invoiceId: string): Promise<InvoiceDetail>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=invoice-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice-service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/invoice-service.ts"],"names":[],"mappings":"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"}
|