@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.
- package/LICENSE +21 -0
- package/README.md +57 -0
- package/dist/admin/api/ledger-client.d.ts +15 -0
- package/dist/admin/api/ledger-client.d.ts.map +1 -0
- package/dist/admin/api/ledger-client.js +35 -0
- package/dist/admin/api/ledger-client.js.map +1 -0
- package/dist/admin/index.d.ts +11 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +52 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/LedgerDeliveriesPage.d.ts +4 -0
- package/dist/admin/pages/LedgerDeliveriesPage.d.ts.map +1 -0
- package/dist/admin/pages/LedgerDeliveriesPage.js +101 -0
- package/dist/admin/pages/LedgerDeliveriesPage.js.map +1 -0
- package/dist/admin/pages/LedgerRoutingPage.d.ts +4 -0
- package/dist/admin/pages/LedgerRoutingPage.d.ts.map +1 -0
- package/dist/admin/pages/LedgerRoutingPage.js +67 -0
- package/dist/admin/pages/LedgerRoutingPage.js.map +1 -0
- package/dist/admin/pages/merge-delivery-pages.d.ts +3 -0
- package/dist/admin/pages/merge-delivery-pages.d.ts.map +1 -0
- package/dist/admin/pages/merge-delivery-pages.js +5 -0
- package/dist/admin/pages/merge-delivery-pages.js.map +1 -0
- package/dist/admin/zones/InvoiceLedgerRemoteIdPanel.d.ts +11 -0
- package/dist/admin/zones/InvoiceLedgerRemoteIdPanel.d.ts.map +1 -0
- package/dist/admin/zones/InvoiceLedgerRemoteIdPanel.js +36 -0
- package/dist/admin/zones/InvoiceLedgerRemoteIdPanel.js.map +1 -0
- package/dist/admin/zones/LedgerDeliveriesTab.d.ts +10 -0
- package/dist/admin/zones/LedgerDeliveriesTab.d.ts.map +1 -0
- package/dist/admin/zones/LedgerDeliveriesTab.js +15 -0
- package/dist/admin/zones/LedgerDeliveriesTab.js.map +1 -0
- package/dist/admin/zones/LedgerRoutingTab.d.ts +11 -0
- package/dist/admin/zones/LedgerRoutingTab.d.ts.map +1 -0
- package/dist/admin/zones/LedgerRoutingTab.js +16 -0
- package/dist/admin/zones/LedgerRoutingTab.js.map +1 -0
- package/dist/backend/commands/retry-delivery.command.d.ts +8 -0
- package/dist/backend/commands/retry-delivery.command.d.ts.map +1 -0
- package/dist/backend/commands/retry-delivery.command.js +26 -0
- package/dist/backend/commands/retry-delivery.command.js.map +1 -0
- package/dist/backend/commands/routing.commands.d.ts +7 -0
- package/dist/backend/commands/routing.commands.d.ts.map +1 -0
- package/dist/backend/commands/routing.commands.js +13 -0
- package/dist/backend/commands/routing.commands.js.map +1 -0
- package/dist/backend/entities/invoice-ledger-activation-lock.entity.d.ts +15 -0
- package/dist/backend/entities/invoice-ledger-activation-lock.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice-ledger-activation-lock.entity.js +46 -0
- package/dist/backend/entities/invoice-ledger-activation-lock.entity.js.map +1 -0
- package/dist/backend/entities/invoice-ledger-client-map.entity.d.ts +18 -0
- package/dist/backend/entities/invoice-ledger-client-map.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice-ledger-client-map.entity.js +72 -0
- package/dist/backend/entities/invoice-ledger-client-map.entity.js.map +1 -0
- package/dist/backend/entities/invoice-ledger-delivery.entity.d.ts +65 -0
- package/dist/backend/entities/invoice-ledger-delivery.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice-ledger-delivery.entity.js +168 -0
- package/dist/backend/entities/invoice-ledger-delivery.entity.js.map +1 -0
- package/dist/backend/entities/invoice-ledger-document-map.entity.d.ts +25 -0
- package/dist/backend/entities/invoice-ledger-document-map.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice-ledger-document-map.entity.js +80 -0
- package/dist/backend/entities/invoice-ledger-document-map.entity.js.map +1 -0
- package/dist/backend/entities/invoice-ledger-webhook-receipt.entity.d.ts +18 -0
- package/dist/backend/entities/invoice-ledger-webhook-receipt.entity.d.ts.map +1 -0
- package/dist/backend/entities/invoice-ledger-webhook-receipt.entity.js +71 -0
- package/dist/backend/entities/invoice-ledger-webhook-receipt.entity.js.map +1 -0
- package/dist/backend/index.d.ts +12 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +230 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +11 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +36 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/services/invoice-ledger-delivery-admin.service.d.ts +33 -0
- package/dist/backend/services/invoice-ledger-delivery-admin.service.d.ts.map +1 -0
- package/dist/backend/services/invoice-ledger-delivery-admin.service.js +104 -0
- package/dist/backend/services/invoice-ledger-delivery-admin.service.js.map +1 -0
- package/dist/backend/services/invoice-ledger-delivery.service.d.ts +55 -0
- package/dist/backend/services/invoice-ledger-delivery.service.d.ts.map +1 -0
- package/dist/backend/services/invoice-ledger-delivery.service.js +322 -0
- package/dist/backend/services/invoice-ledger-delivery.service.js.map +1 -0
- package/dist/backend/services/invoice-ledger-registry.service.d.ts +64 -0
- package/dist/backend/services/invoice-ledger-registry.service.d.ts.map +1 -0
- package/dist/backend/services/invoice-ledger-registry.service.js +119 -0
- package/dist/backend/services/invoice-ledger-registry.service.js.map +1 -0
- package/dist/backend/services/invoice-ledger-routing-write.service.d.ts +15 -0
- package/dist/backend/services/invoice-ledger-routing-write.service.d.ts.map +1 -0
- package/dist/backend/services/invoice-ledger-routing-write.service.js +85 -0
- package/dist/backend/services/invoice-ledger-routing-write.service.js.map +1 -0
- package/dist/backend/services/invoice-ledger-routing.service.d.ts +11 -0
- package/dist/backend/services/invoice-ledger-routing.service.d.ts.map +1 -0
- package/dist/backend/services/invoice-ledger-routing.service.js +20 -0
- package/dist/backend/services/invoice-ledger-routing.service.js.map +1 -0
- package/dist/backend/services/invoice-ledger-vendor-freeze-registry.d.ts +9 -0
- package/dist/backend/services/invoice-ledger-vendor-freeze-registry.d.ts.map +1 -0
- package/dist/backend/services/invoice-ledger-vendor-freeze-registry.js +13 -0
- package/dist/backend/services/invoice-ledger-vendor-freeze-registry.js.map +1 -0
- package/dist/backend/services/invoice-ledger-webhook.service.d.ts +30 -0
- package/dist/backend/services/invoice-ledger-webhook.service.d.ts.map +1 -0
- package/dist/backend/services/invoice-ledger-webhook.service.js +170 -0
- package/dist/backend/services/invoice-ledger-webhook.service.js.map +1 -0
- package/dist/backend/services/mapped-delivery-error.d.ts +25 -0
- package/dist/backend/services/mapped-delivery-error.d.ts.map +1 -0
- package/dist/backend/services/mapped-delivery-error.js +54 -0
- package/dist/backend/services/mapped-delivery-error.js.map +1 -0
- package/dist/manifest.d.ts +183 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +112 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260908T125013_invoice_ledger_init.d.ts +12 -0
- package/dist/migrations/20260908T125013_invoice_ledger_init.d.ts.map +1 -0
- package/dist/migrations/20260908T125013_invoice_ledger_init.js +167 -0
- package/dist/migrations/20260908T125013_invoice_ledger_init.js.map +1 -0
- package/dist/migrations/20260914T140000_invoice_ledger_row_organization.d.ts +64 -0
- package/dist/migrations/20260914T140000_invoice_ledger_row_organization.d.ts.map +1 -0
- package/dist/migrations/20260914T140000_invoice_ledger_row_organization.js +126 -0
- package/dist/migrations/20260914T140000_invoice_ledger_row_organization.js.map +1 -0
- package/dist/migrations/index.d.ts +13 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +16 -0
- package/dist/migrations/index.js.map +1 -0
- package/docs/invoice-ledger.md +22 -0
- package/i18n/en.json +50 -0
- package/i18n/pl.json +50 -0
- package/package.json +89 -0
- 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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EACL,eAAe,EACf,oCAAoC,EACpC,yCAAyC,EACzC,2BAA2B,EAC3B,wBAAwB,GAYzB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,iCAAiC,EAAE,MAAM,qDAAqD,CAAC;AACxG,OAAO,EAAE,gCAAgC,EAAE,MAAM,oDAAoD,CAAC;AACtG,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;AAClG,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,iCAAiC,EAAE,MAAM,qDAAqD,CAAC;AACxG,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,GAE7B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAiC3F;;;;;;;;;;;;GAYG;AACH;;;;;;;;;;;;;GAaG;AACH,SAAS,mBAAmB;IAC1B,OAAO,2BAA2B,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,gBAAgB,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,cAAc;SAClB,2BAA2B,CAAC,eAAe,CAAC,qBAAqB,CAAC;SAClE,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAkB;IAC/C,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC;QACd,qBAAqB,EAAE,GAAG,CAAC,OAAO,CAAC,4BAA4B,CAAC;QAChE,2EAA2E;QAC3E,gFAAgF;QAChF,gFAAgF;QAChF,+EAA+E;QAC/E,0BAA0B,EAAE,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC;QACpE,iCAAiC,EAAE,GAAG;aACnC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,iCAAiC,EAAE,CAAC;aACzD,SAAS,EAAE;KACf,CAAC,CAAC;IACH,GAAG,CAAC,EAAE,CAAC,WAAW,CAChB,2BAA2B,EAC3B,GAAG;SACA,UAAU,CACT,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,0BAA0B,EAAgB,EAAE,EAAE,CACjF,IAAI,4BAA4B,CAC9B,SAAS,EACT,qBAAqB,EACrB,0BAA0B,CAC3B,CACJ;SACA,SAAS,EAAE,CACf,CAAC;IAEF,GAAG,CAAC,EAAE,CAAC,WAAW,CAChB,0BAA0B,EAC1B,GAAG;SACA,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,QAAQ,GAAG,QAAQ,CAAmB,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,QAAQ,CAA4B,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACvF,OAAO,IAAI,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC,CAAC;SACD,SAAS,EAAE,CACf,CAAC;IAEF,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC;QACd,4BAA4B,EAAE,GAAG;aAC9B,UAAU,CAAC,CAAC,EAAE,SAAS,EAAgB,EAAE,EAAE,CAAC,IAAI,4BAA4B,CAAC,SAAS,CAAC,CAAC;aACxF,SAAS,EAAE;KACf,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,WAAW,CAChB,2BAA2B,EAC3B,GAAG;SACA,UAAU,CAAC,CAAC,EAAE,4BAA4B,EAAgB,EAAE,EAAE,CAAC,4BAA4B,CAAC;SAC5F,SAAS,EAAE,CACf,CAAC;IAEF,GAAG,CAAC,EAAE,CAAC,WAAW,CAChB,0BAA0B,EAC1B,GAAG;SACA,UAAU,CAAC,CAAC,EAAE,SAAS,EAAgB,EAAE,EAAE;QAC1C,MAAM,UAAU,GAAG,QAAQ,CAA4B,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACzF,OAAO,IAAI,2BAA2B,CAAC;YACrC,SAAS;YACT,UAAU;YACV,SAAS,EAAE,QAAQ,CAA2B,GAAG,EAAE,0BAA0B,CAAC;YAC9E,IAAI,EAAE,QAAQ,CAAsB,GAAG,EAAE,qBAAqB,CAAC;YAC/D,cAAc,EAAE,QAAQ,CAA4B,GAAG,EAAE,2BAA2B,CAAC;SACtF,CAAC,CAAC;IACL,CAAC,CAAC;SACD,SAAS,EAAE,CACf,CAAC;IAEF,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC;QACd,yBAAyB,EAAE,GAAG;aAC3B,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAgB,EAAE,EAAE;YACtD,MAAM,QAAQ,GAAG,QAAQ,CAAmB,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,QAAQ,CAA4B,GAAG,EAAE,2BAA2B,CAAC,CAAC;YACvF,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACpE,OAAO,IAAI,gCAAgC,CACzC,OAAO,EACP,QAAQ,CAAoB,GAAG,EAAE,sBAAsB,CAAC,EACxD,SAAS,EACT,UAAU,CACX,CAAC;QACJ,CAAC,CAAC;aACD,SAAS,EAAE;QACd,0BAA0B,EAAE,GAAG;aAC5B,UAAU,CAAC,CAAC,EAAE,4BAA4B,EAAE,UAAU,EAAE,QAAQ,EAAgB,EAAE,EAAE;YACnF,OAAO,IAAI,iCAAiC,CAC1C,4BAA4B,EAC5B,QAAQ,CAAsB,GAAG,EAAE,qBAAqB,CAAC,EACzD,UAAU,EACV,QAAQ,CACT,CAAC;QACJ,CAAC,CAAC;aACD,SAAS,EAAE;KACf,CAAC,CAAC;IAEH,KAAK,UAAU,uBAAuB,CAAC,KAItC;QACC,wEAAwE;QACxE,4EAA4E;QAC5E,yEAAyE;QACzE,gEAAgE;QAChE,2EAA2E;QAC3E,0EAA0E;QAC1E,4EAA4E;QAC5E,2EAA2E;QAC3E,0EAA0E;QAC1E,4EAA4E;QAC5E,uCAAuC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAsB,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAA2B,GAAG,EAAE,0BAA0B,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC;QACvC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAChE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,QAAQ,CAA4B,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACzF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,UAAU,CAAC,aAAa,CAC5B;oBACE,SAAS,EAAE,mBAAmB,EAAE;oBAChC,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,cAAc;oBACd,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,cAAc,EAAE,SAAS;oBACzB,cAAc,EAAE,mBAAmB,EAAE;oBACrC,WAAW,EAAE,SAAS;oBACtB,aAAa;oBACb,WAAW;oBACX,aAAa,EAAE,IAAI;iBACpB,EACD,yCAAyC,EACzC,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAgB,CAAC,iCAAiC,CAAC;QAC5E,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI;YAC7D,cAAc,EAAE,SAAS;YACzB,WAAW,EAAE,SAAkB;SAChC,CAAC;QACF,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAE/C,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YACnC,SAAS;YACT,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,cAAc;YACd,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,cAAc,EAAE,SAAS;YACzB,cAAc;YACd,WAAW;YACX,aAAa;YACb,WAAW;YACX,aAAa,EAAE,WAAW,KAAK,QAAQ;SACxC,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,EAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,oCAAoC,EAAE;YAC7E,OAAO,EAAE,UAAU,EAAE;YACrB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,UAAU,EAAE,GAAG,CAAC,EAAE;YAClB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACnD,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO;QAC5C,MAAM,uBAAuB,CAAC;YAC5B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;YAChC,IAAI,EAAE,SAAS;YACf,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc;SAC3C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,2BAA2B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAC5B,MAAM,uBAAuB,CAAC;YAC5B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;YAChC,IAAI,EAAE,YAAY;YAClB,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc;SAC3C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,SAAS,CAAC,2BAA2B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC3D,MAAM,KAAK,GAAG,OAAyC,CAAC;QACxD,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACpF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC5C,MAAM,QAAQ,GAAG,QAAQ,CAA4B,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACvF,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACvB,MAAM,EAAE,YAAY,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,GAC3E,GAAG,CAAC,MAAM,EAAgB,CAAC;QAC7B,MAAM,gCAAgC,CAAC,GAAG,EAAE;YAC1C,YAAY;YACZ,YAAY,EAAE,yBAAyB;YACvC,UAAU,EAAE,0BAA0B;SACvC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,2BAA2B;IAC3B,sBAAsB;IACtB,wBAAwB;IACxB,qBAAqB;IACrB,2BAA2B;CAC5B,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,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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"}
|