@ekwo-ai/coda 0.4.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/dist/index.js ADDED
@@ -0,0 +1,546 @@
1
+ import { isValidBelgianReference, isValidCreditorReference, isValidIban, } from './checks.js';
2
+ import { formatAmount, parseAmount } from './decimal.js';
3
+ import { StatementFileError } from './errors.js';
4
+ import { decode, splitRecords } from './records.js';
5
+ export { formatBelgianReference, isValidBelgianReference, isValidCreditorReference, isValidIban } from './checks.js';
6
+ export { StatementFileError } from './errors.js';
7
+ /** Every record of a CODA file is this long, the line break not counted. */
8
+ export const RECORD_LENGTH = 128;
9
+ const DEFAULTS = { maxBytes: 32 * 1024 * 1024, pivotYear: 80 };
10
+ // --- positions ---------------------------------------------------------------
11
+ /** Positions `from` to `to` of a record, counted from 1 and inclusive, as the standard writes them. */
12
+ function at(record, from, to = from) {
13
+ return record.slice(from - 1, to);
14
+ }
15
+ /** A zone as text: trailing and leading blanks gone, null when nothing is left. */
16
+ function zone(record, from, to) {
17
+ if (record === null)
18
+ return null;
19
+ const value = at(record, from, to).trim();
20
+ return value === '' ? null : value;
21
+ }
22
+ function gather(records) {
23
+ const out = [];
24
+ let current = null;
25
+ let previous = '';
26
+ const refuse = (index, message) => {
27
+ throw new StatementFileError('unexpected_record', message, index + 1);
28
+ };
29
+ records.forEach((record, index) => {
30
+ const identification = at(record, 1);
31
+ const article = at(record, 2);
32
+ const kind = identification === '2' || identification === '3' ? identification + article : identification;
33
+ if (kind === '0') {
34
+ if (current)
35
+ refuse(index, 'a header record, and the statement before it has no trailer record');
36
+ if (at(record, 128) !== '2') {
37
+ throw new StatementFileError('unsupported_version', `the version code is "${at(record, 128)}", and this reader reads version 2 of the standard; version 1 is another lay-out under the same name`, index + 1);
38
+ }
39
+ current = {
40
+ record: index + 1,
41
+ header: record,
42
+ oldBalance: null,
43
+ movements: [],
44
+ newBalance: null,
45
+ free: [],
46
+ trailer: null,
47
+ counted: 0,
48
+ };
49
+ previous = kind;
50
+ return;
51
+ }
52
+ if (!['1', '21', '22', '23', '31', '32', '33', '4', '8', '9'].includes(kind)) {
53
+ throw new StatementFileError('unknown_record', identification === '2' || identification === '3'
54
+ ? `record identification ${identification} with article code "${article}": the standard has articles 1, 2 and 3`
55
+ : `record identification "${identification}": the standard has 0, 1, 2, 3, 4, 8 and 9`, index + 1);
56
+ }
57
+ if (!current)
58
+ return refuse(index, `a record ${kind} before any header record`);
59
+ const statement = current;
60
+ const movement = statement.movements[statement.movements.length - 1];
61
+ const sameMovement = () => movement !== undefined && at(record, 3, 10) === at(movement.r21, 3, 10);
62
+ switch (kind) {
63
+ case '1':
64
+ if (previous !== '0')
65
+ refuse(index, 'an old balance record that does not follow a header record');
66
+ statement.oldBalance = record;
67
+ break;
68
+ case '21':
69
+ if (!statement.oldBalance || statement.newBalance) {
70
+ refuse(index, 'a movement record outside the old and the new balance');
71
+ }
72
+ statement.movements.push({ record: index + 1, r21: record, r22: null, r23: null, information: [] });
73
+ break;
74
+ case '22':
75
+ if (previous !== '21' || !sameMovement())
76
+ refuse(index, 'a record 2.2 that does not follow its record 2.1');
77
+ movement.r22 = record;
78
+ break;
79
+ case '23':
80
+ if ((previous !== '21' && previous !== '22') || !sameMovement()) {
81
+ refuse(index, 'a record 2.3 that does not follow its record 2.1 or 2.2');
82
+ }
83
+ movement.r23 = record;
84
+ break;
85
+ case '31':
86
+ if (!movement || statement.newBalance || at(record, 3, 6) !== at(movement.r21, 3, 6)) {
87
+ refuse(index, 'an information record that refers to no movement before it');
88
+ }
89
+ movement.information.push({ r31: record, r32: null, r33: null });
90
+ break;
91
+ case '32':
92
+ case '33': {
93
+ const information = movement?.information[movement.information.length - 1];
94
+ const follows = kind === '32' ? previous === '31' : previous === '31' || previous === '32';
95
+ if (!information || !follows || at(record, 3, 10) !== at(information.r31, 3, 10)) {
96
+ refuse(index, `a record 3.${kind[1]} that does not follow its record 3.1`);
97
+ }
98
+ if (kind === '32')
99
+ information.r32 = record;
100
+ else
101
+ information.r33 = record;
102
+ break;
103
+ }
104
+ case '8':
105
+ if (!statement.oldBalance || statement.newBalance) {
106
+ refuse(index, 'a new balance record without an old one, or a second one');
107
+ }
108
+ statement.newBalance = record;
109
+ break;
110
+ case '4':
111
+ if (!statement.oldBalance)
112
+ refuse(index, 'a free communication before the old balance');
113
+ statement.free.push(record);
114
+ break;
115
+ case '9':
116
+ if (!statement.oldBalance)
117
+ refuse(index, 'a trailer record for a statement that has no old balance');
118
+ statement.trailer = record;
119
+ out.push(statement);
120
+ current = null;
121
+ break;
122
+ }
123
+ if (kind !== '4' && kind !== '9')
124
+ statement.counted += 1;
125
+ previous = kind;
126
+ });
127
+ if (current) {
128
+ throw new StatementFileError('incomplete_statement', `the statement that begins at record ${current.record} has no trailer record: the file stops before its end`);
129
+ }
130
+ return out;
131
+ }
132
+ // --- small readers -----------------------------------------------------------
133
+ /** `DDMMYY` to `YYYY-MM-DD`: null when the bank writes zeros, undefined when it is not a date. */
134
+ function day(field, pivotYear) {
135
+ if (field === '000000' || field.trim() === '')
136
+ return null;
137
+ if (!/^[0-9]{6}$/.test(field))
138
+ return undefined;
139
+ const date = Number(field.slice(0, 2));
140
+ const month = Number(field.slice(2, 4));
141
+ const short = Number(field.slice(4, 6));
142
+ const year = (short >= pivotYear ? 1900 : 2000) + short;
143
+ if (month < 1 || month > 12 || date < 1)
144
+ return undefined;
145
+ const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
146
+ const length = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
147
+ if (date > length)
148
+ return undefined;
149
+ return `${year}-${field.slice(2, 4)}-${field.slice(0, 2)}`;
150
+ }
151
+ /** The thirty-seven positions of "account number and currency code", by the structure record 1 announces. */
152
+ function ownAccount(area, structure) {
153
+ const compact = (text) => text.replace(/\s+/g, '').toUpperCase();
154
+ const currency = (text) => (/^[A-Z]{3}$/.test(text) ? text : null);
155
+ switch (structure) {
156
+ case '0':
157
+ return {
158
+ identifier: { kind: 'other', value: compact(area.slice(0, 12)), scheme: 'BBAN', issuer: null },
159
+ currency: currency(area.slice(13, 16)),
160
+ };
161
+ case '1':
162
+ return {
163
+ identifier: { kind: 'other', value: compact(area.slice(0, 34)), scheme: 'BBAN', issuer: null },
164
+ currency: currency(area.slice(34, 37)),
165
+ };
166
+ case '2':
167
+ return { identifier: { kind: 'iban', value: compact(area.slice(0, 31)) }, currency: currency(area.slice(34, 37)) };
168
+ case '3':
169
+ return { identifier: { kind: 'iban', value: compact(area.slice(0, 34)) }, currency: currency(area.slice(34, 37)) };
170
+ default:
171
+ return null;
172
+ }
173
+ }
174
+ /**
175
+ * The counterparty's account, which comes "in the structure of the initial
176
+ * payment" and announces nothing: an IBAN when it passes ISO 13616, else what
177
+ * was written. The old domestic lay-out — twelve digits, a blank, a currency —
178
+ * is recognised so that the currency is not read as part of the number.
179
+ */
180
+ function otherAccount(area) {
181
+ const domestic = /^([0-9]{12}) /.exec(area);
182
+ const value = (domestic ? domestic[1] : area.slice(0, 34)).replace(/\s+/g, '').toUpperCase();
183
+ if (value === '' || /^0+$/.test(value))
184
+ return null;
185
+ if (isValidIban(value))
186
+ return { kind: 'iban', value };
187
+ return { kind: 'other', value, scheme: null, issuer: null };
188
+ }
189
+ function communication(flag, text) {
190
+ if (flag === '1') {
191
+ return { free: null, structured: { type: text.slice(0, 3), text: text.slice(3).trimEnd() } };
192
+ }
193
+ const free = text.trim();
194
+ return { free: free === '' ? null : free, structured: null };
195
+ }
196
+ function parse(movement) {
197
+ const sign = at(movement.r21, 32);
198
+ const unsigned = parseAmount(at(movement.r21, 33, 47));
199
+ return {
200
+ movement,
201
+ sequenceNumber: at(movement.r21, 3, 6),
202
+ detailNumber: at(movement.r21, 7, 10),
203
+ type: at(movement.r21, 54),
204
+ amount: unsigned === null || (sign !== '0' && sign !== '1') ? null : sign === '1' ? -unsigned : unsigned,
205
+ children: [],
206
+ };
207
+ }
208
+ // --- a statement -------------------------------------------------------------
209
+ function readStatement(raw, position, pivotYear, violations) {
210
+ const report = (code, message, line) => {
211
+ violations.push(line === undefined ? { code, message, statement: position } : { code, message, statement: position, line });
212
+ };
213
+ const dayOf = (field, what, line) => {
214
+ const value = day(field, pivotYear);
215
+ if (value === undefined) {
216
+ report('invalid_date', `${what} "${field}" is not a date (DDMMYY)`, line);
217
+ return null;
218
+ }
219
+ return value;
220
+ };
221
+ const header = raw.header;
222
+ const oldBalance = raw.oldBalance;
223
+ // The account, which the old and the new balance both name.
224
+ const structure = at(oldBalance, 2);
225
+ const account = ownAccount(at(oldBalance, 6, 42), structure);
226
+ if (account === null || account.identifier.value === '') {
227
+ throw new StatementFileError('incomplete_statement', account === null
228
+ ? `the account structure is "${structure}", and the standard has 0, 1, 2 and 3`
229
+ : 'the old balance record names no account: there is nothing to attach its lines to', raw.record + 1);
230
+ }
231
+ if (raw.newBalance) {
232
+ const again = ownAccount(at(raw.newBalance, 5, 41), structure);
233
+ if (again?.identifier.value !== account.identifier.value || again.currency !== account.currency) {
234
+ throw new StatementFileError('inconsistent_record', `the old balance is of account ${account.identifier.value} ${account.currency ?? ''} and the new balance of ${again?.identifier.value ?? ''} ${again?.currency ?? ''}`.trimEnd(), raw.record + 1);
235
+ }
236
+ }
237
+ if (account.identifier.kind === 'iban' && !isValidIban(account.identifier.value)) {
238
+ report('invalid_iban', `the account ${account.identifier.value} is written as an IBAN and fails its own check digits`);
239
+ }
240
+ if (account.currency === null) {
241
+ report('currency_missing', 'the account zone carries no currency code: the amounts are returned without one');
242
+ }
243
+ // Balances.
244
+ const balance = (type, sign, figure, date, what) => {
245
+ const unsigned = parseAmount(figure);
246
+ if (unsigned === null || (sign !== '0' && sign !== '1')) {
247
+ report('invalid_amount', `the ${what} balance "${figure}" with sign "${sign}" is not fifteen digits and a sign of 0 or 1`);
248
+ return null;
249
+ }
250
+ const scaled = sign === '1' ? -unsigned : unsigned;
251
+ return {
252
+ balance: { type, amount: formatAmount(scaled), currency: account.currency, date: dayOf(date, `the date of the ${what} balance`) },
253
+ scaled,
254
+ };
255
+ };
256
+ const opening = balance('OPBD', at(oldBalance, 43), at(oldBalance, 44, 58), at(oldBalance, 59, 64), 'old');
257
+ const closing = raw.newBalance
258
+ ? balance('CLBD', at(raw.newBalance, 42), at(raw.newBalance, 43, 57), at(raw.newBalance, 58, 63), 'new')
259
+ : null;
260
+ if (!raw.newBalance) {
261
+ report('closing_balance_missing', raw.movements.length === 0
262
+ ? 'the file carries no new balance record, which is how the standard writes a day without movement: nothing is checked, and nothing is invented'
263
+ : 'the file carries movements and no new balance record');
264
+ }
265
+ // Movements, grouped by continuous sequence number.
266
+ const groups = [];
267
+ for (const movement of raw.movements) {
268
+ const parsed = parse(movement);
269
+ const group = groups[groups.length - 1];
270
+ if (group && group[0].sequenceNumber === parsed.sequenceNumber)
271
+ group.push(parsed);
272
+ else
273
+ groups.push([parsed]);
274
+ }
275
+ const lines = [];
276
+ let checkable = opening !== null && closing !== null;
277
+ let totalsReadable = true;
278
+ let movementTotal = 0n;
279
+ let debitTotal = 0n;
280
+ let creditTotal = 0n;
281
+ const build = (parsed, entry, part, fallback) => {
282
+ const index = lines.length + 1;
283
+ const { r21, r22, r23, information } = parsed.movement;
284
+ const sign = at(r21, 32);
285
+ if (sign !== '0' && sign !== '1') {
286
+ report('invalid_direction', `movement ${parsed.sequenceNumber}/${parsed.detailNumber} is neither a credit nor a debit ("${sign}")`, index);
287
+ }
288
+ else if (parsed.amount === null) {
289
+ report('invalid_amount', `the amount of movement ${parsed.sequenceNumber}/${parsed.detailNumber}, "${at(r21, 33, 47)}", is not fifteen digits`, index);
290
+ }
291
+ const said = communication(at(r21, 62), at(r21, 63, 115) + (r22 ? at(r22, 11, 63) : '') + (r23 ? at(r23, 83, 125) : ''));
292
+ const remittance = { unstructured: said.free === null ? [] : [said.free], structured: [] };
293
+ let mandateId = null;
294
+ let returnReason = zone(r22, 114, 117);
295
+ if (said.structured) {
296
+ const { type, text } = said.structured;
297
+ if (type === '101' || type === '102') {
298
+ const digits = text.slice(0, 12);
299
+ remittance.structured.push({ reference: digits, type: 'SCOR', issuer: 'BBA' });
300
+ if (!isValidBelgianReference(digits)) {
301
+ report('invalid_structured_reference', `the structured communication "${digits}" is not twelve digits whose last two are the first ten modulo 97; it is returned as written`, index);
302
+ }
303
+ }
304
+ else if (type === '100') {
305
+ const reference = text.trim().toUpperCase();
306
+ remittance.structured.push({ reference, type: 'SCOR', issuer: 'ISO' });
307
+ if (!isValidCreditorReference(reference)) {
308
+ report('invalid_structured_reference', `the creditor reference "${reference}" fails the check digits of ISO 11649; it is returned as written`, index);
309
+ }
310
+ }
311
+ else if (type === '127') {
312
+ // Settlement date 6, type 1, scheme 1, paid or reason 1, creditor 35,
313
+ // mandate 35, communication 62, type of R-transaction 1, reason 4.
314
+ mandateId = text.slice(44, 79).trim() || null;
315
+ const free = text.slice(79, 141).trim();
316
+ if (free !== '')
317
+ remittance.unstructured.push(free);
318
+ returnReason = returnReason ?? (text.slice(142, 146).trim() || null);
319
+ }
320
+ }
321
+ const details = information.map((item) => {
322
+ const read = communication(at(item.r31, 40), at(item.r31, 41, 113) + (item.r32 ? at(item.r32, 11, 115) : '') + (item.r33 ? at(item.r33, 11, 100) : ''));
323
+ return read.structured
324
+ ? { type: read.structured.type, text: read.structured.text }
325
+ : { type: null, text: read.free ?? '' };
326
+ });
327
+ const typed = (type) => details.find((detail) => detail.type === type)?.text.slice(0, 70).trim() || null;
328
+ const credit = parsed.amount !== null ? parsed.amount >= 0n : sign === '0';
329
+ const counterparty = {
330
+ name: zone(r23, 48, 82) ?? typed('001'),
331
+ account: r23 ? otherAccount(at(r23, 11, 47)) : null,
332
+ agentBic: zone(r22, 99, 109),
333
+ // 008 names the ultimate creditor and 009 the ultimate debtor: the one
334
+ // behind the counterparty is the creditor of money going out.
335
+ ultimateName: typed(credit ? '009' : '008'),
336
+ };
337
+ const code = at(r21, 54, 61);
338
+ const transactionCode = /^[0-9]{8}$/.test(code)
339
+ ? { type: code.slice(0, 1), family: code.slice(1, 3), transaction: code.slice(3, 5), category: code.slice(5, 8) }
340
+ : null;
341
+ const bankReference = (record) => {
342
+ const value = zone(record, 11, 31);
343
+ return value === null || /^0+$/.test(value) ? null : value;
344
+ };
345
+ const customerReference = zone(r22, 64, 98);
346
+ const total = parsed.type === '1' || parsed.type === '2';
347
+ const free = details.filter((detail) => detail.type === null && detail.text !== '').map((detail) => detail.text);
348
+ const bookingDate = dayOf(at(r21, 116, 121), `the entry date of movement ${parsed.sequenceNumber}/${parsed.detailNumber}`, index) ??
349
+ (fallback ? day(at(fallback.movement.r21, 116, 121), pivotYear) ?? null : null);
350
+ if (bookingDate === null) {
351
+ report('booking_date_missing', `movement ${parsed.sequenceNumber}/${parsed.detailNumber} has no entry date`, index);
352
+ }
353
+ lines.push({
354
+ index,
355
+ entry,
356
+ detail: part?.nth ?? null,
357
+ detailCount: part?.count ?? null,
358
+ status: 'BOOK',
359
+ booked: true,
360
+ reversal: transactionCode?.transaction === '49' || transactionCode?.transaction === '99',
361
+ bookingDate,
362
+ valueDate: dayOf(at(r21, 48, 53), `the value date of movement ${parsed.sequenceNumber}/${parsed.detailNumber}`, index) ??
363
+ (fallback ? day(at(fallback.movement.r21, 48, 53), pivotYear) ?? null : null),
364
+ amount: parsed.amount === null ? null : formatAmount(parsed.amount),
365
+ currency: account.currency,
366
+ entryAmount: part ? formatAmount(part.whole) : null,
367
+ bankReference: bankReference(r21) ?? (fallback ? bankReference(fallback.movement.r21) : null),
368
+ entryReference: null,
369
+ endToEndId: total ? null : customerReference,
370
+ transactionId: null,
371
+ instructionId: null,
372
+ paymentInformationId: total ? customerReference : null,
373
+ mandateId,
374
+ counterparty: Object.values(counterparty).every((value) => value === null) ? null : counterparty,
375
+ remittance,
376
+ bankTransactionCode: transactionCode
377
+ ? { domain: null, family: null, subFamily: null, proprietary: code, proprietaryIssuer: 'CODA' }
378
+ : null,
379
+ returnReason,
380
+ instructedAmount: null,
381
+ exchangeRate: null,
382
+ additionalInformation: free.length === 0 ? null : free.join(' '),
383
+ sequenceNumber: parsed.sequenceNumber,
384
+ detailNumber: parsed.detailNumber,
385
+ transactionCode,
386
+ globalisationCode: at(r21, 125),
387
+ structuredCommunication: said.structured,
388
+ rTransactionType: zone(r22, 113, 113),
389
+ categoryPurpose: zone(r22, 118, 121),
390
+ purpose: zone(r22, 122, 125),
391
+ information: details,
392
+ });
393
+ };
394
+ groups.forEach((group, groupIndex) => {
395
+ const entry = groupIndex + 1;
396
+ const first = lines.length + 1;
397
+ const head = group[0];
398
+ // A movement the statement counts is the record with detail number 0000:
399
+ // that is what the trailer adds up, and so what the balance moved by.
400
+ if (head.detailNumber !== '0000') {
401
+ for (const orphan of group)
402
+ build(orphan, entry, null, null);
403
+ return;
404
+ }
405
+ if (head.amount === null) {
406
+ checkable = false;
407
+ totalsReadable = false;
408
+ }
409
+ else {
410
+ movementTotal += head.amount;
411
+ if (head.amount < 0n)
412
+ debitTotal -= head.amount;
413
+ else
414
+ creditTotal += head.amount;
415
+ }
416
+ const rest = group.slice(1);
417
+ if (rest.length === 0)
418
+ return build(head, entry, null, null);
419
+ // Details of the movement; a type 9 is the detail of the type 7 before it.
420
+ const level = [];
421
+ for (const detail of rest) {
422
+ const parent = level[level.length - 1];
423
+ if (detail.type === '9' && parent)
424
+ parent.children.push(detail);
425
+ else
426
+ level.push(detail);
427
+ }
428
+ const sum = (items) => items.every((item) => item.amount !== null)
429
+ ? items.reduce((total, item) => total + item.amount, 0n)
430
+ : null;
431
+ const detailed = sum(level);
432
+ if (head.amount === null || detailed !== head.amount) {
433
+ report('batch_not_split', detailed === null || head.amount === null
434
+ ? `the ${level.length} details of movement ${head.sequenceNumber} do not each carry a readable amount; it is kept as one line`
435
+ : `the ${level.length} details of movement ${head.sequenceNumber} add up to ${formatAmount(detailed)} and the movement is ${formatAmount(head.amount)}; it is kept as one line`, first);
436
+ return build(head, entry, null, null);
437
+ }
438
+ const leaves = [];
439
+ for (const item of level) {
440
+ if (item.children.length === 0)
441
+ leaves.push({ parsed: item, fallback: head });
442
+ else if (sum(item.children) === item.amount) {
443
+ for (const child of item.children)
444
+ leaves.push({ parsed: child, fallback: item });
445
+ }
446
+ else {
447
+ report('batch_not_split', `the ${item.children.length} details of detail ${item.sequenceNumber}/${item.detailNumber} do not add up to it; it is kept as one line`, lines.length + leaves.length + 1);
448
+ leaves.push({ parsed: item, fallback: head });
449
+ }
450
+ }
451
+ leaves.forEach((leaf, nth) => build(leaf.parsed, entry, leaves.length === 1 ? null : { nth: nth + 1, count: leaves.length, whole: head.amount }, leaf.fallback));
452
+ });
453
+ // Old balance plus what moved is the new balance, or the file says so.
454
+ const separateApplication = at(header, 84, 88);
455
+ let balanced = null;
456
+ if (separateApplication !== '00000') {
457
+ report('separate_application', `the code "separate application" is ${separateApplication}: this file is an extract of the account's movements, its balances are zeroed by the standard, and it proves nothing about the account`);
458
+ }
459
+ else if (checkable && opening && closing) {
460
+ const computed = opening.scaled + movementTotal;
461
+ balanced = computed === closing.scaled;
462
+ if (!balanced) {
463
+ report('balance_mismatch', `old balance ${opening.balance.amount} plus movements ${formatAmount(movementTotal)} is ${formatAmount(computed)}, and the statement closes at ${closing.balance.amount}: a difference of ${formatAmount(closing.scaled - computed)}${account.currency ? ` ${account.currency}` : ''}`);
464
+ }
465
+ }
466
+ // The trailer: what the bank says it wrote.
467
+ const trailer = raw.trailer;
468
+ const announced = at(trailer, 17, 22);
469
+ if (!/^[0-9]{6}$/.test(announced) || Number(announced) !== raw.counted) {
470
+ report('record_count_mismatch', `the trailer announces ${announced.trim() || 'nothing'} records 1, 2, 3 and 8, and the file holds ${raw.counted}: records were lost, or added, on the way`);
471
+ }
472
+ for (const [code, from, to, computed, what] of [
473
+ ['debit_total_mismatch', 23, 37, debitTotal, 'debit'],
474
+ ['credit_total_mismatch', 38, 52, creditTotal, 'credit'],
475
+ ]) {
476
+ const said = parseAmount(at(trailer, from, to));
477
+ if (said === null || (totalsReadable && said !== computed)) {
478
+ report(code, said === null
479
+ ? `the ${what} total of the trailer, "${at(trailer, from, to)}", is not fifteen digits`
480
+ : `the trailer announces a ${what} movement of ${formatAmount(said)} and the movements with detail number 0000 add up to ${formatAmount(computed)}`);
481
+ }
482
+ }
483
+ // Free communications: one text per continuous sequence number.
484
+ const freeCommunications = [];
485
+ let lastSequence = null;
486
+ for (const record of raw.free) {
487
+ const sequence = at(record, 3, 6);
488
+ const text = at(record, 33, 112).trimEnd();
489
+ if (sequence === lastSequence && freeCommunications.length > 0) {
490
+ freeCommunications[freeCommunications.length - 1] += `\n${text}`;
491
+ }
492
+ else
493
+ freeCommunications.push(text);
494
+ lastSequence = sequence;
495
+ }
496
+ const createdAt = dayOf(at(header, 6, 11), 'the creation date');
497
+ const coded = at(oldBalance, 126, 128);
498
+ const paper = at(raw.newBalance ?? oldBalance, raw.newBalance ? 2 : 3, raw.newBalance ? 4 : 5);
499
+ const balances = [opening?.balance, closing?.balance].filter((item) => item !== undefined && item !== null);
500
+ return {
501
+ id: `${(createdAt ?? opening?.balance.date ?? '0000').slice(0, 4)}-${coded}`,
502
+ electronicSequenceNumber: /^[0-9]{3}$/.test(coded) && coded !== '000' ? String(Number(coded)) : null,
503
+ legalSequenceNumber: null,
504
+ createdAt,
505
+ period: null,
506
+ page: null,
507
+ account: {
508
+ identifier: account.identifier,
509
+ currency: account.currency,
510
+ name: zone(oldBalance, 91, 125),
511
+ ownerName: zone(oldBalance, 65, 90),
512
+ servicerBic: zone(header, 61, 71),
513
+ },
514
+ openingBalance: opening?.balance ?? null,
515
+ closingBalance: closing?.balance ?? null,
516
+ balances,
517
+ lines,
518
+ balanced,
519
+ paperSequenceNumber: /^0*$/.test(paper.trim()) ? null : paper,
520
+ duplicate: at(header, 17) === 'D',
521
+ fileReference: zone(header, 25, 34),
522
+ addressee: zone(header, 35, 60),
523
+ holderIdentification: zone(header, 72, 82),
524
+ separateApplication,
525
+ freeCommunications,
526
+ };
527
+ }
528
+ /**
529
+ * Read a CODA file — a string, or the bytes as they came — into its
530
+ * statements, their lines, and what does not add up.
531
+ *
532
+ * Throws a `StatementFileError` for what is not a readable CODA at all: a
533
+ * record of the wrong length, an unknown record, a record out of place, an
534
+ * encoding that is not the one announced. Everything else comes back, with the
535
+ * trouble named in `violations` and nothing silently repaired: a new balance
536
+ * that does not follow from the old one is returned as the bank wrote it, and
537
+ * reported.
538
+ */
539
+ export function readCoda(input, options = {}) {
540
+ const text = decode(input, options.encoding ?? 'utf-8', options.maxBytes ?? DEFAULTS.maxBytes);
541
+ const records = splitRecords(text, RECORD_LENGTH);
542
+ const violations = [];
543
+ const statements = gather(records).map((raw, index) => readStatement(raw, index + 1, options.pivotYear ?? DEFAULTS.pivotYear, violations));
544
+ return { format: 'coda', version: '2', namespace: 'coda.2', statements, violations };
545
+ }
546
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export type Encoding = 'utf-8' | 'iso-8859-1';
2
+ /**
3
+ * Bytes to text, fatally: a byte that is not the encoding announced is an
4
+ * error and not a replacement character in somebody's name. ISO-8859-1 maps
5
+ * every byte, so it is never guessed — the caller says so, or the bytes are
6
+ * UTF-8 (of which ASCII, which is what the standard writes, is a subset).
7
+ */
8
+ export declare function decode(input: string | Uint8Array, encoding: Encoding, maxBytes: number): string;
9
+ /**
10
+ * The records of the file: its lines, or — when the file has no line break at
11
+ * all, as some transfers deliver it — consecutive slices of the record length.
12
+ * Every record is exactly `length` characters, or the file is refused: nothing
13
+ * is padded and nothing is trimmed, because the last position of a record
14
+ * means something.
15
+ */
16
+ export declare function splitRecords(text: string, length: number): string[];
17
+ //# sourceMappingURL=records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../src/records.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;AAY9C;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA8C/F;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BnE"}