Ir para conteúdo
  • Cadastre-se

theiller

Membros
  • Total de ítens

    37
  • Registro em

  • Última visita

Posts postados por theiller

  1. O provedor CTAConsult não retorna o "xml da nota fiscal autorizada", e sim um "xml do protocolo da autorização", foi identificado que existem algumas tags que não estão sendo carregadas, embora existam no xml e no classe de retorno:

    • NumeroNota
    • Link
    • CodigoVerificacao

    Segue exemplo do retorno xml em ambiente homologação

    Citar

    <retornoNfseLote xmlns="http://www.ctaconsult.com/nfse">  <codigoMunicipio>727</codigoMunicipio>  <protocolo>6271131</protocolo>  <autenticacao>    <token>C36D17ABC320D2054E91AD97A46B6BBB</token>  </autenticacao>  <codigoStatus>100</codigoStatus>  <numeroNota>999</numeroNota>  <linkPdfNota>stm.balsas.d2ti.com.br/credenciamento/jsp/visualizacaoNFSe/visualizacaoNFSe.jsf?nf=345</linkPdfNota>  <chaveSeguranca>B75DEFDB15DC2073C0F375F72BE2D918</chaveSeguranca></retornoNfseLote>


    Ajuste:

    • Fontes\ACBrDFe\ACBrNFSeX\Provedores\CTAConsult.Provider.pas
    • TACBrNFSeProviderCTAConsult.TratarRetornoEmitir
          Response.Protocolo := ObterConteudoTag(ANode.Childrens.FindAnyNs('protocolo'), tcStr);
          Response.Situacao := ObterConteudoTag(ANode.Childrens.FindAnyNs('codigoStatus'), tcStr);
    
          Response.NumeroNota := ObterConteudoTag(ANode.Childrens.FindAnyNs('numeroNota'), tcStr);
          Response.Link := ObterConteudoTag(ANode.Childrens.FindAnyNs('linkPdfNota'), tcStr);
          Response.CodigoVerificacao := ObterConteudoTag(ANode.Childrens.FindAnyNs('chaveSeguranca'), tcStr);

    Segue em anexo o fonte atualizado.

    CTAConsult.Provider.pas

  2. Identifiquei que na maioria dos bancos os campos de descontos 2 e 3 não estão sendo tratados da forma que é tratado os campos de descontos "1".

    Na classe TACBrBancoClass possui duas funções que podem ser implementadas e tratam o desconto "1" mas não existem algo parecido para os campos de descontos 2 e 3.

    function DefineCodigoDesconto(const ACBrTitulo: TACBrTitulo): String; virtual;
    function DefineDataDesconto(const ACBrTitulo: TACBrTitulo; AFormat: String = 'ddmmyyyy'): String; virtual;

    Minha sugestão é também ter a mesma funcionalidade para os demais campos, facilitando e permitindo popular corretamente os registros de forma simples e reuso do código, ainda manda a função anterior já como deprecated.

    function DefineCodigoDesconto(const ACBrTitulo: TACBrTitulo): String; virtual; deprecated 'Moved to the AnsiStrings unit';  //Utilizando para definir Código de Desconto na Remessa
    function DefineCodigoDescontoId(const ATipo: TACBrTipoDesconto; const AValor: Currency): String; virtual;  //Utilizando para definir Código de Desconto na Remessa
    function DefineDataDesconto(const ACBrTitulo: TACBrTitulo; AFormat: String = 'ddmmyyyy'): String; virtual; deprecated 'Moved to the AnsiStrings unit';   //Utilizado para definir a Data de Desconto na Remessa
    function DefineDataDescontoId(const AData: TDateTime; const AValor: Currency; const AFormat: String = 'ddmmyyyy'): String; virtual;    //Utilizado para definir a Data de Desconto na Remessa
    
    //...
    
    function TACBrBancoClass.DefineCodigoDesconto(const ACBrTitulo: TACBrTitulo): String;
    begin
      with ACBrTitulo do
      begin
        Result := DefineCodigoDescontoId(TipoDesconto, ValorDesconto);
      end;
    end;
    
    function TACBrBancoClass.DefineCodigoDescontoId(
      const ATipo: TACBrTipoDesconto; const AValor: Currency): String;
    begin
      if (AValor > 0) then
      begin
        case ATipo of
           tdValorFixoAteDataInformada : Result := '1';
           tdPercentualAteDataInformada: Result := '2';
          else
            Result := '1';
        end;
      end
      else
        Result := '0';
    end;
    
    function TACBrBancoClass.DefineDataDesconto(const ACBrTitulo: TACBrTitulo; AFormat: String): String;
    begin
      with ACBrTitulo do
      begin
        DefineDataDescontoId(DataDesconto, ValorDesconto, AFormat);
      end;
    end;
    
    function TACBrBancoClass.DefineDataDescontoId(const AData: TDateTime; const AValor: Currency; const AFormat: String): String;
    begin
      if (AValor > 0) then
      begin
        if (AData > 0) then
          Result := FormatDateTime(AFormat, AData)
        else
          Result := PadRight('', Length(AFormat), '0');
      end
      else
        Result := PadRight('', Length(AFormat), '0');
    end;

    Assim simplifica o ajuste nas classes dos bancos, mantendo a mesma lógica do código:

    image.thumb.png.2e31fd1d3edcb46a29beed0b22adc68f.png

    Segue código com o ajuste.

    ACBrBoleto.pas ACBrBancoSantander.pas

  3. A cidade Vitoria da conquista-BA utiliza o provedor WebISS v1, ao tentar emitir uma NFSe recebi o retorno que a aliquota não era correspondente.

    Fiz a verificação dos dados da versão do provedor WebISS, código do serviço, alíquota e valores...

    Ao compararmos com um XML enviado diretamente pelo site da prefeitura na plataforma webiss, identificamos que a falha está na geração do XML de envio, que requer que a alíquota já esteja dividida pelo percentual (2.10 / 100 = 0.021).

    129792125-f1c4050a-beec-483f-94dd-f102e31f4b9d.thumb.png.4ec20ec1a09dac27c42fd060629cff63.png

    Na análise do arquivo pnfsNFSeW_ABRASFv1.pas existe essa tipo de tratamento, porem para o webiss esta sendo passado o percentual direto ao invés de dividir por 100, como ja existe a regra para outros provedores.

    Imagino que os desenvolvedores da região estejam preenchendo o objeto do acbr passando o valor já dividido, quando o correto deveria ser tratado pelo componente.

    Então fiz um ajuste para considerar a possibilidade de passarem o valor já dividido ou o percentual, para evitar o erro pós atualização caso outros projetos estejam tratando isso diretamente no código de cada projeto:

        //Retrocompatibilidade, se alguem estiver passando o valor da aliquota já dividida por 100
        proWebISS:  if (NFSe.Servico.Valores.Aliquota > 0) and (NFSe.Servico.Valores.Aliquota < 0.1) then
                      Gerador.wCampo(tcDe4, '#25', 'Aliquota', 01, 05, 1, NFSe.Servico.Valores.Aliquota, DSC_VALIQ)
                    else
                      Gerador.wCampo(tcDe4, '#25', 'Aliquota', 01, 05, 1, (NFSe.Servico.Valores.Aliquota / 100), DSC_VALIQ);

    Segue anexo do xml emitido pela própria plataforma assim como o arquivo fonte alterado.

    129792125-f1c4050a-beec-483f-94dd-f102e31f4b9d.png

    NFSe-WebISSv1-Vitoria-Conquista.zip

    pnfsNFSeW_ABRASFv1_Alterado.zip

  4. Na NFSe e possível fazer a emissão informando o município de prestação e/ou incidência, em que podem ser diferentes, porem na impressão esta sendo impresso o nome da cidade de prestação em ambos.

    Verfiquei com o XML esta correto e o arquivo de impressão também.

    image.png.281f7bdcafbfef909e1d8344dfe9a793.png

    A falha foi identificada em:

    Arquivo:

    Citar

    Fontes\ACBrDFe\ACBrNFSe\DANFSE\Fast\ACBrNFSeDANFSeFR.pas

    Método:

    Citar

    TACBrNFSeDANFSeFR.CarregaParametros

    Atual:

    FieldByName('MunicipioIncidencia').AsString := CodCidadeToCidade(StrToIntDef(CodigoMunicipio, 0)); // Antes:

    Correção:

    FieldByName('MunicipioIncidencia').AsString := CodCidadeToCidade(IfThen(MunicipioIncidencia > 0, MunicipioIncidencia, StrToIntDef(CodigoMunicipio, 0)));

    Segue em anexo arquivo para análise e correção em repositório.

    ACBrNFSeDANFSeFR.pas

  5. Atualização CNAB 240 e 400 banco sicred: Intenção de pagamento

    Segue em anexo, manuais e ajustes dos fontes para atualização do SVN.

    AA2878835FA527B8CE635C088A558D94

     

    Criei mais um TACBrTipoOcorrencia: toRetornoIntensaoPagamento

    ACBrBancoSicredi - TACBrBancoSicredi.CodMotivoRejeicaoToDescricao - ACBrBanco.ACBrBoleto.LayoutRemessa: 400

            toRetornoIntensaoPagamento:
              case AnsiIndexStr(CodMotivo, ['00','H5']) of
                 0 : Result:= '00-Devolução de Comunicado pelos Correios';
                 1 : Result:= 'H5-Recebimento de liquidação fora da rede Sicredi – VLB Inferior – Via Compensação ';
               else
                 Result:= PadLeft(CodMotivo,2,'0') +' - Outros Motivos';
               end;

     

    ACBrBancoSicredi - TACBrBancoSicredi.TipoOcorrenciaToDescricao - ACBrBanco.ACBrBoleto.LayoutRemessa = c240

    91: Result := '07-Intenção de pagamento';

    ACBrBancoSicredi - TACBrBancoSicredi.TipoOcorrenciaToDescricao - ACBrBanco.ACBrBoleto.LayoutRemessa = c400

    07: Result := '07-Intenção de pagamento';

    ACBrBancoSicredi - TACBrBancoSicredi.CodOcorrenciaToTipo - ACBrBanco.ACBrBoleto.LayoutRemessa = c240
    ACBrBancoSicredi - TACBrBancoSicredi.CodOcorrenciaToTipo - ACBrBanco.ACBrBoleto.LayoutRemessa = c400


    ACBrBancoSicredi - TACBrBancoSicredi.TipoOCorrenciaToCod - ACBrBanco.ACBrBoleto.LayoutRemessa = c240
    ACBrBancoSicredi - TACBrBancoSicredi.TipoOCorrenciaToCod - ACBrBanco.ACBrBoleto.LayoutRemessa = c400

  6. Olá, tive problema ao tentar emitir MDFe:

    SegCodBarra(Segundo código de barras) - Tamanho menor que o mínimo permitido

    image.thumb.png.1f9a5167239d946bec191045d48bf08b.png

    Esse campo deve ser preenchido quando o Documento NFe/CTe foi emitida em contingência (tpEmis in [2,5]😞

    • FS-DA - Formulário de Segurança para Impressão de Documento Auxiliar
    • FS-IA - Formulário de Segurança Impressor Autônomo

    Acreditava que essa validação deveria estar nos Schemas, porem fiz a atualização dos arquivos e não resolveu.

    Após depurar identifiquei que o problema encontra-se na geração do XML (ACBrDFe\ACBrMDFe\PCNMDFe\pmdfeMDFeW.pas), em que TGerador.wCampo esta sendo passado uma constante de validação tamanho min e max discrepante (44) ao manual MDFe (36), tanto para NFe quando para CTe.

    Citar

     

    Gerador.wCampo(tcStr, '#050', 'SegCodBarra', 44, 44, 0, MDFe.infDoc.infMunDescarga[i].infCTe[j].SegCodBarra, DSC_SEGCODBARRA);

    ...

    Gerador.wCampo(tcStr, '#059', 'SegCodBarra', 44, 44, 0, MDFe.infDoc.infMunDescarga[i].infNFe[j].SegCodBarra, DSC_SEGCODBARRA);

     

    image.thumb.png.6c3bf673417275d9707c89857e4ed9c8.png

     

    Fiz o ajuste no arquivo, comentei as linhas e reescrevi abaixo com o tamanho correto. O documento MDFe foi autorizado.

    Segue em anexo unit corrigida para atualização do code git.

    pmdfeMDFeW.pas

    • Curtir 1
  7. O provedor de NFSe Saatri não possui a tag do ValorrIssRetido, controlando esse definição por outras tags, alem de ser necessário manter o valo do ISS populado, devido a isso, quando faz a consulta do RPS ou carga pelo XML, o valor do iss retido não fica preenchido, e apresenta o valor liquido errado.

    Segue em anexo o ajuste necessário.

    image.thumb.png.604ac172d6b4732c052b37cdcbdbeefc.png

     

    image.thumb.png.9d87db40dfd0ef7cc40d56c819453fcf.png

    pnfsNFSeR.pas

    • Curtir 1
  8. Olá, para o Sicoob no processo de homologação, existe uma área para validação do arquivo remessa:

    https://www.sicoob.com.br/validador-cnab240-cobranca?p_auth=KeQ8zP2T&p_p_id=validadorcnab_WAR_portalsicoobinternetsp&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_pos=1&p_p_col_count=2&_validadorcnab_WAR_portalsicoobinternetsp_java

    No CNAB 240 Header posição 72 DigitoVerificadorAgenciaConta, possui uma validação em que não aceita que seja definido vazio: "Valor informado diverge do valor default definido para o campo: 0", mas no forte o default é "bracos/espaço":

    PadRight(DigitoVerificadorAgenciaConta, 1, ' ')

    image.thumb.png.ec6b357fc7bc13303c508c26af2351a2.png

    Como essa propriedade é tipo String e outros bancos permitirem passar "branco/espaço", uma validação de layout acredito que poderia/deveria ser tratado diretamente pelo componente, por se tratar de uma regra estrutural para validação no processo de homologação:

    PadRight(DigitoVerificadorAgenciaConta, 1, '0')

    Dessa forma evitaria codificar condições para bancos no processo cadastral / gerar remessa, situação já vivenciada em outros tópicos como esse:

     

    Segue unit em anexo com o ajuste

     

    ACBrBancoBancoob.pas

  9. Favor corrigir falha na conversão de texto pra tipo:

    Unit: ACBrEPCBlocos

    Function: StrToInd_Rec

    AValue = '03'

     

    function StrToInd_Rec(const AValue: string):TACBrInd_Rec;
    begin
      if AValue = '01' then
        Result := crCliente
      else if AValue = '02' then
        Result :=  crAdministradora
      else if AValue = '03' then
        Result :=   crTituloDeCredito
      else if AValue = '04' then
        Result :=    crDocumentoFiscal
      else if AValue = '05' then
        Result :=   crItemVendido
      else if AValue = '99' then
        Result :=   crOutros
        else
         raise Exception.Create(format('Valor informado [%s] deve estar entre (01,02,03,04,05 e 99)',[AValue]));
    end;

    StrToInd_Rec_03.png

  10. Olá,

    Os bancos possuem os dados da agencia, conta, cedente e convenio.

    No Header do CNAB240 na identificação da empresa da empresa é passado o número do convenio, porem no CNAB400 esta sendo passado o numero do cedente.

    Já havia feito esse ajuste à tempos no fonte backup versão "Trunc" descontinuado, se possível avaliem para disponibilizar em SVN.

     

    Segue em anexo print do manual e fonte.

    Observação, esse fonte em anexo contem os ajustes documentos em outros dois (2) artigos:

     

    ACBrBancoBradesco.pas

    Bradesco400IdentificadorEmpresaPag9.PNG

    Bradesco400IdentificadorEmpresaPag16.PNG

    Bradesco400IdentificadorEmpresaFonte.PNG

  11. Olá,

    Fiz um ajuste para o arquivo de remessa Bradesco CNAB400 referente as instruções (Protesto/Baixa).

    Existe uma particularidade em que a "instrução1" refere-se ao código da operação, podendo ser para para (Protesto) ou (Baixa/Devolução), enquanto a "instrução2" refere-se aos dias equivalente ao código passada na "instrução1".

    O ACBrTitulo possui as propriedades Instrucao1, Instrucao2, DataBaixa e DataProtesto, geralmente a Instrucao1 é destinada ao protesto e a instrução2 destina a baixa/devolução, mas como dito acima no Bradesco CNAB400 não trata exatamente dessa forma.

    Identifiquei que no fonte existe o tratamento para o protesto inclusive passando um código direto, embora exista mais de um tipo de protesto possível ('06' e '05'), um outro caso é após os possíveis "elses" é utilizado o conteúdo real definido nas instuções 1 e 2 porem como existe um tratamento melhorado para o protesto (Comparando "DataProtesto"), creio que também deveria existir para o caso de baixa/devolução (Comparando "DataBaixa") e utilizar os valores direto das instruções em ultimo caso, pois geralmente tempos em nosso sistemas definições especificas para o código e dias para cada instrução (Protesto/Baixa).

    Fiz um ajuste para tratar o protesto conforme instrução com "IFF" para tratar o "legado" que já estava sendo passado valor fixo "06".

    Fiz um ajuste quanto a data baixa conforme condição já existente para o protesto.

    Segue em anexos: prints, manual, e fonte.

    Espero que possam avaliar/melhorar/disponibilizar em SVN.

    Observação: Nesse fonte já consta um outro ajuste realizado e documento em artigo:

     

    Ajuste.ACBrBradesco.PNG

    BradescoCNAB400Pag11.PNG

    BradescoCNAB400Pag20.PNG

    Bradesco_CNAB_400.pdf

    ACBrBancoBradesco.pas

  12. Olá,

    Identifiquei uma falha na remessa Bradesco CNAB400 no registro tipo 2 referente aos campos de descontos.

    As posições referente aos valores (Data Desconto2, Valor Desconto2, Data Desconto3, Valor Desconto3) requerem dados numéricos, porem está sendo passado o caracteres "espaço em branco" que é considerado alfanumérico.

    Fiz o ajuste formatando o conteúdo corretamente, embora zerado e não através das propriedades especificas, pois como não faço uso desse recurso e já estava sendo passando um valor nulo, não me preocupei tanto quanto a associação.

    Também adicionei como comentário as posições especificas na concatenação da string que monta a linha.

    A análise foi feio através do manual e site de validação de arquivo remessa próprio Bradesco (aba Cobrança):

    https://banco.bradesco/assets/pessoajuridica/pdf/4008-524-0121-layout-cobranca-versao-portugues.pdf

    https://banco.bradesco/html/pessoajuridica/solucoes-integradas/outros/layout-de-arquivo.shtm

    Segue anexos para analise, e atualização do componente!

    WhatsApp Image 2018-07-26 at 08.47.23.jpeg

    Ajuste.PNG

    ACBrBancoBradesco.pas

    • Curtir 1
  13. Tambem passo por essas situações algumas vezes, mas avaliando sei caso comparei seus XML e notei que o fechamento de algumas tags possuem espaco,

    ex.:

    "<cEAN />",

    "<cEANTrib />",

    "<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />"

    "<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />"

    "<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />"

    já a tag "DigestValue" estão idênticos

     

    No xml do banco está com o padrao UTF-8 e no outro não,

    Porem no xml comum tem a informação de autorização <infProt>

     

    Você utilizou a mesma aplicação para gerar os dois XML?

    Segue anexo dos seus XML com algumas quebras de linha identificado os exemplos da comparação.

    35160208957311000155550000001983351450305138-nfe.xml

    35160208957311000155550000001983351450305138-nfe-banco.xml

  14. Olá,

    Hoje 13.02.2015 a Sefaz BA está em modo contingencia SVCRS, e estive com alguns problemas.

     

    Após atualizar os fontes e continuar com o problema, identifiquei que a falha ocorre porque ao "DefinirServicoEAction" a BAHIA possui um tratamento diferenciado, porem deve ser apenas quando a "FormaEmissaão" for "teNormal", pois como está trabalhando em contingência não deve utilizar dessa outra URL.

     

    Identificado essa situação para os serviços de Status, Consulta e Inutilização.

     

    Segue anexo da unit alterada para ajuste em ACBr.

    ACBrNFeWebServices.pas

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.