jessicamrbr / jsons-to-cnab

Convert JSON data and map to cnab file and the opposite too
MIT License
6 stars 3 forks source link

Arquivo gerado é recusado pelo Bradesco. #2

Closed olegario96 closed 5 years ago

olegario96 commented 5 years ago

Consegui gerar um arquivo no layout CNAB 240 do bradesco, porém ao tentar subir o arquivo dentro do sistema do Bradesco, a seguinte mensagem foi exibida pelo sistema:

unnamed

Configurei todos os campos conforme a documentação e todos as linhas geradas possuem o tamanho de 240. Segue abaixo o arquivo gerado.

bradesco.txt

jessicamrbr commented 5 years ago

Eu só bati o olho, mas já vi algumas coisas estranhas para avaliar. O trailer do arquivo não possui total de valor e linhas. O trailer de lote também.

Os tamanhos das linhas do arquivo bradesco.txt realmente estão ok. Talvez esse ret esteja diferente.

postar o código pode ajudar a descobrir. Entrar em contato com o bradesco para entender melhor qual o erro também.

Outra curiosidade, imagino que esta gerando uma remessa, porque salvou como .ret? Enviou o arquivo correto?

Deixo um convite a depois adicionar o layout do bradesco ao projeto para contribuir com o projeto.

jessicamrbr commented 5 years ago

Sobre contribuir com o projeto, veja o diretório Layout e o método getFromLayoutsLib. Vai ajudar outros membros que utilizam o bradesco.

olegario96 commented 5 years ago

Eu não entendi muito bem o que tu quis dizer com "total de valor e linhas". O arquivo é o mesmo, eu só mudei a extensão, pois o Github não aceitou a extensão .ret. O código que eu estou usando para gerar o arquivo é o seguinte:

const fs = require('fs')

const registryLength = 240
const jsonsToCnab = new JsonsToCnab(registryLength)

const headerFile = [
    {
        fieldName: "CODIGODOBANCO",
        positionStart: 1,
        positionEnd: 3,
        positionLength: 3,
        picture: "9",
        defaultValue: "237",
    },
....

const headerFileData = {
    // Length 8
    DATAGERACAO: "19032018",
    // Length 6
    HORAGERACAO: "104333",
    // Length 6
    NUMEROSEQUENCIAL: "000001"
}

const headerBatch = [
    {
        fieldName: "CODIGODOBANCO",
        positionStart: 1,
        positionEnd: 3,
        positionLength: 3,
        picture: "9",
        defaultValue: "237"
    },
....

const rowDetailSegmentA = [
    {
        fieldName: "CODIGODOBANCO",
        positionStart: 1,
        positionEnd: 3,
        positionLength: 3,
        picture: "9",
        defaultValue: "237"
    },
....

const rowDetailSegmentB = [
    {
        fieldName: "CODIGODOBANCO",
        positionStart: 1,
        positionEnd: 3,
        positionLength: 3,
        picture: "9",
        defaultValue: "237"
    },
....

const footerBatch = [
    {
        fieldName: "CODIGODOBANCO",
        positionStart: 1,
        positionEnd: 3,
        positionLength: 3,
        picture: "9",
        defaultValue: "237"
    },
....

const footerFile = [
    {
        fieldName: "CODIGODOBANCO",
        positionStart: 1,
        positionEnd: 3,
        positionLength: 3,
        picture: "9",
        defaultValue: "237"
    },
...

const footerFileData = {
    // Length 6
    QUANTIDADELOTES: jsonsToCnab.counterLots().toString(),
    // Length 6
    QUANTIDADEREGISTROS: jsonsToCnab.counterRegistersInFile().toString(),
    // Length 6
    QUANTIDADECONTAS: jsonsToCnab.counterRegistersInFile().toString(),
}

jsonsToCnab.configHeaderFile(headerFile)
jsonsToCnab.setHeaderFile(headerFileData)

const content = fs.readFileSync('batches.json')
const batches = JSON.parse(content)

i = 1;
for (const batch of batches.batches) {
    jsonsToCnab.configHeaderLot(headerBatch)
    const headerBatchData = {
        // Length 4
        CODIGODOLOTE: "000" + i.toString(),
    }
    jsonsToCnab.addHeaderLote(headerBatchData)

    jsonsToCnab.configRow(rowDetailSegmentA)
    const rowDetailSegmentAData = {
        // Length 4
        CODIGODOLOTE: "000" + i.toString(),
        // Length 5
        AGENCIA: batch.account.agency,
        // Length 1
        VERIFICADORAGENCIA: batch.account.agencyDigit,
        // Length 12
        CONTA: batch.account.account,
        // Length 1
        VERIFICADORCONTA: batch.account.accountDigit,
        // Length 30
        NOME: batch.name,
        // Length 20
        NUMERO: "0000000000000000000" + i.toString(),
        // Length 8
        DATAPAGAMENTO: batch.paymentDate,
        // Length 10
        QUANTIDADEMOEDA: batch.coinAmount,
        // Length 8
        DATAREAL: batch.paymentDate,
    }
    jsonsToCnab.addRow(rowDetailSegmentAData)

    jsonsToCnab.configRow(rowDetailSegmentB)
    const rowDetailSegmentBData = {
        // Length 4
        CODIGODOLOTE: "000" + i.toString(),
        // Length 14
        NUMEROINSCRICAO: batch.cpf

    }
    jsonsToCnab.addRow(rowDetailSegmentBData)

    jsonsToCnab.configFooterLot(footerBatch)
    const footerBatchData = {
        // Length 4
        CODIGODOLOTE: "000" + i.toString(),
        // Length 6
        QUANTIDADEREGISROS: jsonsToCnab.counterRegistersInCurrentLot(),
    }
    jsonsToCnab.addFooterLote(footerBatchData)
    ++i
}

jsonsToCnab.configFooterFile(footerFile)
jsonsToCnab.setFooterFile(footerFileData)

fileContent = jsonsToCnab.save()
fs.writeFileSync('./bradesco.ret', fileContent)

Assim que eu conseguir gerar o arquivo no formato correto, pretendo ajudar outros usuários sim, contribuindo com um PR.

jessicamrbr commented 5 years ago

Algumas dicas:

jessicamrbr commented 5 years ago

Especificamente sobre o erro no banco precisa entrar em contato com o Bradesco para validar melhor qual foi e talvez ajustar no layout ou nos dados, mas esta no caminho certo, só alguns ajustes para melhorar.

olegario96 commented 5 years ago

A operação está em Loop, porque eu quero gerar um arquivo de pagamento em massa, ou seja adicionar vários lotes cada um com uma conta com suas operações. Essa seria a forma correta?

jessicamrbr commented 5 years ago

Talvez um exemplo ajude:

Suas contas:

Seus fornecedores:

A melhor organização de lotes seria: Lote 1 - 2 trasnferências por ted da conta 1 Lote 2 - 1 trasnferências por ted da conta 2 Lote 3 - 2 pagamentos de boletos da conta 2

agora se todos os pagamentos fossem por boletos e saíssem da conta 1, você teria um Único lote.

antes de percorrer o loop de seus pagamentos, você precisa agrupa-los para gerar um lote por conta origem + operação.

Caso contrario você vai criar um lote para cada registro desnecessariamente.

Um lote pode ter vários registros desde que o dinheiro sai da mesma conta e seu pela mesma forma de pagamento.

olegario96 commented 5 years ago

Entendi. O destino vai ser sempre diferente no meu caso, mas a origem vai ser sempre a mesma. Esse ponto não havia ficado claro na documentação do Bradesco. E isso faz mais sentido, realmente visto que estamos falando de "lotes". Muito obrigado. Vou arrumar esses pontos no meu código e tentar entrar em contato com Bradesco.

jessicamrbr commented 5 years ago

Show, depois se puder compartilhe a versão ajustada e o problema apontado pelo Bradesco, para contribuir com os demais. Se realmente puder subir o PR com layout do bradesco, vai reduzir muito seu código e colaborar mais ainda com os demais.

jessicamrbr commented 5 years ago

@olegario96 o @gilsonsouzah notou que alguns sistemas(bancos) podem solicitar uma finalização de linha diferente "\n", "\r\n", talvez esse seja o mesmo caso que o seu. Experimente a nova versão lançada no NPM

olegario96 commented 5 years ago

Não sabia disso. Vou testar então. Muito obrigado @jessicamrbr e @gilsonsouzah