@endora-commerce/mod-invoice-ledger 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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -0
  3. package/dist/admin/api/ledger-client.d.ts +15 -0
  4. package/dist/admin/api/ledger-client.d.ts.map +1 -0
  5. package/dist/admin/api/ledger-client.js +35 -0
  6. package/dist/admin/api/ledger-client.js.map +1 -0
  7. package/dist/admin/index.d.ts +11 -0
  8. package/dist/admin/index.d.ts.map +1 -0
  9. package/dist/admin/index.js +52 -0
  10. package/dist/admin/index.js.map +1 -0
  11. package/dist/admin/pages/LedgerDeliveriesPage.d.ts +4 -0
  12. package/dist/admin/pages/LedgerDeliveriesPage.d.ts.map +1 -0
  13. package/dist/admin/pages/LedgerDeliveriesPage.js +101 -0
  14. package/dist/admin/pages/LedgerDeliveriesPage.js.map +1 -0
  15. package/dist/admin/pages/LedgerRoutingPage.d.ts +4 -0
  16. package/dist/admin/pages/LedgerRoutingPage.d.ts.map +1 -0
  17. package/dist/admin/pages/LedgerRoutingPage.js +67 -0
  18. package/dist/admin/pages/LedgerRoutingPage.js.map +1 -0
  19. package/dist/admin/pages/merge-delivery-pages.d.ts +3 -0
  20. package/dist/admin/pages/merge-delivery-pages.d.ts.map +1 -0
  21. package/dist/admin/pages/merge-delivery-pages.js +5 -0
  22. package/dist/admin/pages/merge-delivery-pages.js.map +1 -0
  23. package/dist/admin/zones/InvoiceLedgerRemoteIdPanel.d.ts +11 -0
  24. package/dist/admin/zones/InvoiceLedgerRemoteIdPanel.d.ts.map +1 -0
  25. package/dist/admin/zones/InvoiceLedgerRemoteIdPanel.js +36 -0
  26. package/dist/admin/zones/InvoiceLedgerRemoteIdPanel.js.map +1 -0
  27. package/dist/admin/zones/LedgerDeliveriesTab.d.ts +10 -0
  28. package/dist/admin/zones/LedgerDeliveriesTab.d.ts.map +1 -0
  29. package/dist/admin/zones/LedgerDeliveriesTab.js +15 -0
  30. package/dist/admin/zones/LedgerDeliveriesTab.js.map +1 -0
  31. package/dist/admin/zones/LedgerRoutingTab.d.ts +11 -0
  32. package/dist/admin/zones/LedgerRoutingTab.d.ts.map +1 -0
  33. package/dist/admin/zones/LedgerRoutingTab.js +16 -0
  34. package/dist/admin/zones/LedgerRoutingTab.js.map +1 -0
  35. package/dist/backend/commands/retry-delivery.command.d.ts +8 -0
  36. package/dist/backend/commands/retry-delivery.command.d.ts.map +1 -0
  37. package/dist/backend/commands/retry-delivery.command.js +26 -0
  38. package/dist/backend/commands/retry-delivery.command.js.map +1 -0
  39. package/dist/backend/commands/routing.commands.d.ts +7 -0
  40. package/dist/backend/commands/routing.commands.d.ts.map +1 -0
  41. package/dist/backend/commands/routing.commands.js +13 -0
  42. package/dist/backend/commands/routing.commands.js.map +1 -0
  43. package/dist/backend/entities/invoice-ledger-activation-lock.entity.d.ts +15 -0
  44. package/dist/backend/entities/invoice-ledger-activation-lock.entity.d.ts.map +1 -0
  45. package/dist/backend/entities/invoice-ledger-activation-lock.entity.js +46 -0
  46. package/dist/backend/entities/invoice-ledger-activation-lock.entity.js.map +1 -0
  47. package/dist/backend/entities/invoice-ledger-client-map.entity.d.ts +18 -0
  48. package/dist/backend/entities/invoice-ledger-client-map.entity.d.ts.map +1 -0
  49. package/dist/backend/entities/invoice-ledger-client-map.entity.js +72 -0
  50. package/dist/backend/entities/invoice-ledger-client-map.entity.js.map +1 -0
  51. package/dist/backend/entities/invoice-ledger-delivery.entity.d.ts +65 -0
  52. package/dist/backend/entities/invoice-ledger-delivery.entity.d.ts.map +1 -0
  53. package/dist/backend/entities/invoice-ledger-delivery.entity.js +168 -0
  54. package/dist/backend/entities/invoice-ledger-delivery.entity.js.map +1 -0
  55. package/dist/backend/entities/invoice-ledger-document-map.entity.d.ts +25 -0
  56. package/dist/backend/entities/invoice-ledger-document-map.entity.d.ts.map +1 -0
  57. package/dist/backend/entities/invoice-ledger-document-map.entity.js +80 -0
  58. package/dist/backend/entities/invoice-ledger-document-map.entity.js.map +1 -0
  59. package/dist/backend/entities/invoice-ledger-webhook-receipt.entity.d.ts +18 -0
  60. package/dist/backend/entities/invoice-ledger-webhook-receipt.entity.d.ts.map +1 -0
  61. package/dist/backend/entities/invoice-ledger-webhook-receipt.entity.js +71 -0
  62. package/dist/backend/entities/invoice-ledger-webhook-receipt.entity.js.map +1 -0
  63. package/dist/backend/index.d.ts +12 -0
  64. package/dist/backend/index.d.ts.map +1 -0
  65. package/dist/backend/index.js +230 -0
  66. package/dist/backend/index.js.map +1 -0
  67. package/dist/backend/routes.admin.d.ts +11 -0
  68. package/dist/backend/routes.admin.d.ts.map +1 -0
  69. package/dist/backend/routes.admin.js +36 -0
  70. package/dist/backend/routes.admin.js.map +1 -0
  71. package/dist/backend/services/invoice-ledger-delivery-admin.service.d.ts +33 -0
  72. package/dist/backend/services/invoice-ledger-delivery-admin.service.d.ts.map +1 -0
  73. package/dist/backend/services/invoice-ledger-delivery-admin.service.js +104 -0
  74. package/dist/backend/services/invoice-ledger-delivery-admin.service.js.map +1 -0
  75. package/dist/backend/services/invoice-ledger-delivery.service.d.ts +55 -0
  76. package/dist/backend/services/invoice-ledger-delivery.service.d.ts.map +1 -0
  77. package/dist/backend/services/invoice-ledger-delivery.service.js +322 -0
  78. package/dist/backend/services/invoice-ledger-delivery.service.js.map +1 -0
  79. package/dist/backend/services/invoice-ledger-registry.service.d.ts +64 -0
  80. package/dist/backend/services/invoice-ledger-registry.service.d.ts.map +1 -0
  81. package/dist/backend/services/invoice-ledger-registry.service.js +119 -0
  82. package/dist/backend/services/invoice-ledger-registry.service.js.map +1 -0
  83. package/dist/backend/services/invoice-ledger-routing-write.service.d.ts +15 -0
  84. package/dist/backend/services/invoice-ledger-routing-write.service.d.ts.map +1 -0
  85. package/dist/backend/services/invoice-ledger-routing-write.service.js +85 -0
  86. package/dist/backend/services/invoice-ledger-routing-write.service.js.map +1 -0
  87. package/dist/backend/services/invoice-ledger-routing.service.d.ts +11 -0
  88. package/dist/backend/services/invoice-ledger-routing.service.d.ts.map +1 -0
  89. package/dist/backend/services/invoice-ledger-routing.service.js +20 -0
  90. package/dist/backend/services/invoice-ledger-routing.service.js.map +1 -0
  91. package/dist/backend/services/invoice-ledger-vendor-freeze-registry.d.ts +9 -0
  92. package/dist/backend/services/invoice-ledger-vendor-freeze-registry.d.ts.map +1 -0
  93. package/dist/backend/services/invoice-ledger-vendor-freeze-registry.js +13 -0
  94. package/dist/backend/services/invoice-ledger-vendor-freeze-registry.js.map +1 -0
  95. package/dist/backend/services/invoice-ledger-webhook.service.d.ts +30 -0
  96. package/dist/backend/services/invoice-ledger-webhook.service.d.ts.map +1 -0
  97. package/dist/backend/services/invoice-ledger-webhook.service.js +170 -0
  98. package/dist/backend/services/invoice-ledger-webhook.service.js.map +1 -0
  99. package/dist/backend/services/mapped-delivery-error.d.ts +25 -0
  100. package/dist/backend/services/mapped-delivery-error.d.ts.map +1 -0
  101. package/dist/backend/services/mapped-delivery-error.js +54 -0
  102. package/dist/backend/services/mapped-delivery-error.js.map +1 -0
  103. package/dist/manifest.d.ts +183 -0
  104. package/dist/manifest.d.ts.map +1 -0
  105. package/dist/manifest.js +112 -0
  106. package/dist/manifest.js.map +1 -0
  107. package/dist/migrations/20260908T125013_invoice_ledger_init.d.ts +12 -0
  108. package/dist/migrations/20260908T125013_invoice_ledger_init.d.ts.map +1 -0
  109. package/dist/migrations/20260908T125013_invoice_ledger_init.js +167 -0
  110. package/dist/migrations/20260908T125013_invoice_ledger_init.js.map +1 -0
  111. package/dist/migrations/20260914T140000_invoice_ledger_row_organization.d.ts +64 -0
  112. package/dist/migrations/20260914T140000_invoice_ledger_row_organization.d.ts.map +1 -0
  113. package/dist/migrations/20260914T140000_invoice_ledger_row_organization.js +126 -0
  114. package/dist/migrations/20260914T140000_invoice_ledger_row_organization.js.map +1 -0
  115. package/dist/migrations/index.d.ts +13 -0
  116. package/dist/migrations/index.d.ts.map +1 -0
  117. package/dist/migrations/index.js +16 -0
  118. package/dist/migrations/index.js.map +1 -0
  119. package/docs/invoice-ledger.md +22 -0
  120. package/i18n/en.json +50 -0
  121. package/i18n/pl.json +50 -0
  122. package/package.json +89 -0
  123. package/tailwind.css +14 -0
@@ -0,0 +1,71 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, Index, OptionalProps, PrimaryKey, Property, Unique } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * Vendor event-id claim. Persist `received` before invoices-port side effects.
15
+ */
16
+ let InvoiceLedgerWebhookReceipt = class InvoiceLedgerWebhookReceipt {
17
+ [OptionalProps];
18
+ id = randomUUID();
19
+ adapterId;
20
+ eventId;
21
+ eventType;
22
+ state = 'received';
23
+ attempts = 0;
24
+ receivedAt = new Date();
25
+ appliedAt;
26
+ error;
27
+ };
28
+ __decorate([
29
+ PrimaryKey({ type: 'uuid' }),
30
+ __metadata("design:type", String)
31
+ ], InvoiceLedgerWebhookReceipt.prototype, "id", void 0);
32
+ __decorate([
33
+ Property({ type: 'varchar', length: 64, fieldName: 'adapter_id' }),
34
+ __metadata("design:type", String)
35
+ ], InvoiceLedgerWebhookReceipt.prototype, "adapterId", void 0);
36
+ __decorate([
37
+ Property({ type: 'varchar', length: 128, fieldName: 'event_id' }),
38
+ __metadata("design:type", String)
39
+ ], InvoiceLedgerWebhookReceipt.prototype, "eventId", void 0);
40
+ __decorate([
41
+ Property({ type: 'varchar', length: 64, fieldName: 'event_type' }),
42
+ __metadata("design:type", String)
43
+ ], InvoiceLedgerWebhookReceipt.prototype, "eventType", void 0);
44
+ __decorate([
45
+ Property({ type: 'varchar', length: 24, fieldName: 'state' }),
46
+ Index(),
47
+ __metadata("design:type", String)
48
+ ], InvoiceLedgerWebhookReceipt.prototype, "state", void 0);
49
+ __decorate([
50
+ Property({ type: 'integer', fieldName: 'attempts' }),
51
+ __metadata("design:type", Number)
52
+ ], InvoiceLedgerWebhookReceipt.prototype, "attempts", void 0);
53
+ __decorate([
54
+ Property({ type: 'timestamptz', fieldName: 'received_at' }),
55
+ __metadata("design:type", Date)
56
+ ], InvoiceLedgerWebhookReceipt.prototype, "receivedAt", void 0);
57
+ __decorate([
58
+ Property({ type: 'timestamptz', fieldName: 'applied_at', nullable: true }),
59
+ __metadata("design:type", Object)
60
+ ], InvoiceLedgerWebhookReceipt.prototype, "appliedAt", void 0);
61
+ __decorate([
62
+ Property({ type: 'text', fieldName: 'error', nullable: true }),
63
+ __metadata("design:type", Object)
64
+ ], InvoiceLedgerWebhookReceipt.prototype, "error", void 0);
65
+ InvoiceLedgerWebhookReceipt = __decorate([
66
+ GlobalEntity(),
67
+ Entity({ tableName: 'invoice_ledger_webhook_receipts' }),
68
+ Unique({ properties: ['adapterId', 'eventId'] })
69
+ ], InvoiceLedgerWebhookReceipt);
70
+ export { InvoiceLedgerWebhookReceipt };
71
+ //# sourceMappingURL=invoice-ledger-webhook-receipt.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-ledger-webhook-receipt.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/invoice-ledger-webhook-receipt.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAIpC;;GAEG;AAII,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACtC,CAAC,aAAa,CAAC,CAA4D;IAG3E,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,SAAS,CAAU;IAGnB,OAAO,CAAU;IAGjB,SAAS,CAAU;IAInB,KAAK,GAAqC,UAAU,CAAC;IAGrD,QAAQ,GAAW,CAAC,CAAC;IAGrB,UAAU,GAAS,IAAI,IAAI,EAAE,CAAC;IAG9B,SAAS,CAAe;IAGxB,KAAK,CAAiB;CACvB,CAAA;AA1BC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;uDACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;;8DAChD;AAGnB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;4DACjD;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;;8DAChD;AAInB;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAC7D,KAAK,EAAE;;0DAC6C;AAGrD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;6DAChC;AAGrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;8BAChD,IAAI;+DAAc;AAG9B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8DACnD;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0DACzC;AA7BX,2BAA2B;IAHvC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,iCAAiC,EAAE,CAAC;IACxD,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC;GACpC,2BAA2B,CA8BvC"}
@@ -0,0 +1,12 @@
1
+ import type { ModuleContext } from '@endora-commerce/platform/kernel';
2
+ import { InvoiceLedgerActivationLock } from './entities/invoice-ledger-activation-lock.entity.js';
3
+ import { InvoiceLedgerClientMap } from './entities/invoice-ledger-client-map.entity.js';
4
+ import { InvoiceLedgerDelivery } from './entities/invoice-ledger-delivery.entity.js';
5
+ import { InvoiceLedgerDocumentMap } from './entities/invoice-ledger-document-map.entity.js';
6
+ import { InvoiceLedgerWebhookReceipt } from './entities/invoice-ledger-webhook-receipt.entity.js';
7
+ export declare function registerModule(ctx: ModuleContext): void;
8
+ export declare const entities: (typeof InvoiceLedgerClientMap | typeof InvoiceLedgerDelivery | typeof InvoiceLedgerDocumentMap | typeof InvoiceLedgerActivationLock | typeof InvoiceLedgerWebhookReceipt)[];
9
+ export { InvoiceLedgerRegistryService } from './services/invoice-ledger-registry.service.js';
10
+ export { InvoiceLedgerRoutingService } from './services/invoice-ledger-routing.service.js';
11
+ export { InvoiceLedgerDeliveryService } from './services/invoice-ledger-delivery.service.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAyC,MAAM,kCAAkC,CAAC;AAK7G,OAAO,EAAE,2BAA2B,EAAE,MAAM,qDAAqD,CAAC;AAClG,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AAC5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,qDAAqD,CAAC;AAgFlG,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAiNvD;AAED,eAAO,MAAM,QAAQ,8KAMpB,CAAC;AAEF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC"}
@@ -0,0 +1,230 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { CAPABILITY_KEYS, INVOICE_LEDGER_DELIVERY_QUEUED_EVENT, INVOICE_LEDGER_VENDOR_KSEF_ABSENT_MESSAGE, invoiceCorrectedEventSchema, invoiceIssuedEventSchema, } from '@endora-commerce/contracts';
3
+ import { effectiveState, lazyPort } from '@endora-commerce/platform/kernel';
4
+ import { registerInvoiceLedgerAdminRoutes } from './routes.admin.js';
5
+ import { InvoiceLedgerDeliveryAdminService } from './services/invoice-ledger-delivery-admin.service.js';
6
+ import { InvoiceLedgerRoutingWriteService } from './services/invoice-ledger-routing-write.service.js';
7
+ import { InvoiceLedgerActivationLock } from './entities/invoice-ledger-activation-lock.entity.js';
8
+ import { InvoiceLedgerClientMap } from './entities/invoice-ledger-client-map.entity.js';
9
+ import { InvoiceLedgerDelivery } from './entities/invoice-ledger-delivery.entity.js';
10
+ import { InvoiceLedgerDocumentMap } from './entities/invoice-ledger-document-map.entity.js';
11
+ import { InvoiceLedgerWebhookReceipt } from './entities/invoice-ledger-webhook-receipt.entity.js';
12
+ import { InvoiceLedgerDeliveryService } from './services/invoice-ledger-delivery.service.js';
13
+ import { InvoiceLedgerVendorFreezeRegistry } from './services/invoice-ledger-vendor-freeze-registry.js';
14
+ import { declaredLedgerVendorModules, defaultInvoiceLedgerPresence, InvoiceLedgerRegistryService, } from './services/invoice-ledger-registry.service.js';
15
+ import { InvoiceLedgerRoutingService } from './services/invoice-ledger-routing.service.js';
16
+ import { InvoiceLedgerWebhookService } from './services/invoice-ledger-webhook.service.js';
17
+ /**
18
+ * Feature 132 (T026) — the vendor family, derived, read at the moment it is asked.
19
+ *
20
+ * This was a module-level `Set` built from `INVOICE_LEDGER_MODULES` at import
21
+ * time. Both halves of that were wrong once the family became a declaration: the
22
+ * population came from a hand-written array a vendor outside this repository
23
+ * cannot edit, and the `Set` was frozen at import, while the derived family is
24
+ * re-installed by every `b2b:module:state-changed` refresh.
25
+ *
26
+ * **Declared** membership, not effective: this answers "is the module this event
27
+ * names one of mine", and on a *deactivation* the vendor is already absent — an
28
+ * effective-presence test would drop exactly the event that has to clear the lock.
29
+ */
30
+ /**
31
+ * The adapter a **dead-lettered** delivery is attributed to when no vendor is
32
+ * active at all and KSeF routing is `vendor` — the row shape requires an
33
+ * `adapterId` and there is, by construction, no adapter.
34
+ *
35
+ * It was `INVOICE_LEDGER_MODULES[0].id`, i.e. "whichever vendor happened to be
36
+ * first in a hand-written array", and deleting the array forces the placeholder to
37
+ * be named rather than inherited. This keeps today's semantics exactly — the first
38
+ * **declared** member of the family, which is the same module in this tree — and
39
+ * falls back to this module's own id when the deployment ships no vendor at all, a
40
+ * state the array could not represent. Attributing a no-vendor failure to an
41
+ * arbitrary vendor is a wart either way; it is recorded here rather than moved, and
42
+ * `specs/132-connector-family-discovery/tasks.md` T028 carries it for the owner.
43
+ */
44
+ function deadLetterAdapterId() {
45
+ return declaredLedgerVendorModules()[0]?.id ?? 'invoice_ledger';
46
+ }
47
+ function isLedgerVendor(moduleId) {
48
+ return effectiveState
49
+ .declaredMembersOfCapability(CAPABILITY_KEYS.INVOICE_LEDGER_VENDOR)
50
+ .includes(moduleId);
51
+ }
52
+ export function registerModule(ctx) {
53
+ ctx.di.register({
54
+ invoiceLedgerPresence: ctx.asValue(defaultInvoiceLedgerPresence),
55
+ // Feature 132 (T026) — the seam that was already open, now supplied by the
56
+ // derivation instead of by an imported array. A **function**, so a refresh that
57
+ // adds or removes a member is answered rather than out-lived; the harness still
58
+ // overrides this name with an explicit list to add a sibling it does not ship.
59
+ invoiceLedgerVendorModules: ctx.asValue(declaredLedgerVendorModules),
60
+ invoiceLedgerVendorFreezeRegistry: ctx
61
+ .asFunction(() => new InvoiceLedgerVendorFreezeRegistry())
62
+ .singleton(),
63
+ });
64
+ ctx.di.providePort('invoiceLedgerRegistryPort', ctx
65
+ .asFunction(({ emFactory, invoiceLedgerPresence, invoiceLedgerVendorModules }) => new InvoiceLedgerRegistryService(emFactory, invoiceLedgerPresence, invoiceLedgerVendorModules))
66
+ .singleton());
67
+ ctx.di.providePort('invoiceLedgerRoutingPort', ctx
68
+ .asFunction(() => {
69
+ const settings = lazyPort(ctx, 'settingsReadPort');
70
+ const registry = lazyPort(ctx, 'invoiceLedgerRegistryPort');
71
+ return new InvoiceLedgerRoutingService(settings, registry);
72
+ })
73
+ .singleton());
74
+ ctx.di.register({
75
+ invoiceLedgerDeliveryService: ctx
76
+ .asFunction(({ emFactory }) => new InvoiceLedgerDeliveryService(emFactory))
77
+ .singleton(),
78
+ });
79
+ ctx.di.providePort('invoiceLedgerDeliveryPort', ctx
80
+ .asFunction(({ invoiceLedgerDeliveryService }) => invoiceLedgerDeliveryService)
81
+ .singleton());
82
+ ctx.di.providePort('invoiceLedgerWebhookPort', ctx
83
+ .asFunction(({ emFactory }) => {
84
+ const deliveries = lazyPort(ctx, 'invoiceLedgerDeliveryPort');
85
+ return new InvoiceLedgerWebhookService({
86
+ emFactory,
87
+ deliveries,
88
+ numbering: lazyPort(ctx, 'invoiceNumberingHostPort'),
89
+ paid: lazyPort(ctx, 'invoicePaidHostPort'),
90
+ ksefAssignment: lazyPort(ctx, 'invoiceKsefAssignmentPort'),
91
+ });
92
+ })
93
+ .singleton());
94
+ ctx.di.register({
95
+ invoiceLedgerRoutingWrite: ctx
96
+ .asFunction(({ emFactory, commandBus }) => {
97
+ const settings = lazyPort(ctx, 'settingsReadPort');
98
+ const registry = lazyPort(ctx, 'invoiceLedgerRegistryPort');
99
+ const routing = new InvoiceLedgerRoutingService(settings, registry);
100
+ return new InvoiceLedgerRoutingWriteService(routing, lazyPort(ctx, 'settingsAdminService'), emFactory, commandBus);
101
+ })
102
+ .singleton(),
103
+ invoiceLedgerDeliveryAdmin: ctx
104
+ .asFunction(({ invoiceLedgerDeliveryService, commandBus, eventBus }) => {
105
+ return new InvoiceLedgerDeliveryAdminService(invoiceLedgerDeliveryService, lazyPort(ctx, 'invoiceCopyHostPort'), commandBus, eventBus);
106
+ })
107
+ .singleton(),
108
+ });
109
+ async function enqueueFromInvoiceEvent(input) {
110
+ // The buyer organization, first and outside every other read: it is the
111
+ // delivery row's own tenant key since the two ledger tables stopped hanging
112
+ // off `Invoice` (`invoice-ledger-delivery.entity.ts` has the reasoning),
113
+ // and a row cannot be written without one — Principle XI has no
114
+ // "no organization" path. The copy port is the only way this module learns
115
+ // anything about an invoice, and it is the same `invoiceCopyHostPort` the
116
+ // delivery list already reads. It returning nothing is a state with nothing
117
+ // to enqueue rather than a refusal to report: either `invoices` is absent,
118
+ // in which case it emitted no event and this function was not reached, or
119
+ // the invoice this event names is gone, and a work item for an invoice that
120
+ // is not there has nothing to deliver.
121
+ const copies = lazyPort(ctx, 'invoiceCopyHostPort');
122
+ const copy = await copies.getById(input.invoiceId);
123
+ if (copy === null)
124
+ return;
125
+ const organizationId = copy.organizationId;
126
+ const routing = lazyPort(ctx, 'invoiceLedgerRoutingPort');
127
+ const channelId = input.salesChannelId;
128
+ const numberingMode = await routing.numberingModeFor(channelId);
129
+ const ksefAction = await routing.nativeKsefActionFor(channelId);
130
+ const ksefRouting = ksefAction === 'skip' ? 'vendor' : 'native';
131
+ const adapterId = await routing.activeVendorModuleId();
132
+ const deliveries = lazyPort(ctx, 'invoiceLedgerDeliveryPort');
133
+ if (!adapterId) {
134
+ if (ksefRouting === 'vendor') {
135
+ await deliveries.enqueueClosed({
136
+ adapterId: deadLetterAdapterId(),
137
+ invoiceId: input.invoiceId,
138
+ organizationId,
139
+ kind: input.kind,
140
+ salesChannelId: channelId,
141
+ credentialCode: deadLetterAdapterId(),
142
+ environment: 'sandbox',
143
+ numberingMode,
144
+ ksefRouting,
145
+ ksefDelegated: true,
146
+ }, INVOICE_LEDGER_VENDOR_KSEF_ABSENT_MESSAGE, { dead: true });
147
+ }
148
+ return;
149
+ }
150
+ const freeze = ctx.cradle().invoiceLedgerVendorFreezeRegistry;
151
+ const frozen = (await freeze.resolve(adapterId, channelId)) ?? {
152
+ credentialCode: adapterId,
153
+ environment: 'sandbox',
154
+ };
155
+ const { credentialCode, environment } = frozen;
156
+ const row = await deliveries.enqueue({
157
+ adapterId,
158
+ invoiceId: input.invoiceId,
159
+ organizationId,
160
+ kind: input.kind,
161
+ salesChannelId: channelId,
162
+ credentialCode,
163
+ environment,
164
+ numberingMode,
165
+ ksefRouting,
166
+ ksefDelegated: ksefRouting === 'vendor',
167
+ });
168
+ ctx.cradle().eventBus.emit(INVOICE_LEDGER_DELIVERY_QUEUED_EVENT, {
169
+ eventId: randomUUID(),
170
+ occurredAt: new Date().toISOString(),
171
+ deliveryId: row.id,
172
+ adapterId,
173
+ });
174
+ }
175
+ ctx.subscribe('invoice.issued.v1', async (payload) => {
176
+ const parsed = invoiceIssuedEventSchema.safeParse(payload);
177
+ if (!parsed.success)
178
+ return;
179
+ if (parsed.data.kind === 'proforma')
180
+ return;
181
+ await enqueueFromInvoiceEvent({
182
+ invoiceId: parsed.data.invoiceId,
183
+ kind: 'invoice',
184
+ salesChannelId: parsed.data.salesChannelId,
185
+ });
186
+ });
187
+ ctx.subscribe('invoice.corrected.v1', async (payload) => {
188
+ const parsed = invoiceCorrectedEventSchema.safeParse(payload);
189
+ if (!parsed.success)
190
+ return;
191
+ await enqueueFromInvoiceEvent({
192
+ invoiceId: parsed.data.invoiceId,
193
+ kind: 'correction',
194
+ salesChannelId: parsed.data.salesChannelId,
195
+ });
196
+ });
197
+ ctx.subscribe('module.activation.changed', async (payload) => {
198
+ const event = payload;
199
+ if (typeof event.moduleId !== 'string' || typeof event.active !== 'boolean')
200
+ return;
201
+ if (!isLedgerVendor(event.moduleId))
202
+ return;
203
+ const registry = lazyPort(ctx, 'invoiceLedgerRegistryPort');
204
+ if (event.active) {
205
+ await registry.recordActive(event.moduleId, null);
206
+ }
207
+ else {
208
+ await registry.clearActive(event.moduleId);
209
+ }
210
+ });
211
+ ctx.routes(async (app) => {
212
+ const { requireAdmin, invoiceLedgerRoutingWrite, invoiceLedgerDeliveryAdmin } = ctx.cradle();
213
+ await registerInvoiceLedgerAdminRoutes(app, {
214
+ requireAdmin,
215
+ routingWrite: invoiceLedgerRoutingWrite,
216
+ deliveries: invoiceLedgerDeliveryAdmin,
217
+ });
218
+ });
219
+ }
220
+ export const entities = [
221
+ InvoiceLedgerActivationLock,
222
+ InvoiceLedgerClientMap,
223
+ InvoiceLedgerDocumentMap,
224
+ InvoiceLedgerDelivery,
225
+ InvoiceLedgerWebhookReceipt,
226
+ ];
227
+ export { InvoiceLedgerRegistryService } from './services/invoice-ledger-registry.service.js';
228
+ export { InvoiceLedgerRoutingService } from './services/invoice-ledger-routing.service.js';
229
+ export { InvoiceLedgerDeliveryService } from './services/invoice-ledger-delivery.service.js';
230
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type { RequireAdminFactory } from '@endora-commerce/platform/kernel';
3
+ import type { InvoiceLedgerDeliveryAdminService } from './services/invoice-ledger-delivery-admin.service.js';
4
+ import type { InvoiceLedgerRoutingWriteService } from './services/invoice-ledger-routing-write.service.js';
5
+ export interface InvoiceLedgerAdminRoutesDeps {
6
+ requireAdmin: RequireAdminFactory;
7
+ routingWrite: InvoiceLedgerRoutingWriteService;
8
+ deliveries: InvoiceLedgerDeliveryAdminService;
9
+ }
10
+ export declare function registerInvoiceLedgerAdminRoutes(app: FastifyInstance, deps: InvoiceLedgerAdminRoutesDeps): Promise<void>;
11
+ //# sourceMappingURL=routes.admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.admin.d.ts","sourceRoot":"","sources":["../../src/backend/routes.admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAU/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,qDAAqD,CAAC;AAC7G,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,oDAAoD,CAAC;AAE3G,MAAM,WAAW,4BAA4B;IAC3C,YAAY,EAAE,mBAAmB,CAAC;IAClC,YAAY,EAAE,gCAAgC,CAAC;IAC/C,UAAU,EAAE,iCAAiC,CAAC;CAC/C;AAcD,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -0,0 +1,36 @@
1
+ import { ERROR_CODES, INVOICE_LEDGER_READ_PERMISSION, INVOICE_LEDGER_WRITE_PERMISSION, invoiceLedgerDeliveryListQuerySchema, invoiceLedgerRoutingWriteBodySchema, } from '@endora-commerce/contracts';
2
+ import { HttpError } from '@endora-commerce/platform/http';
3
+ function parseOrThrow(schema, value) {
4
+ const parsed = schema.safeParse(value);
5
+ if (!parsed.success) {
6
+ const issue = parsed.error.issues[0];
7
+ const path = issue?.path.map(String).join('.') || 'body';
8
+ throw new HttpError(400, ERROR_CODES.VALIDATION_FAILED, `${path}: ${issue?.message ?? 'invalid'}`, {
9
+ field: path,
10
+ });
11
+ }
12
+ return parsed.data;
13
+ }
14
+ export async function registerInvoiceLedgerAdminRoutes(app, deps) {
15
+ const read = { preHandler: deps.requireAdmin(INVOICE_LEDGER_READ_PERMISSION) };
16
+ const write = { preHandler: deps.requireAdmin(INVOICE_LEDGER_WRITE_PERMISSION) };
17
+ app.get('/api/v1/admin/invoice-ledger/routing', read, async (_request, reply) => {
18
+ return reply.send({ data: await deps.routingWrite.view() });
19
+ });
20
+ app.put('/api/v1/admin/invoice-ledger/routing', write, async (request, reply) => {
21
+ const body = parseOrThrow(invoiceLedgerRoutingWriteBodySchema, request.body ?? {});
22
+ return reply.send({ data: await deps.routingWrite.write(body) });
23
+ });
24
+ app.get('/api/v1/admin/invoice-ledger/deliveries', read, async (request, reply) => {
25
+ const query = parseOrThrow(invoiceLedgerDeliveryListQuerySchema, request.query ?? {});
26
+ return reply.send(await deps.deliveries.list(query));
27
+ });
28
+ app.post('/api/v1/admin/invoice-ledger/deliveries/:id/retry', write, async (request, reply) => {
29
+ const id = request.params.id;
30
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(id)) {
31
+ throw new HttpError(404, ERROR_CODES.NOT_FOUND, 'Delivery not found.');
32
+ }
33
+ return reply.send({ data: await deps.deliveries.retry(id) });
34
+ });
35
+ }
36
+ //# sourceMappingURL=routes.admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.admin.js","sourceRoot":"","sources":["../../src/backend/routes.admin.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,8BAA8B,EAC9B,+BAA+B,EAC/B,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAW3D,SAAS,YAAY,CAAI,MAAoB,EAAE,KAAc;IAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC;QACzD,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,iBAAiB,EAAE,GAAG,IAAI,KAAK,KAAK,EAAE,OAAO,IAAI,SAAS,EAAE,EAAE;YACjG,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,GAAoB,EACpB,IAAkC;IAElC,MAAM,IAAI,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,8BAA8B,CAAC,EAAE,CAAC;IAC/E,MAAM,KAAK,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,+BAA+B,CAAC,EAAE,CAAC;IAEjF,GAAG,CAAC,GAAG,CAAC,sCAAsC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,sCAAsC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9E,MAAM,IAAI,GAAG,YAAY,CAAC,mCAAmC,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,yCAAyC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAChF,MAAM,KAAK,GAAG,YAAY,CAAC,oCAAoC,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACtF,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CACN,mDAAmD,EACnD,KAAK,EACL,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,4EAA4E,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3F,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { INVOICE_LEDGER_DELIVERY_QUEUED_EVENT, type InvoiceCopyHostPort, type InvoiceLedgerDeliveryListItem, type InvoiceLedgerDeliveryListQuery, type InvoiceLedgerDeliveryQueuedEvent, type LedgerDeliveryRecord } from '@endora-commerce/contracts';
2
+ import type { CommandBus } from '@endora-commerce/platform/commands';
3
+ import type { EventBase, EventBus } from '@endora-commerce/platform/events';
4
+ import type { InvoiceLedgerDeliveryService } from './invoice-ledger-delivery.service.js';
5
+ type LedgerEvents = Record<string, EventBase> & {
6
+ [INVOICE_LEDGER_DELIVERY_QUEUED_EVENT]: InvoiceLedgerDeliveryQueuedEvent;
7
+ };
8
+ export declare class InvoiceLedgerDeliveryAdminService {
9
+ private readonly deliveries;
10
+ private readonly invoiceCopy;
11
+ private readonly commandBus;
12
+ private readonly eventBus;
13
+ constructor(deliveries: InvoiceLedgerDeliveryService, invoiceCopy: InvoiceCopyHostPort, commandBus: CommandBus, eventBus: EventBus<LedgerEvents>);
14
+ list(query: InvoiceLedgerDeliveryListQuery): Promise<{
15
+ data: InvoiceLedgerDeliveryListItem[];
16
+ pagination: {
17
+ cursor: string | null;
18
+ hasMore: boolean;
19
+ limit: number;
20
+ };
21
+ }>;
22
+ retry(id: string): Promise<LedgerDeliveryRecord>;
23
+ /**
24
+ * Delivery is transitively scoped through Invoice → Order. There is no org
25
+ * column on the row, so the ambient `isOrgInScope` check is the list/retry
26
+ * guard — same as invoices' admin list. A missing copy (or invoices off)
27
+ * attributes as `''`, which only an unrestricted admin may see.
28
+ */
29
+ private visibleToActor;
30
+ private loadCopies;
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=invoice-ledger-delivery-admin.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-ledger-delivery-admin.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/invoice-ledger-delivery-admin.service.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,oCAAoC,EACpC,KAAK,mBAAmB,EAExB,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,EACrC,KAAK,oBAAoB,EAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAK5E,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAGzF,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG;IAC9C,CAAC,oCAAoC,CAAC,EAAE,gCAAgC,CAAC;CAC1E,CAAC;AAEF,qBAAa,iCAAiC;IAE1C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAHR,UAAU,EAAE,4BAA4B,EACxC,WAAW,EAAE,mBAAmB,EAChC,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC;IAG7C,IAAI,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC;QACzD,IAAI,EAAE,6BAA6B,EAAE,CAAC;QACtC,UAAU,EAAE;YAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,OAAO,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;KACxE,CAAC;IAiCI,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsCtD;;;;;OAKG;IACH,OAAO,CAAC,cAAc;YAIR,UAAU;CAYzB"}
@@ -0,0 +1,104 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { ERROR_CODES, INVOICE_LEDGER_DELIVERY_QUEUED_EVENT, } from '@endora-commerce/contracts';
3
+ import { HttpError } from '@endora-commerce/platform/http';
4
+ import { effectiveState } from '@endora-commerce/platform/kernel';
5
+ import { isOrgInScope } from '@endora-commerce/platform/tenancy';
6
+ import { makeRetryInvoiceLedgerDeliveryCommand } from '../commands/retry-delivery.command.js';
7
+ import { mappedDeliveryError } from './mapped-delivery-error.js';
8
+ export class InvoiceLedgerDeliveryAdminService {
9
+ deliveries;
10
+ invoiceCopy;
11
+ commandBus;
12
+ eventBus;
13
+ constructor(deliveries, invoiceCopy, commandBus, eventBus) {
14
+ this.deliveries = deliveries;
15
+ this.invoiceCopy = invoiceCopy;
16
+ this.commandBus = commandBus;
17
+ this.eventBus = eventBus;
18
+ }
19
+ async list(query) {
20
+ const limit = query.limit;
21
+ const rows = await this.deliveries.listRows({
22
+ limit,
23
+ ...(query.status ? { status: query.status } : {}),
24
+ ...(query.salesChannelId ? { salesChannelId: query.salesChannelId } : {}),
25
+ ...(query.invoiceId ? { invoiceId: query.invoiceId } : {}),
26
+ ...(query.cursor ? { cursor: query.cursor } : {}),
27
+ });
28
+ const copies = await this.loadCopies(rows.map((row) => row.invoiceId));
29
+ const scoped = rows.filter((row) => this.visibleToActor(copies.get(row.invoiceId)));
30
+ const hasMore = scoped.length > limit;
31
+ const page = scoped.slice(0, limit);
32
+ return {
33
+ data: page.map((row) => ({
34
+ id: row.id,
35
+ invoiceId: row.invoiceId,
36
+ invoiceNumber: copies.get(row.invoiceId)?.number ?? null,
37
+ adapterId: row.adapterId,
38
+ status: row.status,
39
+ lastError: mappedDeliveryError(row.lastError ?? null),
40
+ environment: row.environment,
41
+ remoteDocumentId: row.remoteDocumentId ?? null,
42
+ updatedAt: row.updatedAt.toISOString(),
43
+ })),
44
+ pagination: {
45
+ cursor: hasMore ? (page[page.length - 1]?.id ?? null) : null,
46
+ hasMore,
47
+ limit,
48
+ },
49
+ };
50
+ }
51
+ async retry(id) {
52
+ const before = await this.deliveries.getById(id);
53
+ if (!before) {
54
+ throw new HttpError(404, ERROR_CODES.NOT_FOUND, 'Delivery not found.');
55
+ }
56
+ const copies = await this.loadCopies([before.invoiceId]);
57
+ if (!this.visibleToActor(copies.get(before.invoiceId))) {
58
+ throw new HttpError(404, ERROR_CODES.NOT_FOUND, 'Delivery not found.');
59
+ }
60
+ if (before.status !== 'failed' && before.status !== 'dead') {
61
+ throw new HttpError(409, ERROR_CODES.INVOICE_LEDGER_DELIVERY_NOT_RETRYABLE, 'This delivery cannot be retried.');
62
+ }
63
+ const result = await this.commandBus.run(makeRetryInvoiceLedgerDeliveryCommand({
64
+ deliveryId: id,
65
+ before,
66
+ retry: async () => {
67
+ const queued = await this.deliveries.requeue(id);
68
+ if (!queued) {
69
+ throw new HttpError(404, ERROR_CODES.NOT_FOUND, 'Delivery not found.');
70
+ }
71
+ return queued;
72
+ },
73
+ }));
74
+ this.eventBus.emit(INVOICE_LEDGER_DELIVERY_QUEUED_EVENT, {
75
+ eventId: randomUUID(),
76
+ occurredAt: new Date().toISOString(),
77
+ deliveryId: result.id,
78
+ adapterId: result.adapterId,
79
+ });
80
+ return result;
81
+ }
82
+ /**
83
+ * Delivery is transitively scoped through Invoice → Order. There is no org
84
+ * column on the row, so the ambient `isOrgInScope` check is the list/retry
85
+ * guard — same as invoices' admin list. A missing copy (or invoices off)
86
+ * attributes as `''`, which only an unrestricted admin may see.
87
+ */
88
+ visibleToActor(copy) {
89
+ return isOrgInScope(copy?.organizationId ?? '');
90
+ }
91
+ async loadCopies(invoiceIds) {
92
+ const unique = [...new Set(invoiceIds)];
93
+ const out = new Map();
94
+ if (unique.length === 0 || !effectiveState.isPresent('invoices'))
95
+ return out;
96
+ await Promise.all(unique.map(async (invoiceId) => {
97
+ const copy = await this.invoiceCopy.getById(invoiceId);
98
+ if (copy)
99
+ out.set(invoiceId, copy);
100
+ }));
101
+ return out;
102
+ }
103
+ }
104
+ //# sourceMappingURL=invoice-ledger-delivery-admin.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-ledger-delivery-admin.service.js","sourceRoot":"","sources":["../../../src/backend/services/invoice-ledger-delivery-admin.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import { type InvoiceLedgerClientMapInput, type InvoiceLedgerDeliveryPort, type InvoiceLedgerEnqueueInput, type LedgerDeliveryRecord } from '@endora-commerce/contracts';
3
+ import { InvoiceLedgerDelivery } from '../entities/invoice-ledger-delivery.entity.js';
4
+ export declare class InvoiceLedgerDeliveryService implements InvoiceLedgerDeliveryPort {
5
+ private readonly emFactory;
6
+ constructor(emFactory: () => EntityManager);
7
+ getById(id: string): Promise<LedgerDeliveryRecord | null>;
8
+ findByInvoice(adapterId: string, invoiceId: string): Promise<LedgerDeliveryRecord | null>;
9
+ enqueue(input: InvoiceLedgerEnqueueInput): Promise<LedgerDeliveryRecord>;
10
+ enqueueClosed(input: InvoiceLedgerEnqueueInput, error: string, opts?: {
11
+ dead?: boolean;
12
+ }): Promise<LedgerDeliveryRecord>;
13
+ markAwaitingRemote(id: string, asyncTaskId: string, opts?: {
14
+ remoteDocumentId?: string;
15
+ originalInvoiceId?: string | null;
16
+ remoteVendorNumber?: string | null;
17
+ }): Promise<void>;
18
+ markSucceeded(id: string, remoteDocumentId: string, opts?: {
19
+ originalInvoiceId?: string | null;
20
+ remoteVendorNumber?: string | null;
21
+ }): Promise<void>;
22
+ rememberClient(input: InvoiceLedgerClientMapInput): Promise<void>;
23
+ findClientRemoteId(input: {
24
+ adapterId: string;
25
+ organizationId: string;
26
+ environment: 'sandbox' | 'production';
27
+ credentialCode: string;
28
+ }): Promise<string | null>;
29
+ findDocumentRemoteId(input: {
30
+ adapterId: string;
31
+ invoiceId: string;
32
+ }): Promise<string | null>;
33
+ lookupUniqueMappedInvoice(input: {
34
+ adapterId: string;
35
+ remoteDocumentId: string;
36
+ environment?: 'sandbox' | 'production';
37
+ credentialCode?: string;
38
+ }): Promise<{
39
+ invoiceId: string;
40
+ } | null>;
41
+ recordQueuedWait(id: string, error: string): Promise<void>;
42
+ markRemotePaid(id: string): Promise<void>;
43
+ markFailed(id: string, error: string, opts?: {
44
+ dead?: boolean;
45
+ }): Promise<void>;
46
+ requeue(id: string): Promise<LedgerDeliveryRecord | null>;
47
+ listRows(input: {
48
+ status?: LedgerDeliveryRecord['status'];
49
+ salesChannelId?: string;
50
+ invoiceId?: string;
51
+ limit: number;
52
+ cursor?: string;
53
+ }): Promise<InvoiceLedgerDelivery[]>;
54
+ }
55
+ //# sourceMappingURL=invoice-ledger-delivery.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-ledger-delivery.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/invoice-ledger-delivery.service.ts"],"names":[],"mappings":"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"}