Skip to content

Commit

Permalink
feat: stringify Cnab file
Browse files Browse the repository at this point in the history
  • Loading branch information
yxuo committed Feb 23, 2024
1 parent 724e50d commit 08cb318
Show file tree
Hide file tree
Showing 10 changed files with 165 additions and 11 deletions.
50 changes: 42 additions & 8 deletions src/cnab/cnab-utils.spec.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,56 @@
import {
getCnabRegistros,
stringifyCnab,
stringifyRegistro,
validateRegistroPosition,
} from './cnab-utils';
import { CnabField } from './types/cnab-field.type';
import { CnabFields } from './types/cnab-field.type';
import { CnabFile } from './types/cnab-file.type';
import { CnabLote } from './types/cnab-lote.type';
import { CnabRegistro } from './types/cnab-registro.type';

process.env.TZ = 'UTC';

describe('cnab-utils.ts', () => {
// describe('stringifyCnabFile()', () => {
// it('should return text version of CnabFile accordingly', () => {
// // Arrange
// const cnab: CnabFile
// });
// });
describe('stringifyCnab()', () => {
it('should return text version of CnabFile accordingly', () => {
// Arrange
const fieldsBase: CnabFields = {
a: { pos: [1, 100], picture: '9(98)V99', value: '1' },
b: { pos: [101, 200], picture: 'X(100)', value: ' ' },
c: { pos: [201, 240], picture: 'X(40)', value: ' ' },
};
const cnab: CnabFile = {
headerArquivo: { fields: fieldsBase },
lotes: [
{
headerLote: { fields: fieldsBase },
registros: [{ fields: fieldsBase }],
trailerLote: { fields: fieldsBase },
},
],
trailerArquivo: { fields: fieldsBase },
};

// Act
const response = stringifyCnab(cnab);

// Assert
const responseLine = '0'.repeat(97) + '100' + ' '.repeat(140);
const expectedResponse =
responseLine +
'\r\n' +
responseLine +
'\r\n' +
responseLine +
'\r\n' +
responseLine +
'\r\n' +
responseLine;
expect(response.length).toEqual(expectedResponse.length);
expect(response).toEqual(expectedResponse);
});
});

describe('stringifyRegistro()', () => {
it('should return text version of Registro accordingly', () => {
Expand Down Expand Up @@ -203,7 +237,7 @@ describe('cnab-utils.ts', () => {
});

describe('getCnabRegistros()', () => {
const fields: Record<string, CnabField>[] = [
const fields: CnabFields[] = [
{ a: { picture: 'X(1)', pos: [1, 1], value: ' ' } },
{ b: { picture: 'X(2)', pos: [1, 2], value: ' ' } },
{ c: { picture: 'X(3)', pos: [1, 3], value: ' ' } },
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { CnabFields } from 'src/cnab/types/cnab-field.type';

export const cnab240GenericDetalheATemplateTest: CnabFields = {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: '0001' },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '3' },
nsr: { pos: [9, 13], picture: '9(005)', value: '00001' },
codigoSegmento: { pos: [14, 14], picture: 'X(001)', value: 'A' },
filler: { pos: [15, 119], picture: 'X(105)', value: ' ' },
valorLancamento: {
pos: [120, 134],
picture: '9(013)V99',
value: '000000001000010',
},
usoFebraban: { pos: [135, 240], picture: 'X(105)', value: ' ' },
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { CnabFields } from 'src/cnab/types/cnab-field.type';

export const cnab240GenericDetalheBTemplateTest: CnabFields = {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: '0001' },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '3' },
nsr: { pos: [9, 13], picture: '9(005)', value: '00002' },
codigoSegmento: { pos: [14, 14], picture: 'X(001)', value: 'B' },
usoExclusivoFebraban: { pos: [15, 135], picture: 'X(121)', value: ' ' },
valorDocumento: {
pos: [136, 150],
picture: '9(013)V99',
value: '000000001000010',
},
usoExclusivoFebraban2: { pos: [151, 240], picture: 'X(090)', value: ' ' },
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { CnabFields } from 'src/cnab/types/cnab-field.type';

export const cnab240GenericHeaderArquivoTemplateTest: CnabFields = {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: '0090' },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '0' },
filler: { pos: [9, 17], picture: 'X(009)', value: ' ' },
nsa: { pos: [158, 163], picture: '9(006)', value: '000101' },
filler2: { pos: [164, 240], picture: 'X(077)', value: ' ' },
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { CnabFields } from 'src/cnab/types/cnab-field.type';

export const cnab240GenericHeaderLoteTemplateTest: CnabFields = {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: '0001' },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '1' },
filler: { pos: [9, 240], picture: 'X(232)', value: ' ' },
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { CnabFields } from 'src/cnab/types/cnab-field.type';

export const cnab240GenericTrailerArquivoTemplateTest: CnabFields = {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: '9999' },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '5' },
usoExclusivoFebraban: {
pos: [9, 17],
picture: 'X(009)',
value: ' ',
},
quantidadeLotesArquivo: {
pos: [18, 23],
picture: '9(006)',
value: '000001',
},
quantidadeRegistrosArquivo: {
pos: [24, 29],
picture: '9(006)',
value: '000001',
},
quantidadeContasConciliacao: {
pos: [30, 35],
picture: '9(006)',
value: '000000',
},
usoExclusivoFebraban2: {
pos: [36, 240],
picture: 'X(205)',
value: ' '.repeat(205),
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { CnabFields } from 'src/cnab/types/cnab-field.type';

export const cnab240GenericTrailerLoteTemplateTest: CnabFields = {
codigoBanco: { pos: [1, 3], picture: '9(003)', value: '104' },
loteServico: { pos: [4, 7], picture: '9(004)', value: '0000' },
codigoRegistro: { pos: [8, 8], picture: '9(001)', value: '5' },
usoExclusivoFebraban: { pos: [9, 17], picture: 'X(009)', value: ' ' },
quantidadeRegistrosLote: {
pos: [18, 23],
picture: '9(006)',
value: '000000',
},
somatorioValores: {
pos: [24, 41],
picture: '9(016)V99',
value: '0000000000000000',
},
somatorioQtdeMoeda: {
pos: [42, 59],
picture: '9(013)V99999',
value: '0000000000000',
},
numeroAvisoDebito: { pos: [60, 65], picture: '9(006)', value: '000000' },
usoExclusivoFebraban2: {
pos: [66, 230],
picture: 'X(165)',
value: ' '.repeat(165),
},
ocorrencias: { pos: [231, 240], picture: 'X(010)', value: ' ' },
};
6 changes: 6 additions & 0 deletions src/cnab/test/templates/240/generic/example-240-104.rem
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
10400900 20001234560011111200709P 0000 0095550000000000032 CONVE DE PAGAMENTOSSA E OEBSACAIXA 20602202710234200010100001600 000
10400011C3001041 20001234560011111200702000201 0095550000000000032 CONVE DE PAGAMENTOSSA E PENSA RUA ALMIR PEDRAS
1040001300001A0000001040095550031993933180 TEREZINHA SEVERIANA 000027 105022023BRL000000000000000000000001347272000000000 01N1060000000000000000000000000 01 0
1040001300002B000100097654026005RUA ALAMEDA 00104APTO 315 CENTRO RIO DE JANEIRO 22544010RJ06022023000000001347272000000000000000000000000000000000000000000000000000000000000
10400015 00000200000000000000020000000000000000000000
10499995 000001000001000000
2 changes: 2 additions & 0 deletions src/cnab/types/cnab-field.type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ export type CnabField = {
dateFormat?: string;
};

export type CnabFields = Record<string, CnabField>;

export function isCnabField(value: any) {
return (
typeof value === 'object' &&
Expand Down
6 changes: 3 additions & 3 deletions src/cnab/types/cnab-registro.type.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { isArrayContainEqual } from 'src/utils/array-utils';
import { ICnabRegistroFieldMap } from '../interfaces/cnab-registro-field-map.interface';
import { CnabField } from './cnab-field.type';
import { CnabFields } from './cnab-field.type';

export type CnabRegistro = {
fields: Record<string, CnabField>;
fields: CnabFields;
fieldMap?: ICnabRegistroFieldMap;
};

export type CnabRegistroMapped = {
fields: Record<string, CnabField>;
fields: CnabFields;
fieldMap: ICnabRegistroFieldMap;
};

Expand Down

0 comments on commit 08cb318

Please sign in to comment.