@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,322 @@
1
+ import {} from '@endora-commerce/contracts';
2
+ import { InvoiceLedgerClientMap } from '../entities/invoice-ledger-client-map.entity.js';
3
+ import { InvoiceLedgerDelivery } from '../entities/invoice-ledger-delivery.entity.js';
4
+ import { InvoiceLedgerDocumentMap } from '../entities/invoice-ledger-document-map.entity.js';
5
+ import { mappedDeliveryError } from './mapped-delivery-error.js';
6
+ function remoteVendorNumberFromAttempts(attempts) {
7
+ for (let i = attempts.length - 1; i >= 0; i -= 1) {
8
+ const attempt = attempts[i];
9
+ if (attempt?.status === 'succeeded' && attempt.remoteVendorNumber) {
10
+ return attempt.remoteVendorNumber;
11
+ }
12
+ }
13
+ return null;
14
+ }
15
+ function toRecord(row) {
16
+ return {
17
+ id: row.id,
18
+ adapterId: row.adapterId,
19
+ invoiceId: row.invoiceId,
20
+ kind: row.kind,
21
+ salesChannelId: row.salesChannelId ?? null,
22
+ credentialCode: row.credentialCode,
23
+ environment: row.environment,
24
+ numberingMode: row.numberingMode,
25
+ ksefRouting: row.ksefRouting,
26
+ status: row.status,
27
+ asyncTaskId: row.asyncTaskId ?? null,
28
+ remoteDocumentId: row.remoteDocumentId ?? null,
29
+ idempotencyKey: row.idempotencyKey,
30
+ attemptCount: row.attemptCount,
31
+ attempts: row.attempts,
32
+ lastError: mappedDeliveryError(row.lastError ?? null),
33
+ remotePaidAt: row.remotePaidAt ? row.remotePaidAt.toISOString() : null,
34
+ remoteVendorNumber: remoteVendorNumberFromAttempts(row.attempts),
35
+ ksefDelegated: row.ksefDelegated,
36
+ createdAt: row.createdAt.toISOString(),
37
+ updatedAt: row.updatedAt.toISOString(),
38
+ };
39
+ }
40
+ function appendAttempt(row, status, error, opts) {
41
+ const attempt = {
42
+ status,
43
+ at: new Date().toISOString(),
44
+ error,
45
+ ...(opts?.remoteVendorNumber
46
+ ? { remoteVendorNumber: opts.remoteVendorNumber }
47
+ : {}),
48
+ };
49
+ row.attempts = [...row.attempts, attempt];
50
+ row.attemptCount = row.attempts.length;
51
+ row.lastError = mappedDeliveryError(error);
52
+ }
53
+ export class InvoiceLedgerDeliveryService {
54
+ emFactory;
55
+ constructor(emFactory) {
56
+ this.emFactory = emFactory;
57
+ }
58
+ async getById(id) {
59
+ const row = await this.emFactory().findOne(InvoiceLedgerDelivery, { id });
60
+ return row ? toRecord(row) : null;
61
+ }
62
+ async findByInvoice(adapterId, invoiceId) {
63
+ const row = await this.emFactory().findOne(InvoiceLedgerDelivery, { adapterId, invoiceId });
64
+ return row ? toRecord(row) : null;
65
+ }
66
+ async enqueue(input) {
67
+ // command-coverage-ignore: ledger delivery queue stamp — the row is the
68
+ // worker's job token; connection / routing / retry stay on CommandBus.
69
+ const em = this.emFactory();
70
+ const existing = await em.findOne(InvoiceLedgerDelivery, {
71
+ adapterId: input.adapterId,
72
+ invoiceId: input.invoiceId,
73
+ });
74
+ if (existing)
75
+ return toRecord(existing);
76
+ const row = em.create(InvoiceLedgerDelivery, {
77
+ adapterId: input.adapterId,
78
+ invoiceId: input.invoiceId,
79
+ organizationId: input.organizationId,
80
+ kind: input.kind,
81
+ salesChannelId: input.salesChannelId,
82
+ credentialCode: input.credentialCode,
83
+ environment: input.environment,
84
+ numberingMode: input.numberingMode,
85
+ ksefRouting: input.ksefRouting,
86
+ ksefDelegated: input.ksefDelegated,
87
+ status: 'queued',
88
+ idempotencyKey: `${input.adapterId}:${input.invoiceId}`,
89
+ });
90
+ await em.flush();
91
+ return toRecord(row);
92
+ }
93
+ async enqueueClosed(input, error, opts) {
94
+ // command-coverage-ignore: ledger delivery queue stamp for a copy that
95
+ // never leaves the platform (missing NIP, Infakt off, proforma).
96
+ const em = this.emFactory();
97
+ const existing = await em.findOne(InvoiceLedgerDelivery, {
98
+ adapterId: input.adapterId,
99
+ invoiceId: input.invoiceId,
100
+ });
101
+ if (existing)
102
+ return toRecord(existing);
103
+ const status = opts?.dead ? 'dead' : 'failed';
104
+ const row = em.create(InvoiceLedgerDelivery, {
105
+ adapterId: input.adapterId,
106
+ invoiceId: input.invoiceId,
107
+ organizationId: input.organizationId,
108
+ kind: input.kind,
109
+ salesChannelId: input.salesChannelId,
110
+ credentialCode: input.credentialCode,
111
+ environment: input.environment,
112
+ numberingMode: input.numberingMode,
113
+ ksefRouting: input.ksefRouting,
114
+ ksefDelegated: input.ksefDelegated,
115
+ status,
116
+ idempotencyKey: `${input.adapterId}:${input.invoiceId}`,
117
+ });
118
+ appendAttempt(row, status, error);
119
+ await em.flush();
120
+ return toRecord(row);
121
+ }
122
+ async markAwaitingRemote(id, asyncTaskId, opts) {
123
+ // command-coverage-ignore: Infakt worker queue stamp — parks the delivery
124
+ // on the vendor async-task id until the webhook or poll completes.
125
+ const em = this.emFactory();
126
+ const row = await em.findOne(InvoiceLedgerDelivery, { id });
127
+ if (!row)
128
+ return;
129
+ row.asyncTaskId = asyncTaskId;
130
+ row.status = 'awaiting_remote';
131
+ appendAttempt(row, 'awaiting_remote', null, {
132
+ remoteVendorNumber: opts?.remoteVendorNumber ?? null,
133
+ });
134
+ const remoteDocumentId = opts?.remoteDocumentId;
135
+ if (remoteDocumentId) {
136
+ row.remoteDocumentId = remoteDocumentId;
137
+ let map = await em.findOne(InvoiceLedgerDocumentMap, {
138
+ adapterId: row.adapterId,
139
+ invoiceId: row.invoiceId,
140
+ });
141
+ const originalInvoiceId = opts?.originalInvoiceId ?? null;
142
+ if (map === null) {
143
+ map = em.create(InvoiceLedgerDocumentMap, {
144
+ adapterId: row.adapterId,
145
+ invoiceId: row.invoiceId,
146
+ organizationId: row.organizationId,
147
+ originalInvoiceId,
148
+ remoteDocumentId,
149
+ environment: row.environment,
150
+ credentialCode: row.credentialCode,
151
+ });
152
+ }
153
+ else {
154
+ map.remoteDocumentId = remoteDocumentId;
155
+ map.environment = row.environment;
156
+ map.credentialCode = row.credentialCode;
157
+ if (originalInvoiceId)
158
+ map.originalInvoiceId = originalInvoiceId;
159
+ }
160
+ }
161
+ await em.flush();
162
+ }
163
+ async markSucceeded(id, remoteDocumentId, opts) {
164
+ // command-coverage-ignore: Infakt worker queue stamp plus the document-map
165
+ // projection the webhook lookup uses.
166
+ const em = this.emFactory();
167
+ const row = await em.findOne(InvoiceLedgerDelivery, { id });
168
+ if (!row)
169
+ return;
170
+ row.remoteDocumentId = remoteDocumentId;
171
+ row.status = 'succeeded';
172
+ appendAttempt(row, 'succeeded', null, {
173
+ remoteVendorNumber: opts?.remoteVendorNumber ?? null,
174
+ });
175
+ let map = await em.findOne(InvoiceLedgerDocumentMap, {
176
+ adapterId: row.adapterId,
177
+ invoiceId: row.invoiceId,
178
+ });
179
+ const originalInvoiceId = opts?.originalInvoiceId ?? null;
180
+ if (map === null) {
181
+ map = em.create(InvoiceLedgerDocumentMap, {
182
+ adapterId: row.adapterId,
183
+ invoiceId: row.invoiceId,
184
+ // The delivery froze the buyer organization at enqueue and this is its
185
+ // projection, so the map takes the row's value rather than resolving
186
+ // the invoice a second time — two reads of one fact are two answers
187
+ // waiting to disagree, and the second one would need `invoices` to be
188
+ // composed, which is what this column exists to stop needing.
189
+ organizationId: row.organizationId,
190
+ originalInvoiceId,
191
+ remoteDocumentId,
192
+ environment: row.environment,
193
+ credentialCode: row.credentialCode,
194
+ });
195
+ }
196
+ else {
197
+ map.remoteDocumentId = remoteDocumentId;
198
+ map.environment = row.environment;
199
+ map.credentialCode = row.credentialCode;
200
+ if (originalInvoiceId)
201
+ map.originalInvoiceId = originalInvoiceId;
202
+ }
203
+ await em.flush();
204
+ }
205
+ async rememberClient(input) {
206
+ // command-coverage-ignore: Infakt worker stamp of the org → remote client
207
+ // map; not an operator write.
208
+ const em = this.emFactory();
209
+ let row = await em.findOne(InvoiceLedgerClientMap, {
210
+ adapterId: input.adapterId,
211
+ organizationId: input.organizationId,
212
+ environment: input.environment,
213
+ credentialCode: input.credentialCode,
214
+ });
215
+ if (row === null) {
216
+ row = em.create(InvoiceLedgerClientMap, {
217
+ adapterId: input.adapterId,
218
+ organizationId: input.organizationId,
219
+ nipUsed: input.nipUsed,
220
+ remoteClientId: input.remoteClientId,
221
+ credentialCode: input.credentialCode,
222
+ environment: input.environment,
223
+ salesChannelId: input.salesChannelId,
224
+ });
225
+ }
226
+ else {
227
+ row.nipUsed = input.nipUsed;
228
+ row.remoteClientId = input.remoteClientId;
229
+ row.salesChannelId = input.salesChannelId;
230
+ }
231
+ await em.flush();
232
+ }
233
+ async findClientRemoteId(input) {
234
+ const row = await this.emFactory().findOne(InvoiceLedgerClientMap, {
235
+ adapterId: input.adapterId,
236
+ organizationId: input.organizationId,
237
+ environment: input.environment,
238
+ credentialCode: input.credentialCode,
239
+ });
240
+ return row?.remoteClientId ?? null;
241
+ }
242
+ async findDocumentRemoteId(input) {
243
+ const row = await this.emFactory().findOne(InvoiceLedgerDocumentMap, {
244
+ adapterId: input.adapterId,
245
+ invoiceId: input.invoiceId,
246
+ });
247
+ return row?.remoteDocumentId ?? null;
248
+ }
249
+ async lookupUniqueMappedInvoice(input) {
250
+ const where = {
251
+ adapterId: input.adapterId,
252
+ remoteDocumentId: input.remoteDocumentId,
253
+ };
254
+ if (input.environment)
255
+ where.environment = input.environment;
256
+ if (input.credentialCode)
257
+ where.credentialCode = input.credentialCode;
258
+ const maps = await this.emFactory().find(InvoiceLedgerDocumentMap, where);
259
+ if (maps.length !== 1)
260
+ return null;
261
+ const invoiceId = maps[0]?.invoiceId;
262
+ return invoiceId ? { invoiceId } : null;
263
+ }
264
+ async recordQueuedWait(id, error) {
265
+ // command-coverage-ignore: Infakt worker queue stamp — the correction
266
+ // stays queued until the original remote id exists; last_error is the wait.
267
+ const em = this.emFactory();
268
+ const row = await em.findOne(InvoiceLedgerDelivery, { id });
269
+ if (!row)
270
+ return;
271
+ row.status = 'queued';
272
+ appendAttempt(row, 'queued', error);
273
+ await em.flush();
274
+ }
275
+ async markRemotePaid(id) {
276
+ // command-coverage-ignore: Infakt worker / webhook stamp that the remote
277
+ // invoice is paid — the invoices paidTotal write is the operator-visible one.
278
+ const em = this.emFactory();
279
+ const row = await em.findOne(InvoiceLedgerDelivery, { id });
280
+ if (!row || row.remotePaidAt)
281
+ return;
282
+ row.remotePaidAt = new Date();
283
+ await em.flush();
284
+ }
285
+ async markFailed(id, error, opts) {
286
+ // command-coverage-ignore: Infakt worker queue stamp for a mapped failure.
287
+ const em = this.emFactory();
288
+ const row = await em.findOne(InvoiceLedgerDelivery, { id });
289
+ if (!row)
290
+ return;
291
+ row.status = opts?.dead ? 'dead' : 'failed';
292
+ appendAttempt(row, row.status, error);
293
+ await em.flush();
294
+ }
295
+ async requeue(id) {
296
+ // command-coverage-ignore: queue stamp inside the audited retry Command.
297
+ const em = this.emFactory();
298
+ const row = await em.findOne(InvoiceLedgerDelivery, { id });
299
+ if (!row)
300
+ return null;
301
+ row.status = 'queued';
302
+ await em.flush();
303
+ return toRecord(row);
304
+ }
305
+ async listRows(input) {
306
+ const em = this.emFactory();
307
+ const where = {};
308
+ if (input.status)
309
+ where['status'] = input.status;
310
+ if (input.salesChannelId)
311
+ where['salesChannelId'] = input.salesChannelId;
312
+ if (input.invoiceId)
313
+ where['invoiceId'] = input.invoiceId;
314
+ if (input.cursor)
315
+ where['id'] = { $lt: input.cursor };
316
+ return em.find(InvoiceLedgerDelivery, where, {
317
+ orderBy: { updatedAt: 'DESC', id: 'DESC' },
318
+ limit: input.limit + 1,
319
+ });
320
+ }
321
+ }
322
+ //# sourceMappingURL=invoice-ledger-delivery.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-ledger-delivery.service.js","sourceRoot":"","sources":["../../../src/backend/services/invoice-ledger-delivery.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import { type InvoiceLedgerRegistryPort } from '@endora-commerce/contracts';
3
+ export interface LedgerActivationPresenceReader {
4
+ isOperatorActivated(moduleId: string): boolean;
5
+ }
6
+ /**
7
+ * Feature 132 (T026) — **effective** presence, not the activation Setting alone.
8
+ *
9
+ * This read was `presence(moduleId)?.operatorActivated`, which answers `true` for
10
+ * a module whose *platform* availability is off — a vendor the deployment never
11
+ * installed holding a claim that refuses another. The conjunction is what
12
+ * Principle XVII means by "a module that is off behaves as if never installed"
13
+ * (spec FR-012), and `isPresent` is the one place the two axes are combined.
14
+ *
15
+ * The method name stays `isOperatorActivated` because it is the shape of an
16
+ * injected seam three call sites and the test harness already pass; what it
17
+ * answers is the conjunction now, and it says so.
18
+ */
19
+ export declare const defaultInvoiceLedgerPresence: LedgerActivationPresenceReader;
20
+ /**
21
+ * The vendor family, from the members' own manifest declarations.
22
+ *
23
+ * This was `INVOICE_LEDGER_MODULES`, a hand-written array in
24
+ * `@endora-commerce/contracts` — and `invoice_ledger` was already the family whose
25
+ * seam was open, because the member list was a constructor parameter and a
26
+ * container value rather than an import inside the method. Feature 132 changes
27
+ * what supplies it (`capability-exclusivity.md` R3), so a vendor installed from
28
+ * npm joins by declaring `capabilities` and no file in this repository names it.
29
+ */
30
+ export declare function declaredLedgerVendorModules(): readonly {
31
+ id: string;
32
+ }[];
33
+ export declare class InvoiceLedgerRegistryService implements InvoiceLedgerRegistryPort {
34
+ private readonly emFactory;
35
+ private readonly presence;
36
+ /**
37
+ * The family. A **function** rather than an array, because the derived family
38
+ * is re-installed by every `b2b:module:state-changed` refresh and a value
39
+ * captured at construction would answer for the deployment as it was when this
40
+ * singleton was built. Callers that pass an explicit list — the test harness
41
+ * does, to add a sibling without shipping one — keep passing a list.
42
+ */
43
+ private readonly modules;
44
+ constructor(emFactory: () => EntityManager, presence?: LedgerActivationPresenceReader,
45
+ /**
46
+ * The family. A **function** rather than an array, because the derived family
47
+ * is re-installed by every `b2b:module:state-changed` refresh and a value
48
+ * captured at construction would answer for the deployment as it was when this
49
+ * singleton was built. Callers that pass an explicit list — the test harness
50
+ * does, to add a sibling without shipping one — keep passing a list.
51
+ */
52
+ modules?: readonly {
53
+ id: string;
54
+ }[] | (() => readonly {
55
+ id: string;
56
+ }[]));
57
+ private vendorModules;
58
+ assertCanActivate(moduleId: string): Promise<void>;
59
+ recordActive(moduleId: string, adminId: string | null): Promise<void>;
60
+ clearActive(moduleId: string): Promise<void>;
61
+ getActiveModuleId(): Promise<string | null>;
62
+ private findActiveSibling;
63
+ }
64
+ //# sourceMappingURL=invoice-ledger-registry.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-ledger-registry.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/invoice-ledger-registry.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAQpC,MAAM,WAAW,8BAA8B;IAC7C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAChD;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,4BAA4B,EAAE,8BAI1C,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,IAAI,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,CAIvE;AAED,qBAAa,4BAA6B,YAAW,yBAAyB;IAE1E,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO;gBATP,SAAS,EAAE,MAAM,aAAa,EAC9B,QAAQ,GAAE,8BAA6D;IACxF;;;;;;OAMG;IACc,OAAO,GACpB,SAAS;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,GACzB,CAAC,MAAM,SAAS;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAA+B;IAGrE,OAAO,CAAC,aAAa;IAIf,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBrE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5C,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASjD,OAAO,CAAC,iBAAiB;CAS1B"}
@@ -0,0 +1,119 @@
1
+ import { CAPABILITY_KEYS, ERROR_CODES, } from '@endora-commerce/contracts';
2
+ import { effectiveState } from '@endora-commerce/platform/kernel';
3
+ import { HttpError } from '@endora-commerce/platform/http';
4
+ import { INVOICE_LEDGER_ACTIVATION_LOCK_SINGLETON_ID, InvoiceLedgerActivationLock, } from '../entities/invoice-ledger-activation-lock.entity.js';
5
+ /**
6
+ * Feature 132 (T026) — **effective** presence, not the activation Setting alone.
7
+ *
8
+ * This read was `presence(moduleId)?.operatorActivated`, which answers `true` for
9
+ * a module whose *platform* availability is off — a vendor the deployment never
10
+ * installed holding a claim that refuses another. The conjunction is what
11
+ * Principle XVII means by "a module that is off behaves as if never installed"
12
+ * (spec FR-012), and `isPresent` is the one place the two axes are combined.
13
+ *
14
+ * The method name stays `isOperatorActivated` because it is the shape of an
15
+ * injected seam three call sites and the test harness already pass; what it
16
+ * answers is the conjunction now, and it says so.
17
+ */
18
+ export const defaultInvoiceLedgerPresence = {
19
+ isOperatorActivated(moduleId) {
20
+ return effectiveState.isPresent(moduleId);
21
+ },
22
+ };
23
+ /**
24
+ * The vendor family, from the members' own manifest declarations.
25
+ *
26
+ * This was `INVOICE_LEDGER_MODULES`, a hand-written array in
27
+ * `@endora-commerce/contracts` — and `invoice_ledger` was already the family whose
28
+ * seam was open, because the member list was a constructor parameter and a
29
+ * container value rather than an import inside the method. Feature 132 changes
30
+ * what supplies it (`capability-exclusivity.md` R3), so a vendor installed from
31
+ * npm joins by declaring `capabilities` and no file in this repository names it.
32
+ */
33
+ export function declaredLedgerVendorModules() {
34
+ return effectiveState
35
+ .declaredMembersOfCapability(CAPABILITY_KEYS.INVOICE_LEDGER_VENDOR)
36
+ .map((id) => ({ id }));
37
+ }
38
+ export class InvoiceLedgerRegistryService {
39
+ emFactory;
40
+ presence;
41
+ modules;
42
+ constructor(emFactory, presence = defaultInvoiceLedgerPresence,
43
+ /**
44
+ * The family. A **function** rather than an array, because the derived family
45
+ * is re-installed by every `b2b:module:state-changed` refresh and a value
46
+ * captured at construction would answer for the deployment as it was when this
47
+ * singleton was built. Callers that pass an explicit list — the test harness
48
+ * does, to add a sibling without shipping one — keep passing a list.
49
+ */
50
+ modules = declaredLedgerVendorModules) {
51
+ this.emFactory = emFactory;
52
+ this.presence = presence;
53
+ this.modules = modules;
54
+ }
55
+ vendorModules() {
56
+ return typeof this.modules === 'function' ? this.modules() : this.modules;
57
+ }
58
+ async assertCanActivate(moduleId) {
59
+ const activeSibling = this.findActiveSibling(moduleId);
60
+ if (activeSibling !== null) {
61
+ throw new HttpError(409, ERROR_CODES.INVOICE_LEDGER_VENDOR_ALREADY_ACTIVE, `Another invoice ledger vendor is already active: ${activeSibling}`, { activeModuleId: activeSibling });
62
+ }
63
+ }
64
+ async recordActive(moduleId, adminId) {
65
+ const em = this.emFactory();
66
+ let row = await em.findOne(InvoiceLedgerActivationLock, {
67
+ id: INVOICE_LEDGER_ACTIVATION_LOCK_SINGLETON_ID,
68
+ });
69
+ if (row === null) {
70
+ // command-coverage-ignore: mutual-exclusion bookkeeping. Mirrors the operator's
71
+ // vendor activation choice in the lock row; the activation write itself is audited.
72
+ row = em.create(InvoiceLedgerActivationLock, {
73
+ id: INVOICE_LEDGER_ACTIVATION_LOCK_SINGLETON_ID,
74
+ activeModuleId: moduleId,
75
+ updatedByAdminId: adminId,
76
+ updatedAt: new Date(),
77
+ });
78
+ }
79
+ else {
80
+ row.activeModuleId = moduleId;
81
+ row.updatedByAdminId = adminId;
82
+ row.updatedAt = new Date();
83
+ }
84
+ await em.flush();
85
+ }
86
+ async clearActive(moduleId) {
87
+ const em = this.emFactory();
88
+ const row = await em.findOne(InvoiceLedgerActivationLock, {
89
+ id: INVOICE_LEDGER_ACTIVATION_LOCK_SINGLETON_ID,
90
+ });
91
+ if (row === null || row.activeModuleId !== moduleId) {
92
+ return;
93
+ }
94
+ // command-coverage-ignore: mutual-exclusion bookkeeping. Clears the lock when the
95
+ // named vendor deactivates; the activation write itself is audited.
96
+ row.activeModuleId = null;
97
+ row.updatedAt = new Date();
98
+ await em.flush();
99
+ }
100
+ async getActiveModuleId() {
101
+ for (const sibling of this.vendorModules()) {
102
+ if (this.presence.isOperatorActivated(sibling.id)) {
103
+ return sibling.id;
104
+ }
105
+ }
106
+ return null;
107
+ }
108
+ findActiveSibling(exceptModuleId) {
109
+ for (const sibling of this.vendorModules()) {
110
+ if (sibling.id === exceptModuleId)
111
+ continue;
112
+ if (this.presence.isOperatorActivated(sibling.id)) {
113
+ return sibling.id;
114
+ }
115
+ }
116
+ return null;
117
+ }
118
+ }
119
+ //# sourceMappingURL=invoice-ledger-registry.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-ledger-registry.service.js","sourceRoot":"","sources":["../../../src/backend/services/invoice-ledger-registry.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type InvoiceLedgerRoutingDto, type InvoiceLedgerRoutingWriteBody, type SettingsAdminPort } from '@endora-commerce/contracts';
2
+ import type { CommandBus } from '@endora-commerce/platform/commands';
3
+ import type { EntityManager } from '@mikro-orm/postgresql';
4
+ import type { InvoiceLedgerRoutingService } from './invoice-ledger-routing.service.js';
5
+ export declare class InvoiceLedgerRoutingWriteService {
6
+ private readonly routing;
7
+ private readonly settingsAdmin;
8
+ private readonly emFactory;
9
+ private readonly commandBus;
10
+ constructor(routing: InvoiceLedgerRoutingService, settingsAdmin: SettingsAdminPort, emFactory: () => EntityManager, commandBus: CommandBus);
11
+ view(): Promise<InvoiceLedgerRoutingDto>;
12
+ write(body: InvoiceLedgerRoutingWriteBody): Promise<InvoiceLedgerRoutingDto>;
13
+ private persist;
14
+ }
15
+ //# sourceMappingURL=invoice-ledger-routing-write.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-ledger-routing-write.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/invoice-ledger-routing-write.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAClC,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAGrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAIvF,qBAAa,gCAAgC;IAEzC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAHV,OAAO,EAAE,2BAA2B,EACpC,aAAa,EAAE,iBAAiB,EAChC,SAAS,EAAE,MAAM,aAAa,EAC9B,UAAU,EAAE,UAAU;IAGnC,IAAI,IAAI,OAAO,CAAC,uBAAuB,CAAC;IA8BxC,KAAK,CAAC,IAAI,EAAE,6BAA6B,GAAG,OAAO,CAAC,uBAAuB,CAAC;YAUpE,OAAO;CAwEtB"}
@@ -0,0 +1,85 @@
1
+ import { ERROR_CODES, INVOICE_LEDGER_SETTING_CODES, invoiceLedgerKsefRoutingSchema, invoiceLedgerNumberingModeSchema, } from '@endora-commerce/contracts';
2
+ import { HttpError } from '@endora-commerce/platform/http';
3
+ import { SalesChannel } from '@endora-commerce/platform/kernel';
4
+ import { makeWriteInvoiceLedgerRoutingCommand } from '../commands/routing.commands.js';
5
+ const AUDIT = { actorAdminUserId: null };
6
+ export class InvoiceLedgerRoutingWriteService {
7
+ routing;
8
+ settingsAdmin;
9
+ emFactory;
10
+ commandBus;
11
+ constructor(routing, settingsAdmin, emFactory, commandBus) {
12
+ this.routing = routing;
13
+ this.settingsAdmin = settingsAdmin;
14
+ this.emFactory = emFactory;
15
+ this.commandBus = commandBus;
16
+ }
17
+ async view() {
18
+ const numberingMode = await this.routing.numberingModeFor(null);
19
+ const ksefRouting = (await this.routing.nativeKsefActionFor(null)) === 'skip' ? 'vendor' : 'native';
20
+ const channels = await this.emFactory().find(SalesChannel, {});
21
+ const channelOverrides = [];
22
+ for (const channel of channels) {
23
+ const channelNumbering = await this.routing.numberingModeFor(channel.id);
24
+ const channelKsef = (await this.routing.nativeKsefActionFor(channel.id)) === 'skip' ? 'vendor' : 'native';
25
+ const entry = { salesChannelId: channel.id };
26
+ let present = false;
27
+ if (channelNumbering !== numberingMode) {
28
+ entry.numberingMode = channelNumbering;
29
+ present = true;
30
+ }
31
+ if (channelKsef !== ksefRouting) {
32
+ entry.ksefRouting = channelKsef;
33
+ present = true;
34
+ }
35
+ if (present)
36
+ channelOverrides.push(entry);
37
+ }
38
+ return {
39
+ numberingMode,
40
+ ksefRouting,
41
+ activeVendorModuleId: await this.routing.activeVendorModuleId(),
42
+ channelOverrides,
43
+ };
44
+ }
45
+ async write(body) {
46
+ const before = await this.view();
47
+ return this.commandBus.run(makeWriteInvoiceLedgerRoutingCommand({
48
+ before,
49
+ write: () => this.persist(before, body),
50
+ }));
51
+ }
52
+ async persist(before, body) {
53
+ if (body.numberingMode !== undefined &&
54
+ body.numberingMode !== before.numberingMode &&
55
+ body.confirm !== true) {
56
+ throw new HttpError(400, ERROR_CODES.VALIDATION_FAILED, 'Confirm the numbering mode change.', { field: 'confirm' });
57
+ }
58
+ if (body.numberingMode !== undefined) {
59
+ invoiceLedgerNumberingModeSchema.parse(body.numberingMode);
60
+ await this.settingsAdmin.setValueForAllChannels(INVOICE_LEDGER_SETTING_CODES.NUMBERING_MODE, body.numberingMode, null, AUDIT);
61
+ }
62
+ if (body.ksefRouting !== undefined) {
63
+ invoiceLedgerKsefRoutingSchema.parse(body.ksefRouting);
64
+ await this.settingsAdmin.setValueForAllChannels(INVOICE_LEDGER_SETTING_CODES.KSEF_ROUTING, body.ksefRouting, null, AUDIT);
65
+ }
66
+ if (body.channelOverrides) {
67
+ for (const override of body.channelOverrides) {
68
+ const channel = await this.emFactory().findOne(SalesChannel, {
69
+ id: override.salesChannelId,
70
+ });
71
+ if (!channel) {
72
+ throw new HttpError(400, ERROR_CODES.VALIDATION_FAILED, 'Unknown sales channel for a routing override.', { field: 'channelOverrides' });
73
+ }
74
+ if (override.numberingMode !== undefined) {
75
+ await this.settingsAdmin.setValueForSubset(INVOICE_LEDGER_SETTING_CODES.NUMBERING_MODE, [channel.code], override.numberingMode, null, AUDIT);
76
+ }
77
+ if (override.ksefRouting !== undefined) {
78
+ await this.settingsAdmin.setValueForSubset(INVOICE_LEDGER_SETTING_CODES.KSEF_ROUTING, [channel.code], override.ksefRouting, null, AUDIT);
79
+ }
80
+ }
81
+ }
82
+ return this.view();
83
+ }
84
+ }
85
+ //# sourceMappingURL=invoice-ledger-routing-write.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-ledger-routing-write.service.js","sourceRoot":"","sources":["../../../src/backend/services/invoice-ledger-routing-write.service.ts"],"names":[],"mappings":"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"}