Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 4366 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Prezados,

 

Estou realizando meus testes de PAF-ECF e me deparei com um problema que ocorreu apos uma redução Z sem movimento, onde o acbr não conseguiu recuperar a DataDoMovimento, entao modifiquei a mesma para que ignore a data em branco.

 

function TACBrECFBematech.GetDadosUltimaReducaoZ: AnsiString;
Var
  RetCmd, S, SS : AnsiString ;
  I : Integer ;
  ECFCRZ, ECFCRO : String;
  AliqZ: TACBrECFAliquota;
  CNFZ: TACBrECFComprovanteNaoFiscal;
  RGZ : TACBrECFRelatorioGerencial;
  vDatMovStr: String;
begin
  // Zerar variaveis e inicializa Dados do ECF //
  InitDadosUltimaReducaoZ;

  if not Assigned( fpAliquotas ) then
    CarregaAliquotas ;

  if not Assigned( fpComprovantesNaoFiscais ) then
    CarregaComprovantesNaoFiscais ;

  if fpMFD then
  begin

    // Dados dos Relatorios Gerenciais //
    if not Assigned( fpRelatoriosGerenciais ) then
      CarregaRelatoriosGerenciais ;

    BytesResp := 621 ;
    RetCmd    := BcdToAsc(EnviaComando( #88, 5 )) ;

    {ESC 88 Tamanho de Retorno: 621 bytes (BCD), com a seguinte estrutura:
    Descrição             Bytes         (Digitos BCD)
    RZautomática se zero indica que a RZ foi emitida por comando 1 (2)  1   ,  2
    CRO Contador de Reinício de Operação 2 (4)                          3   ,  6
    CRZ Contador de Redução Z 2 (4)                                     7   , 10
    COO Contador de Ordem de Operação 3 (6)                             11  , 16
    GNF Contador Geral de Operações Não Fiscais 3 (6)                   17  , 22
    CCF Contador de Cupom Fiscal 3 (6)                                  23  , 28
    GRG Contador Geral de Relatório Gerencial 3 (6)                     29  , 34
    CFD Contador de Fita Detalhe Emitida 3 (6)                          35  , 40
    NFC Contador de Operação Não Fiscal Cancelada 2 (4)                 41  , 44
    CFC Contador de Cupom Fiscal Cancelado 2 (4)                        45  , 48
    CON[30] Contadores Específicos de Operações não Fiscais 30x2 (30x4) 49  ,168
    CER[30] Contadores Específicos de Relatórios Gerenciais 30x2 (30x4) 169 ,288
    CDC Contador de Comprovantes de Débito ou Crédito 2 (4)             289 ,292
    NCN Contador de Débito ou Crédito não Emitidos 2 (4)                293 ,296
    CCDC Contador de Débito ou Crédito Cancelados 2 (4)                 297 ,300
    GT Totalizador Geral 9 (18)                                         301 ,318
    TP[16] Totalizadores Parciais Tributados 16x7 (16x14)               319 ,542
    I I Totalizador de Isenção de ICMS 7 (14)                           543 ,556
    NN Totalizador de Não Incidência de ICMS 7 (14)                     557 ,570
    FF Totalizador de Substituição Tributária de ICMS 7 (14)            571 ,584
    SI Totalizador de Isenção de ISSQN 7 (14)                           585 ,598
    SN Totalizador de Não Incidência de ISSQN 7 (14)                    599 ,612
    SF Totalizador de Substituição Tributária de ISSQN 7 (14)           613 ,626
    Totalizador de Desconto em ICMS 7 (14)                              627 ,640
    Totalizador de Desconto em ISSQN 7 (14)                             641 ,654
    Totalizador de Acrécimo em ICMS 7 (14)                              655 ,668
    Totalizador de Acrécimo em ISSQN 7 (14)                             669 ,682
    Totalizador de Cancelamentos em ICMS 7 (14)                         683 ,696
    Totalizador de Cancelamentos em ISSQN 7 (14)                        697 ,710
    TPNS Totalizadores Parciais Não sujeitos ao ICMS 28x7 (28x14)       711 ,1102
    Sangria Totalizador de Sangria 7 (14)                               1103,1116
    Suprimento Totalizador de Suprimento 7 (14)                         1117,1130
    Totalizador de Cancelamentos de Não Fiscais 7 (14)                  1131,1144
    Totalizador de Descontos de Não Fiscais 7 (14)                      1145,1158
    Totalizador de Acrécimos de Não Fiscais 7 (14)                      1159,1172
    Alíquotas Tributadas 16x2 (16x4)                                    1173,1236
    Data do Movimento 3     (6)                                         1237,1242}

    { Alimenta a class com os dados atuais do ECF }
    with fpDadosReducaoZClass do
    begin
      vDatMovStr := copy(RetCmd,1237,2) + DateSeparator +
                                           copy(RetCmd,1239,2) + DateSeparator +
                                           copy(RetCmd,1241,2);
      if vDatMovStr <> '00/00/00' then
      DataDoMovimento := StringToDateTime( copy(RetCmd,1237,2) + DateSeparator +
                                           copy(RetCmd,1239,2) + DateSeparator +
                                           copy(RetCmd,1241,2), 'dd/mm/yy' );

      CRO  := StrToIntDef( copy(RetCmd,  3,4), 0) ;
      CRZ  := StrToIntDef( copy(RetCmd,  7,4), 0) ;
      COO  := StrToIntDef( copy(RetCmd, 11,6), 0) ;
      GNF  := StrToIntDef( copy(RetCmd, 17,6), 0) ;
      CCF  := StrToIntDef( copy(RetCmd, 23,6), 0) ;
      GRG  := StrToIntDef( copy(RetCmd, 29,6), 0) ;
      CFD  := StrToIntDef( copy(RetCmd, 35,6), 0) ;
      GNFC := StrToIntDef( copy(RetCmd, 41,4), 0) ;
      CFC  := StrToIntDef( copy(RetCmd, 45,4), 0) ;
      GNF  := StrToIntDef( copy(RetCmd, 17,6), 0) ;
      CDC  := StrToIntDef( copy(RetCmd,289,4), 0) ;
      NCN  := StrToIntDef( copy(RetCmd,293,4), 0) ;
      CCDC := StrToIntDef( copy(RetCmd,297,4), 0) ;

      ValorGrandeTotal := RoundTo( StrToFloatDef( copy(RetCmd,301,18),0) / 100, -2) ;
      IsentoICMS := RoundTo( StrToFloatDef( copy(RetCmd,543,14),0) / 100, -2) ;
      NaoTributadoICMS := RoundTo( StrToFloatDef( copy(RetCmd,557,14),0) / 100, -2) ;
      SubstituicaoTributariaICMS := RoundTo( StrToFloatDef( copy(RetCmd,571,14),0) / 100, -2) ;
      IsentoISSQN := RoundTo( StrToFloatDef( copy(RetCmd,585,14),0) / 100, -2) ;
      NaoTributadoISSQN := RoundTo( StrToFloatDef( copy(RetCmd,599,14),0) / 100, -2) ;
      SubstituicaoTributariaISSQN := RoundTo( StrToFloatDef( copy(RetCmd,613,14),0) / 100, -2) ;
      DescontoICMS := RoundTo( StrToFloatDef( copy(RetCmd,627,14),0) / 100, -2)  ;
      DescontoISSQN := RoundTo( StrToFloatDef( copy(RetCmd,641,14),0) / 100, -2)  ;
      AcrescimoICMS  := RoundTo( StrToFloatDef( copy(RetCmd,655,14),0) / 100, -2) ;
      AcrescimoISSQN := RoundTo( StrToFloatDef( copy(RetCmd,669,14),0) / 100, -2);
      CancelamentoICMS := RoundTo( StrToFloatDef( copy(RetCmd,683,14),0) / 100, -2)  ;
      CancelamentoISSQN := RoundTo( StrToFloatDef( copy(RetCmd,697,14),0) / 100, -2)  ;
      DescontoOPNF := RoundTo( StrToFloatDef( copy(RetCmd,1131,14),0) / 100, -2)  ;
      AcrescimoOPNF := RoundTo( StrToFloatDef( copy(RetCmd,1145,14),0) / 100, -2)  ;
      CancelamentoOPNF := RoundTo( StrToFloatDef( copy(RetCmd,1159,14),0) / 100, -2) ;

      // Dados das Aliquotas //
      S := copy(RetCmd,319,224) ; // TP[16] * 14 Totalizadores Parciais Tributados
      For I := 0 to fpAliquotas.Count-1 do
      begin
        AliqZ := TACBrECFAliquota.Create ;
        AliqZ.Assign( fpAliquotas[I] );
        AliqZ.Total := RoundTo( StrToFloatDef( copy(S,(I*14)+1,14),0) / 100, -2);

        AdicionaAliquota( AliqZ );
      end ;

      // Dados dos Comprovantes não Fiscais //
      S :=  copy(RetCmd,1103,28) +  // Sangria(14) + Suprimento(14)
            copy(RetCmd,739,364) ;  // Não ICMS  (392)  28 * 14 (2 primeiros vem vazios ??)
      SS := copy(RetCmd,161,8)   +  // Contadores: Sangria(4) + Suprimento(4)
            copy(RetCmd,57,104);    // Não ICMS(112) 28 * 4  (2 primeiros vem vazios ??)

      for I := 0 to fpComprovantesNaoFiscais.Count - 1 do
      begin
        CNFZ := TACBrECFComprovanteNaoFiscal.Create ;
        CNFZ.Assign( fpComprovantesNaoFiscais[I] );
        CNFZ.Total    := RoundTo( StrToFloatDef( copy(S,(I*14)+1,14),0) / 100, -2) ;
        CNFZ.Contador := StrToIntDef( copy(SS,(I*4)+1,4), 0);

        TotalizadoresNaoFiscais.Add( CNFZ ) ;
      end;

      S := copy(RetCmd,169,120) ; // 30 * 4
      For I := 0 to fpRelatoriosGerenciais.Count-1 do
      begin
        RGZ := TACBrECFRelatorioGerencial.Create ;
        RGZ.Assign( fpRelatoriosGerenciais[I] );
        RGZ.Contador := StrToIntDef(copy(S,(I*4)+1,4), 0) ;

        RelatorioGerencial.Add( RGZ ) ;
      end ;

      CalculaValoresVirtuais;
      Result := MontaDadosReducaoZ;
    end ;

  end
  else //Não é impressora MFD
  begin
    with TACBrECF(fpOwner) do
    begin
      ECFCRZ := NumCRZ;
      ECFCRO := NumCRO;
    end;

    BytesResp := 308 ;
    RetCmd    := BcdToAsc(EnviaComando( #62 + #55, 5 )) ;

  { ESC 62 55 - Tamanho de Retorno 616 dígitos BCD (308 bytes),
                com a seguinte estrutura.
    2 RZAUT Se 00 redução por comando, caso contrário automática.
   18 GTDA GT no momento da última redução.
   14 CANCEL Cancelamentos
   14 DESCON Descontos
   64 TR Tributos
  266 TP Totalizadores Parciais Tributados
   14 SANGRIA Sangria
   14 SUPRIMENTOS Suprimentos
  126 NSI Totalizadores não Sujeitos ao ICMS
   36 CNSI Contadores dos TP’s não Sujeitos ao ICMS
    6 COO Contador de Ordem de Operação
    6 CNS Contador de Operações não Sujeitas ao ICMS
    2 AL Número de Alíquotas Cadastradas
    6 DATA_PC Data do Movimento
   14 ACRESC Acréscimo
   14 ACRFIN Acréscimo Financeiro

  RRGGGGGGGGGGGGGGGGGGCCCCCCCCCCCCCCDDDDDDDDDDDDDDT001T002T003T004T005T006T007T008T009T010T011T012T013T014T015T016TPT00000000001TPT00000000002TPT00000000003TPT00000000004TPT00000000005TPT00000000006TPT00000000007TPT00000000008TPT00000000009TPT00000000010TPT00000000011TPT00000000012TPT00000000013TPT00000000014TPT00000000015TPT00000000016IIIIIIIIIIIIIINNNNNNNNNNNNNNFFFFFFFFFFFFFFAAAAAAAAAAAAAAUUUUUUUUUUUUUUTNS00000000001TNS00000000002TNS00000000003TNS00000000004TNS00000000005TNS00000000006TNS00000000007TNS00000000008TNS00000000009CN01CN02CN03CN04CN05CN06CN07CN08CN09COOCOOCNSCNSALDTMOVTAAAAAAAAAAAAAAFFFFFFFFFFFFFF
  0000000000000014231000000000000000000000000000001800021605001200050025000250180013001600170002110200100006000100000000000001000000000000020000000000000300000000000004010000000000050100000000000601000000000007010000000000080100000000000901000000000010010000000000110200000000001202000000000013020000000000140200000000001502000000000016020000000001001400000000010114000000000408640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000162000019161708070000000000011100000000000000
  ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+.
  }

    { Alimenta a class com os dados atuais do ECF }
    with fpDadosReducaoZClass do
    begin
      DataDoMovimento := StringToDateTime( copy(RetCmd,583,2) + DateSeparator +
                                           copy(RetCmd,585,2) + DateSeparator +
                                           copy(RetCmd,587,2), 'dd/mm/yy' );

      CRO  := StrToIntDef( ECFCRO, 0) ;
      CRZ  := StrToIntDef( ECFCRZ, 0) ;
      COO  := StrToIntDef( copy(RetCmd,569,6), 0) ;

      SubstituicaoTributariaICMS := RoundTo( StrToFloatDef( copy(RetCmd,365,14),0) / 100, -2) ;
      NaoTributadoICMS := RoundTo( StrToFloatDef( copy(RetCmd,351,14),0) / 100, -2) ;
      IsentoICMS := RoundTo( StrToFloatDef( copy(RetCmd,337,14),0) / 100, -2) ;
      DescontoICMS := RoundTo( StrToFloatDef( copy(RetCmd,35,14),0) / 100, -2) ;
      CancelamentoICMS := RoundTo( StrToFloatDef( copy(RetCmd,21,14),0) / 100, -2) ;
      AcrescimoICMS := RoundTo( StrToFloatDef( copy(RetCmd,589,14),0) / 100, -2) ;
      ValorGrandeTotal := RoundTo( StrToFloatDef( copy(RetCmd,3,18),0) / 100, -2);

      // Dados das Aliquotas //
      S := copy(RetCmd,113,224);   // 16 * 14
      For I := 0 to fpAliquotas.Count-1 do
      begin
        AliqZ := TACBrECFAliquota.Create ;
        AliqZ.Assign( fpAliquotas[I] );
        AliqZ.Total := RoundTo( StrToFloatDef( copy(S,(I*14)+1,14),0) / 100, -2) ;

        AdicionaAliquota( AliqZ );
      end ;

      S := copy(RetCmd,379,154) ;//Começa na posição 379 para pegar os dados da Sangria e Suprimento, deveria então ter tamanho (14+14+126)
      for I := 0 to fpComprovantesNaoFiscais.Count - 1 do
      begin
        CNFZ := TACBrECFComprovanteNaoFiscal.Create ;
        CNFZ.Assign( fpComprovantesNaoFiscais[I] );
        CNFZ.Total := RoundTo( StrToFloatDef( copy(S,(I*14)+1,14),0) / 100, -2) ;

        TotalizadoresNaoFiscais.Add( CNFZ ) ;
      end;

      CalculaValoresVirtuais;
      Result := MontaDadosReducaoZ;
    end;
  end;
end;

 

 

Sds

 

Araujo Junior

  • Consultores
Postado

Olá Araujo,

 

  você também não citou qual foi o erro que foi gerado. Como assim "o acbr não conseguiu recuperar a DataDoMovimento"?

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Este tópico foi criado há 4366 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

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

The popup will be closed in 10 segundos...