{==================================
   Baseado no Layout Fornecido Pela DiviCred
   CNAB240-BANCOOB_atualização_220709.xls
===================================}
unit CNAB240_DIVICRED;
                            
interface
   function CNAB240_HEADER_ARQUIVO( Codigo_Banco ,Tipo_Inscr_Empresa ,Num_Inscri_Empresa
                                    ,Convenio ,Agencia ,Agencia_DV ,Conta_Numero ,Conta_DV ,DV ,Nome_Empresa
                                    ,Nome_Banco ,Data_Geracao ,Hora_Geracao ,Sequencial
                                    ,Versao_Layout ,Uso_Reservado_Banco ,Uso_Reservado_Empresa : string
                                   ):string;


   function CNAB240_HEADER_LOTE( Banco,   Lote,    Operacao,   Servico, Layout_do_Lote, inscricao_Tipo, inscricao_Numero,
                                 Convenio, Agencia_codigo, Agencia_DV, Conta_Numero, Conta_DV, DV, Nome, Informacao_1, Informacao_2,
                                 Num_Rem_Ret,  Dt_Gravacao, Data_Credito : string
                               ) : string ;

   function CNAB240_SEGMENTO_P( Banco, Lote, Num_Registro, Cod_Mov, Agencia_Codigo,
                                Agencia_DV, Conta_Numero, Conta_DV, DV, Nosso_Numero, Carteira, Cadastramento,
                                Tipo_Documento, ID_Emissao_Bloqueto, Distrib_Bloqueto, Num_Documento : string; Vencimento : TDateTime;
                                Valor_Titulo : Real ; Ag_Cobradora, Ag_Cobradora_DV, Especie_de_Titulo, Aceite: string; Data_Emissao_Titulo :TDateTime;
                                Cod_Juros_Mora : string; Data_Juros_Mora: TDateTime; Juros_Mora : Real; Cod_Desc_1 : string; Data_Desc_1 : TDateTime; Valor_Desconto_1 :Real;
                                Valor_IOF, Valor_Abatimento, Uso_Empresa_Cedente, Cod_para_Protesto, Prazo_para_Protesto,
                                Cod_para_Baixa_Devolucao, Prazo_para_Baixa_Devolucao, Codigo_Moeda, Numero_Contrato : string
                              ): string;

   function CNAB240_SEGMENTO_Q(Lote_Servico, Num_Sequencial,
                            Cod_Movimento_Remessa, Tipo_Inscricao_Sacado,
                            Numero_Inscricao_Sacado, Nome_Sacado, Endereco_Sacado, Bairro_Sacado,
                            CEP_Sacado, Cidade_Sacado, UF_Sacado, Tipo_Inscricao_Sacador_Avalista,
                            Num_Inscricao_Sacador_Avalista, Nome_Sacador_Avalista, Banco_Corresp_Compensacao : string
                            ) : string;


   function CNAB240_SEGMENTO_Q1( Cod_Banco_Compensacao, Lote_Servico, Num_Sequencial,  Cod_Movimento_Remessa, Tipo_Inscricao, Numero_Inscricao, Nome,
                                 Num_DDD, Num_telefone, Num_ramal, Data_Nasc, Recebe_Boleto_Eletronico, Cod_grupo_sacado,
                                 Descricao_Grupo_sacado, Nome_Sacador_Avalista ,Banco_Corresp_Compensacao ,Nosso_Numero,
                                 Local_Efetivacao_Convenio ,Squencial_convenio_Banco_Corresp ,Cod_Agencia_Banco_Corresp : string
                               ) : string;

   function CNAB240_SEGMENTO_Q2( Cod_Banco,  Lote_Servico, Num_Sequencial  ,Cod_Movimento,  Id_Sequencial_Sacado,
                                 Endereco, Numero, Endereco_Padrao, Complemento, Bairro, Cidade,
                                 CEP, UF, CodBanco_Corresp, Nosso_Numero, Cod_Municipio : string
                               ) : string;


   function CNAB240_Segmento_R ( Banco, Lote, Num_Seq_Registro, Cod_Mov
                                 , Cod_Desc, Data_Desc, Desconto, Cod_Desc3, Data_Desc3, Desconto3
                                 , Cod_Multa, Data_Multa, Multa, Informacao_Sacado, Informacao_3
                                 , Informacao_4, Cod_Ocor_Sacado, Debito_Banco, Debito_Agencia
                                 , Debito_Dv_Agencia, Debito_Conta_Corrente, Debito_DV_Conta_Corrente
                                 , Debito_DV_ContaAgencia, Aviso_Deb_Automatico : string
                               ) : string;

   function CNAB240_Segmento_S ( Banco , Lote , Num_Sequencial ,Informacao_5 , Informacao_6 , Informacao_7
                                 ,Informacao_8 , Informacao_9   : string
                               ) : string;

   function CNAB240_Trailer_LOTE( Banco , Lote , Qtde_Registros , Cobr_Simples_Qtd_Titulos_Cobr
                                  , Cobr_Simples_Valor_Titulos_Cart , Cobr_Vinculada_Qtd_Titulos_Cobr , Cobr_Vinculada_Valor_Titulos_Cart
                                  , Cobr_Caucionada_Qtd_Titulos_Cobr , Cobr_Caucionada_Qtd_Titulos_Cart , Cobr_Descontada_Qtd_Titulos_Cobr
                                  , Cobr_Descontada_Valor_Titulos_Cart , Num_Aviso_Lancamento  : string
                                 ):string;

   function CNAB240_Trailer_ARQUIVO( Banco ,Qtde_Lotes ,Qtde_Registros ,
                                     Qtde_Contas_Conciliacao : string
                                   ) : string;


   function MontaNossoNumeroSicoobDivCredRemessa(Agencia,NumeroCedente,NumDuplicata, Carteira:string ) : string;
   function MontaNossoNumeroSicoobDivCred(Agencia,NumeroCedente,NumDuplicata, Carteira:string ) : string;
   function Mod11_Nosso_Numero_SicoobDivCred(Agencia , CodigoCedente , Nosso_Numero: string) : string;

   function Modulo11_CodBarra_SicoobDivCred(Valor: String; Base: Integer = 9; Resto : boolean = false) : string;


   function MontaCodBarraSicoobDivCred( DataVenc : TDateTime; Valor_Documento, Codigo_carteira, Codigo_Cooperativa, Modalidade,
                                        Codigo_Cliente, Numero_Titulo, Numero_Parcela : string): string ;

   function MontaLinhaDigitavelSicoobDivCred(cod_barra : string) : string;

implementation
uses Rotinas,SysUtils;

function CNAB240_HEADER_ARQUIVO( Codigo_Banco ,Tipo_Inscr_Empresa ,Num_Inscri_Empresa
                                 , Convenio ,Agencia ,Agencia_DV ,Conta_Numero ,Conta_DV ,DV ,Nome_Empresa
                                 , Nome_Banco ,Data_Geracao ,Hora_Geracao ,Sequencial
                                 , Versao_Layout ,Uso_Reservado_Banco ,Uso_Reservado_Empresa : string
                                ):string;
var   Tipo_Registro,
  CNAB_1,
  CNAB_2,
  CNAB_3,
  Densidade_Gravacao,
  Lote_Servico,
  Num_Rem_Ret  :string;
begin
   //==================== Campo com valor padrao =============
   Codigo_Banco  := '756';
   Tipo_Registro := '0';
   Lote_Servico  := '0000';
   CNAB_1        := '';
   CNAB_2        := '';
   CNAB_3        := '';
   Densidade_Gravacao := '0';
   Num_Rem_Ret := '1';

   //==================== Formatando campos =============
   Data_Geracao       := FormatDateTime('ddmmyyyy', StrToDate(Data_Geracao));
   Hora_Geracao       := FormatDateTime('hhmmsss', StrToTime(Hora_Geracao));
   Num_Inscri_Empresa := LimpaTexto(Num_Inscri_Empresa);


   Codigo_Banco         := FormatarTexto(Codigo_Banco         ,3 , False , '0');
   Lote_Servico         := FormatarTexto(Lote_Servico         ,4 , False , '0');
   Tipo_Registro        := FormatarTexto(Tipo_Registro        ,1 , False , '0');
   CNAB_1               := FormatarTexto(CNAB_1               ,9 , True  , ' ');
   Tipo_Inscr_Empresa   := FormatarTexto(Tipo_Inscr_Empresa   ,1 , False , '0');
   Num_Inscri_Empresa   := FormatarTexto(Num_Inscri_Empresa   ,14, False , '0');
   Convenio             := FormatarTexto(Convenio             ,20, True  , ' ');
   Agencia              := FormatarTexto(Agencia              ,5 , False , '0');
   Agencia_DV           := FormatarTexto(Agencia_DV           ,1 , True  , ' ');
   Conta_Numero         := FormatarTexto(Conta_Numero         ,12, False , '0');
   Conta_DV             := FormatarTexto(Conta_DV             ,1 , True  , ' ');
   DV                   := FormatarTexto(DV                   ,1 , True  , ' ');
   Nome_Empresa         := FormatarTexto(Nome_Empresa         ,30, True  , ' ');
   Nome_Banco           := FormatarTexto(Nome_Banco           ,30, True  , ' ');
   CNAB_2               := FormatarTexto(CNAB_2               ,10, True  , ' ');
   Num_Rem_Ret          := FormatarTexto(Num_Rem_Ret          ,1 , False , '0');
   Data_Geracao         := FormatarTexto(Data_Geracao         ,8 , False , '0');
   Hora_Geracao         := FormatarTexto(Hora_Geracao         ,6 , False , '0');
   Sequencial           := FormatarTexto(Sequencial           ,6 , False , '0');
   Versao_Layout        := FormatarTexto(Versao_Layout        ,3 , False , '0');
   Densidade_Gravacao   := FormatarTexto(Densidade_Gravacao   ,5 , False , '0');
   Uso_Reservado_Banco  := FormatarTexto(Uso_Reservado_Banco  ,20, True  , ' ');
   Uso_Reservado_Empresa:= FormatarTexto(Uso_Reservado_Empresa,20, True  , ' ');
   CNAB_3               := FormatarTexto(CNAB_3               ,29, True  , ' ');

   Result := Codigo_Banco + Lote_Servico + Tipo_Registro + CNAB_1 + Tipo_Inscr_Empresa + Num_Inscri_Empresa
             + Convenio + Agencia + Agencia_DV + Conta_Numero + Conta_DV + DV + Nome_Empresa
             + Nome_Banco + CNAB_2 + Num_Rem_Ret + Data_Geracao + Hora_Geracao + Sequencial
             + Versao_Layout + Densidade_Gravacao + Uso_Reservado_Banco + Uso_Reservado_Empresa + CNAB_3;
end;

function CNAB240_HEADER_LOTE( Banco,   Lote,    Operacao,   Servico, Layout_do_Lote, inscricao_Tipo, inscricao_Numero,
                                 Convenio, Agencia_codigo, Agencia_DV, Conta_Numero, Conta_DV, DV, Nome, Informacao_1, Informacao_2,
                                 Num_Rem_Ret,  Dt_Gravacao, Data_Credito : string) : string ;
var CNAB_1,
    CNAB_2,
    CNAB_3 ,
    Registro: string;
begin
   Registro := '1';
   CNAB_1   := '';
   CNAB_2   := '';
   CNAB_3   := '';
   Banco    := '756';

   inscricao_Numero := LimpaTexto(inscricao_Numero);
   Dt_Gravacao := FormatDateTime('ddmmyyyy', StrToDate(Dt_Gravacao));

   if Trim(Data_Credito) <> '' then
      Data_Credito := FormatDateTime('ddmmyyyy', StrToDate(Data_Credito));

   Banco             := FormatarTexto( Banco            , 3 , False , '0' );
   Lote              := FormatarTexto( Lote             , 4 , False , '0' );
   Registro          := FormatarTexto( Registro         , 1 , False , '0' );
   Operacao          := FormatarTexto( Operacao         , 1 , True  , ' ' );
   Servico           := FormatarTexto( Servico          , 2 , False , '0' );
   CNAB_1            := FormatarTexto( CNAB_1           , 2 , True  , ' ' );
   Layout_do_Lote    := FormatarTexto( Layout_do_Lote   , 3 , False , '0' );
   CNAB_2            := FormatarTexto( CNAB_2           , 1 , True  , ' ' );
   inscricao_Tipo    := FormatarTexto( inscricao_Tipo   , 1 , False , '0' );
   inscricao_Numero  := FormatarTexto( inscricao_Numero , 15, False , '0' );
   Convenio          := FormatarTexto( Convenio         , 20, True  , ' ' );
   Agencia_codigo    := FormatarTexto( Agencia_codigo   , 5 , False , '0' );
   Agencia_DV        := FormatarTexto( Agencia_DV       , 1 , True  , ' ' );
   Conta_Numero      := FormatarTexto( Conta_Numero     , 12, False , '0' );
   Conta_DV          := FormatarTexto( Conta_DV         , 1 , True  , ' ' );
   DV                := FormatarTexto( DV               , 1 , True  , ' ' );
   Nome              := FormatarTexto( Nome             , 30, True  , ' ' );
   Informacao_1      := FormatarTexto( Informacao_1     , 40, True  , ' ' );
   Informacao_2      := FormatarTexto( Informacao_2     , 40, True  , ' ' );
   Num_Rem_Ret       := FormatarTexto( Num_Rem_Ret      , 8 , False , '0' );
   Dt_Gravacao       := FormatarTexto( Dt_Gravacao      , 8 , False , '0' );
   Data_Credito      := FormatarTexto( Data_Credito     , 8 , False , '0' );
   CNAB_3            := FormatarTexto( CNAB_3           , 33, True  , ' ' );

   Result := Banco + Lote + Registro + Operacao + Servico + CNAB_1 + Layout_do_Lote + CNAB_2 +
             inscricao_Tipo + inscricao_Numero + Convenio + Agencia_codigo + Agencia_DV +
             Conta_Numero + Conta_DV + DV + Nome + Informacao_1 + Informacao_2 + Num_Rem_Ret +
             Dt_Gravacao + Data_Credito + CNAB_3;
end;

function CNAB240_SEGMENTO_P( Banco, Lote, Num_Registro, Cod_Mov, Agencia_Codigo,
                                    Agencia_DV, Conta_Numero, Conta_DV, DV, Nosso_Numero, Carteira, Cadastramento,
                                    Tipo_Documento, ID_Emissao_Bloqueto, Distrib_Bloqueto, Num_Documento : string; Vencimento : TDateTime;
                                    Valor_Titulo : Real ; Ag_Cobradora, Ag_Cobradora_DV, Especie_de_Titulo, Aceite: string; Data_Emissao_Titulo :TDateTime;
                                    Cod_Juros_Mora : string; Data_Juros_Mora: TDateTime; Juros_Mora : Real; Cod_Desc_1 : string; Data_Desc_1 : TDateTime; Valor_Desconto_1 :Real;
                                    Valor_IOF, Valor_Abatimento, Uso_Empresa_Cedente, Cod_para_Protesto, Prazo_para_Protesto,
                                    Cod_para_Baixa_Devolucao, Prazo_para_Baixa_Devolucao, Codigo_Moeda, Numero_Contrato : string
                                  ): string;
var Valor_Desconto_1_STR: string;
   Data_Desc_1STR: String;
   Juros_MoraSTR: string;
   CNAB_1, CNAB_2,
   VencimentoSTR,
   Valor_TituloSTR,
   Data_Emissao_TituloSTR ,
   Data_Juros_MoraSTR,
   Segmento,
   Registro: string;
begin
   Banco := '756';
   Registro := '3';
   Segmento := 'P';
   CNAB_1 := '';
   CNAB_2 := '';
   VencimentoSTR         := FormatDateTime('ddmmyyyy',Vencimento);

   Valor_TituloSTR       := FormatarMoeda(FloatToStr(Valor_Titulo)) ;
   Valor_TituloSTR       := TiraCaracter(Valor_TituloSTR,'.');
   Valor_TituloSTR       := TiraCaracter(Valor_TituloSTR,',');

   Data_Emissao_TituloSTR:= FormatDateTime('ddmmyyyy',Data_Emissao_Titulo);
   Data_Juros_MoraSTR    := FormatDateTime('ddmmyyyy',Data_Juros_Mora);

   Juros_MoraSTR         := FormatarMoeda(FloatToStr(Juros_Mora)) ;
   Juros_MoraSTR         := TiraCaracter(Juros_MoraSTR, '.');
   Juros_MoraSTR         := TiraCaracter(Juros_MoraSTR, ',');

   //==================== Segundo instruções do Geraldo da DivCrede a Data de desconto deve ser zerada =============
   Data_Desc_1STR := '0';

   //Data_Desc_1STR := FormatDateTime('ddmmyyyy',Data_Desc_1 );

   Valor_Desconto_1_STR := FormatarMoeda(FloatToStr(Valor_Desconto_1)) ;
   Valor_Desconto_1_STR := TiraCaracter(Valor_Desconto_1_STR,'.');
   Valor_Desconto_1_STR := TiraCaracter(Valor_Desconto_1_STR,',');

   //Numero_Contrato := '69537';

   Banco                      := FormatarTexto( Banco                      , 3 , False   , '0');
   Lote                       := FormatarTexto( Lote                       , 4 , False   , '0');
   Registro                   := FormatarTexto( Registro                   , 1 , False   , '0');
   Num_Registro               := FormatarTexto( Num_Registro               , 5 , False   , '0');
   Segmento                   := FormatarTexto( Segmento                   , 1 , True    , ' ');
   CNAB_1                     := FormatarTexto( CNAB_1                     , 1 , True    , ' ');
   Cod_Mov                    := FormatarTexto( Cod_Mov                    , 2 , False   , '0');
   Agencia_Codigo             := FormatarTexto( Agencia_Codigo             , 5 , False   , '0');
   Agencia_DV                 := FormatarTexto( Agencia_DV                 , 1 , True    , ' ');
   Conta_Numero               := FormatarTexto( Conta_Numero               , 12, False   , '0');
   Conta_DV                   := FormatarTexto( Conta_DV                   , 1 , True    , ' ');
   DV                         := FormatarTexto( DV                         , 1 , True    , ' ');
   Nosso_Numero               := FormatarTexto( Nosso_Numero               , 20, True    , ' ');
   Carteira                   := FormatarTexto( Carteira                   , 1 , False   , '0');
   Cadastramento              := FormatarTexto( Cadastramento              , 1 , False   , '0');
   Tipo_Documento             := FormatarTexto( Tipo_Documento             , 1 , True    , ' ');
   ID_Emissao_Bloqueto        := FormatarTexto( ID_Emissao_Bloqueto        , 1 , False   , '0');
   Distrib_Bloqueto           := FormatarTexto( Distrib_Bloqueto           , 1 , True    , ' ');
   Num_Documento              := FormatarTexto( Num_Documento              , 15, True    , ' ');
   VencimentoSTR              := FormatarTexto( VencimentoSTR              , 8 , False   , '0');
   Valor_TituloSTR            := FormatarTexto( Valor_TituloSTR            , 15, False   , '0');
   Ag_Cobradora               := FormatarTexto( Ag_Cobradora               , 5 , False   , '0');
   Ag_Cobradora_DV            := FormatarTexto( Ag_Cobradora_DV            , 1 , True    , ' ');
   Especie_de_Titulo          := FormatarTexto( Especie_de_Titulo          , 2 , False   , '0');
   Aceite                     := FormatarTexto( Aceite                     , 1 , True    , ' ');
   Data_Emissao_TituloSTR     := FormatarTexto( Data_Emissao_TituloSTR     , 8 , False   , '0');
   Cod_Juros_Mora             := FormatarTexto( Cod_Juros_Mora             , 1 , False   , '0');
   Data_Juros_MoraSTR         := FormatarTexto( Data_Juros_MoraSTR         , 8 , False   , '0');
   Juros_MoraSTR              := FormatarTexto( Juros_MoraSTR              , 15, False   , '0');
   Cod_Desc_1                 := FormatarTexto( Cod_Desc_1                 , 1 , False   , '0');
   Data_Desc_1STR             := FormatarTexto( Data_Desc_1STR             , 8 , False   , '0');
   Valor_Desconto_1_STR       := FormatarTexto( Valor_Desconto_1_STR       , 15, False   , '0');
   Valor_IOF                  := FormatarTexto( Valor_IOF                  , 15, False   , '0');
   Valor_Abatimento           := FormatarTexto( Valor_Abatimento           , 15, False   , '0');
   Uso_Empresa_Cedente        := FormatarTexto( Uso_Empresa_Cedente        , 25, True    , ' ');
   Cod_para_Protesto          := FormatarTexto( Cod_para_Protesto          , 1 , False   , '0');
   Prazo_para_Protesto        := FormatarTexto( Prazo_para_Protesto        , 2 , False   , '0');
   Cod_para_Baixa_Devolucao   := FormatarTexto( Cod_para_Baixa_Devolucao   , 1 , False   , '0');
   Prazo_para_Baixa_Devolucao := FormatarTexto( Prazo_para_Baixa_Devolucao , 3 , True    , ' ');
   Codigo_Moeda               := FormatarTexto( Codigo_Moeda               , 2 , False   , '0');
   Numero_Contrato            := FormatarTexto( Numero_Contrato            , 10, False   , '0');
   CNAB_2                     := FormatarTexto( CNAB_2                     , 1 , True    , ' ');

Result :=  Banco +  Lote +  Registro +  Num_Registro +  Segmento +  CNAB_1 +  Cod_Mov +  Agencia_Codigo +
           Agencia_DV +  Conta_Numero +  Conta_DV +  DV +  Nosso_Numero +  Carteira +  Cadastramento +
           Tipo_Documento +  ID_Emissao_Bloqueto +  Distrib_Bloqueto +  Num_Documento +  VencimentoSTR +
           Valor_TituloSTR +  Ag_Cobradora +  Ag_Cobradora_DV +  Especie_de_Titulo+  Aceite +  Data_Emissao_TituloSTR +
           Cod_Juros_Mora +  Data_Juros_MoraSTR +  Juros_MoraSTR +  Cod_Desc_1 +  Data_Desc_1STR +  Valor_Desconto_1_STR +
           Valor_IOF +  Valor_Abatimento +  Uso_Empresa_Cedente +  Cod_para_Protesto +  Prazo_para_Protesto +
           Cod_para_Baixa_Devolucao +  Prazo_para_Baixa_Devolucao +  Codigo_Moeda +  Numero_Contrato + CNAB_2

end;

function CNAB240_SEGMENTO_Q1( Cod_Banco_Compensacao, Lote_Servico, Num_Sequencial,
                                      Cod_Movimento_Remessa, Tipo_Inscricao, Numero_Inscricao, Nome,
                                      Num_DDD, Num_telefone, Num_ramal, Data_Nasc, Recebe_Boleto_Eletronico, Cod_grupo_sacado,
                                      Descricao_Grupo_sacado, Nome_Sacador_Avalista ,Banco_Corresp_Compensacao ,Nosso_Numero,
                                      Local_Efetivacao_Convenio ,Squencial_convenio_Banco_Corresp ,Cod_Agencia_Banco_Corresp : string
                                    ) : string;

var
    Exclusivo_FEBRABAN2,
    Tipo_Registro,
    Cod_Segmento : string;
begin
   Exclusivo_FEBRABAN2 := '';
   Tipo_Registro       := '3';
   Cod_Segmento        := 'Q1';
   Cod_Banco_Compensacao := '756'; 
   
   Num_DDD             := LimpaTexto(Num_DDD);
   Num_telefone        := LimpaTexto(Num_telefone);
   Num_ramal           := LimpaTexto(Num_ramal);

   if LimpaTexto(Data_Nasc) <> '' then
      Data_Nasc := FormatDateTime('ddmmyyyy', StrToDate(Data_Nasc))
   else
      Data_Nasc := '0';

   Cod_Banco_Compensacao           := FormatarTexto( Cod_Banco_Compensacao           , 3 , False , '0' );
   Lote_Servico                    := FormatarTexto( Lote_Servico                    , 4 , False , '0' );
   Tipo_Registro                   := FormatarTexto( Tipo_Registro                   , 1 , False , '0' );
   Num_Sequencial                  := FormatarTexto( Num_Sequencial                  , 5 , False , '0' );
   Cod_Segmento                    := FormatarTexto( Cod_Segmento                    , 2 , True  , ' ' );
   Cod_Movimento_Remessa           := FormatarTexto( Cod_Movimento_Remessa           , 2 , False , '0' );
   Tipo_Inscricao                  := FormatarTexto( Tipo_Inscricao                  , 1 , False , '0' );
   Numero_Inscricao                := FormatarTexto( Numero_Inscricao                , 15, False , '0' );
   Nome                            := FormatarTexto( Nome                            , 50, True  , ' ' );
   Num_DDD                         := FormatarTexto( Num_DDD                         , 2 , False , '0' );
   Num_telefone                    := FormatarTexto( Num_telefone                    , 8 , False , '0' );
   Num_ramal                       := FormatarTexto( Num_ramal                       , 4 , False , '0' );
   Data_Nasc                       := FormatarTexto( Data_Nasc                       , 8 , False , '0' );
   Recebe_Boleto_Eletronico        := FormatarTexto( Recebe_Boleto_Eletronico        , 1 , True  , ' ' );
   Cod_grupo_sacado                := FormatarTexto( Cod_grupo_sacado                , 2 , False , '0' );
   Descricao_Grupo_sacado          := FormatarTexto( Descricao_Grupo_sacado          , 40, False , '0' );
   Nome_Sacador_Avalista           := FormatarTexto( Nome_Sacador_Avalista           , 50, True  , ' ' );
   Banco_Corresp_Compensacao       := FormatarTexto( Banco_Corresp_Compensacao       , 3 , False , '0' );
   Nosso_Numero                    := FormatarTexto( Nosso_Numero                    , 20, True  , ' ' );
   Local_Efetivacao_Convenio       := FormatarTexto( Local_Efetivacao_Convenio       , 2 , False , '0' );
   Squencial_convenio_Banco_Corresp:= FormatarTexto( Squencial_convenio_Banco_Corresp, 10, False , '0' );
   Cod_Agencia_Banco_Corresp       := FormatarTexto( Cod_Agencia_Banco_Corresp       , 5 , False , '0' );
   Exclusivo_FEBRABAN2             := FormatarTexto( Exclusivo_FEBRABAN2             , 2 , True  , ' ' );

   Result :=  Cod_Banco_Compensacao  + Lote_Servico + Tipo_Registro + Num_Sequencial + Cod_Segmento
             + Cod_Movimento_Remessa + Tipo_Inscricao + Numero_Inscricao + Nome + Num_DDD
             + Num_telefone + Num_ramal + Data_Nasc + Recebe_Boleto_Eletronico
             + Cod_grupo_sacado + Descricao_Grupo_sacado + Nome_Sacador_Avalista
             + Banco_Corresp_Compensacao + Nosso_Numero + Local_Efetivacao_Convenio
             + Squencial_convenio_Banco_Corresp + Cod_Agencia_Banco_Corresp + Exclusivo_FEBRABAN2
end;

function CNAB240_SEGMENTO_Q2( Cod_Banco,  Lote_Servico, Num_Sequencial  ,Cod_Movimento,  Id_Sequencial_Sacado,
                                      Endereco, Numero, Endereco_Padrao, Complemento, Bairro, Cidade,
                                      CEP, UF, CodBanco_Corresp, Nosso_Numero, Cod_Municipio : string
                                    ) : string;

var Tipo_Registro,
    Cod_Segmento,
    Exclusivo_FEBRABAN2,
    Exclusivo_FEBRABAN3,
    Sufixo_CEP : string;
begin
   Tipo_Registro := '3';
   Cod_Segmento  := 'Q2';
   Cod_Banco := '756'; 

   CEP := LimpaTexto(CEP);
   if CEP <> '' then
   begin
      Sufixo_CEP := Copy(CEP,6,3);
      CEP := Copy(CEP,1,5);
   end;

    Exclusivo_FEBRABAN2 := '';
    Exclusivo_FEBRABAN3 := '';

    //================== Segundo do geraldo da divcred este campo devera ser 1 para todos em 20 set 2011 ===============
   Id_Sequencial_Sacado := '1';

   Cod_Banco            := FormatarTexto( Cod_Banco            , 3  , False , '0');
   Lote_Servico         := FormatarTexto( Lote_Servico         , 4  , False , '0');
   Tipo_Registro        := FormatarTexto( Tipo_Registro        , 1  , False , '0');
   Num_Sequencial       := FormatarTexto( Num_Sequencial       , 5  , False , '0');
   Cod_Segmento         := FormatarTexto( Cod_Segmento         , 2  , True  , ' ');
   Cod_Movimento        := FormatarTexto( Cod_Movimento        , 2  , False , '0');
   Id_Sequencial_Sacado := FormatarTexto( Id_Sequencial_Sacado , 8  , False , '0');
   Endereco             := FormatarTexto( Endereco             , 40 , True  , ' ');
   Exclusivo_FEBRABAN2  := FormatarTexto( Exclusivo_FEBRABAN2  , 10 , True  , ' ');
   Numero               := FormatarTexto( Numero               , 6  , True  , ' ');
   Endereco_Padrao      := FormatarTexto( Endereco_Padrao      , 1  , True  , ' ');
   Complemento          := FormatarTexto( Complemento          , 20 , True  , ' ');
   Bairro               := FormatarTexto( Bairro               , 30 , True  , ' ');
   Cidade               := FormatarTexto( Cidade               , 40 , True  , ' ');
   CEP                  := FormatarTexto( CEP                  , 5  , False , '0');
   Sufixo_CEP           := FormatarTexto( Sufixo_CEP           , 3  , False , '0');
   UF                   := FormatarTexto( UF                   , 2  , True  , ' ');
   CodBanco_Corresp     := FormatarTexto( CodBanco_Corresp     , 3  , False , '0');
   Nosso_Numero         := FormatarTexto( Nosso_Numero         , 20 , True  , ' ');
   Cod_Municipio        := FormatarTexto( Cod_Municipio        , 7  , False , '0');
   Exclusivo_FEBRABAN3  := FormatarTexto( Exclusivo_FEBRABAN3  , 28 , True  , ' ');

   Result := Cod_Banco + Lote_Servico + Tipo_Registro + Num_Sequencial + Cod_Segmento
           + Cod_Movimento + Id_Sequencial_Sacado + Endereco + Exclusivo_FEBRABAN2
           + Numero + Endereco_Padrao + Complemento + Bairro + Cidade + CEP + Sufixo_CEP
           + UF + CodBanco_Corresp + Nosso_Numero + Cod_Municipio + Exclusivo_FEBRABAN3;
end;

function CNAB240_Segmento_R ( Banco, Lote, Num_Seq_Registro, Cod_Mov
                                      , Cod_Desc, Data_Desc, Desconto, Cod_Desc3, Data_Desc3, Desconto3
                                      , Cod_Multa, Data_Multa, Multa, Informacao_Sacado, Informacao_3
                                      , Informacao_4, Cod_Ocor_Sacado, Debito_Banco, Debito_Agencia
                                      , Debito_Dv_Agencia, Debito_Conta_Corrente, Debito_DV_Conta_Corrente
                                      , Debito_DV_ContaAgencia, Aviso_Deb_Automatico : string
                                    ) : string;
var CNAB, CNAB2, CNAB3,
    Segmento, Registro : string;

begin
   CNAB  := '';
   CNAB2 := '';
   CNAB3 := '';
   Segmento := 'R';
   Registro := '3';
   Banco := '756';

   Desconto := FormatarMoeda(Desconto);
   Desconto := TiraCaracter(Desconto,'.');
   Desconto := TiraCaracter(Desconto,',');

   Desconto3 := FormatarMoeda(Desconto3);
   Desconto3 := TiraCaracter(Desconto3,'.');
   Desconto3 := TiraCaracter(Desconto3,',');

   Data_Desc := FormatDateTime('ddmmyyyy', StrToDate(Data_Desc));
   Data_Desc3 := FormatDateTime('ddmmyyyy', StrToDate(Data_Desc3));

   //================== Segundo o geraldo divicred qdo nao tiver valor de desconto informar a data de desconto zerada ===============
   if StrToInt(Desconto) = 0 then
   begin
      Data_Desc  := '00000000';
      Data_Desc3 := '00000000';
   end;

   Multa := FormatarMoeda(Multa);
   Multa := TiraCaracter(Multa,'.');
   Multa := TiraCaracter(Multa,',');

   Data_Multa := FormatDateTime('ddmmyyyy', StrToDate(Data_Multa));


   Banco                    := FormatarTexto(Banco                    , 3  , False , '0' );
   Lote                     := FormatarTexto(Lote                     , 4  , False , '0' );
   Registro                 := FormatarTexto(Registro                 , 1  , False , '0' );
   Num_Seq_Registro         := FormatarTexto(Num_Seq_Registro         , 5  , False , '0' );
   Segmento                 := FormatarTexto(Segmento                 , 1  , True  , ' ' );
   CNAB                     := FormatarTexto(CNAB                     , 1  , True  , ' ' );
   Cod_Mov                  := FormatarTexto(Cod_Mov                  , 2  , False , '0' );
   Cod_Desc                 := FormatarTexto(Cod_Desc                 , 1  , False , '0' );
   Data_Desc                := FormatarTexto(Data_Desc                , 8  , False , '0' );
   Desconto                 := FormatarTexto(Desconto                 , 15 , False , '0' );
   Cod_Desc3                := FormatarTexto(Cod_Desc3                , 1  , False , '0' );
   Data_Desc3               := FormatarTexto(Data_Desc3               , 8  , False , '0' );
   Desconto3                := FormatarTexto(Desconto3                , 15 , False , '0' );
   Cod_Multa                := FormatarTexto(Cod_Multa                , 1  , True  , ' ' );
   Data_Multa               := FormatarTexto(Data_Multa               , 8  , False , '0' );
   Multa                    := FormatarTexto(Multa                    , 15 , False , '0' );
   Informacao_Sacado        := FormatarTexto(Informacao_Sacado        , 10 , True  , ' ' );
   Informacao_3             := FormatarTexto(Informacao_3             , 40 , True  , ' ' );
   Informacao_4             := FormatarTexto(Informacao_4             , 40 , True  , ' ' );
   CNAB2                    := FormatarTexto(CNAB2                    , 20 , True  , ' ' );
   Cod_Ocor_Sacado          := FormatarTexto(Cod_Ocor_Sacado          , 8  , False , '0' );
   Debito_Banco             := FormatarTexto(Debito_Banco             , 3  , False , '0' );
   Debito_Agencia           := FormatarTexto(Debito_Agencia           , 5  , False , '0' );
   Debito_Dv_Agencia        := FormatarTexto(Debito_Dv_Agencia        , 1  , True  , ' ' );
   Debito_Conta_Corrente    := FormatarTexto(Debito_Conta_Corrente    , 12 , False , '0' );
   Debito_DV_Conta_Corrente := FormatarTexto(Debito_DV_Conta_Corrente , 1  , True  , ' ' );
   Debito_DV_ContaAgencia   := FormatarTexto(Debito_DV_ContaAgencia   , 1  , True  , ' ' );
   Aviso_Deb_Automatico     := FormatarTexto(Aviso_Deb_Automatico     , 1  , False , '0' );
   CNAB3                    := FormatarTexto(CNAB3                    , 9  , True  , ' ' );

   Result :=  Banco + Lote + Registro + Num_Seq_Registro + Segmento + CNAB + Cod_Mov
             + Cod_Desc + Data_Desc + Desconto + Cod_Desc3 + Data_Desc3 + Desconto3
             + Cod_Multa + Data_Multa + Multa + Informacao_Sacado + Informacao_3
             + Informacao_4  + CNAB2 + Cod_Ocor_Sacado + Debito_Banco + Debito_Agencia
             + Debito_Dv_Agencia  + Debito_Conta_Corrente + Debito_DV_Conta_Corrente
             + Debito_DV_ContaAgencia  + Aviso_Deb_Automatico + CNAB3;
end;

function CNAB240_Segmento_S ( Banco , Lote , Num_Sequencial ,Informacao_5 , Informacao_6 , Informacao_7
                                      ,Informacao_8 , Informacao_9   : string
                                     ) : string;
var CNAB_1,
    CNAB_2,
    Registro,
    Segmento,
    Cod_Movimentacao,
    Tipo_Impressao : string;
begin
   CNAB_1   := '';
   CNAB_2   := '';
   Registro := '3';
   Segmento := 'S';
   Cod_Movimentacao := '1';
   Tipo_Impressao := '3';
   Banco := '756';


   Banco               := FormatarTexto(Banco            , 3  , False, '0');
   Lote                := FormatarTexto(Lote             , 4  , False, '0');
   Registro            := FormatarTexto(Registro         , 1  , False, '0');
   Num_Sequencial      := FormatarTexto(Num_Sequencial   , 5  , False, '0');
   Segmento            := FormatarTexto(Segmento         , 1  , True , ' ');
   CNAB_1              := FormatarTexto(CNAB_1           , 1  , True , ' ');
   Cod_Movimentacao    := FormatarTexto(Cod_Movimentacao , 2  , False, '0');
   Tipo_Impressao      := FormatarTexto(Tipo_Impressao   , 1  , False, '0');
   Informacao_5        := FormatarTexto(Informacao_5     , 40 , True , ' ');
   Informacao_6        := FormatarTexto(Informacao_6     , 40 , True , ' ');
   Informacao_7        := FormatarTexto(Informacao_7     , 40 , True , ' ');
   Informacao_8        := FormatarTexto(Informacao_8     , 40 , True , ' ');
   Informacao_9        := FormatarTexto(Informacao_9     , 40 , True , ' ');
   CNAB_2              := FormatarTexto(CNAB_2           , 22 , True , ' ');

Result := Banco + Lote + Registro + Num_Sequencial + Segmento + CNAB_1 + Cod_Movimentacao
        + Tipo_Impressao + Informacao_5 + Informacao_6 + Informacao_7
        + Informacao_8 + Informacao_9 + CNAB_2
end;

function CNAB240_Trailer_LOTE (Banco , Lote , Qtde_Registros , Cobr_Simples_Qtd_Titulos_Cobr
                               , Cobr_Simples_Valor_Titulos_Cart , Cobr_Vinculada_Qtd_Titulos_Cobr , Cobr_Vinculada_Valor_Titulos_Cart
                               , Cobr_Caucionada_Qtd_Titulos_Cobr , Cobr_Caucionada_Qtd_Titulos_Cart , Cobr_Descontada_Qtd_Titulos_Cobr
                               , Cobr_Descontada_Valor_Titulos_Cart , Num_Aviso_Lancamento  : string ):string;
var CNAB_1, CNAB_2, Registro :string;
begin

   CNAB_1 := '';
   CNAB_2 := ''; 
   Banco := '756';

   Registro := '5';
   Cobr_Simples_Valor_Titulos_Cart := FormatarMoeda(Cobr_Simples_Valor_Titulos_Cart);
   Cobr_Simples_Valor_Titulos_Cart := TiraCaracter(Cobr_Simples_Valor_Titulos_Cart,'.');
   Cobr_Simples_Valor_Titulos_Cart := TiraCaracter(Cobr_Simples_Valor_Titulos_Cart,',');

   Cobr_Vinculada_Valor_Titulos_Cart := FormatarMoeda(Cobr_Vinculada_Valor_Titulos_Cart);
   Cobr_Vinculada_Valor_Titulos_Cart := TiraCaracter(Cobr_Vinculada_Valor_Titulos_Cart,'.');
   Cobr_Vinculada_Valor_Titulos_Cart := TiraCaracter(Cobr_Vinculada_Valor_Titulos_Cart,',');

   Cobr_Descontada_Valor_Titulos_Cart := FormatarMoeda(Cobr_Descontada_Valor_Titulos_Cart);
   Cobr_Descontada_Valor_Titulos_Cart := TiraCaracter(Cobr_Descontada_Valor_Titulos_Cart,'.');
   Cobr_Descontada_Valor_Titulos_Cart := TiraCaracter(Cobr_Descontada_Valor_Titulos_Cart,',');

   Banco                             := FormatarTexto(Banco                             , 3  , False , '0');
   Lote                              := FormatarTexto(Lote                              , 4  , False , '0');
   Registro                          := FormatarTexto(Registro                          , 1  , False , '0');
   CNAB_1                            := FormatarTexto(CNAB_1                            , 9  , True  , ' ');
   Qtde_Registros                    := FormatarTexto(Qtde_Registros                    , 6  , False , '0');
   Cobr_Simples_Qtd_Titulos_Cobr     := FormatarTexto(Cobr_Simples_Qtd_Titulos_Cobr     , 6  , False , '0');
   Cobr_Simples_Valor_Titulos_Cart   := FormatarTexto(Cobr_Simples_Valor_Titulos_Cart   , 17 , False , '0');
   Cobr_Vinculada_Qtd_Titulos_Cobr   := FormatarTexto(Cobr_Vinculada_Qtd_Titulos_Cobr   , 6  , False , '0');
   Cobr_Vinculada_Valor_Titulos_Cart := FormatarTexto(Cobr_Vinculada_Valor_Titulos_Cart , 17 , False , '0');
   Cobr_Caucionada_Qtd_Titulos_Cobr  := FormatarTexto(Cobr_Caucionada_Qtd_Titulos_Cobr  , 6  , False , '0');
   Cobr_Caucionada_Qtd_Titulos_Cart  := FormatarTexto(Cobr_Caucionada_Qtd_Titulos_Cart  , 17 , False , '0');
   Cobr_Descontada_Qtd_Titulos_Cobr  := FormatarTexto(Cobr_Descontada_Qtd_Titulos_Cobr  , 6  , False , '0');
   Cobr_Descontada_Valor_Titulos_Cart:= FormatarTexto(Cobr_Descontada_Valor_Titulos_Cart, 17 , False , '0');
   Num_Aviso_Lancamento              := FormatarTexto(Num_Aviso_Lancamento              , 8  , True  , ' ');
   CNAB_2                            := FormatarTexto(CNAB_2                            , 117, True  , ' ');

   Result := Banco + Lote + Registro + CNAB_1 + Qtde_Registros + Cobr_Simples_Qtd_Titulos_Cobr
           + Cobr_Simples_Valor_Titulos_Cart + Cobr_Vinculada_Qtd_Titulos_Cobr + Cobr_Vinculada_Valor_Titulos_Cart
           + Cobr_Caucionada_Qtd_Titulos_Cobr + Cobr_Caucionada_Qtd_Titulos_Cart + Cobr_Descontada_Qtd_Titulos_Cobr
           + Cobr_Descontada_Valor_Titulos_Cart + Num_Aviso_Lancamento + CNAB_2
end;

function CNAB240_Trailer_ARQUIVO( Banco ,Qtde_Lotes ,Qtde_Registros ,
                                  Qtde_Contas_Conciliacao : string
                                ) : string;
var Lote,
    Registro,
    CNAB_1,
    CNAB_2 : string;
begin
   Lote    := '9999';
   Registro:= '9';
   CNAB_1  := '';
   CNAB_2  := '';
   Banco := '756';

   Banco                  := FormatarTexto( Banco                  , 3  , False , '0');
   Lote                   := FormatarTexto( Lote                   , 4  , False , '0');
   Registro               := FormatarTexto( Registro               , 1  , False , '0');
   CNAB_1                 := FormatarTexto( CNAB_1                 , 9  , False , '0');
   Qtde_Lotes             := FormatarTexto( Qtde_Lotes             , 6  , False , '0');
   Qtde_Registros         := FormatarTexto( Qtde_Registros         , 6  , False , '0');
   Qtde_Contas_Conciliacao:= FormatarTexto( Qtde_Contas_Conciliacao, 6  , False , '0');
   CNAB_2                 := FormatarTexto( CNAB_2                 , 205, True  , ' ');

   Result := Banco + Lote + Registro + CNAB_1 + Qtde_Lotes +  Qtde_Registros + Qtde_Contas_Conciliacao + CNAB_2;
end;

function Mod11_Nosso_Numero_SicoobDivCred(Agencia , CodigoCedente , Nosso_Numero  : string) : string;
var
  Num, Res :String;
  i, base, digito : Integer;
const
  indice = '319731973197319731973';
begin

   Result := '0';


   Num :=  FormatarTexto(agencia,4,False,'0') +
           FormatarTexto(CodigoCedente,10,False,'0') +
           FormatarTexto(trim(Nosso_Numero),7,False,'0');


   base := 0;
   for i := 1 to Length(Num) do
   begin
     base := base + ( StrToInt(copy(Num,i,1)) * StrToInt(copy(indice,i,1)) );
   end;
   digito := 11-((  base )-( trunc(base/11) * 11));
   //(Se o Resto for igual a 0 ou 1 então o DV é igual a 0)
   //if (digito > 9) or (digito = 1) then

   if digito > 9  then
      digito := 0;

   Res    := IntToStr(digito);
   Result := Res;

   { Para o cálculo do dígito verificador do nosso número, deverá ser utilizada
     a fórmula abaixo:
     Número da Cooperativa    9(4) – 3009
     Código do Cliente   9(10) – cedente
     Nosso Número   9(7) – Iniciado contagem em 1

     Constante para cálculo  = 3197


     a) Concatenar na seqüência completando com zero à esquerda.
        Ex.: Número da Cooperativa  = 0001
             Número do Cliente(cedente)  = 1-9
             Nosso Número  = 21
             000100000000190000021

     b) Alinhar a constante com a seqüência repetindo de traz para frente.
        Ex.: 000100000000190000021
             319731973197319731973

     c) Multiplicar cada componente da seqüência com o seu correspondente da
        constante e somar os resultados.
        Ex.: 1*7 + 1*3 + 9*1 + 2*7 + 1*3 = 36

     d) Calcular o Resto através do Módulo 11.
        Ex.: 36/11 = 3, resto = 3

     e) O resto da divisão deverá ser subtraído de 11 achando assim o DV
        (Se o Resto for igual a 0 ou 1 então o DV é igual a 0).
        Ex.: 11 – 3 = 8, então Nosso Número + DV = 21-8


     Memória de Cálculo
     Coop.(4)|Cliente(10)		    |Nosso Número(7)
     3	   0	 0	9	0	0	0	0	1	3	6	3	5	2	5	9	3	1	1	5	1
     3	   1 	 9	7	3	1	9	7	3	1	9	7	3	1	9	7	3	1	9	7	3
     9	   0	 0	63	0	0	0	0	3	3	54	21	15	2	45	63	9	1	9	35	3 = soma = 335

     digito = 11-((  soma )-( resto inteiro (trunc) da divisao da soma por 11 * 11))
     digito = 11-((  335 )-(30*11))
     digito = 6 }
end;


function MontaNossoNumeroSicoobDivCredRemessa(Agencia,NumeroCedente,NumDuplicata, Carteira:string ) : string;
var nosso_numero : string;
begin
   {==================================
      Monta o nosso numero da fatura de acordo com o layout Cnab 240 do Sicoob
      NOSSO NUMERO
      NumTitulo - 10 posições (1 a 10)
      Parcela - 02 posições (11 a 12)
      Modalidade - 02 posições (13 a 14)
      Tipo Formulário - 01 posição  (15 a 15)
      Em branco - 05 posições (16 a 20)
   ===================================}

   nosso_numero := NumDuplicata+
                   Mod11_Nosso_Numero_SicoobDivCred(Agencia, NumeroCedente, NumDuplicata);

   Carteira     := FormatarTexto(Carteira,2,False,'0');
   nosso_numero := FormatarTexto(nosso_numero,10,False,'0');
   nosso_numero := nosso_numero + '01';
   nosso_numero := nosso_numero + Carteira;
   nosso_numero := nosso_numero + '1';
   nosso_numero := FormatarTexto(nosso_numero,20,True,' ');

   Result := nosso_numero;
end;

function MontaNossoNumeroSicoobDivCred(Agencia,NumeroCedente,NumDuplicata, Carteira:string ) : string;
var nosso_numero : string;
begin
   {==================================
      Monta o nosso numero da fatura de acordo com o layout Cnab 240 do Sicoob
      NOSSO NUMERO
      NumTitulo - 10 posições (1 a 10)
      Parcela - 02 posições (11 a 12)
      Modalidade - 02 posições (13 a 14)
      Tipo Formulário - 01 posição  (15 a 15)
      Em branco - 05 posições (16 a 20)
   ===================================}

   nosso_numero := NumDuplicata+
                   Mod11_Nosso_Numero_SicoobDivCred(Agencia, NumeroCedente, NumDuplicata);

   Carteira     := FormatarTexto(Carteira,2,False,'0');
   nosso_numero := FormatarTexto(nosso_numero,10,False,'0');
   nosso_numero := nosso_numero;
   nosso_numero := FormatarTexto(nosso_numero,20,True,' ');

   Result := nosso_numero;
end;


function Modulo11_CodBarra_SicoobDivCred(Valor: String; Base: Integer = 9; Resto : boolean = false) : string;
{
   Rotina muito usada para calcular dígitos verificadores
   Pega-se cada um dos dígitos contidos no parâmetro VALOR, da direita para a
   esquerda e multiplica-se pela seqüência de pesos 2, 3, 4 ... até BASE.
   Por exemplo: se a base for 9, os pesos serão 2,3,4,5,6,7,8,9,2,3,4,5...
   Se a base for 7, os pesos serão 2,3,4,5,6,7,2,3,4...
   Soma-se cada um dos subprodutos.
   Divide-se a soma por 11.
   Faz-se a operação 11-Resto da divisão e devolve-se o resultado dessa operação
   como resultado da função Modulo11.
   Obs.: Caso o resultado seja maior que 9, deverá ser substituído por 0 (ZERO).
}
var
   Soma : integer;
   Contador, Peso, Digito : integer;
begin
   Soma := 0;
   Peso := 2;
   for Contador := Length(Valor) downto 1 do
   begin
      Soma := Soma + (StrToInt(Valor[Contador]) * Peso);
      if Peso < Base then
         Peso := Peso + 1
      else
         Peso := 2;
   end;

   if Resto then
      Result := IntToStr(Soma mod 11)
   else
   begin
      Digito := 11 - (Soma mod 11);

      if (Digito > 9) then
         Digito := 1;

      if (Digito = 0) or (Digito = 1) then
         Digito := 1;
         
      Result := IntToStr(Digito);
   end
end;

function MontaCodBarraSicoobDivCred( DataVenc : TDateTime; Valor_Documento, Codigo_carteira, Codigo_Cooperativa, Modalidade,
                                     Codigo_Cliente, Numero_Titulo, Numero_Parcela : string): string ;
var codMoeda,
   Digito_verificador,
   Fator_Vencimento,
   Identificacao_Banco,
   codBarra : string;
begin
//==================== Monta o codigo de barras  =============
   Identificacao_Banco := '756';
   codMoeda            := '9';
   Digito_verificador  := '';

   Valor_Documento  := LimpaTexto(Valor_Documento);
   Fator_Vencimento := CalcularFatorVencimento(DataVenc);

   Numero_Titulo := Numero_Titulo + Mod11_Nosso_Numero_SicoobDivCred(Codigo_Cooperativa, Codigo_Cliente, Numero_Titulo);


   Identificacao_Banco := FormatarTexto( Identificacao_Banco  ,  3 , False, '0');
   codMoeda            := FormatarTexto( codMoeda             ,  1 , False, '0');
   Fator_Vencimento    := FormatarTexto( Fator_Vencimento     ,  4 , False, '0');
   Valor_Documento     := FormatarTexto( Valor_Documento      , 10 , False, '0');
   Codigo_carteira     := FormatarTexto( Codigo_carteira      ,  1 , False, '0');
   Codigo_Cooperativa  := FormatarTexto( Codigo_Cooperativa   ,  4 , False, '0');
   Modalidade          := FormatarTexto( Modalidade           ,  2 , False, '0');
   Codigo_Cliente      := FormatarTexto( Codigo_Cliente       ,  7 , False, '0');
   Numero_Titulo       := FormatarTexto( Numero_Titulo        ,  8 , False, '0');
   Numero_Parcela      := FormatarTexto( Numero_Parcela       ,  3 , False, '0');

   codBarra := Identificacao_Banco + codMoeda + Digito_verificador+
               Fator_Vencimento + Valor_Documento + Codigo_carteira +
               Codigo_Cooperativa + Modalidade + Codigo_Cliente + Numero_Titulo + Numero_Parcela;

   Digito_verificador := Modulo11_CodBarra_SicoobDivCred(codBarra);

   codBarra := Copy(codBarra,1,4) + Digito_verificador + Copy(codBarra,5, Length(codBarra) );

   Result := codBarra;

end;

function MontaLinhaDigitavelSicoobDivCred(cod_barra : string) : string;
var
   p1, p2, p3, p4, p5, p6,
   Campo1, Campo2, Campo3, Campo4, Campo5 : string;
begin
   {
      Campo 1 - composto pelo código do banco, código da moeda, as cinco primeiras posições
      do campo livre e DV (modulo10) desse campo
   }
   p1 := Copy(cod_barra,1,4);
   p2 := Copy(cod_barra,20,5);
   p3 := Modulo10(p1+p2);
   p4 := p1 + p2 + p3;
   p5 := Copy(p4,1,5);
   p6 := Copy(p4,6,5);
   Campo1 := p5+'.'+p6;

   {
      Campo 2 - composto pelas posiçoes 6 a 15 do campo livre
      e DV (modulo10) deste campo
   }
   p1 := Copy(cod_barra,25,10);
   p2 := Modulo10(p1);
   p3 := p1+p2;
   p4 := Copy(p3,1,5);
   p5 := Copy(p3,6,6);
   Campo2 := p4+'.'+p5;

   {
      Campo 3 - composto pelas posicoes 16 a 25 do campo livre
      e DV (modulo10) deste campo
   }
   p1 := Copy(cod_barra,35,10);
   p2 := Modulo10(p1);
   p3 := p1+p2;
   p4 := Copy(p3,1,5);
   p5 := Copy(p3,6,6);
   Campo3 := p4+'.'+p5;

   {
      Campo 4 - digito verificador do codigo de barras
   }
   Campo4 := Copy(cod_barra,5,1);

   {
      Campo 5 - composto pelo valor nominal do documento, sem indicacao
      de zeros a esquerda e sem edicao (sem ponto e virgula). Quando se
      tratar de valor zerado, a representacao deve ser 000 (tres zeros).
   }
   Campo5 := Copy(cod_barra,6,14);

   Result := Campo1 + '  ' + Campo2 + '  ' + Campo3 + '  ' + Campo4 + '  ' + Campo5;
end;

function CNAB240_SEGMENTO_Q(Lote_Servico, Num_Sequencial,
                            Cod_Movimento_Remessa, Tipo_Inscricao_Sacado,
                            Numero_Inscricao_Sacado, Nome_Sacado, Endereco_Sacado, Bairro_Sacado,
                            CEP_Sacado, Cidade_Sacado, UF_Sacado, Tipo_Inscricao_Sacador_Avalista,
                            Num_Inscricao_Sacador_Avalista, Nome_Sacador_Avalista, Banco_Corresp_Compensacao : string
                            ) : string;
var  Cod_Banco_Compensacao
   , Exclusivo_FEBRABAN1
   , Exclusivo_FEBRABAN2
   , Tipo_Registro
   , Cod_Segmento
   , Nosso_Numero_Bco_correspondente :string;
begin

   Cod_Banco_Compensacao           := '756';
   Exclusivo_FEBRABAN1             := '';
   Exclusivo_FEBRABAN2             := '';
   Tipo_Registro                   := '3';
   Cod_Segmento                    := 'Q';
   Nosso_Numero_Bco_correspondente := '';

   Cod_Banco_Compensacao           := FormatarTexto( Cod_Banco_Compensacao           , 3 , False , '0' );
   Lote_Servico                    := FormatarTexto( Lote_Servico                    , 4 , False , '0' );
   Tipo_Registro                   := FormatarTexto( Tipo_Registro                   , 1 , False , '0' );
   Num_Sequencial                  := FormatarTexto( Num_Sequencial                  , 5 , False , '0' );
   Cod_Segmento                    := FormatarTexto( Cod_Segmento                    , 1 , True  , ' ' );
   Exclusivo_FEBRABAN1             := FormatarTexto( Exclusivo_FEBRABAN1             , 1 , True  , ' ' );
   Cod_Movimento_Remessa           := FormatarTexto( Cod_Movimento_Remessa           , 2 , False , '0' );
   Tipo_Inscricao_Sacado           := FormatarTexto( Tipo_Inscricao_Sacado           , 1 , False , '0' );
   Numero_Inscricao_Sacado         := FormatarTexto( Numero_Inscricao_Sacado         , 15, False , '0' );
   Nome_Sacado                     := FormatarTexto( Nome_Sacado                     , 40, True  , ' ' );
   Endereco_Sacado                 := FormatarTexto( Endereco_Sacado                 , 40, True  , ' ' );
   Bairro_Sacado                   := FormatarTexto( Bairro_Sacado                   , 15, True  , ' ' );
   CEP_Sacado                      := FormatarTexto( CEP_Sacado                      , 8 , False , '0' );
   Cidade_Sacado                   := FormatarTexto( Cidade_Sacado                   , 15, True  , ' ' );
   UF_Sacado                       := FormatarTexto( UF_Sacado                       , 2 , True  , ' ' );

   Tipo_Inscricao_Sacador_Avalista := FormatarTexto( Tipo_Inscricao_Sacador_Avalista , 1 , False  , '0' );
   Num_Inscricao_Sacador_Avalista  := FormatarTexto( Num_Inscricao_Sacador_Avalista  , 15, False  , '0');


   Nome_Sacador_Avalista           := FormatarTexto( Nome_Sacador_Avalista           , 40, True  , ' ' );
   Banco_Corresp_Compensacao       := FormatarTexto( Banco_Corresp_Compensacao       , 3 , False  , '0' );
   Nosso_Numero_Bco_correspondente := FormatarTexto( Nosso_Numero_Bco_correspondente , 20, True   , ' ' );
   Exclusivo_FEBRABAN2             := FormatarTexto( Exclusivo_FEBRABAN2             , 8 , True   , ' ' );


   Result := Cod_Banco_Compensacao + Lote_Servico + Tipo_Registro + Num_Sequencial +
             Cod_Segmento + Exclusivo_FEBRABAN1 + Cod_Movimento_Remessa + Tipo_Inscricao_Sacado +
             Numero_Inscricao_Sacado + Nome_Sacado + Endereco_Sacado + Bairro_Sacado +
             CEP_Sacado + Cidade_Sacado + UF_Sacado + Tipo_Inscricao_Sacador_Avalista +
             Num_Inscricao_Sacador_Avalista + Nome_Sacador_Avalista + Banco_Corresp_Compensacao +
             Nosso_Numero_Bco_correspondente + Exclusivo_FEBRABAN2;

end;

end.


