Skip to content

Commit

Permalink
chore: decouple CnabRegistroMapped
Browse files Browse the repository at this point in the history
  • Loading branch information
yxuo committed Feb 23, 2024
1 parent e4c3f12 commit 724e50d
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 242 deletions.
145 changes: 26 additions & 119 deletions src/cnab/cnab-utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,9 @@ import {
stringifyRegistro,
validateRegistroPosition,
} from './cnab-utils';
import { ICnabRegistroFieldMap } from './interfaces/cnab-registro-field-map.interface';
import { CnabField } from './types/cnab-field.type';
import { CnabFileMapped } from './types/cnab-file-mapped.type';
import { CnabFile } from './types/cnab-file.type';
import { CnabLoteMapped } from './types/cnab-lote-mapped.type';
import { CnabLote } from './types/cnab-lote.type';
import { CnabRegistroMapped } from './types/cnab-registro-mapped.type';
import { CnabRegistro } from './types/cnab-registro.type';

process.env.TZ = 'UTC';
Expand All @@ -26,10 +22,12 @@ describe('cnab-utils.ts', () => {
it('should return text version of Registro accordingly', () => {
// Arrange
const registro: CnabRegistro = {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: 1 },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '3' },
nsr: { pos: [9, 240], picture: 'X(232)', value: 'A' },
fields: {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: 1 },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '3' },
nsr: { pos: [9, 240], picture: 'X(232)', value: 'A' },
},
};

// Act
Expand All @@ -42,10 +40,12 @@ describe('cnab-utils.ts', () => {
it('should throw exception when position doesnt match picture', () => {
// Arrange
const registro: CnabRegistro = {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: 1 },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '3' },
nsr: { pos: [9, 14], picture: '9(005)', value: 1 },
fields: {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: 1 },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '3' },
nsr: { pos: [9, 14], picture: '9(005)', value: 1 },
},
};

// Act
Expand Down Expand Up @@ -229,18 +229,14 @@ describe('cnab-utils.ts', () => {
{ w: { picture: 'X(23)', pos: [1, 23], value: ' ' } },
{ x: { picture: 'X(24)', pos: [1, 24], value: ' ' } },
];
const mapping: ICnabRegistroFieldMap = {
registroCodigoField: '',
registroLoteField: '',
};

it('should convert CnabLote record', () => {
// Arrange
const registros: CnabRegistro[] = [
{ ...fields[0], ...fields[1] },
{ ...fields[2], ...fields[3] },
{ ...fields[4], ...fields[5] },
{ ...fields[6], ...fields[7] },
{ fields: { ...fields[0], ...fields[1] } },
{ fields: { ...fields[2], ...fields[3] } },
{ fields: { ...fields[4], ...fields[5] } },
{ fields: { ...fields[6], ...fields[7] } },
];
const lote: CnabLote = {
headerLote: registros[0],
Expand All @@ -255,57 +251,19 @@ describe('cnab-utils.ts', () => {
expect(result).toEqual(registros);
});

it('should convert CnabLoteMapped record', () => {
// Arrange
const registros: CnabRegistroMapped[] = [
{
registro: { ...fields[0], ...fields[1] },
fieldMap: mapping,
},
{
registro: { ...fields[2], ...fields[3] },
fieldMap: mapping,
},
{
registro: { ...fields[4], ...fields[5] },
fieldMap: mapping,
},
{
registro: { ...fields[6], ...fields[7] },
fieldMap: mapping,
},
];
const lote: CnabLoteMapped = {
headerLote: registros[0],
registros: [registros[1], registros[2]],
trailerLote: registros[3],
};

// Act
const result = getCnabRegistros(lote);

// Assert
expect(result).toEqual([
{ ...fields[0], ...fields[1] },
{ ...fields[2], ...fields[3] },
{ ...fields[4], ...fields[5] },
{ ...fields[6], ...fields[7] },
]);
});

it('should convert CnabFile record', () => {
// Arrange
const registros: CnabRegistro[] = [
{ ...fields[0], ...fields[1] },
{ ...fields[2], ...fields[3] },
{ ...fields[4], ...fields[5] },
{ ...fields[6], ...fields[7] },
{ ...fields[8], ...fields[9] },
{ ...fields[10], ...fields[11] },
{ ...fields[12], ...fields[13] },
{ ...fields[14], ...fields[15] },
{ ...fields[16], ...fields[27] },
{ ...fields[18], ...fields[19] },
{ fields: { ...fields[0], ...fields[1] } },
{ fields: { ...fields[2], ...fields[3] } },
{ fields: { ...fields[4], ...fields[5] } },
{ fields: { ...fields[6], ...fields[7] } },
{ fields: { ...fields[8], ...fields[9] } },
{ fields: { ...fields[10], ...fields[11] } },
{ fields: { ...fields[12], ...fields[13] } },
{ fields: { ...fields[14], ...fields[15] } },
{ fields: { ...fields[16], ...fields[27] } },
{ fields: { ...fields[18], ...fields[19] } },
];
const lotes: CnabLote[] = [
{
Expand All @@ -331,56 +289,5 @@ describe('cnab-utils.ts', () => {
// Assert
expect(result).toEqual(registros);
});

it('should convert CnabFileMapped record', () => {
// Arrange
const registros: CnabRegistroMapped[] = [
{ registro: { ...fields[0], ...fields[1] }, fieldMap: mapping },
{ registro: { ...fields[2], ...fields[3] }, fieldMap: mapping },
{ registro: { ...fields[4], ...fields[5] }, fieldMap: mapping },
{ registro: { ...fields[6], ...fields[7] }, fieldMap: mapping },
{ registro: { ...fields[8], ...fields[9] }, fieldMap: mapping },
{ registro: { ...fields[10], ...fields[11] }, fieldMap: mapping },
{ registro: { ...fields[12], ...fields[13] }, fieldMap: mapping },
{ registro: { ...fields[14], ...fields[15] }, fieldMap: mapping },
{ registro: { ...fields[16], ...fields[17] }, fieldMap: mapping },
{ registro: { ...fields[18], ...fields[19] }, fieldMap: mapping },
];

const lotes: CnabLoteMapped[] = [
{
headerLote: registros[1],
registros: [registros[2], registros[3]],
trailerLote: registros[4],
},
{
headerLote: registros[5],
registros: [registros[6], registros[7]],
trailerLote: registros[8],
},
];
const file: CnabFileMapped = {
headerArquivo: registros[0],
lotes,
trailerArquivo: registros[9],
};

// Act
const result = getCnabRegistros(file);

// Assert
expect(result).toEqual([
{ ...fields[0], ...fields[1] },
{ ...fields[2], ...fields[3] },
{ ...fields[4], ...fields[5] },
{ ...fields[6], ...fields[7] },
{ ...fields[8], ...fields[9] },
{ ...fields[10], ...fields[11] },
{ ...fields[12], ...fields[13] },
{ ...fields[14], ...fields[15] },
{ ...fields[16], ...fields[17] },
{ ...fields[18], ...fields[19] },
]);
});
});
});
49 changes: 5 additions & 44 deletions src/cnab/cnab-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,7 @@ import { Exception } from 'handlebars';
import { CNAB_SUPPORTED_FORMATS } from './cnab-consts';
import { getCnabPictureValue, parseField } from './cnab-field-utils';
import { CnabField } from './types/cnab-field.type';
import {
CnabFileMapped,
isCnabFileMapped,
} from './types/cnab-file-mapped.type';
import { CnabFile, isCnabFile } from './types/cnab-file.type';
import {
CnabLoteMapped,
isCnabLoteMapped,
} from './types/cnab-lote-mapped.type';
import { CnabLote, isCnabLote } from './types/cnab-lote.type';
import { CnabRegistro } from './types/cnab-registro.type';

Expand All @@ -19,7 +11,7 @@ import { CnabRegistro } from './types/cnab-registro.type';
*/
export function stringifyRegistro(registro: CnabRegistro) {
let line = '';
const registros = Object.values(registro);
const registros = Object.values(registro.fields);
for (const i in registros) {
const current = registros[i];
validateRegistroPosition(
Expand All @@ -37,8 +29,8 @@ export function parseRegistro(
registro: CnabRegistro,
textStart = 0,
): CnabRegistro {
const regEntries = Object.entries(registro);
const newRegistro: CnabRegistro = {};
const regEntries = Object.entries(registro.fields);
const newRegistro: CnabRegistro = { fields: {} };
for (let i = 0; i < regEntries.length; i++) {
const [key, field] = regEntries[i];
validateRegistroPosition(
Expand Down Expand Up @@ -78,23 +70,13 @@ export function validateRegistroPosition(
}
}

export function getCnabRegistros(
cnab: CnabFile | CnabFileMapped | CnabLote | CnabLoteMapped,
): CnabRegistro[] {
export function getCnabRegistros(cnab: CnabFile | CnabLote): CnabRegistro[] {
const plainRegistros: CnabRegistro[] = [];

if (isCnabLote(cnab)) {
plainRegistros.push(...getCnabRegistrosFromLote(cnab as CnabLote));
} else if (isCnabLoteMapped(cnab)) {
plainRegistros.push(
...getCnabRegistrosFromLoteMapped(cnab as CnabLoteMapped),
);
} else if (isCnabFile(cnab)) {
plainRegistros.push(...getCnabRegistrosFromCnabFile(cnab as CnabFile));
} else if (isCnabFileMapped(cnab)) {
plainRegistros.push(
...getCnabRegistrosFromCnabFileMapped(cnab as CnabFileMapped),
);
} else {
throw new Exception('Unsupported object type.');
}
Expand All @@ -109,32 +91,11 @@ function getCnabRegistrosFromCnabFile(file: CnabFile): CnabRegistro[] {
];
}

function getCnabRegistrosFromCnabFileMapped(
file: CnabFileMapped,
): CnabRegistro[] {
return [
file.headerArquivo.registro,
...file.lotes.reduce(
(l, i) => [...l, ...getCnabRegistrosFromLoteMapped(i)],
[],
),
file.trailerArquivo.registro,
];
}

function getCnabRegistrosFromLote(lote: CnabLote): CnabRegistro[] {
return [lote.headerLote, ...lote.registros, lote.trailerLote];
}

function getCnabRegistrosFromLoteMapped(lote: CnabLoteMapped): CnabRegistro[] {
return [
lote.headerLote.registro,
...lote.registros.reduce((l, i) => [...l, i.registro], []),
lote.trailerLote.registro,
];
}

export function stringifyCnab(cnab: CnabFile | CnabFileMapped): string {
export function stringifyCnab(cnab: CnabFile): string {
return getCnabRegistros(cnab)
.reduce((l, i) => [...l, stringifyRegistro(i)], [])
.join('\r\n');
Expand Down
25 changes: 0 additions & 25 deletions src/cnab/types/cnab-file-mapped.type.ts

This file was deleted.

5 changes: 2 additions & 3 deletions src/cnab/types/cnab-file.type.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { isArrayContainEqual } from 'src/utils/array-utils';
import { CnabLote } from './cnab-lote.type';
import { CnabRegistro, isCnabRegistro } from './cnab-registro.type';
import { CnabRegistro } from './cnab-registro.type';

export type CnabFile = {
headerArquivo: CnabRegistro;
Expand All @@ -16,7 +16,6 @@ export function isCnabFile(value: any) {
'headerArquivo',
'lotes',
'trailerArquivo',
]) &&
isCnabRegistro(value.headerArquivo)
])
);
}
24 changes: 0 additions & 24 deletions src/cnab/types/cnab-lote-mapped.type.ts

This file was deleted.

5 changes: 2 additions & 3 deletions src/cnab/types/cnab-lote.type.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { isArrayContainEqual } from 'src/utils/array-utils';
import { CnabRegistro, isCnabRegistro } from './cnab-registro.type';
import { CnabRegistro } from './cnab-registro.type';

export type CnabLote = {
headerLote: CnabRegistro;
Expand All @@ -15,7 +15,6 @@ export function isCnabLote(value: any) {
'headerLote',
'registros',
'trailerLote',
]) &&
isCnabRegistro(value.headerLote)
])
);
}
16 changes: 0 additions & 16 deletions src/cnab/types/cnab-registro-mapped.type.ts

This file was deleted.

Loading

0 comments on commit 724e50d

Please sign in to comment.