@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,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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"}
|