Jump to content

rodrigod6

Membros
  • Content Count

    103
  • Joined

  • Last visited

Community Reputation

21 Excellent

1 Follower

About rodrigod6

  • Rank
    Membro

Profile Information

  • Sexo
    Masculino
  • Localização
    CWB

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Bom dia, A título de comentário, no github temos o projeto Api-Boleto, que foi implementado em Linguagem Go. Podemos verificar como é a implementação de outros bancos. Eles já tem implementado os bancos: Banco do Brasil Caixa Citibank Santander BradescoShopFacil BradescoNetEmpresas Itau https://github.com/mundipagg/boleto-api Não encontrei o layout dos bancos no projeto, mas temos outros tópicos que temos referências com os manuais. Mas tem esse que o Davi coloca o fonte da Caixa no último comentário e alguns layouts (bradesco, caixa)
  2. Recebemos este e-mail sobre a atualização do ws da GNRE para a versão 2.00 Prezado Contribuinte, Informamos que a partir do dia 01/04/2019, o Portal GNRE terá sua versão atualizada para 2.0. A versão 2.0 contemplará três opções para geração das guias: 1. GNRE Simples - esta opção equivale à geração da GNRE atual, ou seja, geração de guia para apenas um pagamento. 2. GNRE com Múltiplos Documentos de Origem - nesta opção poderão ser adicionados múltiplos documentos de origem, desde que mantida a mesma UF destinatária, o mesmo Contribuinte Emitente, o mesmo Código de Receita e o mesmo Tipo de Documento de Origem. 3. GNRE com Múltiplas Receitas - nesta opção poderão ser adicionados diversos códigos de receitas, desde que se mantenha a mesma UF destinatária e o mesmo Contribuinte Emitente. Nesta opção serão aceitos vários códigos de receita, inclusive podendo repetir o mesmo código de receita. Para os contribuintes que utilizam os serviços (webservices) de automação que o Portal disponibiliza, será necessário adequar suas aplicações para a nova estrutura do XML versão 2.0. Haverá um período em que o Portal da GNRE aceitará as duas versões simultaneamente.Este período será para que as UFs e os contribuintes possam fazer os ajustes necessários para utilização desta versão. Ao fim deste período só serão aceitas requisições, via webservice, na nova versão. O período inicial da versão 2.0 será informado no Portal GNRE (Testes/Homologação e Produção) em momento posterior. Para maiores detalhes, acessar o Portal GNRE no ambiente de Testes/Homologação (http://www.testegnre.pe.gov.br) e clicar no menu Automação. Neste link, você encontrará: • Manual para Preenchimento do Lote: o Formato do arquivo (versão 1.0 e 2.0) o Dicionário de dados do arquivo XML (versão 1.0 e 2.0) o Regras de Preenchimento • Anexos • Links para as empresas solicitarem a utilização dos webservices • Manual de Integração do Contribuinte (versão 2.0) • Endereço dos serviços (webservices) Em caso de dúvidas encaminhar e-mail para [email protected] Atenciosamente, Gestor Nacional do GNRE Secretaria da Fazenda do Estado de Pernambuco Na encontrei mais informações sobre o período que inicia o ambiente de testes. E também não encontrei informações sobre até quando as duas irão funcionar em paralelo. Alguém tem mais informações a respeito? Obrigado,
  3. Acho que falta o c10_valorTotal no seu arquivo: <c10_valorTotal>55.81</c10_valorTotal> with ACBrGNRE1.Guias.Add.GNRE do begin ... c10_valorTotal := c06_valorPrincipal; ... abs
  4. Modifiquei o AcbrBancoBrasil nos motivos do retorno para que não quando ache o motivo, retorne 00-Outros motivos. Fiz a modificação baseado no AcbrSantander que já possui a funcionalidade. 1) Primeira mudança - alinhamento do if que verifica CNAB 400 2) Alinhamento/padronização dos motivos do tipo da ocorrência: toRetornoComandoRecusado: //03 (Recusado) 3) Adicionado um retorno padrão (CNAB 400), semelhante ao que tem no fonte do AcbrSantander, para retornar outros motivos. 4) CNAB 240 - (toRetornoRegistroRecusado) - Alinhado case, e colocado no result os códigos junto com a descrição, seguindo o padrão existente: 5) CNAB 240 -(toRetornoLiquidado, toRetornoBaixaAutomatica, toRetornoLiquidadoSemRegistro: // 06, 09 e 17 (Liquidado)) Colocado no result os códigos junto com a descrição, seguindo o padrão existente: 6) Mesmo acima para toRetornoDebitoTarifas 7) Adicionado um retorno padrão (CNAB 240), semelhante ao que tem no fonte do AcbrSantander, para retornar outros motivos. Segue arquivo fonte para análise se pode ser alterado no Acbr. ACBrBancoBrasil.Acbr.2018.10.26-Correcao.pas Obrigado,
  5. Estou com o mesmo retorno do código A9 no motivo, também no arquivo de retorno do Banco do Brasil. Ele só retornar quando vem o retorno de entrada confirmada no código da ocorrência. No meu arquivo esta retorno assim: 0000000000000000000000161A9 11019088330 000 0000000000000000000000161A9A4 11019088330 000 Primeiro título veio A9 (Linha 1) No segundo veio A9A4 (Linha 3) No layout do CNAB 240 temos o campo 28.3T que identifica os códigos dos motivos das ocorrências Encontrei no final das notas do campo o seguinte trecho: Detalhamento para DDA: Para título DDA, o campo “Código de movimento de retorno”, posição 16 a 17, apresentará a mensagem “02 – Entrada confirmada”. Além disso, no campo “Motivo da Ocorrência”, posição 214 a 223, haverá a mensagem “A4 – Sacado DDA”. Entendo que quando no campo 16-17 vir 02 - Entrada confirmada No motivo da ocorrência vier A4, será A4 - Sacado DDA. Quanto ao A9 não consegui identificar qual o tratamento ou mensagem do mesmo. Teríamos que criar no ACBrBancoBrasil, um código assim: toRetornoRegistroConfirmado: //02 (Entrada) case CodMotivo of 00: Result:='00-Por meio magnético'; 11: Result:='11-Por via convencional'; 16: Result:='16-Por alteração do código do cedente'; 17: Result:='17-Por alteração da variação'; 18: Result:='18-Por alteração de carteira'; A4: Result:='A4-Sacado DDA' end; Mas o campo CodMotivo é do tipo System.Integer não sendo possível fazer isso. Se alguém tiver alguma ideia de como ajustar, pensei em algumas opções: 1 - Mudar a variável da Integer para String; 2 - Colocar o else do case semelhante ao do santander: else Result := IntToStrZero(CodMotivo, 3) + ' - Outros Motivos'; end; Só que ai com 2 e não apareceria o A4. O que acham, alguma ideia? Mais alguém recebeu retornos de entrada confirmadas com este código?
  6. Na última versão já tem e diferença do CNAB 240 e 400. function TACBrBancoBrasil.CodMotivoRejeicaoToDescricao(const TipoOcorrencia: TACBrTipoOcorrencia; CodMotivo: Integer): String; begin if (ACBrBanco.ACBrBoleto.LayoutRemessa = c400) then begin // end else //240 // ... Somente para o banco do brasil, e como o colega citou, temos dois layouts (CNAB 240 e CNAB 400) Acho que são esses links BB - Leiaute CNAB 240 - Novembro 2016 BB - Layout de Arquivo - CNAB 400 - Março - 2018
  7. Pesquisei e achei esses https://www.projetoacbr.com.br/forum/topic/35914-trasmissão-automática-remessa-e-retorno/?tab=comments#comment-285905
  8. Boa tarde, Estou precisando enviar a mensagem do Segmento S, onde possui 200 colunas, para envio no Santander e no Banco do Brasil. Fiz uma análise do fonte da Caixa. Temos no Segmento R - de 40 colunas o campo mensagem 3 (Coluna 100 a 139 - Mensagem 3) - é enviado em branco. {SEGMENTO R} Result:= Result + #13#10 + IntToStrZero(ACBrBanco.Numero, 3) ... PadRight('', 40, ' ') + // 100 a 139 - Mensagem 3 No segmento S é enviado Mensagem 5, 6, 7, 8 e 9, totalizando 200 colunas de mensagem {SEGMENTO S} if (Mensagem.Count > 0) then begin Result := Result + #13#10 + ... MontarInstrucoes2 + // 019 - 058 / Mensagem 5 // 059 - 098 / Mensagem 6 // 099 - 138 / Mensagem 7 // 139 - 178 / Mensagem 8 // 179 - 218 / Mensagem 9 No Banco do Brasil e no Santander, não temos a programação das mensagens no segmento S. No Santander, no segmento S temos a rotina MontarInstrucoes2, mas gera as 200 colunas em branco. Seguindo o exemplo da Caixa, talvez mudando de: function MontarInstrucoes2: string; begin with ACBrTitulo do begin if Mensagem.Count <= 2 then begin // Somente duas linhas, foi montado o MonarInstrucoes1 Result := PadRight('', 200, ' '); // 5 registros Exit; end; Para: function MontarInstrucoes2: string; begin with ACBrTitulo do begin if (Mensagem.Count <= 2) then begin if (Mensagem.Count = 2) then Result := Copy(PadRight(Mensagem[0] +' / '+ Mensagem[1], 200, ' '), 1, 200) else Result := Copy(PadRight(Mensagem[0], 200, ' '), 1, 200); Exit; end; Já no Banco do Brasil, não é gerado nem a Mensagem 3 e nem a mensagem 5, 6, 7, 8 e 9, vejamos o Segmento R: {SEGMENTO R} Result:= Result + #13#10 + ... PadRight('',110,' ') + // 90 - 199 Obs.: Segmento S não tem. Então a sugestão de alteração seria mudar os 110 em branco para 10, 40 e 60: No segmento S: {SEGMENTO R} Result:= Result + #13#10 + ... PadRight('',10,' ') + // 90 - 99 - Informação ao Sacado PadRight(AMensagem,40,' ') + // 100 - 139 - Mensagem 3 PadRight('',60,' ') + // 140 - 199 - Não tratado Se no segmento S a nova programação: {SEGMENTO S} if (Mensagem.Count > 0) then begin Result := Result + #13#10 + IntToStrZero(ACBrBanco.Numero, 3) + // 001 a 003 - Código do banco '0001' + // 004 - 007 - Numero do lote remessa '3' + // 008 - 008 - Tipo de registro IntToStrZero((3 * ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo))+ 4 ,5) + // 009 - 013 - Número seqüencial do registro no lote - Cada título tem 2 registros (P e Q) 'S' + // 014 - 014 - Cód. Segmento do registro detalhe Space(1) + // 015 - 015 - Reservado (uso Banco) ATipoOcorrencia + // 016 - 017 - Código de movimento remessa ifthen( (Mensagem.Count <= 2), '0', '8' ) + // 018 - 018 - Identificação da impressão ifthen( (Mensagem.Count <= 2), '00', '' ) + // 019 - 020 - Reservado (uso Banco) para tipo de impressão 1 e 2 MontarInstrucoes2 + // 019 - 058 - Mensagem 5 // 059 - 098 - Mensagem 6 // 099 - 138 - Mensagem 7 // 139 - 178 - Mensagem 8 // 179 - 218 - Mensagem 9 ifthen( (Mensagem.Count <= 2), '00' + Space(78) ,Space(22)); // 219 - 240 - Reservado (uso Banco) para tipo de impressão 3 end; // 161 - 240 - Reservado (uso Banco) para tipo de impressão 1 e 2 {SEGMENTO S - FIM} Segue os arquivos modificados, para verificar a possibilidade de alteração para o envio das Obs no Segmento S do Banco Santander e Banco do Brasil. Obrigado, Rodrigo ACBrBancoSantanderCorrecao.pas ACBrBancoBrasilCorrecao.pas
  9. Boa tarde Colegas, Estou utilizando o ACBr para envio da remessa e retorno do banco Santander, mas no processamento do retorno encontrei um problema, ou talvez foi feito para ser assim (MotivoRejeicaoComando - somente motivos de rejeição). Primeiro resumidamente é que o Motivo que vem no arquivo quando é liquidação ou baixa(Ocorrência 06 ou 09) ou não está entrando na rotina Titulo.MotivoRejeicaoComando.Add. Assim não temos disponíveis os motivos das ocorrências na baixa/liquidação. Versão mais detalhada: procedure TACBrBancoSantander.LerRetorno240 Layout: Santander - CNAB 240 - Layout de Arquivo - Padrão 240 – Cobrança - Versão 2.8.3 - Setembro/2017 Nota 41 - Indica que o código de ocorrência 03(03 - Entrada rejeitada), 26(26 - instrução rejeitada) e 30(30 - alteração de dados rejeitada) estão relacionados com a nota 41-a E os códigos 06(liquidação), 09(baixa) e 17 estão relacionados com a nota 41-C - Ai temos uma relação - Códigos de rejeições de 01 a 64 associados ao códigos de movimento 03, 26 e 30 - E temos uma relação de Código de liquidação/baixa de 01 a 13 associados ao código de movimento 06, 09 e 17 Bom, analisando um arquivo de retorno do Santander, no segmento, T, na coluna 209(Motivo), quando a ocorrência vem 06(Liquidação) veio os motivos 03(No próprio banco) e 04(Compensação eletrônica). Ai analisando o arquivo do Acbr ( ACBrBancoSantander.pas ) verifiquei que na leitura do retorno na procedure TACBrBancoSantander.LerRetorno240 - DoVerOcorrencia Só tem a tratativa dos motivos das ocorrências 03, 26 e 30, as quais estão ligadas somente as rejeições. if MatchText(AOcorrencia, ['03', '26', '30']) then Mas eu preciso dos motivos das ocorrências 06, 09 e 17, principalmente da 06 e 09 Então minha sugestão de alteração do código seria: if MatchText(AOcorrencia, ['03', '06', '09', '17', '26', '30']) then begin pMotivoRejeicao:= 209; for I:= 0 to 4 do begin CodMotivo:= StrToIntDef(copy(Linha,pMotivoRejeicao,2),0); if CodMotivo > 0 then begin Titulo.MotivoRejeicaoComando.Add(copy(Linha, pMotivoRejeicao, 2)); Titulo.DescricaoMotivoRejeicaoComando.Add(CodMotivoRejeicaoToDescricao( Titulo.OcorrenciaOriginal.Tipo,CodMotivo)); end; Inc(pMotivoRejeicao, 2); end; if AOcorrencia = '03' then Tipo:= toRetornoRegistroRecusado else if AOcorrencia = '26' then Tipo := toRetornoInstrucaoRejeitada else if AOcorrencia = '30' then Tipo := toRetornoAlteracaoDadosRejeitados else if MatchText(AOcorrencia, ['06', '09']) then Tipo := CodOcorrenciaToTipo(StrToInt(AOcorrencia)) else if AOcorrencia = '17' then Tipo := toRetornoLiquidadoAposBaixaOuNaoRegistro end Ou seja incluir no primeiro if o '06', '09', '17'... E colocar no if do Tipo adicionar o 06 , 09 e 17. os quais puxei de baixo onde ele entrava antes. Ver a possibilidade de alteração para que possamos ter os motivos nas ocorrências: (09-baixa ou 06-liquidação) ou se MotivoRejeicaoComando é somente para rejeições e não tem a opção de pegar o motivo quando da baixa. Mas iria enviar o arquivo em anexo do fonte atualizado (2018.05.30) com a alteração mencionada, caso MotivoRejeicaoComando não seja somente rejeição. Mas fui testar a modificação e ai descobri que os códigos de motivos que retornam são os códigos do layout 400. Layout: PRODUTOS RECEBIMENTOS - CNAB 400 (padrão Santander) - Com Registro - Versão 2.17 – Outubro/2017 Página 22 - Nota 13: Códigos de Ocorrências - temos os códigos com 3 dígitos - e na 240 temos com dois dígitos o motivo. Então, seguindo o padrão do ACBrBancoBrasil.pas eu cadastrei os códigos dos motivos para o CNAB 240. Então tive que mudar na procedure TACBrBancoSantander.LerRetorno240 - DoVerOcorrencia Esse código : if AOcorrencia = '03' then Tipo:= toRetornoRegistroRecusado else if AOcorrencia = '26' then Tipo := toRetornoInstrucaoRejeitada else if AOcorrencia = '30' then Tipo := toRetornoAlteracaoDadosRejeitados else if MatchText(AOcorrencia, ['06', '09']) then Tipo := CodOcorrenciaToTipo(StrToInt(AOcorrencia)) else if AOcorrencia = '17' then Tipo := toRetornoLiquidadoAposBaixaOuNaoRegistro; Antes do código da rejeição, pois é necessário saber o Tipo na rotina CodMotivoRejeicaoToDescricao, então ficou assim esse trecho: if MatchText(AOcorrencia, ['03', '06', '09', '17', '26', '30']) then begin if AOcorrencia = '03' then Tipo:= toRetornoRegistroRecusado else if AOcorrencia = '26' then Tipo := toRetornoInstrucaoRejeitada else if AOcorrencia = '30' then Tipo := toRetornoAlteracaoDadosRejeitados else if MatchText(AOcorrencia, ['06', '09']) then Tipo := CodOcorrenciaToTipo(StrToInt(AOcorrencia)) else if AOcorrencia = '17' then Tipo := toRetornoLiquidadoAposBaixaOuNaoRegistro; pMotivoRejeicao:= 209; for I:= 0 to 4 do begin CodMotivo:= StrToIntDef(copy(Linha,pMotivoRejeicao,2),0); if CodMotivo > 0 then begin Titulo.MotivoRejeicaoComando.Add(copy(Linha, pMotivoRejeicao, 2)); Titulo.DescricaoMotivoRejeicaoComando.Add(CodMotivoRejeicaoToDescricao( Titulo.OcorrenciaOriginal.Tipo,CodMotivo)); end; Inc(pMotivoRejeicao, 2); end; Bom agora a mudança no procedimento CodMotivoRejeicaoToDescricao somente a parte do else para o CNAB 240: else // 240 begin case TipoOcorrencia of toRetornoComandoRecusado: //03 (Entrada rejeitada) case CodMotivo of 01: Result:='Codigo do banco invalido'; 02: Result:='Codigo do registro detalhe invalido'; 03: Result:='Codigo do segmento invalido'; 04: Result:='Codigo do movimento nao permitido para carteira'; 05: Result:='Codigo de movimento invalido'; 06: Result:='Tipo/numero de inscricao do beneficiário invalidos'; 07: Result:='Agencia/Conta/DV invalido'; 08: Result:='Nosso numero invalido'; 09: Result:='Nosso numero duplicado'; 10: Result:='Carteira invalida'; 11: Result:='Forma de cadastramento do titulo invalido'; 12: Result:='Tipo de documento invalido'; 13: Result:='Identificacao da emissao do bloqueto invalida'; 14: Result:='Identificacao da distribuicao do bloqueto invalida'; 15: Result:='Caracteristicas da cobranca incompativeis'; 16: Result:='Data de vencimento invalida'; 17: Result:='Data de vencimento anterior a data de emissao'; 18: Result:='Vencimento fora do prazo de operacao'; 19: Result:='Titulo a cargo de Bancos Correspondentes com vencimento inferior XX dias'; 20: Result:='Valor do titulo invalido'; 21: Result:='Especie do titulo invalida'; 22: Result:='Especie nao permitida para a carteira'; 23: Result:='Aceite invalido'; 24: Result:='Data da emissao invalida'; 25: Result:='Data da emissao posterior a data'; 26: Result:='Codigo de juros de mora invalido'; 27: Result:='Valor/Taxa de juros de mora invalido'; 28: Result:='Codigo do desconto invalido'; 29: Result:='Valor do desconto maior ou igual ao valor do titulo '; 30: Result:='Desconto a conceder nao confere'; 31: Result:='Concessao de desconto - ja existe desconto anterior'; 32: Result:='Valor do IOF invalido'; 33: Result:='Valor do abatimento invalido'; 34: Result:='Valor do abatimento maior ou igual ao valor do titulo'; 35: Result:='Abatimento a conceder nao confere'; 36: Result:='Concessao de abatimento - ja existe abatimento anterior'; 37: Result:='Codigo para protesto invalido'; 38: Result:='Prazo para protesto invalido'; 39: Result:='Pedido de protesto nao permitido para o titulo'; 40: Result:='Titulo com ordem de protesto emitida'; 41: Result:='Pedido de cancelamento/sustacao para titulos sem instrucao de protesto'; 42: Result:='Codigo para baixa/devolucao invalido'; 43: Result:='Prazo para baixa/devolucao invalido'; 44: Result:='Codigo da moeda invalido'; 45: Result:='Nome do pagador nao informado'; 46: Result:='Tipo/numero de inscricao do pagador invalidos'; 47: Result:='Endereco do pagador nao informado'; 48: Result:='CEP invalido'; 49: Result:='CEP sem praca de cobranca /nao localizado'; 50: Result:='CEP referente a um Banco Correspondente'; 51: Result:='CEP incompativel com a unidade da federacao'; 52: Result:='Unidade da federacao invalida'; 53: Result:='Tipo/numero de inscricao do sacador/avalista invalidos'; 54: Result:='Sacador/Avalista nao informado'; 55: Result:='Nosso numero no Banco Correspondente nao informado'; 56: Result:='Codigo do Banco Correspondente nao informado'; 57: Result:='Codigo da multa invalido'; 58: Result:='Data da multa invalida'; 59: Result:='Valor/Percentual da multa invalido'; 60: Result:='Movimento para titulo nao cadastrado'; 61: Result:='Alteracao da agencia cobradora/dv invalida'; 62: Result:='Tipo de impressao invalido'; 63: Result:='Entrada para titulo ja cadastrado'; 64: Result:='Numero da linha invalido'; 65: Result:='A espécie de título não permite a instrução'; 72: Result:='Entrada de título Sem Registro'; 90: Result:='Identificador/Quantidade de Parcelas de carnê invalido'; 92: Result:='Data de Desconto Inválida'; end; toRetornoLiquidadoSemRegistro, toRetornoLiquidado, toRetornoLiquidadoPorConta, toRetornoLiquidadoSaldoRestante, toRetornoLiquidadoEmCartorio: // 05, 06, 07, 08 e 15 (Liquidado) case CodMotivo of 01: Result:='01-Por saldo'; 02: Result:='02-Por conta'; 03: Result:='03-No próprio banco'; 04: Result:='04-Compensação eletrônica'; 05: Result:='05-Compensação convencional'; 06: Result:='06-Arquivo magnético'; 07: Result:='07-Após feriado local'; 08: Result:='08-Em cartório'; 09: Result:='09-Pagamento Parcial'; end; else Result := IntToStrZero(CodMotivo, 2) + ' - Outros Motivos'; end; //case TipoOcorrencia end; //else 240 Assim eu consegui ler código do motivo quando a ocorrência vem como liquidado. Como disse não sei se o MotivoRejeicaoComando utiliza somente rejeição, mas a julgar pelo fonte do banco do Brasil, acredito que não, assim esse correção seria interessante. Estou enviando o fonte do Acbr do Santander para análise para verificar a possível alteração. Caso precisem dos manuais também posso disponibiliza-los aqui. Nos testes que fiz aqui deram certo. Abraços, Rodrigo ACBrBancoSantander.pas
  10. Boa Tarde, Achei interessante o tópico, vou estudar mais a respeito. Realmente existe a opção citada ( http://docs.tecnospeed.com.br/boleto/BancosHomologados/) Alguns banco que achei em uma breve pesquisa: Banco - 237 - Bradesco Transmissão Automática de Arquivos A transmissão de arquivos ao Banco pode ser realizada automaticamente. Para manter toda a segurança no processo os arquivos devem ser criptografados. Após o envio ficam pendentes de aprovação.Fonte: https://banco.bradesco/html/pessoajuridica/ferramentas/net-empresa/produtos-e-servicos/transferencia-de-arquivos-webta.shtm Banco 104 – CEF Os boletos poderão ser registrados on-line para liquidação em qualquer banco? Sim. A Cobrança Bancária CAIXA permitirá o registro on-line de 3 formas: Integração via Webservice Há possibilidade de registro por meio de integração entre o sistema do Beneficiário e os sistemas da CAIXA via webservice. Este modelo é ideal para situações em que há necessidade de fornecer o boleto no ato de atendimento ao Pagador, seja em uma plataforma web (site) em que o próprio usuário é o Pagador ou em qualquer outro modelo em que um sistema do Beneficiário é utilizado para emissão de boleto em transações individuais (“boleto a boleto”). Fonte: https://www.caixa.gov.br/Downloads/cobranca-caixa/Perguntas_Frequentes-Nova_Plataforma_de_Cobranca_v1-05.pdf Abraços,
  11. Bom Dia Fernando Rodrigo, Legal !! Eu também estou fazendo assim, mesclando os dados da DI e da planilha do Excel que contem os dados! Levante a questão da possibilidade da criação de um objeto no ACBr para todos conseguirem ler a DI! Inclusive , acredito, ter encontrado o layout técnico dos arquivos da DI e Adição no site da Receita Federal. http://idg.receita.fazenda.gov.br/orientacao/aduaneira/manuais/despacho-de-importacao/sistemas/siscomex-importacao-web/declaracao-de-importacao/funcionalidades/links-para-arquivos/ Abs
  12. Boa Tarde Colegas, Eu também não achei a documentação do XML da DI do Siscomex! Fernando Rodrigo, peguei os seus fontes que usa o XMDocument para leitura, e consegui fazer a leitura do XML. No seu fonte na tag <declaracaoImportacao> coloquei alguns campos a mais: if NodeDeclaracao.ChildNodes[i].NodeName = 'numeroDI' then cNumeroDI := '2'+ NodeDeclaracao.ChildNodes[i].NodeValue; if NodeDeclaracao.ChildNodes[i].NodeName = 'dataRegistro' then dDataRegistroDI := formartDate(NodeDeclaracao.ChildNodes[i].NodeValue); if NodeDeclaracao.ChildNodes[i].NodeName = 'cargaUrfEntradaNome' then cLocalDesemb := NodeDeclaracao.ChildNodes[i].NodeValue; if NodeDeclaracao.ChildNodes[i].NodeName = 'dataDesembaraco' then dDataDesemb := formartDate(NodeDeclaracao.ChildNodes[i].NodeValue); if NodeDeclaracao.ChildNodes[i].NodeName = 'informacaoComplementar' then cObservacoes := NodeDeclaracao.ChildNodes[i].NodeValue; if NodeDeclaracao.ChildNodes[i].NodeName = 'importadorNumero' then // CNPJ cCnpj := NodeDeclaracao.ChildNodes[i].NodeValue; Mas verifiquei que a tag <numeroDI>, só consigo ler ao final , pois a lista de adições estão antes. Mas consegui contornar essa situação. Mas ai cheguei no nó da Adição, onde pode ter diversas mercadorias dentro de uma adição. Tentei fazer a consulta em dois passos, mas sem ter um objeto para guardar os dados ficou difícil, pois não consegui acessar o Nro da adição antes das adições. Então pensei em criar um objeto do ACBr para a leitura do arquivo de Registro de Importação. Agora precisava da ajuda para ver se estou fazendo da maneira correta, ou nos padrões do ACBr para envio. Não está completo, implementado somente com pouco campos para verificação. Baseado em um XML do SisComex: Eu criei um unit Chamada ACBrSiscomex Criei 4 classes(type) type TListaDeclaracoes = class; TdeclaracaoImportacao = class; TadicaoCollection = class; TadicaoCollectionItem = class; Classe raiz <TListaDeclaracoes> que tem dentro uma <TdeclaracaoImportacao> TListaDeclaracoes = class(TPersistent) private FdeclaracaoImportacao: TdeclaracaoImportacao; public constructor Create; destructor Destroy; override; procedure Assign(Source: TPersistent); override; published property declaracaoImportacao: TdeclaracaoImportacao read FdeclaracaoImportacao write FdeclaracaoImportacao; end; Ai criei a classe TdeclaracaoImportacao, a qual tem a coleção de adiçôes e outros atributos TdeclaracaoImportacao = class(TPersistent) private Fadicao: TadicaoCollection; FnumeroDI : String; FtotalAdicoes : Integer; procedure Setadicao(Value: TadicaoCollection); public constructor Create(AOwner: TListaDeclaracoes); destructor Destroy; override; published property adicao: TadicaoCollection read Fadicao write Setadicao; property numeroDI: String read FnumeroDI write FnumeroDI; property totalAdicoes: Integer read FtotalAdicoes write FtotalAdicoes; end; Ai cria a collection com as classes TadicaoCollection e TadicaoCollectionItem: TadicaoCollection = class(TCollection) private function GetItem(Index: Integer): TadicaoCollectionItem; procedure SetItem(Index: Integer; Value: TadicaoCollectionItem); public constructor Create(AOwner: TdeclaracaoImportacao); function Add: TadicaoCollectionItem; property Items[Index: Integer]: TadicaoCollectionItem read GetItem write SetItem; default; end; TadicaoCollectionItem = class(TCollectionItem) private FfornecedorCidade: String; FfornecedorEstado: String; FnumeroAdicao: String; public constructor Create(Collection: TCollection); override; destructor Destroy; override; procedure Assign(Source: TPersistent); override; published property fornecedorCidade: String read FfornecedorCidade write FfornecedorCidade; property fornecedorEstado: String read FfornecedorEstado write FfornecedorEstado; property numeroAdicao: String read FnumeroAdicao write FnumeroAdicao; end; O fonte inicial, de teste, somente com alguns campos para validação da forma de criação está em anexo. O resultado para utilização do objeto seria o seguinte: var ACBrSiscomex1 : TListaDeclaracoes; begin ACBrSiscomex1 := TListaDeclaracoes.Create; ACBrSiscomex1.declaracaoImportacao.numeroDI := '1893293210'; ACBrSiscomex1.declaracaoImportacao.adicao.Add; ACBrSiscomex1.declaracaoImportacao.adicao[0].numeroAdicao := '001'; ACBrSiscomex1.declaracaoImportacao.adicao[0].fornecedorCidade := 'FOR TST'; ACBrSiscomex1.declaracaoImportacao.adicao.Add; ACBrSiscomex1.declaracaoImportacao.adicao[1].numeroAdicao := '002'; ACBrSiscomex1.declaracaoImportacao.adicao[1].fornecedorCidade := 'FOR TST'; Gostaria de ver o que acham da rotina? Sei que tem bastante gente gente mexendo com importação. É viável a criação de um leitor de XML do SisComex nesses moldes? Pois seria muito mais fácil a leitura se tiver os dados dentro do objeto. A forma de criação esta nos padrões do Acbr? Mais um detalhe importante, neste arquivo não temos os cálculos de importação somente a leitura do arquivo do Registro de Importação gerado pelo SISCOMEX! Agradeço a atenção de todos, ACBrSiscomex.pas
  13. Alguém usando Maravilha no NFSe com a Betha no trunk 2? No trunk antigo mudamos no pnfsConversao.pas do provedor Pronim para Betha e está em produção. Migrando para o trunk 2 ainda está como Pronim. [4210506] Nome=Maravilha UF=SC Provedor=Pronim Mudamos para Provedor=Betha Ainda não conseguimos validar, pois está retornando um erro de cadastro, que precisamos ver com a prefeitura que está de férias. Então ainda não posso validar o funcionamento. Temos até um post a respeito da mudança: http://www.projetoacbr.com.br/forum/topic/23943-novo-provedor-de-maravilha-nfse-betha-e-nota/ Alguém já está funcionando no trunk2? Precisamos passar para os moderadores para alterar. @Oneide Luiz Schneider já está no trunk 2? Abraços e feliz natal !!!!
  14. Deu certo, Eu esta tentando com as propriedades MostrarStatus e MostrarPreview, Utilizando: ACBrNFeDANFEFR1.ShowDialog ACBrNFeDANFEFR1.ShowDialog := True; Deu certo !!!! Obrigado
  15. Boa Tarde Pessoal, Utilizamos a versão 4 do FR(FastReport), e no FR não tem a opção para selecionar a impressora quando mostramos o preview na tela, ou mesmo antes de imprimir. Isso é uma limitação do FR? Olhando a função: TACBrNFeDANFEFR.PrepareReport Vi que somente busca a impressora setada. FdmDanfe.frxReport.PrintOptions.Printer := FImpressora; Mas na visualização não tem opção de configurar a bandeja, ou trocar a impressora. Fiz um teste utilizando a printers do windows: function TACBrNFeDANFEFR.PrepareReport(NFE: TNFe): Boolean; var printDialog1 : TPrintDialog; //... printDialog1 := TPrintDialog.Create(Self); if PrintDialog1.Execute then begin FdmDanfe.frxReport.PrintOptions.Printer := Printer.Printers[Printer.PrinterIndex]; FdmDanfe.frxReport.PrintOptions.Copies := Printer.Copies; FdmDanfe.frxReport.PrintOptions.ShowDialog := False; end; Ele abre a caixa de diálogo posso escolher a impressora, etc. Ai fiquei na dúvida se não colocaram a uses printers por causa de uma compatibilidade com o Lazarus, ou algo assim? E se pretendem implementar algo assim? Abraços,
×
×
  • Create New...