Ir para conteúdo
  • Cadastre-se

rodrigod6

Membros
  • Total de ítens

    111
  • Registro em

  • Última visita

Posts postados por rodrigod6

  1. Bom dia,

    O Ajuste SINIEF nº 11/19 foi alterado de 01/01/2022 para 03/04/2023, conforme o Ajuste SINIEF nº 12/21! Correto !?!?

     

    AJUSTE SINIEF Nº 12, DE 08 DE JULHO DE 2021

    Publicado no DOU de 12.07.21, pelo Despacho 50/21.

    Dispensada AIR, conforme Nota Técnica Ascif/Gab/RFB nº 1, de 07.07.21

    Altera o Ajuste SINIEF nº 11/19, que altera o Convênio S/Nº, de 1970, que instituiu o Sistema Nacional Integrado de Informações Econômico-Fiscais – SINIEF, relativamente ao Código Fiscal de Operações e Prestações – CFOP.

    O Conselho Nacional de Política Fazendária - CONFAZ - e a Secretaria da Receita Federal do Brasil, na 181ª Reunião Ordinária do Conselho, realizada em Brasília, DF, no dia 08 de julho de 2021, tendo em vista o disposto no art. 199 do Código Tributário Nacional (Lei nº 5.172, de 25 de outubro de 1966), resolvem celebrar o seguinte

    A J U S T E

    Cláusula primeira O inciso I da cláusula quarta do Ajuste SINIEF nº 11, de 05 de julho de 2019, passa a vigorar com a seguinte redação:

    I - de 03 de abril de 2023, em relação aos incisos I e III da cláusula primeira e ao inciso II da cláusula segunda deste ajuste;”.

    Cláusula segunda Este ajuste entra em vigor na data da sua publicação no Diário Oficial da União, produzindo efeitos a partir do primeiro dia do primeiro mês subsequente ao da publicação.

     

    Fontes: 

    https://www.confaz.fazenda.gov.br/legislacao/ajustes/2019/ajuste-sinief-11-19

    https://www.confaz.fazenda.gov.br/legislacao/ajustes/2021/ajuste-sinief-12-21

    • Curtir 1
  2. Boa tarde,

    Olhem que interessante, o (no seg. R, posição 66 (Código da multa)) código zero não consta no manual  do Santander, mas vejam o retorno do pessoal do Santander: 

    Prezados bom dia, como não há a intenção da cobrança da multa então é necessário manter:
    Posição 66 código 0
    Posição 67-89 manter zerado 
    Entrega Eletronica - Implantacao <entregaeletronicaimplantacao@santander.com.br>; 

     

    Com isso, entendo, que quando o percentual de multa for zero, teria que deixar como estava antes , 0 no campo do código da multa, apesar de não constar no manual.

    Citando o trecho que o Dercide tinha passado como estava o ACBr Antes:

    Antes:
    
                  IfThen((PercentualMulta > 0),
                         IfThen(MultaValorFixo,'1','2'), '0')                                           + // 66 - 66 1-Cobrar Multa Valor Fixo / 2-Percentual / 0-Não cobrar multa

    Verificando a última versão, passada pelo Junior Santos, no dia 01/09/2020,

    vi que foi modificado no ACBr, para quando não tiver multa não gerar o SEGMENTO R.

          if (PercentualMulta > 0) then
          begin
            Inc(ISequencia);
            {SEGMENTO R}

    Ou seja só vai gerar o segmento R, quando tiver multa. 

    Mas vejam que no segmento R, também temos as mensagens 3(posição 100 a 139) e mensagem 4 (posição 140 a 179) que são impressas nos boletos quando emissão pelo banco.

    Então no caso de um cliente que é o banco quem emite, e que não utiliza a multa, não vai mais sair as obs.  

    Acho que somente, o que tinha antes já resolveria: 

     IfThen((PercentualMulta > 0),
       IfThen(MultaValorFixo,'1','2'), '0') + // 66 - 66 1-Cobrar Multa Valor Fixo / 2-Percentual / 0-Não cobrar multa

    Acredito que não precisaria, remover o segmento R todo.

    Segue em anexo a sugestão de como estava antes, mas com a mudança para zero quando não tiver o percentual, sem ter que excluir o Segmento R.

    Abraços,

     

    ACBrBancoSantander.pas

  3. 1 hora atrás, Dercide Alvarez disse:

    Não lembro o que aconteceu na época, mas foi homologado conforme o meu post.

    Temos que ver no manual atualizado.

    No manual que eu tenho, os valores aceitos, são 1 e 2.

    Segmento_R.png

    É isso mesmo, a  dúvida só era sobre a data e valor, que no meu caso o cliente não utiliza data e valor da multa.

    quando eu mando zerado os campos(data e valor da multa), o pessoal da homologação esta retornando como errado.

    por isso queria ver se no teu caso você tinha a data e valor e/ou percentual !! para comparar,

    mas eu acho que deve ter a ver com a terceirizada que esta obrigado o valor. Estou aguardando o retorno deles de como não informar se só temos o valor 1 e 2.

    Obrigado pelo retorno, abs

     

    • Curtir 1
  4. Em 31/10/2019 at 11:02, Dercide Alvarez disse:

    Bom dia,

    Fiz a Homologação da cobrança CNB 240 do Santander, e houve uma critica em relação ao Código da Multas (G073).

    No caso não teria multa, apenas a mora diária, e o componente nesse caso, coloca ZERO ('0'), na posição 066-066 do registro R.

    Mas o banco aceita apenas 1- Valor fixo, 2- Percentual, independente se ter ou não ter multa, ou nesse caso não gerar o Registro R.

    Fiz o ajuste no ACBrBancoSantander.pas e foi homologada a cobrança.

    Antes:

                  IfThen((PercentualMulta > 0),
                         IfThen(MultaValorFixo,'1','2'), '0')                                           + // 66 - 66 1-Cobrar Multa Valor Fixo / 2-Percentual / 0-Não cobrar multa

    Depois:

                  IfThen((PercentualMulta > 0),
                         IfThen(MultaValorFixo,'1','2'), '2')                                           + // 66 - 66 1-Cobrar Multa Valor Fixo / 2-Percentual / 0-Não cobrar multa

     

    Segue o fonte para analise e possível atualização no componente.

    O que notei e diversos fontes, é que apesar do componente ter a propriedade CodigoMulta,, ela não é utilizada na maioria dos bancos.

     

    Dercide.

     

    ACBrBancoSantander.pasUnavailable

    Boa tarde Dercide,

    Eu sempre enviei como 0, mesmo não tendo o campo como você citou. e que estava na versão antiga! 

    Nesta semana estou homologando um cliente, e gerou com 2, e o pessoal da homologação retornou 

    seg R posição 66 código 2)porem na posição 67 a 89 não informa data e valor que deseja para cobrança campos obrigatórios a serem preenchido quando informado código 1 ou 2 na posição 66.

    Mas não estou enviando a multa, pois o cliente não usa multa!

    No seu caso você utilizou 2 e preencheu estes campos data e valor? ou passou em branco? 

  5. Bom dia Italo,

    Estou anexando um XML de consulta.

    O arquivo de exemplo, entrei na página da prefeitura

    Primeiro a página principal 

    https://nfe.sjp.pr.gov.br/servicos/issOnline2/

    Acessando a página temos a área do desenvolvedor

    Citar

    Nesta página

    https://nfe.sjp.pr.gov.br/servicos/issOnline2/desenvolvedor/

    temos a seção XML de exemplo dos métodos, nela temos o exemplo ConsultarLoteRpsV3

    https://nfe.sjp.pr.gov.br/servicos/issOnline2/ws/schemes/ConsultarLoteRpsEnvio.xml

    Mesmo assim vou realizar o download do exemplo deles e anexar aqui.

    01-74580479-con-lot.xml (XML Gerado pelo ACBr)

    ExemploSJP-ConsultarLoteRpsEnvio.xml (Exemplo do Site)

    01-74580479-con-lot.xml ExemploSJP-ConsultarLoteRpsEnvio.xml

  6. Boa tarde, 

    O Site da prefeitura de SJP(São José dos Pinhais), começou a mostrar uma mensagem em seu site:

    ASSINATURA DIGITAL WEB SERVICE
    Prezado usuario(a),
    
    Caso sua empresa consulte o Sistema de Nota Fiscal Eletronica via Web Service, verifique se os servicos abaixo relacionados estão com a assinatura digital conforme orientações disponiveis na área do desenvolvedor.
    
    Servicos utilizados sem a assinatura digital:
    
    ConsultarSituacaoLoteRpsEnvio - 03/02/2020 16:40:36 - 191.177.199.99
    ConsultarLoteRpsEnvio - 03/02/2020 16:40:36 - 191.177.199.99
    
    Informamos que os arquivos fora dos padrães estabelecidos na documentação serão bloqueados a partir de 31/03/2020.
    
    Mais informações sobre como assinar as consultas estão disponiveis em nossa area do desenvolvedor no link https://nfe.sjp.pr.gov.br/servicos/issOnline2/desenvolvedor
    
    

    Revisando a geração do arquivo XML de consulta, constatei que o mesmo já estava com a assinatura.

    Entrei em contato com a prefeitura para averiguar e me informaram que está faltando referenciar o que está assinando:

    Reference URI=""

    Analisando o exemplo que eles passaram esta dessa maneira 

    <Reference URI="#consultar">

    E no XML enviado esta

    -<Reference URI="">

     

    Fiz uma revisão no Acbr, e vi que ele é gerado na ACBrDFeUtil.pas

    function SignatureElement(const URI: String; AddX509Data: Boolean;
      const IdSignature: String; const Digest: TSSLDgst): String;
    var
      MethodAlgorithm, DigestAlgorithm: String;
    begin
      case Digest of
        dgstSHA256:
          begin
            MethodAlgorithm := 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256';
            DigestAlgorithm := 'http://www.w3.org/2001/04/xmlenc#sha256';
          end;
        dgstSHA512:
          begin
            MethodAlgorithm := 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha512';
            DigestAlgorithm := 'http://www.w3.org/2001/04/xmlenc#sha512';
          end;
        else
          begin
            MethodAlgorithm := 'http://www.w3.org/2000/09/xmldsig#rsa-sha1';
            DigestAlgorithm := 'http://www.w3.org/2000/09/xmldsig#sha1';
          end;
      end;
    
      {(*}
      Result :=
      '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"' + IdSignature + '>' +
        '<SignedInfo>' +
          '<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />' +
          '<SignatureMethod Algorithm="'+MethodAlgorithm+'" />' +
          '<Reference URI="' + IfThen(URI = '', '', '#' + URI) + '">' +
            '<Transforms>' +
              '<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />' +
              '<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />' +
            '</Transforms>' +
            '<DigestMethod Algorithm="'+DigestAlgorithm+'" />' +
            '<DigestValue></DigestValue>' +
          '</Reference>' +
        '</SignedInfo>' +
        '<SignatureValue></SignatureValue>' +
        '<KeyInfo>' +
        IfThen(AddX509Data,
          '<X509Data>' +
            '<X509Certificate></X509Certificate>'+
          '</X509Data>',
          '')+
        '</KeyInfo>'+
      '</Signature>';
      {*)}
    end;

    Que é chamada da function AdicionarSignatureElement na ACBrDFeSSL.pas

    function TDFeSSLXmlSignClass.AdicionarSignatureElement(const ConteudoXML: String;
      AddX509Data: Boolean; const docElement, IdSignature: String;
      const IdAttr: String = ''): String;
    var
      URI, TagEndDocElement: String;
      I: Integer;
    begin
      URI := ExtraiURI(ConteudoXML, IdAttr);
    
      TagEndDocElement := '</' + docElement + '>';
      I := PosLast(TagEndDocElement, ConteudoXML);
      if I = 0 then
        raise EACBrDFeException.Create('Não encontrei final do elemento: ' + TagEndDocElement);
    
      Result := copy(ConteudoXML, 1, I - 1) +
                SignatureElement(URI, AddX509Data, IdSignature, FpDFeSSL.SSLDgst) +
                copy(ConteudoXML, I, Length(ConteudoXML));
    end;

    O que ocorre é que esse IdAttr, em determinado momento não é passado o valor para a rotina.
    Então não consegui identificar uma forma de passar a configuração para alterar esta informação.

    Alguém sabe como eu poderia gerar a tag Reference URI= com o valor #consultar? 

    Obrigado

  7. 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)

     

    • Curtir 1
  8. 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,

  9. 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

    AcbrBancoBrasil_01.thumb.png.02b70cca0ebab3a6d504739d6d13ab5b.png

    2) Alinhamento/padronização dos motivos do tipo da ocorrência: toRetornoComandoRecusado: //03 (Recusado)

    AcbrBancoBrasil_02.thumb.png.9e68973a969a608e37369ff35082fe87.png

    3) Adicionado um retorno padrão (CNAB 400), semelhante ao que tem no fonte do AcbrSantander, para retornar outros motivos.

    AcbrBancoBrasil_03.thumb.png.7605448261b7f808f081cab03bb7ae99.png

    4) CNAB 240 - (toRetornoRegistroRecusado) - Alinhado case, e colocado no result os códigos junto com a descrição, seguindo o padrão existente:

    AcbrBancoBrasil_04.thumb.png.6f5a6b9f2a2f13b23be3f85e4b63ff64.png

    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:

    AcbrBancoBrasil_05.thumb.png.9337c2be9290d2dddff0165dce76de28.png

    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.

    AcbrBancoBrasil_06.thumb.png.bb54aa46cc4516b52e9afd41d9869518.png

     

    Segue arquivo fonte para análise se pode ser alterado no Acbr.

    ACBrBancoBrasil.Acbr.2018.10.26-Correcao.pas

    Obrigado,

    • Curtir 1
  10. Em 09/12/2016 at 11:55, lazarinr disse:

    Olá Pessoal

    No arquivo retorno do Banco do Brasil CNAB 240 segmento T posição 216 o banco está retornando o código A9. Isso está causando um erro. Verifiquei na unit ACBrBancoBrasil na procedure CodMotivoRejeicaoToDescricao e não há tratamento para esse código de motivo. Então procurei o manual de cobrança no site do Banco do Brasil a fim de entender do que se trata esse código A9. Porém os códigos de motivos de retorno que encontrei no manual não batem com os códigos que estão nessa procedure. Por exemplo o código na unit está 63: Result:='63-DV do nosso número inválido' ; no manual do FEBRABAN que baixei do site do banco está '63' = Entrada para Título já Cadastrado. Será estou consultando o manual errado? ou a procedure precisa de manutenção? Estou com a última versão do ACBR.

     

    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?

  11. Em 12/12/2016 at 10:49, lazarinr disse:

    Descobri que o motivo da divergência entre as descrições dos código de motivo de rejeição que eu citei na mensagem anterior é porque são de layout diferentes. 63: Result:='63-DV do nosso número inválido' está no manual do padrão CNAB 400 e  '63' = Entrada para Título já Cadastrado.está no manual do padrão CNAB 240. Observei que o componente já faz alguns tratamentos deferentes para esses layout em outras procedures. Porém na procedure CodMotivoRejeicaoToDescricao não há esse tratamento.

    Como vou precisar dessa melhoria no componente, pergunto se alguém já fez esses ajustes? Para não haver retrabalho. Senão eu vou fazer e enviar a unit para ser atualizada no componente.

    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 
        //
    ...

     

    Em 04/12/2017 at 10:46, ricardobmsoft disse:

    Esses motivos de rejeição podem ser usados para todos on bancos ou somente parta Banco do Brasil?

     

    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

     

  12. Em 27/03/2018 at 15:54, rafaeldalbosco disse:

    Pessoal alguém tem alguma novidade sobre o registro das cobranças on-line via API diretamente no banco ? 

    Se alguém tiver mais layouts de outros bancos, como Banco do Brasil, Santander, Caixa, Itaú entre outros que sei que já dispõe do serviço e puder postar.

    Pesquisei e achei esses

    https://www.projetoacbr.com.br/forum/topic/35914-trasmissão-automática-remessa-e-retorno/?tab=comments#comment-285905

     

  13. 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

    • Curtir 1
  14. 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

  15. 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, 

     

     

     

     

     

     

  16. 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

  17. 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:

    SisComexXml.png.b9fe7b13cb3a95f3aef9daf3939f34e7.png

    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

    • Obrigado 1
  18. 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 !!!!

     

    • Curtir 1
  19. 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,

  20. Ainda estou confirmando, mas veja alguns campos como estou pensando em fazer:

    ICMSUFDest.pICMSInterPart

    //Percentual provisório de partilha do ICMS Interestadual
    NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 0;
    if getAno(NFe.Ide.dEmi) = 2016 then // 40% em 2016;
      NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 40;
    if getAno(NFe.Ide.dEmi) = 2017 then // 60% em 2017;
      NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 60;
    if getAno(NFe.Ide.dEmi) = 2018 then // 80% em 2018;
      NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 80;
    if getAno(NFe.Ide.dEmi) = 2019 then // 100% em 2018;
      NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 100;

    ICMSUFDest.vICMSUFDest

    //Valor do ICMS Interestadual para a UF de destino  
    NFe.Det[idx].Imposto.ICMSUFDest.vICMSUFDest := NFe.Det[idx].Imposto.ICMS.vICMS *
      NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart / 100; 

    Procurando tabela Percentual do ICMS relativo ao Fundo de Combate à Pobreza (FCP) na UF de destino ( ICMSUFDest.pFCPUFDest )

    ICMSUFDest.pICMSUFDest

    //Alíquota interna da UF de destino
    NFe.Det[idx].Imposto.ICMSUFDest.pICMSUFDest := getAliqInterna(UF) -
      NFe.Det[idx].Imposto.ICMSUFDest.pFCPUFDest;

     

    Tudo a confirmar... :)

     

     

×
×
  • 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.