Ir para conteúdo
  • Cadastre-se

dev botao

Dúvidas sobre Linha Digitavél Banco Inter


Ver Solução Respondido por Jhonlenon Ribeiro,
  • Este tópico foi criado há 835 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa tarde, estou com a seguinte situação...recentimente começei a emitir boleto pelo Banco INTER usando a API, mais eu tava querendo usar o PDF do ACBrBoleto e não o PDF que o INTER tem, mais a linha digitavél e codigo de barras são diferente...vou mostrar abaixo..

07790.00108 19156.950073 87085.2423 6 89320000001530 - Linha Digital ACBr

07790.00116 12061.975202 07870.8524 2 8989320000001530 - Linha Digitavél API INTER

teria alguma forma de resvolver isso? eu não entendo muito bem...mais será que eu conseguiria alimentar a linha digitavél e codigo de barras do boleto da ACBr com retorno da linha digitavél e codigo de barras da API?

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde

13 minutos atrás, JHONLENON disse:

Boa tarde, estou com a seguinte situação...recentimente começei a emitir boleto pelo Banco INTER usando a API, mais eu tava querendo usar o PDF do ACBrBoleto e não o PDF que o INTER tem, mais a linha digitavél e codigo de barras são diferente...vou mostrar abaixo..

07790.00108 19156.950073 87085.2423 6 89320000001530 - Linha Digital ACBr

07790.00116 12061.975202 07870.8524 2 8989320000001530 - Linha Digitavél API INTER

teria alguma forma de resvolver isso? eu não entendo muito bem...mais será que eu conseguiria alimentar a linha digitavél e codigo de barras do boleto da ACBr com retorno da linha digitavél e codigo de barras da API?

 

Hoje existe a implementação via cnab e existe esta observação :

Citar

Para o calculo do campo livre necessário para a construção do código de barras e linha digitavel, é necessário na propriedade ACBrBoleto.Cedente.CodigoCedente informar o Número da Operação informado pelo banco Inter (Conta Digital > Emissão via CNAB > Retorno).

 

Necessário registrar primeiro a remessa para obter o nosso número de posse do nosso número é possível realizar a impressão da ficha de compensação

Mas sinta-se a vontade em implementar a comunicação via webservices e a impressão e contribuir, anexe os fontes do mesmo após a implementação por favor.

Abraços

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

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

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

Link para o comentário
Compartilhar em outros sites

1 hora atrás, JHONLENON disse:

Boa tarde, estou com a seguinte situação...recentimente começei a emitir boleto pelo Banco INTER usando a API, mais eu tava querendo usar o PDF do ACBrBoleto e não o PDF que o INTER tem, mais a linha digitavél e codigo de barras são diferente...vou mostrar abaixo..

07790.00108 19156.950073 87085.2423 6 89320000001530 - Linha Digital ACBr

07790.00116 12061.975202 07870.8524 2 8989320000001530 - Linha Digitavél API INTER

teria alguma forma de resvolver isso? eu não entendo muito bem...mais será que eu conseguiria alimentar a linha digitavél e codigo de barras do boleto da ACBr com retorno da linha digitavél e codigo de barras da API?

 

Eu já faço a assim tem tempo, uso o acbrboleto, só para gerar esses dados, a impressão é uma minha, personalizada.

O que você precisa fazer é alinhar os dados de código de barras e linha digitável manual no fr3. Coisa fácil de resolver.

Link para o comentário
Compartilhar em outros sites

  frxReport1.Clear;
  frxReport1.Report.Clear;

  frxDBReceber.RangeBegin := rbFirst;
  frxDBReceber.RangeEnd   := reLast;

  frxReport1.EnabledDataSets.Clear;
  frxReport1.DataSets.Clear;

  frxReport1.DataSets.Add(frxDBReceber);
  frxReport1.EnabledDataSets.Add(frxDBReceber);
 

ST := TMemoryStream.Create;
  try
    if FDSCfgMod.FieldByName('ARQUIVO_CFGBLMOD').IsNull then // Quando for atualizado, em Novembro de 2018, esse campo vai ficar vazio na tabela
    begin
      case FDSCfgMod.FieldByName('LAYOUT_CFGBLMOD').AsInteger of
        1: TFuncoesSistemaOperacional.LerRecursoDLL('BOLETO_1PP', sNomeDaDLL, ST);
        2: TFuncoesSistemaOperacional.LerRecursoDLL('BOLETO_2PP', sNomeDaDLL, ST);
        3: TFuncoesSistemaOperacional.LerRecursoDLL('BOLETO_3PP_CARNE', sNomeDaDLL, ST);
      else // 3
        raise Exception.Create('Tipo de Documento: Boleto ou carnê não selecionado na configuração.');
      end;
    end
    else
      TBlobField(FDSCfgMod.FieldByName('ARQUIVO_CFGBLMOD')).SaveToStream(ST);

    ST.Position := 0;

    frxReport1.LoadFromStream(ST);
  finally
    FreeAndNil(ST);
  end;

 

class procedure TFuncoesSistemaOperacional.LerRecursoDLL(const sNomeRecurso, sNomeDLL: string; out Retorno: TMemoryStream);
var
  RS        : TResourceStream;
  S         : string;
  DLL_Handle: THandle;
  Aberta    : Boolean;
begin
  // Lê recursos armazenados na DLL
  if (not Assigned(Retorno)) or (Retorno = nil) then
    raise exception.Create('Retorno para procedimento LerRecursoDLL não definido ou não criado.');

  S := ChangeFileExt(sNomeDLL, '.DLL');

  DLL_Handle := LoadLibrary(PWideChar(S));
  try
    Aberta := DLL_Handle <> HINSTANCE_ERROR;
    if not Aberta then
      raise exception.Create('DLL ' + S + ' não encontrada, favor verificar.');

    RS := TResourceStream.Create(DLL_Handle, sNomeRecurso, RT_RCDATA);
    try
      if RS.Size <> 0 then
        Retorno.LoadFromStream(RS);
      Retorno.Position := 0;
    finally
      FreeAndNil(RS);
    end;
  finally
    FreeLibrary(DLL_Handle);
  end;
end;
 

se for exportar para pdf:

 if frxReport1.PrepareReport(True) then

begin

// saida em pdf

  frxPDFExport1.FileName := 'nome do seu pdf aqui';

 if not frxReport1.Export(frxPDFExport1) then
                raise Exception.Create('Erro ao exportar pdf de boleto');

 

// saida em tela:

frxReport1.ShowReport();

end else

begin

 raise Exception.Create('Relatório não preparado.');

end;

 

Linhas dentro do RC da DLL:

 

// -- BOLETOS E CARNÊS        
BOLETO_1PP                     RCDATA        ".\FastReport\BOLETO_1PP.fr3" 
BOLETO_2PP                     RCDATA       ".\FastReport\BOLETO_2PP.fr3"
BOLETO_3PP_CARNE               RCDATA       ".\FastReport\BOLETO_3PP_CARNE.fr3"
 

Mas pode dar um loadfromfile direto no fastreport.

BOLETO_3PP_CARNE.fr3 BOLETO_1PP.fr3 BOLETO_2PP.fr3

faltou a cereja do boleto. Onde as variaveis recebem os valores do dataset receber

procedure TdmImpressaoBoleto.frxRptCarneGetValue(const VarName: string; var Value: Variant);
var
  S          : string;
  VN         : string;
  Cedente    : string;
  DVCedente  : string;
  Qtde       : Integer;
  ValorAberto: Currency;
  F          : TField;
  DataTemp   : string;
begin
  // tem variavel que vem assim: <CODIGO>
  VN := AnsiUpperCase(VarName); 
  VN := StringReplace(VN, '<', '', []);
  VN := StringReplace(VN, '>', '', []);

  if VN = 'MOSTRAR_AVISO_VENCIDO' then
  begin
    PosicionaCfgModelo(frxDBReceber.DataSet.FieldByName('CFG_BOLETO_MODELO_REC').AsInteger);

    Value := (FDSCfgMod.FieldByName('AVISO_PARCELA_ATRASO_CFGBLMOD').AsString = 'S')
      and (frxDBReceber.DataSet.FieldByName('AVISO_VENCIDO_BOLETO_CLI').AsString = 'S');
  end
  else if VN = 'AVISO_VENCIDO' then
  begin
    PosicionaCfgModelo(frxDBReceber.DataSet.FieldByName('CFG_BOLETO_MODELO_REC').AsInteger);

    Value := '';

    if (FDSCfgMod.FieldByName('AVISO_PARCELA_ATRASO_CFGBLMOD').AsString = 'S') and
      (frxDBReceber.DataSet.FieldByName('AVISO_VENCIDO_BOLETO_CLI').AsString = 'S') then
    begin
      Qtde        := 0;
      S           := '';
      ValorAberto := 0;

      if CDSReceberAberto.Active then
      begin
{$MESSAGE hint 'tem que testar pelo vencimento, ate quando esta vencido'}
        CDSReceberAberto.First;
        while not CDSReceberAberto.Eof do
        begin
          ValorAberto := ValorAberto + CDSReceberAberto.FieldByName('VALOR').AsCurrency;

          if S <> '' then
            S := S + #13;

          S := S + TFuncoesNumero.StrZero(CDSReceberAberto.FieldByName('Mes').AsInteger, 2) + '/';
          S := S + TFuncoesNumero.StrZero(CDSReceberAberto.FieldByName('ANO').AsInteger, 4) + '-';
          S := S + TFuncoesString.PadL(FormatCurr(',0.00', CDSReceberAberto.FieldByName('VALOR').AsCurrency), 7);

          Inc(Qtde, CDSReceberAberto.FieldByName('CNT_MES_ANO').AsInteger);

          CDSReceberAberto.Next;
        end;

        if Qtde = 0 then
        begin
          DataTemp := FormatDateTime('dd/mm/yyyy', frxDBReceber.DataSet.FieldByName('VENCIMENTO_REC').AsDateTime - 1);

          Value := 'FATURAS VENCIDAS ATÉ ' + DataTemp +
            ' PAGAS.'#13 + 'OBRIGADO';
        end
        else
        begin
          if Qtde <= MaxParcelasAberto then
            Value := 'FATURAS ANTERIORES ABERTO: '#13 + S
          else if ValorAberto > 0 then
            Value := 'FATURAS ANTERIORES ABERTO: '#13 + IntToStr(Qtde) + ' ' +
              TFuncoesString.PadL(FormatCurr(',0.00', ValorAberto), 7);
        end;
      end;
    end;
  end
  else if VN = 'NOVA_PAGINA' then
  begin
    PosicionaCfgModelo(frxDBReceber.DataSet.FieldByName('CFG_BOLETO_MODELO_REC').AsInteger);

    Value := FDSCfgMod.FieldByName('NOVAPAGINA_CFGBLMOD').AsString = 'S'
  end
  else if VN = 'FLAGCOMPROVANTE' then
    Value := False
  else if VN = 'DOBRA_COM_ENDERECO' then
  begin
    PosicionaCfgModelo(frxDBReceber.DataSet.FieldByName('CFG_BOLETO_MODELO_REC').AsInteger);

    Value := (FDSCfgMod.FieldByName('END_DEST_DOBRAR_CFGBLMOD').AsString = 'S')
  end
  else if VN = 'FLAGCARNE' then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    Value := (FDSServico.FieldByName('TIPODOCUMENTO_SER').AsInteger = 2);
  end
  else if VN = 'FLAGCAPA' then
    Value := False
  else if VN = 'DATA_EMISSAO' then
    Value := fDataEmissaoBoleto
  else if VN = 'DATA_PROCESSAMENTO' then
    Value := fDataProcessamento
  else if (VN = 'BARRA1') then // linha digitavel
  begin
    Value := TFuncBoleto.FormatarLinhaDigitavel(frxDBReceber.DataSet.FieldByName('LINHA_DIGITAVEL_BOLETO_REC').AsString);
  end
  else if VN = 'BARRA' then
    Value := frxDBReceber.DataSet.FieldByName('COD_BARRA_BOLETO_REC').AsString
  else if (VN = 'EMPRESA') or (VN = 'CEDENTE') then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    Value := FDSServico.FieldByName('CEDENTE_NOME_CCR').AsString;
  end
  else if VN = 'VENCIMENTO' then
    Value := frxDBReceber.DataSet.FieldByName('VENCIMENTO_REC').AsDateTime
  else if VN = 'VALOR' then
    Value := frxDBReceber.DataSet.FieldByName('VALOR_REC').AsCurrency +
      frxDBReceber.DataSet.FieldByName('BOLETO_VLR_COBRADO_REC').AsCurrency
  else if VN = 'NOME' then
    Value := frxDBReceber.DataSet.FieldByName('NOME_CLI').AsString
  else if VN = 'ENDERECO' then
    Value := frxDBReceber.DataSet.FieldByName('ENDERECO_CLI').AsString + ' ' +
      frxDBReceber.DataSet.FieldByName('NUM_ENDERECO_CLI').AsString + ' ' +
      frxDBReceber.DataSet.FieldByName('COMPL_END_CLI').AsString
  else if VN = 'BAIRRO' then
    Value := frxDBReceber.DataSet.FieldByName('BAIRRO_CLI').AsString
  else if VN = 'CIDADE' then
    Value := frxDBReceber.DataSet.FieldByName('CID_CLI').AsString
  else if VN = 'ESTADO' then
    Value := frxDBReceber.DataSet.FieldByName('EST_CLI').AsString
  else if VN = 'CEP' then
    Value := TFuncoesString.FormataCEP(TFuncoesString.SoNumero(frxDBReceber.DataSet.FieldByName('CEP_CLI').AsString))
  else if VN = 'CODIGO' then
    Value := frxDBReceber.DataSet.FieldByName('CODCLI').AsInteger
  else if VN = 'EMISSAO' then
    Value := fDataEmissaoBoleto
  else if VN = 'DEMONSTRATIVO' then
    Value := frxDBReceber.DataSet.FieldByName('DEMONSTRATIVO_REC').AsString
  else if VN = 'TEXTO' then
    Value := frxDBReceber.DataSet.FieldByName('TEXTO_LIVRE_BOLETO_REC').AsString
  else if VN = 'BANCO' then
  begin
    S := '';

    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    if FDSServico.FieldByName('CAMARA_COMPENSACAO_BAN').AsInteger > 0 then
      S := TFuncoesNumero.StrZero(FDSServico.FieldByName('CAMARA_COMPENSACAO_BAN').AsInteger, 3);

    if (S <> '') and (Trim(FDSServico.FieldByName('DV_CAMARA_COMP_BAN').AsString) <> '') then
      S := S + '-';

    S := S + Trim(FDSServico.FieldByName('DV_CAMARA_COMP_BAN').AsString);

    Value := S;
  end
  else if VN = 'ESPECIE' then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    Value := Trim(FDSServico.FieldByName('ESPECIE_DOCUMENTO_SER').AsString);
  end
  else if VN = 'ESPECIE_MOEDA' then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    if FDSServico.FieldByName('NOME_MOEDA_SER').AsString <> '' then
      Value := FDSServico.FieldByName('NOME_MOEDA_SER').AsString
    else
      Value := FDSServico.FieldByName('MOEDA_SER').AsString
  end
  else if VN = 'AGENCIA_COD_CEDENTE' then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    case FDSServico.FieldByName('IDENTIFICACAO_SER').AsInteger of
      1:
        begin
          Cedente   := Trim(FDSServico.FieldByName('CONTA_CCR').AsString);
          DVCedente := Trim(FDSServico.FieldByName('DV_CONTA_CCR').AsString);
        end;
      2:
        begin
          Cedente   := Trim(FDSServico.FieldByName('NUM_CONTRATO_SER').AsString);
          DVCedente := Trim(FDSServico.FieldByName('DV_CONTRATO_SER').AsString);
        end;
      3:
        begin
          Cedente   := Trim(FDSServico.FieldByName('CODIGO_CEDENTE_SER').AsString);
          DVCedente := Trim(FDSServico.FieldByName('DV_CEDENTE_SER').AsString);
        end;
    end;

    Value := FDSServico.FieldByName('AGENCIA_CCR').AsString + ' / ' + Trim(Cedente) +
      ifThen(DVCedente <> '', '-', '') + DVCedente;
  end
  else if VN = 'NUMERO_DOCUMENTO' then
    Value := frxDBReceber.DataSet.FieldByName('DOCUMENTO_REC').AsString
  else if VN = 'NOSSO_NUMERO' then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    if FDSServico.FieldByName('CAMARA_COMPENSACAO_BAN').AsInteger = 77 then // inter
    begin
      var
        D, V, N: string;
      N := frxDBReceber.DataSet.FieldByName('NOSSO_NUM_FORMATADO_REC').AsString;

      V := copy(N, 1, N.Length - 1);
      D := copy(N, N.Length, 1);

      Value := FDSServico.FieldByName('AGENCIA_CCR').AsString + '/' +
        FDSServico.FieldByName('CARTEIRA_SER').AsString + '/' + V + '-' + D;
    end
    else
      Value := frxDBReceber.DataSet.FieldByName('NOSSO_NUM_FORMATADO_REC').AsString;
  end
  else if VN = 'ACEITE' then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    Value := FDSServico.FieldByName('ACEITE_SER').AsString;
  end
  else if VN = 'CARTEIRA' then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    Value := FDSServico.FieldByName('CARTEIRA_SER').AsString
  end
  else if VN = 'LOCAL_PAGAMENTO' then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    Value := FDSServico.FieldByName('LOCAL_PAGAMENTO_SER').AsString
  end
  else if VN = 'CEDENTE_CNPJ_CPF' then
  begin
    PosicionaServico(frxDBReceber.DataSet.FieldByName('SERVICO_BANCARIO_REC').AsInteger);

    Value := TFuncoesString.FormataCnpjCpf(FDSServico.FieldByName('CNPJ_CPF_CCR').AsString)
  end
  else if VN = 'CEDENTE_ENDERECO' then
    Value := fSecaoAtual.Empresa.Endereco + ' ' +
      fSecaoAtual.Empresa.NumeroEndereco + ' ' +
      fSecaoAtual.Empresa.Bairro + ' ' +
      TFuncoesString.FormataCEP(fSecaoAtual.Empresa.CEP) + ' ' +
      fSecaoAtual.Empresa.Cidade.Nome_Cid + '-' +
      fSecaoAtual.Empresa.Cidade.UF_Cid

  else if VN = 'CPF' then
    Value := TFuncoesString.FormataCnpjCpf(
    ifThen(TFuncoesString.SoNumero(frxDBReceber.DataSet.FieldByName('CPF_CLI').AsString) = '',
      frxDBReceber.DataSet.FieldByName('CNPJ_CLI').AsString,
      frxDBReceber.DataSet.FieldByName('CPF_CLI').AsString))
  else if VN = 'VALOR_DESCONTO' then
    Value := 0 // EditValorDesc.Value
  else if VN = 'OUTROS_VALORES' then
    Value := 0
  else
  begin
    F := frxDBReceber.DataSet.FindField(VN);
    if F <> nil then
    begin
      Value := F.AsString;

      // Limpar conteudo
      if (VN = 'SACADOR_AVALISTA_REC') or (VN = 'CODIGO_AVALISTA') then
      begin
        if VarToStr(Value) = '0' then
          Value := '';
      end
      else if (VN = 'CNPJ_CPF_AVALISTA') and (VarToStr(Value) <> '') then
        Value := TFuncoesString.FormataCnpjCpf(Value);
    end;
  end;
end;
 

Link para o comentário
Compartilhar em outros sites

14 horas atrás, JHONLENON disse:

Antonio Gomes Eu pensei que assim dava certo...criando um variavel..... ACBrBoletoFCFR.Report.Variables['CODIGOBARRAS'] := QuotedStr(sCODIGO_BARRAS);

funciona sim, eu faço assim:

 

        AFrxReport.Variables.Variables[Trim(CDS.FieldByName('VARIAVEL_RPERD').AsString)] := CDS.FieldByName('VALOR_RPERD').AsString;

 

 

Link para o comentário
Compartilhar em outros sites

  • Solution

Antonio Gomes Obrigado pela ajuda...mais fiz diferente...rsrs eu consegui alimentar os campos linha digitavél e codigo de barras em tempo de execução....ai ficou top...mais tive modificar um arquivo.fr3 só pro INTER ai funcionou.....eu fiz assim criei um arquivo tfrXDBDaset ligado ao uma Qry com select passando os 2 campos, linha digitavél e codigo de barras....quando me retorna esses dados eu já gravo no banco pra fazer o select antes de imprimir o boleto, lá dentro do arquivo.fr3 do boleto eu liguei os campos linha digitavél e codigo de barras com tfrXDBDaset...ai antes de imprimir o boleto eu faço um select na query que está ligada ao tfrXDBDaset. Pode encerrar o topico.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 835 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.