unit CadRemessa;

interface

uses
  Windows, system.UItypes, IB_Access,  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ModeloCadastro, ImgList, AppEvnts, IB_Components, ExtCtrls,
  jpeg, Grids, IB_Grid, StdCtrls, Buttons, ComCtrls, Mask, IB_Controls,
  UCBase, ppDBPipe, ppComm, ppRelatv, ppProd, ppClass, ppReport,
  IBODataset, ppCtrls, ppBands, ppPrnabl, ppCache, ppModule, raCodMod,
  ppParameter,CBR_641, ppDesignLayer, ppDB, Data.DB, IB_EditButton,
  System.ImageList, GerarArquivoRemessa;


type
  TfrmCadRemessa = class(TFrModeloCadastro)
    IB_Date2: TIB_Date;
    GroupBox1: TGroupBox;
    dbCodigo: TIB_Text;
    edtusuarioLancamento: TIB_Edit;
    edtDataRemessa: TIB_Date;
    edtHoraRemessa: TIB_Edit;
    qryDadosBancarios: TIB_Query;
    dtDadosBancarios: TIB_DataSource;
    pgOutros: TPageControl;
    tabCTRC: TTabSheet;
    qrUsuarioCadastro: TIB_Query;
    dsrUsuarioCadastro: TIB_DataSource;
    qryBoleta: TIB_Query;
    grdBoletas: TIB_Grid;
    dtBoleta: TIB_DataSource;
    BitBtn5: TBitBtn;
    qryPesquisaBoleta: TIB_Query;
    BitBtn6: TBitBtn;
    btnImprimir: TBitBtn;
    edtQteCTRC: TIB_Currency;
    edtTotal_Frete: TIB_Currency;
    dtTotais: TIB_DataSource;
    qryTotais: TIB_Query;
    edtCodBOLETA: TLabeledEdit;
    qrLista: TIBOQuery;
    dsrLista: TDataSource;
    ppDBPipeline1: TppDBPipeline;
    RelatLista: TppReport;
    ppParameterList1: TppParameterList;
    GroupBox2: TGroupBox;
    edtCodDadosBancarios: TEdit;
    edtConvenio: TIB_LookupCombo;
    BitBtn1: TBitBtn;
    IB_Edit1: TIB_Edit;
    IB_Edit2: TIB_Edit;
    IB_Edit3: TIB_Edit;
    qryRemessaDetalhe: TIB_Query;
    ppHeaderBand1: TppHeaderBand;
    ppShape2: TppShape;
    ppLabel1: TppLabel;
    ppLabel2: TppLabel;
    ppLabel8: TppLabel;
    ppDBText9: TppDBText;
    ppLabel15: TppLabel;
    ppLabel3: TppLabel;
    ppLabel4: TppLabel;
    ppDetailBand1: TppDetailBand;
    ppDBText3: TppDBText;
    ppDBText1: TppDBText;
    ppDBText5: TppDBText;
    ppDBText6: TppDBText;
    ppFooterBand1: TppFooterBand;
    ppSummaryBand1: TppSummaryBand;
    ppShape1: TppShape;
    ppDBCalc3: TppDBCalc;
    ppDBCalc1: TppDBCalc;
    ppLabel5: TppLabel;
    raCodeModule1: TraCodeModule;
    ppDBText4: TppDBText;
    ppDBText7: TppDBText;
    btnArquivo: TBitBtn;
    ppDBText8: TppDBText;
    ppDBText10: TppDBText;
    ppDBText11: TppDBText;
    ppLabel7: TppLabel;
    ppDBText12: TppDBText;
    ppLabel10: TppLabel;
    ppLabel9: TppLabel;
    ppDBText13: TppDBText;
    ppLabel11: TppLabel;
    ppDBText14: TppDBText;
    ppDBText15: TppDBText;
    ppLabel12: TppLabel;
    ppLabel13: TppLabel;
    ppDBText2: TppDBText;
    ppLine1: TppLine;
    ppLabel6: TppLabel;
    salvar: TSaveDialog;
    qryHistoricoMovimentacao: TIB_Query;
    procedure FormCreate(Sender: TObject);
    procedure AtualizaTela;
    procedure edtCodDadosBancariosExit(Sender: TObject);
    procedure edtCodDadosBancariosKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure BitBtn1Click(Sender: TObject);
    procedure BtExcluirClick(Sender: TObject);
    procedure BtCancelarClick(Sender: TObject);
    procedure BtAnteriorClick(Sender: TObject);
    procedure BtProximoClick(Sender: TObject);
    procedure BtInserirClick(Sender: TObject);
    procedure BtEditarClick(Sender: TObject);
    procedure edtConvenioChange(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure BtGravarClick(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
    procedure btnImprimirClick(Sender: TObject);
    procedure btnEditar2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure btnArquivoClick(Sender: TObject);
  private
    procedure PesquisaConvenios;
    procedure AtualizaMostraBOLETA;
    function Cabecalho: String;
    function Detalhe: String;
    procedure ExportaArquivo;
    procedure GravaHistoricoMovimentacao;
    procedure MontaNomeArquivo;


    { Private declarations }
  public
    Consulta:Boolean;
    { Public declarations }
  end;

var
  frmCadRemessa: TfrmCadRemessa;
  codbarra : string;
  banco,
  moeda,
  agencia ,
  dv_agencia,
  Conta,
  dv_conta,
  fatorVencimento,
  dv_nosso_Numero,
  convenio,
  dvCodBarra,
  carteira,
  valorSTR,
  nome_cedente : string;
  ArquivoTexto : TextFile;
  linhas:integer;
  NomeArquivo:string;
implementation

uses ModeloPesquisa, DataModulo, Rotinas;

{$R *.dfm}

procedure TfrmCadRemessa.AtualizaTela;
begin
   //=============== Atualiza a visualizacao dos dados ================
   if not qryDadosBancarios.Locate('CODIGO' , TbPrincipal.FieldByName('COD_DADOS_BANCARIOS').Value , [] ) THEN
   begin
      if not qryDadosBancarios.Bof then
      begin
         qryDadosBancarios.First;
         qryDadosBancarios.Prior;
      end;
   end;

   if not qrUsuarioCadastro.Locate('COD_USUARIO' , TbPrincipal.FieldByName('COD_USUARIO').Value  , [] ) then
   begin
      if not qrUsuarioCadastro.Bof then
      begin
         qrUsuarioCadastro.First;
         qrUsuarioCadastro.Prior;
      end;
   end;

  AtualizaMostraBOLETA;
end;

procedure TfrmCadRemessa.AtualizaMostraBOLETA;
begin
  qryBoleta.Close;
  qryBoleta.ParamByName('COD_REMESSA').Value := TbPrincipal.FieldByName('COD_REMESSA').Value;
  qryBoleta.ParamByName('COD_FILIAL').Value    := TbPrincipal.FieldByName('COD_FILIAL').Value;
  qryBoleta.Open;

  qryTotais.Close;
  qryTotais.ParamByName('COD_REMESSA').Value := TbPrincipal.FieldByName('COD_REMESSA').Value;
  qryTotais.ParamByName('COD_FILIAL').Value    := TbPrincipal.FieldByName('COD_FILIAL').Value;
  qryTotais.Open;
end;

procedure TfrmCadRemessa.FormCreate(Sender: TObject);
begin
    //==================== Filta apenas os Manifestos da filial logada =============
   TbPrincipal.ParamByName('COD_FILIAL').Value := Dados.qrFilial.FieldByName('COD_FILIAL').Value;

   inherited;

   qryDadosBancarios.Open;
   qrUsuarioCadastro.Open;
end;

procedure TfrmCadRemessa.edtCodDadosBancariosExit(Sender: TObject);
var Cod : Integer;
begin
   inherited;

   if edtCodDadosBancarios.Text = '' then
      Exit;

   if TryStrToInt(edtCodDadosBancarios.Text , cod) = False then
   begin
      MessageDlg('O código Informado não é válido', mtInformation, [mbOK], 0);
      edtCodDadosBancarios.SetFocus;
      Exit;
   end;

   if not qryDadosBancarios.Locate('CODIGO',cod,[]) then
   begin
      MessageDlg('Não existem Convênios de Cobrança Cadastrados', mtWarning, [mbOK], 0);
      edtCodDadosBancarios.SetFocus;
      edtCodDadosBancarios.SelectAll;
      if not qryDadosBancarios.Bof then
      begin
         qryDadosBancarios.First;
         qryDadosBancarios.Prior;
      end;
   end;

end;

procedure TfrmCadRemessa.PesquisaConvenios;
begin
   //==================== Pesquisa Convenios ============
   frmModeloPesquisa        := TfrmModeloPesquisa.Create(Application);
   frmModeloPesquisa.Tabela := qryDadosBancarios;
   frmModeloPesquisa.lbltitulo.Caption := 'Pesquisa Convênios';
   if frmModeloPesquisa.ShowModal = mrok then
   begin
      qryDadosBancarios.Locate('CODIGO', frmModeloPesquisa.TbPrincipal.FieldByName('CODIGO').Value ,[]);
      edtConvenio.Text := qryDadosBancarios.FieldByName('DESCRICAO_CONVENIO').AsString;
   end;
   frmModeloPesquisa.Destroy;
   Screen.OnActiveControlChange := TrocaCor;
end;



procedure TfrmCadRemessa.edtCodDadosBancariosKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  inherited;
   if TbPrincipal.State in [dssBrowse] then
      Exit;

   if (Key =  VerificaAtalho(Dados.tbConfig.FieldByName('ATALHO_PESQUISA').AsString)) and (edtCodDadosBancarios.Focused or edtConvenio.Focused) then
   begin
      PesquisaConvenios;
   end;
end;

procedure TfrmCadRemessa.BitBtn1Click(Sender: TObject);
begin
  inherited;
   PesquisaConvenios;
end;

procedure TfrmCadRemessa.BtExcluirClick(Sender: TObject);
begin
   inherited;
   AtualizaTela;
end;

procedure TfrmCadRemessa.BtCancelarClick(Sender: TObject);
begin
    {============================================
       Se estiver inserindo um novo manifesto
       No cancel deve tirar o vinculo dos BOLETA com o Manifesto
    ============================================}

   if TbPrincipal.State in [dssInsert] then
   begin
      qryBoleta.First;
      while  not qryBoleta.Eof do
      begin
         qryBoleta.Edit;
         qryBoleta.FieldByName('COD_MANIFESTO').Value        := Null;
         qryBoleta.FieldByName('COD_FILIAL_MANIFESTO').Value := Null;
         qryBoleta.Post;
         qryBoleta.Next;
      end;
   end;

  inherited;
   AtualizaTela;
   btnImprimir.Visible := True;
   btnArquivo.Visible := True;
end;

procedure TfrmCadRemessa.BtAnteriorClick(Sender: TObject);
begin
  inherited;
   AtualizaTela;
end;

procedure TfrmCadRemessa.BtProximoClick(Sender: TObject);
begin
  inherited;
   AtualizaTela;
end;

procedure TfrmCadRemessa.BtInserirClick(Sender: TObject);
var codigo : Integer;
begin
   //=============== Pega o maior codigo da Remessa gerada pela filial atual ================
   qryPesquisa.Close;
   qryPesquisa.SQL.Clear;
   qryPesquisa.SQL.Add(' SELECT MAX(REMESSA.COD_REMESSA) AS codigo ');
   qryPesquisa.SQL.Add(' FROM REMESSA                                ');
   qryPesquisa.SQL.Add(' WHERE REMESSA.COD_FILIAL = :codFilial');
   qryPesquisa.ParamByName('codFilial').Value := Dados.qrFilial.FieldByName('COD_FILIAL').Value;
   qryPesquisa.Open;

   codigo := qryPesquisa.FieldByName('CODIGO').AsInteger + 1;

   inherited;
   if qryDadosBancarios.RecordCount = 1 then
      TbPrincipal.FieldByName('COD_DADOS_BANCARIOS').Value           := qryDadosBancarios.FieldByName('CODIGO').Value;

   TbPrincipal.FieldByName('COD_REMESSA').Value       := codigo;
   TbPrincipal.FieldByName('DATA_CADASTRO').Value     := Date;
   TbPrincipal.FieldByName('HORA_REMESSA').Value      := Time;
   TbPrincipal.FieldByName('DATA_REMESSA').Value      := Date;

   TbPrincipal.FieldByName('COD_USUARIO').Value         := Dados.qrUsuario.FieldByName('COD_USUARIO').Value;
   TbPrincipal.FieldByName('COD_FILIAL').Value := Dados.qrFilial.FieldByName('COD_FILIAL').Value;
   AtualizaTela;

   btnImprimir.Visible := False;
   btnArquivo.Visible := False;

end;

procedure TfrmCadRemessa.BtEditarClick(Sender: TObject);
begin
  inherited;
   AtualizaTela;
end;

procedure TfrmCadRemessa.edtConvenioChange(Sender: TObject);
begin
  inherited;
   if edtConvenio.Text = '' then
      edtCodDadosBancarios.Clear
   else
      edtCodDadosBancarios.Text := qryDadosBancarios.FieldByName('CODIGO').AsString;
end;


procedure TfrmCadRemessa.BitBtn5Click(Sender: TObject);
var num: integer;
begin
  inherited;

   qryPesquisaBoleta.Close;
   qryPesquisaBoleta.ParamByName('cod_conta_receber').Value := edtCodBOLETA.Text;
   qryPesquisaBoleta.ParamByName('COD_FILIAL').Value        := Dados.qrFilial.FieldByName('COD_FILIAL').Value;
   qryPesquisaBoleta.Open;

   if qryPesquisaBoleta.IsEmpty then
   begin
      MessageDlg('BOLETA não encontrada', mtWarning, [mbOK], 0);
      edtCodBOLETA.SetFocus;
      Exit;
   end;

   IF qryPesquisaBoleta.FieldByName('BANCO').AsString <> '' then
   begin
      if (qryPesquisaBoleta.FieldByName('BANCO').AsString <> qryDadosBancarios.FieldByName('BANCO').AsString)    then
      begin
         MessageDlg('BOLETA não é deste banco foi gerada para :'+#13+#10+qryPesquisaBoleta.FieldByName('BANCO').AsString, mtWarning, [mbOK], 0);
         edtCodBOLETA.SetFocus;
         Exit;
      end;

   end;

   {==================================
      Não deixa manifestar um BOLETA q nao tenha data de emissao.
      Estava dando erro nos livro de registro de saida.
      O livro de saida lista os BOLETA com base na data de emissao.
   ===================================}
   if qryPesquisaBoleta.FieldByName('DATA_CAD').IsNull then
   begin
      MessageDlg('Este BOLETA não foi emitida.'+#13+#10+'Não é possível enviá-la', mtWarning, [mbOK], 0);
      edtCodBOLETA.SetFocus;
      Exit;
   end;

   if (qryPesquisaBoleta.FieldByName('CNPJ').AsString = '') then
   begin
      MessageDlg('Não foi informado o cliente no pedido'+#13+#10+
                 'Favor verificar os dados do PEDIDO nº: ' + qryPesquisaBoleta.FieldByName('COD_PEDIDO').AsString, mtWarning, [mbOK], 0);
      edtCodBOLETA.SetFocus;
      Exit;
   end;

   if qryPesquisaBoleta.FieldByName('COD_REMESSA').IsNotNull then
   begin
      if MessageDlg('Este BOLETA já está na Remessa N°: '          + qryPesquisaBoleta.FieldByName('COD_REMESSA').AsString +#13+#10+
                    'Deseja alterar alterar para a REMESSA N°:' + TbPrincipal.FieldByName('COD_REMESSA').AsString , mtConfirmation, [mbYes, mbNo], 0) = mrYes then
      begin
         if (MessageDlg('Confirma a mudança do REMESSA N° ' + edtCodBOLETA.Text  + #13+#10+
                        'atualmente na REMESSA N° ' + qryPesquisaBoleta.FieldByName('COD_REMESSA').AsString + #13+#10+
                        'para a REMESSA Atual N°  ' + TbPrincipal.FieldByName('COD_REMESSA').AsString + ' ?', mtConfirmation, [mbYes, mbNo], 0) = mrNo) then
         begin
            edtCodBOLETA.SetFocus;
            Exit;
         end
      end
      else
      begin
         edtCodBOLETA.SetFocus;
         Exit;
      end;
   end;

   if TbPrincipal.State in [dssInsert] then
      TbPrincipal.PostRetaining;

   qryRemessaDetalhe.Insert;
   qryRemessaDetalhe.FieldByName('COD_REMESSA').Value := TbPrincipal.FieldByName('COD_REMESSA').Value ;
   qryRemessaDetalhe.FieldByName('COD_FILIAL').Value  := TbPrincipal.FieldByName('COD_FILIAL').Value ;
   qryRemessaDetalhe.FieldByName('COD_CONTAS_RECEBER').Value  := edtCodBoleta.Text ;

   descricao_auditoria := 'Cadastrou na remessa a BOLETA ' + qryPesquisaBoleta.FieldByName('COD_REMESSA').AsString + ' filial ' + qryPesquisaBoleta.FieldByName('cod_filial').AsString+
                          ' na REMESSA n° ' + TbPrincipal.FieldByName('COD_REMESSA').AsString +  ' filial ' + TbPrincipal.FieldByName('COD_FILIAL').AsString;

   GravaAuditoria(False,qryPesquisaBoleta);

   qryRemessaDetalhe.Post;

   AtualizaMostraBOLETA;

   num := StrToInt(edtCodBOLETA.Text );
   edtCodBOLETA.Text := IntToStr(num + 1);
   edtCodBOLETA.SetFocus;

     qryBoleta.Locate('cod_contas_receber', num , [])
end;

procedure TfrmCadRemessa.BtGravarClick(Sender: TObject);
begin
   if edtConvenio.Text = '' then
   begin
      MessageDlg('Informe o convênio', mtWarning, [mbOK], 0);
      edtConvenio.SetFocus;
      Exit;
   end;

   if TbPrincipal.State in [dssInsert] then
   begin
      if edtDataRemessa.Value = 0 then
      begin
         MessageDlg('Informe a data da Remessa', mtWarning, [mbOK], 0);
         edtDataRemessa.SetFocus;
         Exit;
      end;
   end;

   if edtDataRemessa.Value < Date then
   begin
      if (MessageDlg('A data informada para a REMESSA é menor'+#13+#10+'que a data Atual.'+#13+#10+'Deseja continuar com o processo de gravação?', mtConfirmation, [mbYes, mbNo], 0) = mrNo) then
      begin
         edtDataRemessa.SetFocus;
         Exit;
      end;
   end;

   if edtHoraRemessa.Field.IsNull then
   begin
      MessageDlg('Informe a hora da remessa', mtWarning, [mbOK], 0);
      edtHoraRemessa.SetFocus;
      Exit;
   end;

   TbPrincipal.FieldByName('COD_DADOS_BANCARIOS').Value:=qryDadosBancarios.FieldBYName('CODIGO').Value;

   inherited;

   btnImprimir.Visible := True;
   btnArquivo.Visible := True;
end;

procedure TfrmCadRemessa.BitBtn6Click(Sender: TObject);
begin
   inherited;
   if (MessageDlg('Deseja reamlente excluir o BOLETA da Remessa?', mtConfirmation, [mbYes, mbNo], 0) = mrNo) then
      Exit;

   descricao_auditoria := 'Tirou da remessa a BOLETA ' + qryBoleta.FieldByName('COD_CONTAS_RECEBER').AsString + ' filial ' + qryBoleta.FieldByName('COD_FILIAL').AsString+
                          ' na REMESSA n° ' + qryBoleta.FieldByName('COD_REMESSA').AsString +  ' filial ' + qryBoleta.FieldByName('COD_FILIAL').AsString;

   qryBoleta.Delete;
   GravaAuditoria(False,qryBoleta);

   AtualizaMostraBOLETA;
end;

procedure TfrmCadRemessa.btnImprimirClick(Sender: TObject);
begin
  inherited;
   qrLista.Close;
   qrLista.ParamByName('COD_REMESSA').Value := TbPrincipal.FieldByName('COD_REMESSA').Value ;
   qrLista.ParamByName('COD_FILIAL').Value    := TbPrincipal.FieldByName('COD_FILIAL').Value ;
   qrLista.Open;

   ImpressaoBaseadaNoModelo(RelatLista,True,'Lista de Remessa','');
end;

procedure TfrmCadRemessa.btnEditar2Click(Sender: TObject);
begin
  inherited;
   btnImprimir.Visible := False;
   btnArquivo.Visible := False;
end;

procedure TfrmCadRemessa.FormActivate(Sender: TObject);
begin
  inherited;
  AtualizaTela;
end;

procedure TfrmCadRemessa.btnArquivoClick(Sender: TObject);
var ListaDuplicatas : TStringList;
    salvarEm:String;
begin
   //==================== Gera o Arquivo de remessa =============
   ListaDuplicatas := TStringList.Create;
   ListaDuplicatas.Clear;

   qryBoleta.First;
   while not qryBoleta.Eof do
   begin
      ListaDuplicatas.Add(qryBoleta.FieldByName('COD_CONTAS_RECEBER').AsString);
      qryBoleta.Next;
   end;

   frmGerarArquivoRemessa := TfrmGerarArquivoRemessa.Create(Application);
   frmGerarArquivoRemessa.Show;

   if qryDadosBancarios.FieldByName('PADRAO_ARQUIVO_REMESSA').AsString = 'Remessa CNAB 240 Sicoob' then
      frmGerarArquivoRemessa.GeraArquivoSicoob_240(ListaDuplicatas, qryDadosBancarios.FieldByName('COD_CONVENIO').AsInteger );

   if qryDadosBancarios.FieldByName('PADRAO_ARQUIVO_REMESSA').AsString = 'Itau CNAB 400' then
      frmGerarArquivoRemessa.GeraArquivoITAU_400(ListaDuplicatas , qryDadosBancarios.FieldByName('COD_CONVENIO').AsInteger);

   if qryDadosBancarios.FieldByName('PADRAO_ARQUIVO_REMESSA').AsString = 'Bancoob 240' then
      frmGerarArquivoRemessa.GeraArquivoACBR (ListaDuplicatas, qryDadosBancarios.FieldByName('COD_CONVENIO').AsInteger );

   if (qryDadosBancarios.FieldByName('PADRAO_ARQUIVO_REMESSA').AsString = 'Brasil 641') or
      (qryDadosBancarios.FieldByName('PADRAO_ARQUIVO_REMESSA').AsString = 'Brasil 240') then
   begin
     //================ Deixando a rotina antiga de geração para o banco do brasil que funcionava normalmente;

     frmGerarArquivoRemessa.Close;

      MontaNomeArquivo;
       try
         if ExisteArquivo('C:\BancoBrasil\officePLUGIN\'+'index.html') then
           salvar.FileName := 'C:\BancoBrasil\BBTransf\remessa\'+NomeArquivo+'.txt'
          else
          begin
           salvar.FileName := CaminhoEXE+NomeArquivo;
           if salvar.Execute then
              salvarEm := salvar.FileName
           else
              Exit;
          end;
          AssignFile(ArquivoTexto,salvar.FileName);
          Rewrite(ArquivoTexto);
          except on E: Exception do
          begin
             MessageDlg('Não foi possível criar o arquivo'+#13+#10+#13+#10+
                       e.Message , mtWarning, [mbOK], 0);
             Exit;
          end;
       end;
      ExportaArquivo;

   end;


   frmGerarArquivoRemessa.Destroy;

   ListaDuplicatas.Destroy;

end;

procedure TfrmCadRemessa.ExportaArquivo;
begin
  linhas:= 0;
  inc(linhas);
  writeln(ArquivoTexto, Cabecalho);
  qryBoleta.First;
  while NOT qryBoleta.Eof  do
  begin
    inc(linhas);
    writeln(ArquivoTexto, Detalhe);
    GravaHistoricoMovimentacao;
    qryBoleta.Next;
  end;
  inc(linhas);
  writeln(ArquivoTexto, CBR_641_Trailler(intToStr(linhas)));
  CloseFile(ArquivoTexto);
end;

function TfrmCadRemessa.Cabecalho:String;
var data_geracao:String;
begin
  data_geracao:=copy(data_geracao,1,2)+copy(data_geracao,4,2)+copy(data_geracao,9,2);
  Result:= CBR_641_Header ('REMESSA', qryDadosBancarios.FieldByName('agencia').AsString, qryDadosBancarios.FieldByName('dv_agencia').AsString, qryDadosBancarios.FieldByName('conta').AsString,
                            qryDadosBancarios.FieldByName('dv_conta').AsString, Dados.qrRegistro.FieldByName('RAZAO_SOCIAL').AsString, DateToStr(date), intToStr(tbPrincipal.FieldByName('COD_REMESSA').AsInteger),
                            qryDadosBancarios.FieldByName('convenio').AsString
                            );

end;

function TfrmCadRemessa.Detalhe:String;
var contas_receber,
    nosso_numero_det,
    variacao,
    Seu_Numero,comando,Data_Vencimento,Valor_Titulo,Tipo_Inscricao_empresa,Data_Emissao,Tipo_Inscricao_Sacado,
    CNPJ_CPF_Sacado,Nome_Sacado,Endereco_Sacado,CEP_Sacado,Cidade_Sacado,UF_Sacado,
    Especie_Titulo,Primeira_Instrucao,Segunda_Instrucao
    , Juros_Mora, Data_Limite_Concessao_Desc, Valor_Desconto, Valor_IOF, Valor_Abatimento
    , Observacoes_Mensagem,Dias_Para_Protesto,Tipo_Cobranca,Carteira_Cobranca,Numero_Banco,Bairro_Sacado:String;
begin
  Tipo_Inscricao_empresa:='02'; // 02 = Pesso Jurídica

  contas_receber:=Formatar(' ',25,false,  ' ');
  Seu_Numero:=FormatarTexto(qryBoleta.FieldByName('COD_CONTAS_RECEBER').AsString,10 ,False , '0');
  nosso_numero_det:=qryDadosBancarios.FieldByName('CONVENIO').AsString+FormatarTexto(qryBoleta.FieldByName('COD_CONTAS_RECEBER').AsString,10 ,False , '0');

  variacao:=qryDadosBancarios.FieldByName('variacao').AsString;
  variacao:=Formatar(variacao,3,false,  '0');
  Especie_Titulo:='01'; // Duplicata Mercantil
  if Dados.tbConfig.FieldByName('PROTESTAR_APOS').AsInteger = 0 then
    Primeira_Instrucao:='07'{NOTA 10 não protestar}
  else
    Primeira_Instrucao:='06';{NOTA 10
                            Indica Protesto em dias corridos, com prazo de 6 a 29, 35 ou 40 dias Corridos.
                          -  Obrigatório impostar, nas posições 392 a 393 o prazo de protesto desejado:  6 a 29, 35 ou 40 dias.}
  Segunda_Instrucao:='01';{NOTA 10 - 01 - Cobrar juros}
  Juros_Mora:=FormatarMoeda(FloatToSTr((qryBoleta.FieldByName('VALOR_A_PAGAR').AsFloat * (Dados.tbConfig.FieldByName('TAXA_JUROS').AsFloat / 100) ) / 30));
  comando:='01';
  Dias_Para_Protesto:=Dados.tbConfig.FieldByName('PROTESTAR_APOS').AsString;
  Tipo_Cobranca:=''; {Nota 26 - TIPO DE COBRANÇA
                    a) Carteiras 11 ou 17
                    -  04DSC: Solicitação de registro na Modalidade Descontada
                    -  08VDR: Solicitação de registro na Modalidade BBVendor
                    -  02VIN: solicitação de registro na Modalidade Vinculada
                    -  BRANCOS: Registro na Modalidade Simples
                     }
  Carteira_Cobranca:=qryDadosBancarios.FieldByName('CARTEIRA').AsString;

  Data_Vencimento:=qryBoleta.FieldByName('DATA_VENCIMENTO').AsString;
  Valor_Titulo:=qryBoleta.FieldByName('VALOR_A_PAGAR').AsString;
  Data_Emissao:=qryBoleta.FieldByName('data_cad').AsString;
  if qryBoleta.FieldByName('TIPO_CADASTRO').AsString = 'J' then
    Tipo_Inscricao_Sacado:='02'
  else
  if qryBoleta.FieldByName('TIPO_CADASTRO').AsString = 'F' then
    Tipo_Inscricao_Sacado:='01';
  Numero_Banco:=qryDadosBancarios.FieldByName('BANCO').AsString;

  CNPJ_CPF_Sacado:=qryBoleta.FieldByName('CLIENTE_CNPJ').AsString;
  Nome_Sacado    :=qryBoleta.FieldByName('CLIENTE_NOME').AsString;
  Endereco_Sacado:=qryBoleta.FieldByName('CLIENTE_ENDERECO').AsString;
  Bairro_Sacado  :='   '+qryBoleta.FieldByName('CLIENTE_BAIRRO').AsString;
  CEP_Sacado     :=qryBoleta.FieldByName('CLIENTE_CEP').AsString;
  Cidade_Sacado  :=qryBoleta.FieldByName('CLIENTE_CIDADE').AsString;
  UF_Sacado      :=qryBoleta.FieldByName('CLIENTE_UF').AsString;

  {Conforme email do dia 09/09/2016 solicitaram colocar a agência cobradora com zeros: "
   Posições 143 a 146: Preencher com zeros, o sistema indicará a agência cobradora de acordo com o CEP do endereço do sacado}

  Result:=CBR_641_Detalhe(  '02'  , Dados.qrRegistro.FieldByName('CNPJ').AsString , qryDadosBancarios.FieldByName('AGENCIA').AsString, qryDadosBancarios.FieldByName('DV_AGENCIA').AsString, qryDadosBancarios.FieldByName('CONTA').AsString
                            , qryDadosBancarios.FieldByName('DV_CONTA').AsString, qryDadosBancarios.FieldByName('CONVENIO').AsString, contas_receber, nosso_numero_det
                            , Formatar(' ',7,false,' '), Variacao, Tipo_Cobranca, Carteira_Cobranca
                            , Comando, Seu_Numero, Data_Vencimento, Valor_Titulo,Numero_Banco , '0','', Especie_Titulo, 'N', Data_Emissao, Primeira_Instrucao, Segunda_Instrucao
                            , Juros_Mora, Data_Limite_Concessao_Desc, Valor_Desconto, Valor_IOF, Valor_Abatimento, Tipo_Inscricao_Sacado
                            , CNPJ_CPF_Sacado, Nome_Sacado, Endereco_Sacado, CEP_Sacado, Cidade_Sacado, UF_Sacado, Observacoes_Mensagem
                            , Dias_Para_Protesto, Bairro_Sacado, intToStr(linhas));

end;

procedure TfrmCadRemessa.GravaHistoricoMovimentacao;
begin
  qryHistoricoMovimentacao.ReadOnly:=False;
  qryHistoricoMovimentacao.Insert;
  qryHistoricoMovimentacao.FieldByName('DATA_EVENTO').Value        :=  tbPrincipal.FieldByName('DATA_REMESSA').Value;
  qryHistoricoMovimentacao.FieldByName('HORA_EVENTO').Value        :=  tbPrincipal.FieldByName('HORA_REMESSA').Value;
  qryHistoricoMovimentacao.FieldByName('COD_EVENTO').Value         :=  Dados.qryParametroCobranca.FieldByName('COD_EVENTO_REMESSA').value;
  qryHistoricoMovimentacao.FieldByName('COD_DESTINO').Value        :=  Dados.qryParametroCobranca.FieldByName('COD_DESTINO_REMESSA').value;
  qryHistoricoMovimentacao.FieldByName('COD_USUARIO').Value        :=  tbPrincipal.FieldBYName('COD_USUARIO').AsInteger;
  qryHistoricoMovimentacao.FieldByName('COD_CONTAS_RECEBER').Value :=  qryBoleta.FieldbyName('COD_CONTAS_RECEBER').AsString;
  qryHistoricoMovimentacao.FieldByName('COD_FILIAL').Value         :=  qryBoleta.FieldByName('COD_FILIAL').Value;
  qryHistoricoMovimentacao.FieldByName('OBSERVACAO').Value         :=  'REMESSA AO BANCO - '+ qryDadosBancarios.FieldByName('NOME_BANCO').AsString;
  qryHistoricoMovimentacao.FieldByName('ARQUIVO').Value            :=  NomeArquivo;
  qryHistoricoMovimentacao.FieldByName('COD_CONVENIO').Value       :=  tbPrincipal.FieldByName('COD_DADOS_BANCARIOS').Value;
  qryHistoricoMovimentacao.Post;
  qryHistoricoMovimentacao.ReadOnly:=True;
end;

procedure TfrmCadRemessa.MontaNomeArquivo;
begin
  NomeArquivo := 'CBR'+FormatDateTime('ddmmyy',tbPrincipal.FieldByName('DATA_REMESSA').AsDate)+tbPrincipal.FieldByName('COD_REMESSA').AsString+'.txt';
end;


end.
