Advertisement
Guest User

Untitled

a guest
Dec 7th, 2017
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 73.78 KB | None | 0 0
  1. unit RLBoleto;
  2.  
  3. {$mode delphi}
  4.  
  5. interface
  6.  
  7. uses
  8. LCLIntf, LResources,classes, SysUtils,StrUtils, Graphics, extctrls,RLReport,
  9.    BoletoLayout, Controls, Forms , MaskUtils, contnrs;
  10.  
  11. type
  12.    {Classe para gerar código de barras para boletos}
  13.    TRLCobCodBar = class
  14.    private
  15.       fCodigo: string; {Dados que serão incluídos no código de barras}
  16.       function GetLinhaDigitavel : string; {Retorna a representação numérica do código de barras}
  17.       function Define2de5 : string; {Define o formato do código de barras INTERCALADO 2 DE 5, retornando a seqüência de 0 e 1 que será usada para gerar a imagem do código de barras}
  18.       function GetImagem: TImage;
  19.    public
  20.       property Codigo    : string  read fCodigo write fCodigo;
  21.       property LinhaDigitavel : string read GetLinhaDigitavel;
  22.       property Imagem    : TImage read GetImagem;
  23.    end;
  24.  
  25.    {TrlEndereco representa o endereço de cedentes ou sacados}
  26.    TEstado = string[2];
  27.    TCEP = string[8];
  28.  
  29.    TrlEndereco = class(TPersistent)
  30.    public
  31.       fRua,
  32.       fNumero,
  33.       fComplemento,
  34.       fBairro,
  35.       fCidade,
  36.       fEMail : string;
  37.       fEstado : TEstado;
  38.       fCEP : TCEP;
  39.       procedure Assign(AEndereco: TrlEndereco); reintroduce;
  40.    published
  41.       property Rua : string read fRua write fRua;
  42.       property Numero : string read fNumero write fNumero;
  43.       property Complemento : string read fComplemento write fComplemento;
  44.       property Bairro : string read fBairro write fBairro;
  45.       property Cidade : string read fCidade write fCidade;
  46.       property Estado : TEstado read fEstado write fEstado;
  47.       property CEP : TCEP read fCEP write fCEP;
  48.       property EMail : string read fEMail write fEMail;
  49.    end;
  50.  
  51.    {Informações sobre o banco}
  52.    TRLBanco = class(TPersistent)
  53.    private
  54.       fCodigo : string; {Código do banco na câmara de compensação}
  55.       fImagem : Byte;
  56.       procedure SetCodigo(ACodigoBanco : string);
  57.       function GetDigito : string; {Retorna o dígito do código do banco}
  58.       function GetNome   : string; {Retorna o nome do banco}
  59.    public
  60.       procedure   Assign(ABanco: TRLBanco); reintroduce;
  61.    published
  62.       property Codigo : string read fCodigo write SetCodigo;
  63.       property Digito : string read GetDigito;
  64.       property Nome   : string read GetNome;
  65.       property ImagemBanco : Byte read fImagem;
  66.    end;
  67.  
  68.    {Dados da conta bancária de cedentes ou sacados}
  69.    TRLContaBancaria = class(TPersistent)
  70.    public
  71.       fBanco : TRLBanco; {Banco onde a pessoa tem conta}
  72.       fCodigoAgencia, {Código da agência}
  73.       fDigitoAgencia, {Dígito verificador do número da agência}
  74.       fNumeroConta,         {Número da conta}
  75.       fDigitoConta,   {Dígito verificador do número da conta}
  76.       fConvenio, {Banco do Brasil, usado nas carteiras 16, 17, 18}
  77.       fNomeCliente : string; {Nome do cliente titular da conta}
  78.       constructor Create;
  79.       destructor  Destroy; override;
  80.       procedure Assign(AContaBancaria: TRLContaBancaria); reintroduce;
  81.    published
  82.       property Banco : TRLBanco read fBanco write fBanco;
  83.       property CodigoAgencia : string read fCodigoAgencia write fCodigoAgencia;
  84.       property DigitoAgencia : string read fDigitoAgencia write fDigitoAgencia;
  85.       property NumeroConta : string read fNumeroConta write fNumeroConta;
  86.       property DigitoConta : string read fDigitoConta write fDigitoConta;
  87.       property Convenio: String Read fConvenio write fConvenio;
  88.       property NomeCliente : string read fNomeCliente write fNomeCliente;
  89.    end;
  90.  
  91.    TTipoInscricao = (tiPessoaFisica, tiPessoaJuridica, tiOutro);
  92.  
  93.    {Dados sobre os cedentes ou sacados}
  94.    TrlPessoa = class(TPersistent)
  95.    private
  96.       fTipoInscricao: TTipoInscricao;
  97.       fNumeroCPFCGC ,
  98.       fNome         ,
  99.       fSacadorAvaLista: string;
  100.       fEndereco     : TrlEndereco;
  101.       fContaBancaria: TRLContaBancaria;
  102.    public
  103.       constructor Create;
  104.       destructor  Destroy; override;
  105.       procedure   Assign(APessoa: TrlPessoa); reintroduce;
  106.    published
  107.       property TipoInscricao: TTipoInscricao read fTipoInscricao write fTipoInscricao;
  108.       property NumeroCPFCGC : string read fNumeroCPFCGC write fNumeroCPFCGC;
  109.       property Nome         : string read fNome write fNome;
  110.       property SacadorAvalista: string read fSacadorAvaLista write fSacadorAvaLista;
  111.       property Endereco     : TrlEndereco read fEndereco write fEndereco;
  112.       property ContaBancaria: TRLContaBancaria read fContaBancaria write fContaBancaria;
  113.    end;
  114.  
  115.    {Dados completos sobre o cedente - Classe derivada de TrlPessoa}
  116.    TrlCedente = class(TrlPessoa)
  117.    private
  118.       fCodigoCedente,
  119.       fDigitoCodigoCedente : string;
  120.    public
  121.       procedure Assign(ACedente: TrlCedente);
  122.    published
  123.       property CodigoCedente       : string read fCodigoCedente write fCodigoCedente;
  124.       property DigitoCodigoCedente : string read fDigitoCodigoCedente write fDigitoCodigoCedente;
  125.    end;
  126.  
  127.    {Especifica o tipo de documento que gerou o título}
  128.    TEspecieDocumento =
  129.    (
  130.       edAluguel,
  131.       edApoliceSeguro,
  132.       edCheque,
  133.       edContrato,
  134.       edContribuicaoConfederativa,
  135.       edCosseguros,
  136.       edDividaAtivaEstado,
  137.       edDividaAtivaMunicipio,
  138.       edDividaAtivaUniao,
  139.       edDuplicataMercantil,
  140.       edDuplicataMercantialIndicacao,
  141.       edDuplicataRural,
  142.       edDuplicataServico,
  143.       edDuplicataServicoIndicacao,
  144.       edFatura,
  145.       edLetraCambio,
  146.       edMensalidadeEscolar,
  147.       edNotaCreditoComercial,
  148.       edNotaCreditoExportacao,
  149.       edNotaCreditoIndustrial,
  150.       edNotaCreditoRural,
  151.       edNotaDebito,
  152.       edNotaPromissoria,
  153.       edNotaPromissoriaRural,
  154.       edNotaSeguro,
  155.       edOutros,
  156.       edParcelaConsorcio,
  157.       edRecibo,
  158.       edTriplicataMercantil,
  159.       edTriplicataServico,
  160.       edWarrant
  161.    );
  162.  
  163.    TAceiteDocumento = (adSim, adNao);
  164.  
  165.    {Indica quem emite o boleto: banco ou cliente}
  166.    TEmissaoBoleto =
  167.    (
  168.       ebBancoEmite,
  169.       ebClienteEmite,
  170.       ebBancoReemite,
  171.       ebBancoNaoReemite
  172.    );
  173.  
  174.    {Tipos de ocorrências permitidas no arquivos remessa / retorno}
  175.    TTipoOcorrencia =
  176.    (
  177.       {Ocorrências para arquivo remessa}
  178.       toRemessaRegistrar, {Registrar o título no banco}
  179.       toRemessaBaixar, {Baixar o título no banco}
  180.       toRemessaDebitarEmConta,
  181.       toRemessaConcederAbatimento,
  182.       toRemessaCancelarAbatimento,
  183.       toRemessaConcederDesconto,
  184.       toRemessaCancelarDesconto,
  185.       toRemessaAlterarVencimento,
  186.       toRemessaProtestar,
  187.       toRemessaCancelarInstrucaoProtesto,
  188.       toRemessaDispensarJuros,
  189.       toRemessaAlterarNomeEnderecoSacado,
  190.       toRemessaAlterarNumeroControle,
  191.       toRemessaOutrasOcorrencias,
  192.  
  193.       {Ocorrências para arquivo retorno}
  194.       toRetornoRegistroConfirmado,
  195.       toRetornoRegistroRecusado,
  196.       toRetornoComandoRecusado,
  197.       toRetornoLiquidado,
  198.       toRetornoLiquidadoEmCartorio,
  199.       toRetornoLiquidadoParcialmente,
  200.       toRetornoLiquidadoSaldoRestante,
  201.       toRetornoLiquidadoSemRegistro,
  202.       toRetornoLiquidadoPorConta,
  203.       toRetornoBaixaSolicitada,
  204.       toRetornoBaixado,
  205.       toRetornoBaixadoPorDevolucao,
  206.       toRetornoBaixadoFrancoPagamento,
  207.       toRetornoBaixaPorProtesto,
  208.       toRetornoRecebimentoInstrucaoBaixar,
  209.       toRetornoBaixaOuLiquidacaoEstornada,
  210.       toRetornoTituloEmSer,
  211.       toRetornoRecebimentoInstrucaoConcederAbatimento,
  212.       toRetornoAbatimentoConcedido,
  213.       toRetornoRecebimentoInstrucaoCancelarAbatimento,
  214.       toRetornoAbatimentoCancelado,
  215.       toRetornoRecebimentoInstrucaoConcederDesconto,
  216.       toRetornoDescontoConcedido,
  217.       toRetornoRecebimentoInstrucaoCancelarDesconto,
  218.       toRetornoDescontoCancelado,
  219.       toRetornoRecebimentoInstrucaoAlterarDados,
  220.       toRetornoDadosAlterados,
  221.       toRetornoRecebimentoInstrucaoAlterarVencimento,
  222.       toRetornoVencimentoAlterado,
  223.       toRetornoAlteracaoDadosNovaEntrada,
  224.       toRetornoAlteracaoDadosBaixa,
  225.       toRetornoRecebimentoInstrucaoProtestar,
  226.       toRetornoProtestado,
  227.       toRetornoRecebimentoInstrucaoSustarProtesto,
  228.       toRetornoProtestoSustado,
  229.       toRetornoInstrucaoProtestoRejeitadaSustadaOuPendente,
  230.       toRetornoDebitoEmConta,
  231.       toRetornoRecebimentoInstrucaoAlterarNomeSacado,
  232.       toRetornoNomeSacadoAlterado,
  233.       toRetornoRecebimentoInstrucaoAlterarEnderecoSacado,
  234.       toRetornoEnderecoSacadoAlterado,
  235.       toRetornoEncaminhadoACartorio,
  236.       toRetornoRetiradoDeCartorio,
  237.       toRetornoRecebimentoInstrucaoDispensarJuros,
  238.       toRetornoJurosDispensados,
  239.       toRetornoManutencaoTituloVencido,
  240.       toRetornoRecebimentoInstrucaoAlterarTipoCobranca,
  241.       toRetornoTipoCobrancaAlterado,
  242.       toRetornoDespesasProtesto,
  243.       toRetornoDespesasSustacaoProtesto,
  244.       toRetornoDebitoCustasAntecipadas,
  245.       toRetornoCustasCartorioDistribuidor,
  246.       toRetornoCustasEdital,
  247.       toRetornoProtestoOuSustacaoEstornado,
  248.       toRetornoDebitoTarifas,
  249.       toRetornoAcertoDepositaria,
  250.       toRetornoOutrasOcorrencias
  251.    );
  252.  
  253.    {Será usado basicamente quando for Banco do Brasil}
  254.    TLayoutNN = (lnN11, lnN16, lnN17, lnC7_N10, lnC4_N7, lnC6_N5);
  255.  
  256.    {Representa um título e todas as rotinas associadas}
  257.    TRLBTitulo = class(TComponent)
  258.    private
  259.       fPrintDialog: Boolean;
  260.       fTipoOcorrencia : TTipoOcorrencia; {Tipo de ocorrência: registro de título, liquidação normal, pedido de baixa, etc...}
  261.       fOcorrenciaOriginal : string; {Indica o código da ocorrência no banco}
  262.       fDescricaoOcorrenciaOriginal : string;
  263.       fMotivoRejeicaoComando : string; {Indica o código do motivo porque o título / comando foi recusado. Usado apenas para receber informações do banco}
  264.       fDescricaoMotivoRejeicaoComando : string;
  265.       fCedente : TrlCedente; {Aquele que emitiu o título}
  266.       fSacado : TrlPessoa; {Devedor}
  267.       fLocalPagamento, {Local onde o título deverá ser pago}
  268.       fSeuNumero, {Número que identifica o título na empresa}
  269.       fNossoNumero, {Número que identifica o título no banco}
  270.       fNumeroDocumento, {Número do documento que gerou o título (número da nota fiscal, por exemplo)}
  271.       fCarteira : string; {Carteira do título, conforme informado pelo banco}
  272.       fAceiteDocumento : TAceiteDocumento;
  273.       fEspecieDocumento: TEspecieDocumento; {Tipo de documento que gerou o título}
  274.       fDataProcessamento, {Data em que o boleto bancário foi gerado}
  275.       fDataDocumento, {Data da emissão do documento que gerou o título (data da emissão da nota fiscal, por exemplo)}
  276.       fDataVencimento, {Data do vencimento do título}
  277.       fDataOcorrencia, {Data da ocorrência em questão (pagamento do título, recebimento de instrução, etc)}
  278.       fDataCredito, {Data em que o banco liberará o dinheiro para o cedente}
  279.       fDataAbatimento, {Data até a qual deverá ser concedido abatimento}
  280.       fDataDesconto, {Data até a qual deverá ser concedido desconto}
  281.       fDataMoraJuros, {Data a partir da qual deverão ser cobrados juros / mora}
  282.       fDataProtesto, {Data em que o título deverá ser protestado em caso de falta de pagamento}
  283.       fDataBaixa: TDateTime; {Data em que o título deverá ser baixado}
  284.       fValorDocumento, {Valor do título}
  285.       fValorDespesaCobranca, {Valor que o banco cobrou pelo serviço de cobrança}
  286.       fValorAbatimento, {Valor do abatimento a conceder / concedido ao sacado}
  287.       fValorDesconto, {Valor do desconto diário a conceder (remessa) ou desconto total concedido (retorno) ao sacado}
  288.       fValorMoraJuros, {Valor dos juros / multa cobrados do sacado}
  289.       fValorIOF, {Valor do Imposto sobre Operações Financeiras}
  290.       fValorOutrasDespesas, {Valor de outras despesas cobradas pelo banco: protesto de títulos, por exemplo}
  291.       fValorOutrosCreditos, {Valor de outros créditos que o banco repassará ao cedente}
  292.       fValorRecebido: Currency; {Valor total recebido informado pelo banco}
  293.       fReferencia: ShortString;
  294.       fInstrucoes : TStringList; {Instruções incluídas no título}
  295.       fEmissaoBoleto: TEmissaoBoleto; {Indica quem emite o boleto: banco ou cliente}
  296.       fLayoutNN: TLayoutNN; {Tipo do visual do nosso numero, usado praticamente só pelo banco do brasil}
  297.       fImagemEmpresa: TRLImage; {Imagem da empresa no boleto}
  298.       nQtdeBoletos : Integer;
  299.       Agrupamento: array of TLayoutBoleto;
  300.       fVersao: ShortString;
  301.       procedure SetInstrucoes(Texto: TStringList);
  302.       function   GerarCodigoBarra : TrlCobCodBar; {Retorna um objeto do tipo TrlCobCodBar contendo linha digitável e imagem do código de barras baseados nos dados do título}
  303.       function   CalcularDigitoNossoNumero : string; {Calcula o dígito do NossoNumero, conforme critérios definidos por cada banco}
  304.       procedure  PrepararBoleto(ABoleto: TLayoutBoleto); {Atribui valores aos campos do boleto antes que ele seja impresso }
  305.       function   GetImagemBoleto : TImage; {Gera a imagem do boleto}
  306.       function   GetImagemFichaCompensacao : TImage; {Gera a imagem da ficha de compensação}
  307.    public
  308.       constructor Create(AOwner: TComponent); override;
  309.       destructor  Destroy; override;
  310.       procedure   Assign(ATitulo: TRLBTitulo); reintroduce;
  311. {      procedure   EnviarPorEMail(Host, LoginUsuario : string; Porta :integer; Assunto : string; Mensagem : TStringList);}
  312.  
  313.       procedure   Visualizar;
  314.       procedure   Preparar;
  315.       procedure   Imprimir;
  316.  
  317.       property CodigoBarra : TrlCobCodBar read GerarCodigoBarra;
  318.       property DigitoNossoNumero : string read CalcularDigitoNossoNumero;
  319.       property ImagemBoleto : TImage read GetImagemBoleto;
  320.       property ImagemFichaCompensacao : TImage read GetImagemFichaCompensacao;
  321.    published
  322.       property PrintDialog: Boolean read fPrintDialog write fPrintDialog;
  323.       property TipoOcorrencia : TTipoOcorrencia read fTipoOcorrencia write fTipoOcorrencia;
  324.       property OcorrenciaOriginal : string read fOcorrenciaOriginal write fOcorrenciaOriginal;
  325.       property DescricaoOcorrenciaOriginal : string read fDescricaoOcorrenciaOriginal write fDescricaoOcorrenciaOriginal;
  326.       property MotivoRejeicaoComando : string read fMotivoRejeicaoComando write fMotivoRejeicaoComando;
  327.       property DescricaoMotivoRejeicaoComando : string read fDescricaoMotivoRejeicaoComando write fDescricaoMotivoRejeicaoComando;
  328.       property LocalPagamento : string read fLocalPagamento write fLocalPagamento;
  329.       property Cedente : TrlCedente read fCedente write fCedente;
  330.       property Sacado : TrlPessoa read fSacado write fSacado;
  331.       property SeuNumero : string read fSeuNumero write fSeuNumero;
  332.       property NossoNumero : string read fNossoNumero write fNossoNumero;
  333.       property NumeroDocumento : string read fNumeroDocumento write fNumeroDocumento;
  334.       property Carteira : string read fCarteira write fCarteira;
  335.       property AceiteDocumento : TAceiteDocumento read fAceiteDocumento write fAceiteDocumento;
  336.       property EspecieDocumento: TEspecieDocumento read fEspecieDocumento write fEspecieDocumento;
  337.       property DataProcessamento : TDateTime read fDataProcessamento write fDataProcessamento;
  338.       property DataDocumento : TDateTime read fDataDocumento write fDataDocumento;
  339.       property DataVencimento : TDateTime read fDataVencimento write fDataVencimento;
  340.       property Referencia: ShortString read fReferencia write fReferencia;
  341.       property DataOcorrencia : TDateTime read fDataOcorrencia write fDataOcorrencia;
  342.       property DataCredito : TDateTime read fDataCredito write fDataCredito;
  343.       property DataAbatimento : TDateTime read fDataAbatimento write fDataAbatimento;
  344.       property DataDesconto : TDateTime read fDataDesconto write fDataDesconto;
  345.       property DataMoraJuros : TDateTime read fDataMoraJuros write fDataMoraJuros;
  346.       property DataProtesto : TDateTime read fDataProtesto write fDataProtesto;
  347.       property DataBaixa : TDateTime read fDataBaixa write fDataBaixa;
  348.       property ValorDocumento : Currency read fValorDocumento write fValorDocumento;
  349.       property ValorDespesaCobranca : Currency read fValorDespesaCobranca write fValorDespesaCobranca;
  350.       property ValorAbatimento : Currency read fValorAbatimento write fValorAbatimento;
  351.       property ValorDesconto : Currency read fValorDesconto write fValorDesconto;
  352.       property ValorMoraJuros : Currency read fValorMoraJuros write fValorMoraJuros;
  353.       property ValorIOF : Currency read fValorIOF write fValorIOF;
  354.       property ValorOutrasDespesas : Currency read fValorOutrasDespesas write fValorOutrasDespesas;
  355.       property ValorOutrosCreditos : Currency read fValorOutrosCreditos write fValorOutrosCreditos;
  356.       property ValorRecebido: Currency read fValorRecebido write fValorRecebido;
  357.       property Instrucoes : TStringList read fInstrucoes write SetInstrucoes;
  358.       property EmissaoBoleto : TEmissaoBoleto read fEmissaoBoleto write fEmissaoBoleto;
  359.       property LayoutNN: TLayoutNN read fLayoutNN write fLayoutNN;
  360.       property ImagemEmpresa : TRLImage read fImagemEmpresa write fImagemEmpresa;
  361.       property Versao: ShortString read fVersao write fVersao;
  362.    end;
  363.  
  364. {$IFNDEF VER120}
  365.  
  366.    {Representa uma lista de títulos - Objetos do tipo RLBTitulo}
  367.  
  368.    TRLTituloList = class(TObjectList)
  369.    protected
  370.       function    GetItem(Index: Integer): TRLBTitulo; {Retorna o objeto TRLBTitulo que está na posição definida por Index}
  371.       procedure   SetItem(Index: Integer; ATitulo : TRLBTitulo); {Altera o objeto TRLBTitulo que está na posição definida por Index}
  372.    public
  373.       constructor Create;
  374.       function    Add(ATitulo : TRLBTitulo) : integer; {Insere o título no final da coleção}
  375.       function    Remove(ATitulo : TRLBTitulo): Integer; {Remove da coleção o título}
  376.       function    IndexOf(ATitulo : TRLBTitulo): Integer; {Retorna a posição onde está localizado o título na coleção}
  377.       function    FindInstanceOf(AClass: TClass; AExact: Boolean = True; AStartAt: Integer = 0): Integer;
  378.       procedure   Insert(Index: Integer; ATitulo : TRLBTitulo); {Insere o título no final da coleção na posição indicada por Index}
  379.       property    Items[Index : integer] : TRLBTitulo read GetItem write SetItem; default;
  380.    end;
  381.  
  382.    {Indica o layout do arquivo remessa / retorno, incluindo tamanho de cada registro, o
  383.     os tipos de registros permitidos e o significado dos campos contidos no arquivo}
  384.    TLayoutArquivo = (laCNAB240, laCNAB400, laOutro);
  385.  
  386.    {Indica o tipo de movimento desejado}
  387.    TTipoMovimento  = (tmRemessa, tmRetorno, tmRemessaTeste, tmRetornoTeste, tmOutro);
  388.  
  389.    {Representa um conjunto de títulos que serão tratados juntos em alguma rotina.
  390.     Por exemplo: processamento de arquivo retorno e geração de arquivo remessa}
  391.    TRLBRemessa = class(TComponent)
  392.    private
  393.       fNomeArquivo : string; {Nome do arquivo remessa ou retorno}
  394.       fNumeroArquivo : Integer; {Número seqüencial do arquivo remessa ou retorno}
  395.       fDataArquivo : TDateTime; {Data da geração do arquivo remessa ou retorno}
  396.       fLayoutArquivo: TLayoutArquivo; {Layout do arquivo remessa / retorno}
  397.       fTipoMovimento: TTipoMovimento; {Tipo de movimento desejado: remessa, retorno, etc...}
  398.       fTitulos : TRLTituloList; {Títulos incluídos no arquivo remessa ou retorno}
  399.    public
  400.       constructor Create(AOwner: TComponent); override;
  401.       destructor Destroy; override;
  402.       function LerRetorno : boolean; {Lê o arquivo retorno recebido do banco}
  403.       function GerarRemessa : boolean; {Gerar arquivo remessa para enviar ao banco}
  404.       function GerarRelatorio : TStringList; {Gera as informações que serão apresentadas na propriedade Relatório}
  405.       property Titulos       : TRLTituloList read fTitulos write fTitulos;
  406.       property Relatorio     : TStringList read GerarRelatorio;
  407.    published
  408.       property NomeArquivo   : string read fNomeArquivo write fNomeArquivo;
  409.       property NumeroArquivo : integer read fNumeroArquivo write fNumeroArquivo;
  410.       property DataArquivo   : TDateTime read fDataArquivo write fDataArquivo;
  411.       property LayoutArquivo : TLayoutArquivo read fLayoutArquivo write fLayoutArquivo;
  412.       property TipoMovimento : TTipoMovimento read fTipoMovimento write fTipoMovimento;
  413.    end;
  414.  
  415. {$ENDIF}
  416.  
  417. procedure Register; {Registra os componentes no Delphi}
  418. function Formatar(Texto : string; TamanhoDesejado : integer; AcrescentarADireita : boolean = true; CaracterAcrescentar : char = ' ') : string;
  419. function FormatarComMascara(StringFormato, Texto: string): string;
  420. function Modulo10(Valor: String) : string;
  421. function Modulo11(Valor: String; Base: Integer = 9; Resto : boolean = false) : string;
  422. function CalcularFatorVencimento(DataDesejada : TDateTime) : string;
  423.  
  424. {$IFDEF VER130}
  425. {Calcula a diferença de dias entre duas datas. No Delphi 6 a função já existe na unit DATEUTILS}
  426. function DaysBetween(DataMaior, DataMenor: TDateTime): integer;
  427. {$ENDIF}
  428.  
  429. implementation
  430.  
  431. uses RLCob000, RLCob001, RLCob033, RLCob104, RLCob237, RLCob275, RLCob341, RLCob399,
  432.   RLCob409, RLCob356, RLCob748, RLCob756;
  433.  
  434. Procedure Register;
  435. begin
  436.    RegisterComponents('RLBoleto',[TRLBRemessa,TRLBTitulo]);
  437. end;
  438.  
  439. {Rotinas auxiliares}
  440.  
  441. function CalcularFatorVencimento(DataDesejada : TDateTime) : string;
  442. {O fator de vencimento é a quantidade de dias entre 07/Nov/1997 e a data de vencimento do título}
  443. begin
  444.    Result := IntToStr( Trunc(DataDesejada - EncodeDate(1997,10,07)));
  445. end;
  446.  
  447. function Modulo10(Valor: String) : string;
  448. {
  449.    Rotina usada para cálculo de alguns dígitos verificadores
  450.    Pega-se cada um dos dígitos contidos no parâmetro VALOR, da direita para a
  451.    esquerda e multiplica-se por 2121212...
  452.    Soma-se cada um dos subprodutos. Caso algum dos subprodutos tenha mais de um
  453.    dígito, deve-se somar cada um dos dígitos. (Exemplo: 7*2 = 14 >> 1+4 = 5)
  454.    Divide-se a soma por 10.
  455.    Faz-se a operação 10-Resto da divisão e devolve-se o resultado dessa operação
  456.    como resultado da função Modulo10.
  457.    Obs.: Caso o resultado seja maior que 9, deverá ser substituído por 0 (ZERO).
  458. }
  459. var
  460.    Auxiliar : string;
  461.    Contador, Peso : integer;
  462.    Digito : integer;
  463. begin
  464.    Auxiliar := '';
  465.    Peso := 2;
  466.    for Contador := Length(Valor) downto 1 do
  467.    begin
  468.       Auxiliar := IntToStr(StrToInt(Valor[Contador]) * Peso) + Auxiliar;
  469.       if Peso = 1 then
  470.          Peso := 2
  471.       else
  472.          Peso := 1;
  473.    end;
  474.  
  475.    Digito := 0;
  476.    for Contador := 1 to Length(Auxiliar) do
  477.    begin
  478.       Digito := Digito + StrToInt(Auxiliar[Contador]);
  479.    end;
  480.    Digito := 10 - (Digito mod 10);
  481.    if (Digito > 9) then
  482.       Digito := 0;
  483.    Result := IntToStr(Digito);
  484. end;
  485.  
  486. function Modulo11(Valor: String; Base: Integer = 9; Resto : boolean = false) : string;
  487. {
  488.    Rotina muito usada para calcular dígitos verificadores
  489.    Pega-se cada um dos dígitos contidos no parâmetro VALOR, da direita para a
  490.    esquerda e multiplica-se pela seqüência de pesos 2, 3, 4 ... até BASE.
  491.    Por exemplo: se a base for 9, os pesos serão 2,3,4,5,6,7,8,9,2,3,4,5...
  492.    Se a base for 7, os pesos serão 2,3,4,5,6,7,2,3,4...
  493.    Soma-se cada um dos subprodutos.
  494.    Divide-se a soma por 11.
  495.    Faz-se a operação 11-Resto da divisão e devolve-se o resultado dessa operação
  496.    como resultado da função Modulo11.
  497.    Obs.: Caso o resultado seja maior que 9, deverá ser substituído por 0 (ZERO).
  498. }
  499. var
  500.    Soma : integer;
  501.    Contador, Peso, Digito : integer;
  502. begin
  503.    Soma := 0;
  504.    Peso := 2;
  505.    for Contador := Length(Valor) downto 1 do
  506.    begin
  507.       Soma := Soma + (StrToInt(Valor[Contador]) * Peso);
  508.       if Peso < Base then
  509.          Peso := Peso + 1
  510.       else
  511.          Peso := 2;
  512.    end;
  513.  
  514.    if Resto then
  515.       Result := IntToStr(Soma mod 11)
  516.    else
  517.    begin
  518.       Digito := 11 - (Soma mod 11);
  519.       if (Digito > 9) then
  520.          Digito := 0;
  521.       Result := IntToStr(Digito);
  522.    end
  523. end;
  524.  
  525. function Formatar(Texto : string; TamanhoDesejado : integer; AcrescentarADireita : boolean = true; CaracterAcrescentar : char = ' ') : string;
  526. {
  527.    OBJETIVO: Eliminar caracteres inválidos e acrescentar caracteres à esquerda ou à direita do texto original para que a string resultante fique com o tamanho desejado
  528.  
  529.    Texto : Texto original
  530.    TamanhoDesejado: Tamanho que a string resultante deverá ter
  531.    AcrescentarADireita: Indica se o carácter será acrescentado à direita ou à esquerda
  532.       TRUE - Se o tamanho do texto for MENOR que o desejado, acrescentar carácter à direita
  533.              Se o tamanho do texto for MAIOR que o desejado, eliminar últimos caracteres do texto
  534.       FALSE - Se o tamanho do texto for MENOR que o desejado, acrescentar carácter à esquerda
  535.              Se o tamanho do texto for MAIOR que o desejado, eliminar primeiros caracteres do texto
  536.    CaracterAcrescentar: Carácter que deverá ser acrescentado
  537. }
  538. //retira acentos e caracteres especiais
  539. var
  540.    QuantidadeAcrescentar,
  541.    TamanhoTexto,
  542.    PosicaoInicial,
  543.    i : integer;
  544. const
  545.   Accents: array [0..25] of String =
  546.     ('Á','À','Â','Ä','Ã','º','ª',
  547.      'É','È','Ê','Ë',
  548.      'Í','Ì','Î','Ï',
  549.      'Ó','Ò','Ô','Ö','Õ',
  550.      'Ú','Ù','Û','Ü',
  551.      'Ç',
  552.      'Ñ');
  553.   NoAccents: array [0..25] of String =
  554.     ('A','A','A','A','A','','',
  555.      'E','E','E','E',
  556.      'I','I','I','I',
  557.      'O','O','O','O','O',
  558.      'U','U','U','U',
  559.      'C',
  560.      'N');
  561. begin
  562.    case CaracterAcrescentar of
  563.       '0'..'9','a'..'z','A'..'Z' : ;{Não faz nada}
  564.       else
  565.          CaracterAcrescentar := ' ';
  566.    end;
  567.  
  568.    Texto := Trim(ANSIToUTF8(ansiuppercase(UTF8ToANSI(Texto))));
  569.    TamanhoTexto := Length(Texto);
  570. //{$WARNINGS OFF}
  571.   // for i := 1 to (TamanhoTexto) do
  572.   //begin
  573.    //   if Pos(Texto[i],' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~''"!@#$%^&*()_-+=|/\{}[]:;,.<>') = 0 then
  574.   {    begin
  575.          case Texto[i] of
  576.             'Á','À','Â','Ä','Ã' : Texto[i] := 'A';
  577.             'É','È','Ê','Ë' : Texto[i] := 'E';
  578.             'Í','Ì','Î','Ï': Texto[i] := 'I';
  579.             'Ó','Ò','Ô','Ö','Õ' : Texto[i] := 'O';
  580.             'Ú','Ù','Û','Ü': Texto[i] := 'U';
  581.             'Ç' : Texto[i] := 'C';
  582.             'Ñ' : Texto[i] := 'N';
  583.             else Texto[i] := ' ';
  584.          end;
  585.       end;
  586.    end; }
  587.     Texto := StringsReplace(Texto, Accents, NoAccents, [rfReplaceAll]);
  588.  
  589.  
  590.    QuantidadeAcrescentar := TamanhoDesejado - TamanhoTexto;
  591.    if QuantidadeAcrescentar < 0 then
  592.       QuantidadeAcrescentar := 0;
  593.    if CaracterAcrescentar = '' then
  594.       CaracterAcrescentar := ' ';
  595.    if TamanhoTexto >= TamanhoDesejado then
  596.       PosicaoInicial := TamanhoTexto - TamanhoDesejado + 1
  597.    else
  598.       PosicaoInicial := 1;
  599.  
  600.    if AcrescentarADireita then
  601.       Texto := Copy(Texto,1,TamanhoDesejado) + StringOfChar(CaracterAcrescentar,QuantidadeAcrescentar)
  602.    else
  603.       Texto := StringOfChar(CaracterAcrescentar,QuantidadeAcrescentar) + Copy(Texto,PosicaoInicial,TamanhoDesejado);
  604.  
  605.    Result := AnsiUpperCase(Texto);
  606. end;
  607.  
  608. function FormatarComMascara(StringFormato, Texto: string): string;
  609. begin
  610.    Result := FormatMaskText(StringFormato,Texto);
  611. end;
  612.  
  613. {$IFDEF VER130}
  614. {Calcula a diferença entre duas datas. No Delphi 6 a função já existe na unit DATEUTILS}
  615. function DaysBetween(DataMaior, DataMenor: TDateTime): integer;
  616. begin
  617.    Result := Trunc(DataMaior - DataMenor);
  618. end;
  619. {$ENDIF}
  620.  
  621. {TrlCobCodBar}
  622.  
  623. function TrlCobCodBar.Define2de5 : string;
  624. {Traduz dígitos do código de barras para valores de 0 e 1, formando um código do tipo Intercalado 2 de 5}
  625. var
  626.    CodigoAuxiliar : string;
  627.    Start   : string;
  628.    Stop    : string;
  629.    T2de5   : array[0..9] of string;
  630.    Codifi  : string;
  631.    I       : integer;
  632.  
  633. begin
  634.    Result := 'Erro';
  635.    Start    := '0000';
  636.    Stop     := '100';
  637.    T2de5[0] := '00110';
  638.    T2de5[1] := '10001';
  639.    T2de5[2] := '01001';
  640.    T2de5[3] := '11000';
  641.    T2de5[4] := '00101';
  642.    T2de5[5] := '10100';
  643.    T2de5[6] := '01100';
  644.    T2de5[7] := '00011';
  645.    T2de5[8] := '10010';
  646.    T2de5[9] := '01010';
  647.  
  648.    { Digitos }
  649.    for I := 1 to length(Codigo) do
  650.    begin
  651.       if pos(Codigo[I],'0123456789') <> 0 then
  652.          Codifi := Codifi + T2de5[StrToInt(Codigo[I])]
  653.       else
  654.          Exit;
  655.    end;
  656.  
  657.    {Se houver um número ímpar de dígitos no Código, acrescentar um ZERO no início}
  658.    if odd(length(Codigo)) then
  659.       Codifi := T2de5[0] + Codifi;
  660.  
  661.    {Intercalar números - O primeiro com o segundo, o terceiro com o quarto, etc...}
  662.    I := 1;
  663.    CodigoAuxiliar := '';
  664.    while I <= (length(Codifi) - 9)do
  665.    begin
  666.       CodigoAuxiliar := CodigoAuxiliar + Codifi[I] + Codifi[I+5] + Codifi[I+1] + Codifi[I+6] + Codifi[I+2] + Codifi[I+7] + Codifi[I+3] + Codifi[I+8] + Codifi[I+4] + Codifi[I+9];
  667.       I := I + 10;
  668.    end;
  669.  
  670.    { Acrescentar caracteres Start e Stop }
  671.    Result := Start + CodigoAuxiliar + Stop;
  672. end;
  673.  
  674.  
  675. function TrlCobCodBar.GetLinhaDigitavel : string;
  676. {
  677.    A linha digitável é baseada na informações do código de barras.
  678.    As informações que fazem parte do código de barras são:
  679.    Posição         Conteúdo
  680.    1 a 3           Número do banco
  681.    4               Código da Moeda - 9 para Real
  682.    5               Digito verificador do Código de Barras
  683.    6 a 19          Valor (12 inteiros e 2 decimais)
  684.    20 a 44         Campo Livre definido por cada banco
  685. }
  686. var
  687.    p1, p2, p3, p4, p5, p6,
  688.    Campo1, Campo2, Campo3, Campo4, Campo5 : string;
  689. begin
  690.    {
  691.       Campo 1 - composto pelo código do banco, código da moeda, as cinco primeiras posições
  692.       do campo livre e DV (modulo10) desse campo
  693.    }
  694.    p1 := Copy(Codigo,1,4);
  695.    p2 := Copy(Codigo,20,5);
  696.    p3 := Modulo10(p1+p2);
  697.    p4 := p1+p2+p3;
  698.    p5 := Copy(p4,1,5);
  699.    p6 := Copy(p4,6,5);
  700.    Campo1 := p5+'.'+p6;
  701.  
  702.    {
  703.       Campo 2 - composto pelas posiçoes 6 a 15 do campo livre
  704.       e DV (modulo10) deste campo
  705.    }
  706.    p1 := Copy(Codigo,25,10);
  707.    p2 := Modulo10(p1);
  708.    p3 := p1+p2;
  709.    p4 := Copy(p3,1,5);
  710.    p5 := Copy(p3,6,6);
  711.    Campo2 := p4+'.'+p5;
  712.  
  713.    {
  714.       Campo 3 - composto pelas posicoes 16 a 25 do campo livre
  715.       e DV (modulo10) deste campo
  716.    }
  717.    p1 := Copy(Codigo,35,10);
  718.    p2 := Modulo10(p1);
  719.    p3 := p1+p2;
  720.    p4 := Copy(p3,1,5);
  721.    p5 := Copy(p3,6,6);
  722.    Campo3 := p4+'.'+p5;
  723.  
  724.    {
  725.       Campo 4 - digito verificador do codigo de barras
  726.    }
  727.    Campo4 := Copy(Codigo,5,1);
  728.  
  729.    {
  730.       Campo 5 - composto pelo valor nominal do documento, sem indicacao
  731.       de zeros a esquerda e sem edicao (sem ponto e virgula). Quando se
  732.       tratar de valor zerado, a representacao deve ser 000 (tres zeros).
  733.    }
  734.    Campo5 := Copy(Codigo,6,14);
  735.  
  736.    Result := Campo1 + ' ' + Campo2 + ' ' + Campo3 + ' ' + Campo4 + ' ' + Campo5;
  737. end;
  738.  
  739. function TrlCobCodBar.GetImagem : TImage;
  740. const
  741.    CorBarra           = clBlack;
  742.    CorEspaco          = clWhite;
  743.    LarguraBarraFina   = 1;
  744.    LarguraBarraGrossa = 3;
  745.    AlturaBarra        = 50;
  746. var
  747.    X            : integer;
  748.    Col          : integer;
  749.    Lar          : integer;
  750.    CodigoAuxiliar : string;
  751. begin
  752.    CodigoAuxiliar := Define2de5;
  753.    Result := TImage.Create(nil);
  754.    Result.Height := AlturaBarra;
  755.    Result.Width := 0;
  756.    For X := 1 to Length(CodigoAuxiliar) do
  757.       case CodigoAuxiliar[X] of
  758.          '0' : Result.Width := Result.Width + LarguraBarraFina;
  759.          '1' : Result.Width := Result.Width + LarguraBarraGrossa;
  760.       end;
  761.  
  762.    Col    := 0;
  763.  
  764.    if CodigoAuxiliar <> 'Erro' then
  765.    begin
  766.       for X := 1 to length(CodigoAuxiliar) do
  767.       begin
  768.          {Desenha barra}
  769.          with Result.Canvas do
  770.          begin
  771.             if Odd(X) then
  772.                Pen.Color := CorBarra
  773.             else
  774.                Pen.Color := CorEspaco;
  775.  
  776.             if CodigoAuxiliar[X] = '0' then
  777.             begin
  778.                for Lar := 1 to LarguraBarraFina do
  779.                begin
  780.                   MoveTo(Col,0);
  781.                   LineTo(Col,AlturaBarra);
  782.                   Col := Col + 1;
  783.                end;
  784.             end
  785.             else
  786.             begin
  787.                for Lar := 1 to LarguraBarraGrossa do
  788.                begin
  789.                   MoveTo(Col,0);
  790.                   LineTo(Col,AlturaBarra);
  791.                   Col := Col + 1;
  792.                end;
  793.             end;
  794.          end;
  795.       end;
  796.    end
  797.    else
  798.       Result.Canvas.TextOut(0,0,'Erro');
  799. end;
  800.  
  801. {TrlEndereco}
  802. procedure TrlEndereco.Assign(AEndereco: TrlEndereco);
  803. begin
  804.    Rua := AEndereco.Rua;
  805.    Numero := AEndereco.Numero;
  806.    Complemento := AEndereco.Complemento;
  807.    Bairro := AEndereco.Bairro;
  808.    Cidade := AEndereco.Cidade;
  809.    Estado := AEndereco.Estado;
  810.    CEP := AEndereco.CEP;
  811.    EMail := AEndereco.EMail;
  812. end;
  813.  
  814. {TRLBanco}
  815. procedure TRLBanco.SetCodigo(ACodigoBanco: string);
  816. begin
  817.    ACodigoBanco := Formatar(ACodigoBanco,3,false,'0');
  818.    if (ACodigoBanco = '000') then
  819.       fCodigo := ''
  820.    else if (ACodigoBanco <> fCodigo) then
  821.       fCodigo := ACodigoBanco;
  822. end;
  823.  
  824. procedure TRLBanco.Assign(ABanco : TRLBanco);
  825. begin
  826.    Codigo := ABanco.Codigo;
  827. end;
  828.  
  829. function TRLBanco.GetDigito : string;
  830. begin
  831.   if Codigo = '' then
  832.     Result := ''
  833.   else if Codigo = '748' then
  834.     Result := 'X'
  835.   else
  836.     Result := Modulo11(Codigo,9);
  837. end;
  838.  
  839. function TRLBanco.GetNome : String;
  840. var
  841.    ACodigoBanco: string;
  842.    AClasseBanco: TPersistentClass;
  843.    ABanco: TPersistent;
  844.    GetNomeBanco: function: string of object;
  845.    GetImagem: function: Byte of object;
  846. begin
  847.    ACodigoBanco := Formatar(Codigo,3,false,'0');
  848.    GetNomeBanco := nil;
  849.    GetImagem    := nil;
  850.    AClasseBanco := GetClass('TRLBanco'+ACodigoBanco);
  851.    if AClasseBanco <> nil then
  852.    begin
  853.       ABanco := AClasseBanco.Create;
  854.       TRY
  855.          @GetNomeBanco := ABanco.MethodAddress('GetNomeBanco');
  856.          @GetImagem    := ABanco.MethodAddress('GetImagem');
  857.          if @GetNomeBanco <> nil then
  858.          begin
  859.             Result  :=  GetNomeBanco;
  860.             fImagem := GetImagem;
  861.          end
  862.          else
  863.             Raise Exception.CreateFmt('O nome do banco %s não está disponível',[ACodigoBanco]);
  864.          ABanco.Free;
  865.       EXCEPT
  866.          ABanco.Free;
  867.          Raise;
  868.       END;
  869.    end
  870.    else
  871.       Raise Exception.CreateFmt('O banco %s não está disponível',[ACodigoBanco]);
  872. end;
  873.  
  874. {TRLContaBancaria}
  875. constructor TRLContaBancaria.Create;
  876. begin
  877.    inherited Create;
  878.    Banco := TRLBanco.Create;
  879. end;
  880.  
  881. destructor TRLContaBancaria.Destroy;
  882. begin
  883.    Banco.Destroy;
  884.    inherited Destroy;
  885. end;
  886.  
  887. procedure TRLContaBancaria.Assign(AContaBancaria: TRLContaBancaria);
  888. begin
  889.    Banco.Assign(AContaBancaria.Banco);
  890.    CodigoAgencia := AContaBancaria.CodigoAgencia;
  891.    DigitoAgencia := AContaBancaria.DigitoAgencia;
  892.    NumeroConta := AContaBancaria.NumeroConta;
  893.    DigitoConta := AContaBancaria.DigitoConta;
  894.    Convenio    := AContaBancaria.Convenio;
  895.    NomeCliente := AContaBancaria.NomeCliente;
  896. end;
  897.  
  898. {TrlPessoa}
  899.  
  900. constructor TrlPessoa.Create;
  901. begin
  902.    inherited Create;
  903.    Endereco := TrlEndereco.Create;
  904.    ContaBancaria := TRLContaBancaria.Create;
  905. end;
  906.  
  907. destructor TrlPessoa.Destroy;
  908. begin
  909.    Endereco.Destroy;
  910.    ContaBancaria.Destroy;
  911.    inherited Destroy;
  912. end;
  913.  
  914. procedure TrlPessoa.Assign(APessoa: TrlPessoa);
  915. begin
  916.    TipoInscricao := APessoa.TipoInscricao;
  917.    NumeroCPFCGC := APessoa.NumeroCPFCGC;
  918.    Nome := APessoa.Nome;
  919.    Endereco.Assign(APessoa.Endereco);
  920.    ContaBancaria.Assign(APessoa.ContaBancaria)
  921. end;
  922.  
  923. procedure TrlCedente.Assign(ACedente: TrlCedente);
  924. begin
  925.    inherited Assign(ACedente);
  926.    CodigoCedente := ACedente.CodigoCedente;
  927.    DigitoCodigoCedente := ACedente.DigitoCodigoCedente;
  928. end;
  929.  
  930. {TRLBTitulo}
  931. constructor TRLBTitulo.Create(AOwner: TComponent);
  932. begin
  933.    inherited Create(AOwner);
  934.    fCedente := TrlCedente.Create;
  935.    fSacado := TrlPessoa.Create;
  936.    fInstrucoes := TStringList.Create;
  937.    fLocalPagamento := 'PAGÁVEL EM QUALQUER BANCO ATÉ O VENCIMENTO';
  938.    fOcorrenciaOriginal := '';
  939.    fTipoOcorrencia := toRemessaRegistrar;
  940.    fEspecieDocumento := edDuplicataMercantil;//edRecibo;
  941.    fAceiteDocumento := adNao;
  942.    fEmissaoBoleto := ebClienteEmite;
  943.    fPrintDialog := True;
  944.    nQtdeBoletos := -1;
  945.    fVersao := '1.1.4';
  946. end;
  947.  
  948. destructor TRLBTitulo.Destroy;
  949. begin
  950.    Cedente.Destroy;
  951.    Sacado.Destroy;
  952.    Instrucoes.Destroy;
  953.    inherited Destroy;
  954. end;
  955.  
  956. procedure TRLBTitulo.SetInstrucoes(Texto: TStringList);
  957. begin
  958.    fInstrucoes.Assign(Texto);
  959. end;
  960.  
  961. procedure TRLBTitulo.Assign(ATitulo: TRLBTitulo);
  962. begin
  963.   PrintDialog := ATitulo.PrintDialog;
  964.   OcorrenciaOriginal := ATitulo.OcorrenciaOriginal;
  965.   DescricaoOcorrenciaOriginal := ATitulo.DescricaoOcorrenciaOriginal;
  966.   TipoOcorrencia := ATitulo.TipoOcorrencia;
  967.   MotivoRejeicaoComando := ATitulo.MotivoRejeicaoComando;
  968.   DescricaoMotivoRejeicaoComando := ATitulo.DescricaoMotivoRejeicaoComando;
  969.   Cedente.Assign(ATitulo.Cedente);
  970.   Sacado.Assign(ATitulo.Sacado);
  971.   LocalPagamento := ATitulo.LocalPagamento;
  972.   SeuNumero := ATitulo.SeuNumero;
  973.   LayoutNN  := ATitulo.LayoutNN;
  974.   NossoNumero := ATitulo.NossoNumero;
  975.   NumeroDocumento := ATitulo.NumeroDocumento;
  976.   Carteira := ATitulo.Carteira;
  977.   AceiteDocumento := ATitulo.AceiteDocumento;
  978.   EspecieDocumento:= ATitulo.EspecieDocumento;
  979.   DataProcessamento := ATitulo.DataProcessamento;
  980.   DataDocumento := ATitulo.DataDocumento;
  981.   DataVencimento := ATitulo.DataVencimento;
  982.   Referencia := ATitulo.Referencia;
  983.   DataOcorrencia := ATitulo.DataOcorrencia;
  984.   DataCredito := ATitulo.DataCredito;
  985.   DataAbatimento := ATitulo.DataAbatimento;
  986.   DataDesconto := ATitulo.DataDesconto;
  987.   DataMoraJuros := ATitulo.DataMoraJuros;
  988.   DataProtesto := ATitulo.DataProtesto;
  989.   DataBaixa := ATitulo.DataBaixa;
  990.   ValorDocumento := ATitulo.ValorDocumento;
  991.   ValorDespesaCobranca := ATitulo.ValorDespesaCobranca;
  992.   ValorAbatimento := ATitulo.ValorAbatimento;
  993.   ValorDesconto := ATitulo.ValorDesconto;
  994.   ValorMoraJuros := ATitulo.ValorMoraJuros;
  995.   ValorIOF := ATitulo.ValorIOF;
  996.   ValorOutrasDespesas := ATitulo.ValorOutrasDespesas;
  997.   ValorOutrosCreditos := ATitulo.ValorOutrosCreditos;
  998.   ValorRecebido := ATitulo.ValorRecebido;
  999.   Instrucoes.Assign(ATitulo.Instrucoes);
  1000.   EmissaoBoleto := ATitulo.EmissaoBoleto;
  1001.   ImagemEmpresa := ATitulo.ImagemEmpresa;
  1002. end;
  1003.  
  1004. function TRLBTitulo.CalcularDigitoNossoNumero : string;
  1005. var
  1006.   ACodigoBanco: string;
  1007.   AClasseBanco: TPersistentClass;
  1008.   ABanco: TPersistent;
  1009.   GetDigitoNossoNumero: function(ATitulo: TRLBTitulo): string of object;
  1010. begin
  1011.    ACodigoBanco := Formatar(Cedente.ContaBancaria.Banco.Codigo,3,false,'0');
  1012.    GetDigitoNossoNumero := nil;
  1013.    AClasseBanco := GetClass('TRLBanco'+ACodigoBanco);
  1014.    if AClasseBanco <> nil then
  1015.    begin
  1016.       ABanco := AClasseBanco.Create;
  1017.       TRY
  1018.          @GetDigitoNossoNumero := ABanco.MethodAddress('CalcularDigitoNossoNumero');
  1019.          if @GetDigitoNossoNumero <> nil then
  1020.             Result :=  GetDigitoNossoNumero(Self)
  1021.          else
  1022.             Raise Exception.CreateFmt('O cálculo do dígito do nosso número para o banco %s não está disponível',[ACodigoBanco]);
  1023.          ABanco.Free;
  1024.       EXCEPT
  1025.          ABanco.Free;
  1026.          Raise;
  1027.       END;
  1028.    end
  1029.    else
  1030.       Raise Exception.CreateFmt('Os boletos para o banco %s não estão disponíveis',[ACodigoBanco]);
  1031. end;
  1032.  
  1033. function TRLBTitulo.GerarCodigoBarra : TrlCobCodBar;
  1034. var
  1035.    ACodigoBanco,
  1036.    ACodigoMoeda,
  1037.    ADigitoCodigoBarras,
  1038.    AFatorVencimento,
  1039.    AValorDocumento,
  1040.    ACampoLivre,
  1041.    ACodigoBarras: string;
  1042.    AClasseBanco: TPersistentClass;
  1043.    ABanco: TPersistent;
  1044.    GetCampoLivreCodigoBarra: function(ATitulo: TRLBTitulo): string of object;
  1045. begin
  1046.    Result := TrlCobCodBar.Create;
  1047.    GetCampoLivreCodigoBarra := nil;
  1048.  
  1049.    {
  1050.     A primeira parte do código de barras é composta por:
  1051.     Código do banco (3 posições)
  1052.     Código da moeda = 9 (1 posição)
  1053.     Dígito do código de barras (1 posição) - Será calculado e incluído pelo componente
  1054.     Fator de vencimento (4 posições) - Obrigatório a partir de 03/07/2000
  1055.     Valor do documento (10 posições) - Sem vírgula decimal e com ZEROS à esquerda
  1056.  
  1057.     A segunda parte do código de barras é um campo livre, que varia de acordo
  1058.     com o banco
  1059.    }
  1060.  
  1061.    {Primeira parte do código de barras}
  1062.    ACodigoBanco := Formatar(Cedente.ContaBancaria.Banco.Codigo,3,false,'0');
  1063.    ACodigoMoeda := '9';
  1064.    AFatorVencimento := Formatar(CalcularFatorVencimento(DataVencimento),4,false,'0');
  1065.    AValorDocumento := FormatCurr('0000000000',ValorDocumento*100); {Formata o valor com 10 dígitos, incluindo as casas decimais, mas não mostra o ponto decimal}
  1066.  
  1067.    {Segunda parte do código de barras - Campo livre - Varia de acordo com o banco}
  1068.  
  1069.    AClasseBanco := GetClass('TRLBanco'+ACodigoBanco);
  1070.    if AClasseBanco <> nil then
  1071.    begin
  1072.       ABanco := AClasseBanco.Create;
  1073.       TRY
  1074.          @GetCampoLivreCodigoBarra := ABanco.MethodAddress('GetCampoLivreCodigoBarra');
  1075.          if @GetCampoLivreCodigoBarra <> nil then
  1076.             ACampoLivre :=  GetCampoLivreCodigoBarra(Self)
  1077.          else
  1078.             Raise Exception.CreateFmt('A geração de código de barras para títulos do banco %s não está disponível',[ACodigoBanco]);
  1079.          ABanco.Free;
  1080.       EXCEPT
  1081.          ABanco.Free;
  1082.          Raise;
  1083.       END
  1084.    end
  1085.    else
  1086.       Raise Exception.CreateFmt('Os boletos para o banco %s não estão disponíveis',[ACodigoBanco]);
  1087.  
  1088.    {Calcula o dígito e completa o código de barras}
  1089.    ACodigoBarras := ACodigoBanco + ACodigoMoeda + AFatorVencimento + AValorDocumento + ACampoLivre;
  1090.    ADigitoCodigoBarras := Modulo11(ACodigoBarras,9);
  1091.    if ADigitoCodigoBarras = '0' then
  1092.       ADigitoCodigoBarras := '1';
  1093.  
  1094.    Result.Codigo := Copy(ACodigoBarras,1,4) + ADigitoCodigoBarras + Copy(ACodigoBarras,5,length(ACodigoBarras)-4);
  1095. end;
  1096.  
  1097. procedure TRLBTitulo.PrepararBoleto(ABoleto: TLayoutBoleto);
  1098. var
  1099.   AAgenciaCodigoCedente,
  1100.   ANossoNumero,
  1101.   ACarteira,
  1102.   AEspecieDocumento,
  1103.   ACodigoBanco: string;
  1104.   AInstrucoes: TStringList;
  1105.   AClasseBanco: TPersistentClass;
  1106.   ABanco: TPersistent;
  1107.   GetFormatoBoleto: procedure(ATitulo: TRLBTitulo; var AAgenciaCodigoCedente, ANossoNumero, ACarteira, AEspecieDocumento: string) of object;
  1108. begin
  1109.   AInstrucoes := TStringList.Create;
  1110.   GetFormatoBoleto := nil;
  1111.  
  1112.   AAgenciaCodigoCedente := Cedente.ContaBancaria.CodigoAgencia + '/' + Cedente.CodigoCedente;
  1113.   ANossoNumero := NossoNumero + '-' + DigitoNossoNumero;
  1114.   ACarteira := Carteira;
  1115.   AEspecieDocumento := '';
  1116.  
  1117.   ACodigoBanco := Formatar(Cedente.ContaBancaria.Banco.Codigo,3,false,'0');
  1118.   AClasseBanco := GetClass('TRLBanco'+ACodigoBanco);
  1119.   if AClasseBanco <> nil then
  1120.   begin
  1121.     ABanco := AClasseBanco.Create;
  1122.     try
  1123.       @GetFormatoBoleto := ABanco.MethodAddress('FormatarBoleto');
  1124.       if @GetFormatoBoleto <> nil then
  1125.         GetFormatoBoleto(Self,AAgenciaCodigoCedente,ANossoNumero,ACarteira, AEspecieDocumento);
  1126.       ABanco.Free;
  1127.       except
  1128.         ABanco.Free;
  1129.         raise;
  1130.       end
  1131.   end;
  1132.   if DataProtesto <> 0 then
  1133.     AInstrucoes.Add('Protestar em ' + FormatDateTime('dd/mm/yyyy',DataProtesto));
  1134.  
  1135.   if ValorAbatimento <> 0 then
  1136.     if DataAbatimento <> 0 then
  1137.       AInstrucoes.Add('Conceder abatimento de ' + FormatCurr('R$ #,##0.00',ValorAbatimento) + ' para pagamento até ' + FormatDateTime('dd/mm/yyyy',DataAbatimento))
  1138.     else
  1139.       AInstrucoes.Add('Conceder abatimento de ' + FormatCurr('R$ #,##0.00',ValorAbatimento) + ' para pagamento até ' + FormatDateTime('dd/mm/yyyy',DataVencimento));
  1140.  
  1141.   if ValorDesconto <> 0 then
  1142.     if DataDesconto <> 0 then
  1143.       AInstrucoes.Add('Conceder desconto de ' + FormatCurr('R$ #,##0.00',ValorDesconto) + ' por dia de antecipação para pagamento até ' + FormatDateTime('dd/mm/yyyy',DataDesconto))
  1144.     else
  1145.       AInstrucoes.Add('Conceder desconto de ' + FormatCurr('R$ #,##0.00',ValorDesconto) + ' por dia de antecipação');
  1146.  
  1147.   if ValorMoraJuros <> 0 then
  1148.     if DataMoraJuros <> 0 then
  1149.       AInstrucoes.Add('Cobrar juros de ' + FormatCurr('R$ #,##0.00',ValorMoraJuros) + ' por dia de atraso para pagamento a partir de ' + FormatDateTime('dd/mm/yyyy',DataMoraJuros))
  1150.     else
  1151.       AInstrucoes.Add('Cobrar juros de ' + FormatCurr('R$ #,##0.00',ValorMoraJuros) + ' por dia de atraso');
  1152.  
  1153.   AInstrucoes.AddStrings(Instrucoes);
  1154.  
  1155.   with ABoleto do
  1156.   begin
  1157.     LayoutBoleto.PrintDialog := PrintDialog;
  1158.     LayoutBoleto.Caption := 'Cobrança - ' + Cedente.ContaBancaria.Banco.Nome + ' - Sacado: ' + Sacado.Nome;
  1159.     {Primeira via do boleto}
  1160.     ImageList.GetBitmap(Cedente.ContaBancaria.Banco.ImagemBanco,ABoleto.imgBanco1.Picture.Bitmap);
  1161.     if Cedente.ContaBancaria.Banco.Codigo = '033' then //Santander Banespa
  1162.       txtNumeroBanco1.Caption := Cedente.ContaBancaria.Banco.Codigo
  1163.     else
  1164.       txtNumeroBanco1.Caption := Cedente.ContaBancaria.Banco.Codigo + '-' + Cedente.ContaBancaria.Banco.Digito;
  1165.     txtLocalPagamento1.Caption := AnsiUpperCase(LocalPagamento);
  1166.     txtDataVencimento1.Caption := FormatDateTime('dd/mm/yyyy',DataVencimento);
  1167.     txtNomeCedente1.Caption := AnsiUpperCase(Cedente.Nome);
  1168.     txtCodigoCedente1.Caption := AAgenciaCodigoCedente;
  1169.     txtNumeroDocumento1.Caption := NumeroDocumento;
  1170.     txtDataProcessamento1.Caption := FormatDateTime('dd/mm/yyyy',DataProcessamento);
  1171.     txtNossoNumero1.Caption := ANossoNumero;
  1172.     txtEspecie1.Caption := 'R$';
  1173.     txtValorDocumento1.Caption := FormatCurr('#,##0.00',ValorDocumento);
  1174.     txtNomeSacado1.Caption := AnsiUpperCase(Sacado.Nome);
  1175.     {Segunda via do boleto}
  1176.     ImageList.GetBitmap(Cedente.ContaBancaria.Banco.ImagemBanco,imgBanco2.Picture.Bitmap);
  1177.     txtNumeroBanco2.Caption := txtNumeroBanco1.Caption;
  1178.     txtLocalPagamento2.Caption := AnsiUpperCase(LocalPagamento);
  1179.     txtDataVencimento2.Caption := FormatDateTime('dd/mm/yyyy',DataVencimento);
  1180.     txtReferencia2.Caption := Referencia;
  1181.     txtNomeCedente2.Caption := AnsiUpperCase(Cedente.Nome);
  1182.     txtCodigoCedente2.Caption := AAgenciaCodigoCedente;
  1183.     txtDataDocumento2.Caption := FormatDateTime('dd/mm/yyyy',DataDocumento);
  1184.     txtNumeroDocumento2.Caption := NumeroDocumento;
  1185.     txtEspecieDoc2.Caption := AEspecieDocumento;
  1186.     if AceiteDocumento = adSim then
  1187.       txtAceite2.Caption := 'S'
  1188.     else
  1189.     txtAceite2.Caption := 'N';
  1190.     txtDataProcessamento2.Caption := FormatDateTime('dd/mm/yyyy',DataProcessamento);
  1191.     txtNossoNumero2.Caption := ANossoNumero;
  1192.     txtUsoBanco2.Caption := '';
  1193.     txtCarteira2.Caption := ACarteira;
  1194.     txtEspecie2.Caption := 'R$';
  1195.     txtQuantidade2.Caption := '';
  1196.     txtValorMoeda2.Caption := '';
  1197.     txtValorDocumento2.Caption := FormatCurr('#,##0.00',ValorDocumento);
  1198.     txtInstrucoes2.Lines.Clear;
  1199.     txtInstrucoes2.Lines.AddStrings(AInstrucoes);
  1200.     txtDesconto2.Caption := '';
  1201.     txtMoraMulta2.Caption := '';
  1202.     txtValorCobrado2.Caption := '';
  1203.     txtNomeSacado2.Caption := AnsiUpperCase(Sacado.Nome);
  1204.     case Sacado.TipoInscricao of
  1205.  //     tiPessoaFisica  : txtCpfCnpjSacado2.Caption := 'CPF: ' + FormatarComMascara('!000\.000\.000\-00;0; ',Sacado.NumeroCPFCGC);
  1206.  //     tiPessoaJuridica: txtCpfCnpjSacado2.Caption := 'CNPJ: ' + FormatarComMascara('!00\.000\.000\/0000\-00;0; ',Sacado.NumeroCPFCGC);
  1207.       tiPessoaFisica  : txtCpfCnpjSacado2.Caption := 'CPF: ' + Sacado.NumeroCPFCGC;
  1208.       tiPessoaJuridica: txtCpfCnpjSacado2.Caption := 'CNPJ: ' + Sacado.NumeroCPFCGC;
  1209.  
  1210.       tiOutro         : txtCpfCnpjSacado2.Caption := Sacado.NumeroCPFCGC;
  1211.     end;
  1212.     txtEnderecoSacado2.Caption := AnsiUpperCase(Sacado.Endereco.Rua + ', ' + Sacado.Endereco.Numero + '   ' + Sacado.Endereco.Complemento);
  1213.     txtCidadeSacado2.Caption := AnsiUpperCase(FormatarComMascara('00000-000;0; ',Sacado.Endereco.CEP) + '    ' + Sacado.Endereco.Bairro + '    ' + Sacado.Endereco.Cidade + '    ' + Sacado.Endereco.Estado);
  1214. //    txtCidadeSacado2.Caption := AnsiUpperCase(Sacado.Endereco.CEP + '    ' + Sacado.Endereco.Bairro + '    ' + Sacado.Endereco.Cidade + '    ' + Sacado.Endereco.Estado);
  1215.     txtSacadorAvalista2.Caption := AnsiUpperCase(Sacado.SacadorAvaLista);
  1216.     txtCodigoBaixa2.Caption := ANossoNumero;
  1217.     {Terceira via do boleto}
  1218.     ImageList.GetBitmap(Cedente.ContaBancaria.Banco.ImagemBanco,imgBanco3.Picture.Bitmap);
  1219.     txtNumeroBanco3.Caption := txtNumeroBanco1.Caption;
  1220.     txtLocalPagamento3.Caption := AnsiUpperCase(LocalPagamento);
  1221.     txtDataVencimento3.Caption := FormatDateTime('dd/mm/yyyy',DataVencimento);
  1222.     txtReferencia3.Caption := Referencia;
  1223.     txtNomeCedente3.Caption := AnsiUpperCase(Cedente.Nome);
  1224.     txtCodigoCedente3.Caption := AAgenciaCodigoCedente;
  1225.     txtDataDocumento3.Caption := FormatDateTime('dd/mm/yyyy',DataDocumento);
  1226.     txtNumeroDocumento3.Caption := NumeroDocumento;
  1227.     txtEspecieDoc3.Caption := AEspecieDocumento;
  1228.     if AceiteDocumento = adSim then
  1229.       txtAceite3.Caption := 'S'
  1230.     else
  1231.       txtAceite3.Caption := 'N';
  1232.     txtDataProcessamento3.Caption := FormatDateTime('dd/mm/yyyy',DataProcessamento);
  1233.     txtNossoNumero3.Caption := ANossoNumero;
  1234.     txtUsoBanco3.Caption := '';
  1235.     txtCarteira3.Caption := ACarteira;
  1236.     txtEspecie3.Caption := 'R$';
  1237.     txtQuantidade3.Caption := '';
  1238.     txtValorMoeda3.Caption := '';
  1239.     txtValorDocumento3.Caption := FormatCurr('#,##0.00',ValorDocumento);
  1240.     txtInstrucoes3.Lines.Clear;
  1241.     txtInstrucoes3.Lines.AddStrings(AInstrucoes);
  1242.     txtDesconto3.Caption := '';
  1243.     txtMoraMulta3.Caption := '';
  1244.     txtValorCobrado3.Caption := '';
  1245.     txtNomeSacado3.Caption := AnsiUpperCase(Sacado.Nome);
  1246.     case Sacado.TipoInscricao of
  1247.  //     tiPessoaFisica  : txtCpfCnpjSacado3.Caption := 'CPF: ' + FormatarComMascara('!000\.000\.000\-00;0; ',Sacado.NumeroCPFCGC);
  1248.  //     tiPessoaJuridica: txtCpfCnpjSacado3.Caption := 'CNPJ: ' + FormatarComMascara('!00\.000\.000\/0000\-00;0; ',Sacado.NumeroCPFCGC);
  1249.       tiPessoaFisica  : txtCpfCnpjSacado3.Caption := 'CPF: ' + Sacado.NumeroCPFCGC;
  1250.       tiPessoaJuridica: txtCpfCnpjSacado3.Caption := 'CNPJ: ' + Sacado.NumeroCPFCGC;
  1251.  
  1252.       tiOutro         : txtCpfCnpjSacado3.Caption := Sacado.NumeroCPFCGC;
  1253.     end;
  1254.     txtEnderecoSacado3.Caption := AnsiUpperCase(Sacado.Endereco.Rua + ', ' + Sacado.Endereco.Numero + '   ' + Sacado.Endereco.Complemento);
  1255.     txtCidadeSacado3.Caption := AnsiUpperCase(FormatarComMascara('00000-000;0; ',Sacado.Endereco.CEP) + '    ' + Sacado.Endereco.Bairro + '    ' + Sacado.Endereco.Cidade + '    ' + Sacado.Endereco.Estado);
  1256.     txtSacadorAvalista3.Caption := AnsiUpperCase(Sacado.SacadorAvaLista);
  1257.     txtCodigoBaixa3.Caption := ANossoNumero;
  1258.     txtLinhaDigitavel.Caption := CodigoBarra.LinhaDigitavel;
  1259.     imgCodigoBarra.Picture.Assign(CodigoBarra.Imagem.Picture);
  1260.   end;
  1261.  
  1262.   AInstrucoes.Free;
  1263. end;
  1264.  
  1265. {procedure TRLBTitulo.EnviarPorEMail(Host, LoginUsuario: string; Porta : integer; Assunto : string; Mensagem : TStringList);
  1266. var
  1267.    Mail : TNMSMTP;
  1268.    NomeArquivo : string;
  1269. begin
  1270.    if Host = '' then
  1271.       Raise Exception.Create('O host não foi informado');
  1272.    if Assunto = '' then
  1273.       Raise Exception.Create('O assunto da mensagem não foi informado');
  1274.  
  1275.    Mail := TNMSMTP.Create(nil);
  1276.  
  1277.    TRY
  1278.       NomeArquivo := 'ImagemBoleto.bmp';
  1279.       ImagemBoleto.Picture.SaveToFile(NomeArquivo);
  1280.       with Mail.PostMessage do
  1281.       begin
  1282.          if Cedente.Endereco.EMail <> '' then
  1283.             FromAddress := Cedente.Endereco.EMail
  1284.          else
  1285.             Raise Exception.Create('O e-mail do cedente não foi informado');
  1286.  
  1287.          if Cedente.Nome <> '' then
  1288.             FromName := Cedente.Nome
  1289.          else
  1290.             FromName := FromAddress;
  1291.  
  1292.          ReplyTo := FromAddress;
  1293.  
  1294.          if Sacado.Endereco.EMail <> '' then
  1295.             ToAddress.Add(Sacado.Endereco.EMail)
  1296.          else
  1297.             Raise Exception.Create('O e-mail do sacado não foi informado');
  1298.  
  1299.          Subject := Assunto;
  1300.          Body.Assign(Mensagem);
  1301.          Attachments.Add(NomeArquivo);
  1302.       end;
  1303.       Mail.Host := Host;
  1304.       Mail.UserID := LoginUsuario;
  1305.       Mail.Port := Porta;
  1306.       Mail.Connect;
  1307.       Mail.SendMail;
  1308.       Mail.Disconnect;
  1309.       Mail.Free;
  1310.       if FileExists(NomeArquivo) then
  1311.          DeleteFile(NomeArquivo);
  1312.    EXCEPT
  1313.       if Mail.Connected then
  1314.          Mail.Disconnect;
  1315.       Mail.Free;
  1316.       if FileExists(NomeArquivo) then
  1317.          DeleteFile(NomeArquivo);
  1318.       Raise;
  1319.    END;
  1320. end;}
  1321.  
  1322. procedure TRLBTitulo.Visualizar;
  1323. var
  1324.   ABoleto : TLayoutBoleto;
  1325.   nI: Integer;
  1326. begin
  1327.   if nQtdeBoletos = -1 then
  1328.   begin
  1329.     ABoleto := TLayoutBoleto.Create(nil);
  1330.     try
  1331.       PrepararBoleto(ABoleto);
  1332.       ABoleto.RLBand1.Visible := Tag = 0;
  1333.       ABoleto.LayoutBoleto.PreviewModal;
  1334.       ABoleto.Free;
  1335.      except
  1336.       ABoleto.Free;
  1337.       raise;
  1338.     end;
  1339.   end
  1340.   else
  1341.   begin
  1342.     Agrupamento[0].RLBand1.Visible := Tag = 0; //quebra galho, impressao de boleto PRO 05/05/2005
  1343.     Agrupamento[0].LayoutBoleto.PreviewModal;
  1344.     for nI := 0 to nQtdeBoletos do
  1345.       Agrupamento[nI].Free;
  1346.     nQtdeBoletos := -1;
  1347.     SetLength(Agrupamento, 0);
  1348.   end;
  1349. end;
  1350.  
  1351. procedure TRLBTitulo.Preparar;
  1352. var
  1353.   nI: Integer;
  1354. begin
  1355.   try
  1356.     Inc(nQtdeBoletos);
  1357.     SetLength(Agrupamento, nQtdeBoletos+1);
  1358.     Agrupamento[nQtdeBoletos] := TLayoutBoleto.Create(nil);
  1359.     PrepararBoleto(Agrupamento[nQtdeBoletos]);
  1360.     if nQtdeBoletos > 0 then
  1361.       Agrupamento[nQtdeBoletos-1].LayoutBoleto.NextReport := Agrupamento[nQtdeBoletos].LayoutBoleto;
  1362.   except
  1363.     for nI := 0 to nQtdeBoletos do
  1364.       Agrupamento[nI].Free;
  1365.     nQtdeBoletos := -1;
  1366.     SetLength(Agrupamento, 0);
  1367.     raise;
  1368.   end;
  1369. {  Inc(nQtdeBoletos);
  1370.   SetLength(Agrupamento, nQtdeBoletos+1);
  1371.   Agrupamento[nQtdeBoletos] := TLayoutBoleto.Create(nil);
  1372.   PrepararBoleto(Agrupamento[nQtdeBoletos]);
  1373.   if nQtdeBoletos > 0 then
  1374.     Agrupamento[nQtdeBoletos-1].LayoutBoleto.NextReport := Agrupamento[nQtdeBoletos].LayoutBoleto;}
  1375. end;
  1376.  
  1377. procedure TRLBTitulo.Imprimir;
  1378. var
  1379.   ABoleto : TLayoutBoleto;
  1380. begin
  1381.   ABoleto := TLayoutBoleto.Create(nil);
  1382.   try
  1383.     PrepararBoleto(ABoleto);
  1384.     ABoleto.LayoutBoleto.Print;
  1385.     ABoleto.Free;
  1386.    except
  1387.      ABoleto.Free;
  1388.      raise;
  1389.   end;
  1390. end;
  1391.  
  1392. {$HINTS OFF}
  1393. {$WARNINGS OFF}
  1394.  
  1395. function TRLBTitulo.GetImagemBoleto : TImage;
  1396. var
  1397.   ABoleto : TLayoutBoleto;
  1398.   AImagem : TImage;
  1399. begin
  1400. //  ABoleto := TLayoutBoleto.Create(nil);
  1401.   //AImagem := TImage.Create;
  1402.   Result := TImage.Create(nil);
  1403.   try
  1404.     PrepararBoleto(ABoleto);
  1405.     ABoleto.LayoutBoleto.Prepare;
  1406. //    AImagem := ABoleto. ;
  1407. //      Result.Height := AImagem.Height;
  1408. //      Result.Width := AImagem.Width;
  1409. //      Result.Canvas.Draw(0,0,AImagem);
  1410.  
  1411. //      Result.Picture.Bitmap.Monochrome := TRUE;
  1412. //      AImagem.Free;
  1413. //      ABoleto.QRPrinter.Free;
  1414. //      ABoleto.Free;
  1415.    EXCEPT
  1416. //      AImagem.Free;
  1417. //      ABoleto.QRPrinter.Free;
  1418. //      ABoleto.Free;
  1419.       Raise;
  1420.    END;
  1421. //   ABoleto.QRPrinter := nil;
  1422. end;
  1423.  
  1424. function TRLBTitulo.GetImagemFichaCompensacao : TImage;
  1425. var
  1426.    AImagem : TImage;
  1427.    RectOrigem, RectDestino : TRect;
  1428. begin
  1429.    Result := TImage.Create(nil);
  1430.    AImagem := TImage.Create(nil);
  1431.    AImagem := ImagemBoleto;
  1432.  
  1433.    with RectOrigem do
  1434.    begin
  1435.       Left   := 35;
  1436.       Top    := 720;
  1437.       Right  := 762;
  1438.       Bottom := AImagem.Height;
  1439.    end;
  1440.  
  1441.    with RectDestino do
  1442.    begin
  1443.       Left   := 0;
  1444.       Top    := 0;
  1445.       Right  := AImagem.Width;
  1446.       Bottom := AImagem.Height - 719;
  1447.    end;
  1448.  
  1449.    Result.Height := RectDestino.Bottom;
  1450.    Result.Width  := RectDestino.Right;
  1451.  
  1452.    Result.Canvas.CopyRect(RectDestino, AImagem.Canvas, RectOrigem);
  1453. end;
  1454.  
  1455. {$IFNDEF VER120}
  1456.  
  1457. {TRLTituloList}
  1458.  
  1459. constructor TRLTituloList.Create;
  1460. begin
  1461.   {$IFDEF VER150}
  1462.      inherited Create(true);
  1463.   {$ELSE}
  1464.    {$IFDEF VER140}
  1465.       inherited Create(true);
  1466.    {$ELSE}
  1467.       {$IFDEF VER130}
  1468.          inherited Create(true);
  1469.       {$ELSE}
  1470.          inherited Create;
  1471.       {$ENDIF}
  1472.    {$ENDIF}
  1473.   {$ENDIF}
  1474. end;
  1475.  
  1476. function TRLTituloList.FindInstanceOf(AClass: TClass; AExact: Boolean;
  1477.   AStartAt: Integer): Integer;
  1478. var
  1479.   I: Integer;
  1480. begin
  1481.   Result := -1;
  1482.   for I := AStartAt to Count - 1 do
  1483.     if (AExact and
  1484.         (Items[I].ClassType = AClass)) or
  1485.        (not AExact and
  1486.         Items[I].InheritsFrom(AClass)) then
  1487.     begin
  1488.       Result := I;
  1489.       break;
  1490.     end;
  1491. end;
  1492.  
  1493. function TRLTituloList.GetItem(Index: Integer): TRLBTitulo;
  1494. begin
  1495.    Result := inherited Items[Index] as TRLBTitulo;
  1496. end;
  1497.  
  1498. function TRLTituloList.Add(ATitulo : TRLBTitulo) : integer;
  1499. var
  1500.    NovoTitulo : TRLBTitulo;
  1501. begin
  1502.    NovoTitulo := TRLBTitulo.Create(nil);
  1503.    NovoTitulo.Assign(ATitulo);
  1504.    Result := inherited Add(NovoTitulo);
  1505. end;
  1506.  
  1507. function TRLTituloList.IndexOf(ATitulo : TRLBTitulo): Integer;
  1508. begin
  1509.   Result := inherited IndexOf(ATitulo);
  1510. end;
  1511.  
  1512. procedure TRLTituloList.Insert(Index: Integer; ATitulo: TRLBTitulo);
  1513. begin
  1514.   inherited Insert(Index, ATitulo);
  1515. end;
  1516.  
  1517. function TRLTituloList.Remove(ATitulo: TRLBTitulo): Integer;
  1518. begin
  1519.   Result := inherited Remove(ATitulo);
  1520. end;
  1521.  
  1522. procedure TRLTituloList.SetItem(Index: Integer; ATitulo: TRLBTitulo);
  1523. begin
  1524.   inherited Items[Index] := ATitulo;
  1525. end;
  1526.  
  1527. {TRLBRemessa}
  1528.  
  1529. constructor TRLBRemessa.Create(AOwner: TComponent);
  1530. begin
  1531.    inherited Create(AOwner);
  1532.    LayoutArquivo := laCNAB400;
  1533.    TipoMovimento := tmRetorno;
  1534.    Titulos := TRLTituloList.Create;
  1535. end;
  1536.  
  1537. destructor TRLBRemessa.Destroy;
  1538. begin
  1539.    Titulos.Destroy;
  1540.    inherited Destroy;
  1541. end;
  1542.  
  1543. function TRLBRemessa.GerarRemessa : boolean;
  1544. var
  1545.    Remessa: TStringList;
  1546.    ACodigoBanco: string;
  1547.    AClasseBanco: TPersistentClass;
  1548.    ABanco: TPersistent;
  1549.    GetRemessa: function(var ACobranca: TRLBRemessa; var Remessa: TStringList): boolean of object;
  1550. begin
  1551.    Result := FALSE;
  1552.    GetRemessa := nil;
  1553.  
  1554.    if Titulos.Count <= 0 then
  1555.       Raise Exception.Create('Não há títulos para gerar arquivo remessa. A coleção de títulos está vazia');
  1556.  
  1557.    Remessa := TStringList.Create;
  1558.    TRY
  1559.  
  1560.       if (TipoMovimento <> tmRemessa) and (TipoMovimento <> tmRemessaTeste) then
  1561.          TipoMovimento := tmRemessa;
  1562.  
  1563.       ACodigoBanco := Formatar(Titulos[0].Cedente.ContaBancaria.Banco.Codigo,3,false,'0');
  1564.       AClasseBanco := GetClass('TRLBanco'+ACodigoBanco);
  1565.       if AClasseBanco <> nil then
  1566.       begin
  1567.          ABanco := AClasseBanco.Create;
  1568.          TRY
  1569.             @GetRemessa := ABanco.MethodAddress('GerarRemessa');
  1570.             if @GetRemessa <> nil then
  1571.             begin
  1572.                Result := GetRemessa(Self, Remessa);
  1573.                if Result then
  1574.                 begin
  1575.                   Remessa.SaveToFile(NomeArquivo); {Grava o arquivo remessa}
  1576.                 end;
  1577.             end
  1578.             else
  1579.                Raise Exception.CreateFmt('A geração de arquivo remessa para o banco %s não está disponível',[ACodigoBanco]);
  1580.             ABanco.Free;
  1581.          EXCEPT
  1582.             ABanco.Free;
  1583.             Raise;
  1584.          END
  1585.       end
  1586.       else
  1587.          Raise Exception.CreateFmt('Processamento de arquivos remessa / retorno para o banco %s não está disponível',[ACodigoBanco]);
  1588.  
  1589.       Remessa.Free;
  1590.  
  1591.    EXCEPT
  1592.       Remessa.Free;
  1593.       Raise;
  1594.    END;
  1595. end;
  1596.  
  1597.  
  1598. function TRLBRemessa.LerRetorno : boolean;
  1599. var
  1600.    ACodigoBanco: string;
  1601.    Retorno : TStringList;
  1602.    AClasseBanco: TPersistentClass;
  1603.    ABanco: TPersistent;
  1604.    GetRetorno: function(var ACobranca: TRLBRemessa; Retorno: TStringList): boolean of object;
  1605. begin
  1606.    Result := FALSE;
  1607.    GetRetorno := nil;
  1608.    Retorno := TStringList.Create;
  1609.    Self.Titulos.Clear; {Zera o conjunto de títulos, antes de incluir os títulos do arquivo retorno}
  1610.  
  1611.    TRY
  1612.       if not FileExists(NomeArquivo) then
  1613.          Raise Exception.CreateFmt('O arquivo %s não foi localizado',[NomeArquivo]);
  1614.  
  1615.       Retorno.LoadFromFile(NomeArquivo);
  1616.  
  1617.       if Retorno.Count < 3 then
  1618.       begin
  1619.          Result := FALSE;
  1620.          Exit;
  1621.       end;
  1622.  
  1623.       case length(Retorno[0]) of
  1624.          240 :
  1625.             begin
  1626.                LayoutArquivo := laCNAB240;
  1627.                {Ver se o arquivo é mesmo RETORNO DE COBRANÇA}
  1628.                if Copy(Retorno.Strings[0],143,1) <> '2' then
  1629.                   Raise Exception.Create(NomeArquivo+' não é um arquivo de retorno de cobrança com layout CNAB240');
  1630.                ACodigoBanco := Copy(Retorno.Strings[0],1,3);
  1631.             end;
  1632.  
  1633.          400 :
  1634.             begin
  1635.                LayoutArquivo := laCNAB400;
  1636.                {Ver se o arquivo é mesmo RETORNO DE COBRANÇA}
  1637.                if Copy(Retorno.Strings[0],1,19) <> '02RETORNO01COBRANCA' then
  1638.                   Raise Exception.Create(NomeArquivo+' não é um arquivo de retorno de cobrança com layout CNAB400');
  1639.                ACodigoBanco := Copy(Retorno.Strings[0],77,3);
  1640.             end;
  1641.          else
  1642.          begin
  1643.             LayoutArquivo := laOutro;
  1644.             Raise Exception.Create(NomeArquivo+' não é um arquivo de retorno de cobrança com layout CNAB240 ou CNAB400');
  1645.          end;
  1646.       end;
  1647.  
  1648.       TipoMovimento := tmRetorno;
  1649.  
  1650.       AClasseBanco := GetClass('TRLBanco'+ACodigoBanco);
  1651.       if AClasseBanco <> nil then
  1652.       begin
  1653.          ABanco := AClasseBanco.Create;
  1654.          TRY
  1655.             @GetRetorno := ABanco.MethodAddress('LerRetorno');
  1656.             if @GetRetorno <> nil then
  1657.                Result := GetRetorno(Self, Retorno)
  1658.             else
  1659.                Raise Exception.CreateFmt('O processamento de arquivo retorno do banco %s não está disponível',[ACodigoBanco]);
  1660.             ABanco.Free;
  1661.          EXCEPT
  1662.             ABanco.Free;
  1663.             Raise;
  1664.          END
  1665.       end
  1666.       else
  1667.          Raise Exception.CreateFmt('Processamento de arquivos remessa / retorno para o banco %s não está disponível',[ACodigoBanco]);
  1668.  
  1669.       Retorno.Free;
  1670.       Result := TRUE;
  1671.    EXCEPT
  1672.       Retorno.Free;
  1673.       Raise;
  1674.    END;
  1675. end;
  1676.  
  1677.  
  1678. function TRLBRemessa.GerarRelatorio : TStringList;
  1679. var
  1680.    i : integer;
  1681. begin
  1682.    Result := TStringList.Create;
  1683.  
  1684.    with Result do
  1685.    begin
  1686.       Add(StringOfChar('=',80));
  1687.       Add('');
  1688.       Add('Nome do arquivo  : ' + NomeArquivo);
  1689.       Add('Número do arquivo: ' + IntToStr(NumeroArquivo));
  1690.       Add('Data do arquivo  : ' + DateTimeToStr(DataArquivo));
  1691.  
  1692.       case LayoutArquivo of
  1693.          laCNAB240 : Add('Layout do arquivo: CNAB240');
  1694.          laCNAB400 : Add('Layout do arquivo: CNAB400');
  1695.       else
  1696.          Add('Layout do arquivo: Outro');
  1697.       end; {case LayoutArquivo}
  1698.  
  1699.       case TipoMovimento of
  1700.          tmRemessa      : Add('Tipo de movimento: Remessa');
  1701.          tmRetorno      : Add('Tipo de movimento: Retorno');
  1702.          tmRemessaTeste : Add('Tipo de movimento: Remessa - Teste');
  1703.          tmRetornoTeste : Add('Tipo de movimento: Retorno - Teste');
  1704.       else
  1705.          Add('Tipo de movimento: Outro');
  1706.       end; {case TipoMovimento}
  1707.  
  1708.       Add('');
  1709.       Add(StringOfChar('=',80));
  1710.  
  1711.       for i := 0 to (Titulos.Count - 1) do
  1712.       begin
  1713.          with Titulos[i] do
  1714.          begin
  1715.             Add('');
  1716.             case TipoOcorrencia of
  1717.                {Ocorrências para arquivo remessa}
  1718.                toRemessaRegistrar : Add('Tipo ocorrência  : Registrar o título no banco');
  1719.                toRemessaBaixar : Add('Tipo ocorrência  : Baixar o título no banco');
  1720.                toRemessaDebitarEmConta : Add('Tipo ocorrência  : Debitar em conta');
  1721.                toRemessaConcederAbatimento : Add('Tipo ocorrência  : Conceder abatimento');
  1722.                toRemessaCancelarAbatimento : Add('Tipo ocorrência  : Cancelar abatimento');
  1723.                toRemessaConcederDesconto : Add('Tipo ocorrência  : Conceder desconto');
  1724.                toRemessaCancelarDesconto : Add('Tipo ocorrência  : Cancelar desconto');
  1725.                toRemessaAlterarVencimento : Add('Tipo ocorrência  : Alterar vencimento');
  1726.                toRemessaProtestar : Add('Tipo ocorrência  : Protestar o título');
  1727.                toRemessaCancelarInstrucaoProtesto : Add('Tipo ocorrência  : Cancelar instrução de protesto');
  1728.                toRemessaDispensarJuros : Add('Tipo ocorrência  : Dispensar juros');
  1729.                toRemessaAlterarNomeEnderecoSacado : Add('Tipo ocorrência  : Alterar nome e endereço do sacado');
  1730.                toRemessaOutrasOcorrencias : Add('Tipo ocorrência  : Outras ocorrências de remessa');
  1731.  
  1732.                {Ocorrências para arquivo retorno}
  1733.                toRetornoRegistroConfirmado : Add('Tipo ocorrência  : Registro do título foi confirmado');
  1734.                toRetornoRegistroRecusado : Add('Tipo ocorrência  : Registro do título foi recusado');
  1735.                toRetornoComandoRecusado : Add('Tipo ocorrência  : Comando recusado');
  1736.                toRetornoLiquidado : Add('Tipo ocorrência  : O título foi liquidado');
  1737.                toRetornoBaixado : Add('Tipo ocorrência  : O título foi baixado');
  1738.                toRetornoRecebimentoInstrucaoBaixar : Add('Tipo ocorrência  : Recebimento de instrução para baixar título');
  1739.                toRetornoBaixaOuLiquidacaoEstornada : Add('Tipo ocorrência  : Baixa / liquidação estornada');
  1740.                toRetornoTituloEmSer : Add('Tipo ocorrência  : Título em ser');
  1741.                toRetornoRecebimentoInstrucaoConcederAbatimento : Add('Tipo ocorrência  : Recebimento de instrução para conceder abatimento');
  1742.                toRetornoAbatimentoConcedido : Add('Tipo ocorrência  : Abatimento concedido');
  1743.                toRetornoRecebimentoInstrucaoCancelarAbatimento : Add('Tipo ocorrência  : Recebimento de instrução para cancelar abatimento');
  1744.                toRetornoAbatimentoCancelado : Add('Tipo ocorrência  : Abatimento cancelado');
  1745.                toRetornoRecebimentoInstrucaoConcederDesconto : Add('Tipo ocorrência  : Recebimento de instrução para conceder desconto');
  1746.                toRetornoDescontoConcedido : Add('Tipo ocorrência  : Desconto concedido');
  1747.                toRetornoRecebimentoInstrucaoCancelarDesconto : Add('Tipo ocorrência  : Recebimento de instrução para cancelar desconto');
  1748.                toRetornoDescontoCancelado : Add('Tipo ocorrência  : Desconto cancelado');
  1749.                toRetornoRecebimentoInstrucaoAlterarDados : Add('Tipo ocorrência  : Recebimento de instrução para alterar dados');
  1750.                toRetornoDadosAlterados : Add('Tipo ocorrência  : Dados alterados');
  1751.                toRetornoRecebimentoInstrucaoAlterarVencimento : Add('Tipo ocorrência  : Recebimento de instrução para alterar vencimento');
  1752.                toRetornoVencimentoAlterado : Add('Tipo ocorrência  : Vencimento alterado');
  1753.                toRetornoRecebimentoInstrucaoProtestar : Add('Tipo ocorrência  : Recebimento de instrução para protestar título');
  1754.                toRetornoProtestado : Add('Tipo ocorrência  : Título protestado');
  1755.                toRetornoRecebimentoInstrucaoSustarProtesto : Add('Tipo ocorrência  : Recebimento de instrução para sustar protesto');
  1756.                toRetornoProtestoSustado : Add('Tipo ocorrência  : Protesto sustado');
  1757.                toRetornoDebitoEmConta : Add('Tipo ocorrência  : Debitado em conta');
  1758.                toRetornoRecebimentoInstrucaoAlterarNomeSacado : Add('Tipo ocorrência  : Recebimento de instrução para alterar nome do sacado');
  1759.                toRetornoNomeSacadoAlterado : Add('Tipo ocorrência  : Nome do sacado alterado');
  1760.                toRetornoRecebimentoInstrucaoAlterarEnderecoSacado : Add('Tipo ocorrência  : Recebimento instrução para alterar endereço do sacado');
  1761.                toRetornoEnderecoSacadoAlterado : Add('Tipo ocorrência  : Endereço do sacado alterado');
  1762.                toRetornoEncaminhadoACartorio : Add('Tipo ocorrência  : Título encaminhado para cartório');
  1763.                toRetornoRetiradoDeCartorio : Add('Tipo ocorrência  : Título retirado do cartório');
  1764.                toRetornoRecebimentoInstrucaoDispensarJuros : Add('Tipo ocorrência  : Recebimento de instrucão para dispensar juros');
  1765.                toRetornoJurosDispensados : Add('Tipo ocorrência  : Juros dispensados');
  1766.                toRetornoManutencaoTituloVencido : Add('Tipo ocorrência  : Manutenção de título vencido');
  1767.                toRetornoRecebimentoInstrucaoAlterarTipoCobranca : Add('Tipo ocorrência  : Recebimento de instrução para alterar tipo de cobrança');
  1768.                toRetornoTipoCobrancaAlterado : Add('Tipo ocorrência  : Tipo de cobrança alterado');
  1769.                toRetornoDespesasProtesto : Add('Tipo ocorrência  : Despesas com protesto');
  1770.                toRetornoDespesasSustacaoProtesto : Add('Tipo ocorrência  : Despesas com sustação de protesto');
  1771.                toRetornoProtestoOuSustacaoEstornado : Add('Tipo ocorrência  : Protesto ou sustação estornado');
  1772.                toRetornoDebitoTarifas : Add('Tipo ocorrência  : Débito de tarifas');
  1773.                toRetornoOutrasOcorrencias : Add('Tipo ocorrência  : Outra ocorrência de retorno');
  1774.             else
  1775.                Add('Tipo ocorrência  : Outra ocorrência não identificada');
  1776.             end; {case TipoOcorrencia}
  1777.  
  1778.             if trim(MotivoRejeicaoComando) <> '' then
  1779.                Add('Motivo rejeição  : ' + MotivoRejeicaoComando);
  1780.             if trim(SeuNumero) <> '' then
  1781.                Add('Seu número       : ' + SeuNumero);
  1782.             if trim(NossoNumero) <> '' then
  1783.                Add('Nosso número     : ' + NossoNumero + '-' + DigitoNossoNumero);
  1784.             if trim(Carteira) <> '' then
  1785.                Add('Carteira         : ' + Carteira);
  1786.             if trim(NumeroDocumento) <> '' then
  1787.                Add('Número documento : ' + NumeroDocumento);
  1788.             if DataDocumento <> 0 then
  1789.                Add('Data documento   : ' + DateToStr(DataDocumento));
  1790.             if DataVencimento <> 0 then
  1791.                Add('Data vencimento  : ' + DateToStr(DataVencimento));
  1792.             if DataOcorrencia <> 0 then
  1793.                Add('Data ocorrência  : ' + DateToStr(DataOcorrencia));
  1794.             if DataCredito <> 0 then
  1795.                Add('Data crédito     : ' + DateToStr(DataCredito));
  1796.             Add('Valor documento  : ' + FormatCurr('#,##0.00',ValorDocumento));
  1797.             if ValorDespesaCobranca > 0 then
  1798.                Add('Despesa cobrança : ' + FormatCurr('#,##0.00',ValorDespesaCobranca));
  1799.             if DataAbatimento <> 0 then
  1800.                Add('Abatimento até   : ' + DateToStr(DataAbatimento));
  1801.             if ValorAbatimento > 0 then
  1802.                Add('Valor abatimento : ' + FormatCurr('#,##0.00',ValorAbatimento));
  1803.             if ValorDesconto > 0 then
  1804.                if DataDesconto <> 0 then
  1805.                begin
  1806.                   Add('Desconto até     : ' + DateToStr(DataDesconto));
  1807.                   Add('Vr. desconto/dia : ' + FormatCurr('#,##0.00',ValorDesconto));
  1808.                end
  1809.                else
  1810.                   Add('Valor desconto   : ' + FormatCurr('#,##0.00',ValorDesconto));
  1811.             if ValorMoraJuros > 0 then
  1812.                if DataMoraJuros <> 0 then
  1813.                begin
  1814.                   Add('Juros a partir de: ' + DateToStr(DataMoraJuros));
  1815.                   Add('Valor juros/dia  : ' + FormatCurr('#,##0.00',ValorMoraJuros));
  1816.                end
  1817.                else
  1818.                   Add('Valor mora/juros : ' + FormatCurr('#,##0.00',ValorMoraJuros));
  1819.             if ValorOutrosCreditos > 0 then
  1820.                Add('Outros acréscimos: ' + FormatCurr('#,##0.00',ValorOutrosCreditos));
  1821.             if ValorIOF > 0 then
  1822.                Add('Valor IOF        : ' + FormatCurr('#,##0.00',ValorIOF));
  1823.             if (DataCredito <> 0) then
  1824.                Add('Valor do crédito : ' + FormatCurr('#,##0.00',ValorDocumento-ValorDespesaCobranca-ValorAbatimento-ValorDesconto+ValorMoraJuros+ValorOutrosCreditos-ValorOutrasDespesas));
  1825.             if DataProtesto <> 0 then
  1826.                Add('Protestar em     : ' + DateToStr(DataProtesto));
  1827.             if DataBaixa <> 0 then
  1828.                Add('Baixar em        : ' + DateToStr(DataBaixa));
  1829.  
  1830.  
  1831.             with Cedente do
  1832.             begin
  1833.                Add('CEDENTE');
  1834.                case TipoInscricao of
  1835.                   tiPessoaFisica  : Add(' Nome / CPF      : ' + Nome + ' / ' + FormatarComMascara('!###\.###\.###\.###\-##;0; ',NumeroCPFCGC));
  1836.                   tiPessoaJuridica: Add(' Nome / CNPJ     : ' + Nome + ' / ' + FormatarComMascara('!##\.###\.###\/####\-##;0; ',NumeroCPFCGC));
  1837.                   tiOutro         : Add(' Nome / Inscrição: ' + Nome + ' / ' + NumeroCPFCGC);
  1838.                end;
  1839.  
  1840.                with Endereco do
  1841.                   if Trim(Rua + Numero + Complemento + Bairro + Cidade + Estado + CEP) <> '' then
  1842.                      Add(' Endereço        : ' + Rua + ' ' + Numero + ' ' + Complemento + ' - ' + Bairro + ' - ' + Cidade + ' - ' + Estado + ' - ' + FormatMaskText('#####\-##;0; ',CEP));
  1843.  
  1844.                with ContaBancaria do
  1845.                   if trim(Banco.Codigo) <> '' then
  1846.                      Add(' Banco/Ag./Conta : ' + Banco.Codigo + '-' + Banco.Digito + ' - ' + Banco.Nome  + ' / ' + Trim(CodigoAgencia) + ' / ' + Trim(NumeroConta) + '-' + Trim(DigitoConta));
  1847.  
  1848.                if Trim(CodigoCedente + DigitoCodigoCedente) <> '' then
  1849.                   Add(' Código cedente  : ' + Trim(CodigoCedente) + '-' + Trim(DigitoCodigoCedente));
  1850.             end; {with Cedente}
  1851.  
  1852.             with Sacado do
  1853.             begin
  1854.                Add('SACADO');
  1855.                case TipoInscricao of
  1856.                   tiPessoaFisica  : Add(' Nome / CPF      : ' + Nome + ' / ' + FormatMaskText('!###\.###\.###\.###\-##;0; ',NumeroCPFCGC));
  1857.                   tiPessoaJuridica: Add(' Nome / CNPJ     : ' + Nome + ' / ' + FormatMaskText('!##\.###\.###\/####\-##;0; ',NumeroCPFCGC));
  1858.                   tiOutro         : Add(' Nome / Inscrição: ' + Nome + ' / ' + NumeroCPFCGC);
  1859.                end;
  1860.  
  1861.                with Endereco do
  1862.                   if Trim(Rua + Numero + Complemento + Bairro + Cidade + Estado + CEP) <> '' then
  1863.                      Add(' Endereço        : ' + Rua + ' ' + Numero + ' ' + Complemento + ' - ' + Bairro + ' - ' + Cidade + ' - ' + Estado + ' - ' + FormatMaskText('#####\-##;0; ',CEP));
  1864.  
  1865.                with ContaBancaria do
  1866.                   if trim(Banco.Codigo) <> '' then
  1867.                      Add(' Banco/Ag./Conta : ' + Banco.Codigo + '-' + Banco.Digito + ' - ' + Banco.Nome  + ' / ' + Trim(CodigoAgencia) + ' / ' + Trim(NumeroConta) + '-' + Trim(DigitoConta));
  1868.             end; {with Sacado}
  1869.  
  1870.             if Trim(Instrucoes.Text) <> '' then
  1871.             begin
  1872.                Add('<INSTRUÇÕES>     :');
  1873.                Add(Instrucoes.Text);
  1874.             end;
  1875.          end; {with Titulos[i]}
  1876.  
  1877.          Add('');
  1878.          Add(StringOfChar('-',80));
  1879.       end; {for I := 0 to (Count - 1)}
  1880.    end;
  1881. end;
  1882.  
  1883. {$ENDIF}
  1884.  
  1885. {$HINTS ON}
  1886. {$WARNINGS ON}
  1887.  
  1888. initialization
  1889. {$I rlboleto.lrs}
  1890.  
  1891. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement