unit CVBNorma32CSB; interface uses Messages, SysUtils, Classes, Dialogs, CVBUtils; type TProcedimiento = (prPrimero, prSegundo); TCVBParte = (CABECERA_GENERAL, CABECERA_REMESA, REGISTRO1, REGISTRO2, REGISTRO3, FIN_REMESA, FIN_GENERAL); TCVBNorma32CSB = class(TComponent) private pReg: array[0..152] of char; // Un digito más por el /0 _LL_: integer; // Longitud Línea. Aquí almacenamos el valor 164 para usarlo // en el resto del componente. _INDICA_: string; _CERO_, _SPCE_: char; _MSK_PT_, _MSK_EU_: string; prProced: TProcedimiento; HayError: boolean; FEuro: boolean; FDepura: boolean; NFic: file; fSumaImpRecibos: double; // Suma de los recibos dentro de una remesa fSumaImpRemesas: double; // Suma de las remesas dentro del fichero iNumRecibos: integer; // Nº de recibos dentro de una remesa iNumRemesas: integer; // Nº de remesas dentro del fichero iTotalLineas: integer; // Nº de líneas en el fichero iTotalRecibos : integer; // Nº de recibos dentro de un fichero FEnCasoError: TNotifyEvent; sReg: string; _19_, _58_, _32_: integer; protected procedure ChequearDatos(Parte: TCVBParte); overload; procedure Error(iErr: integer); dynamic; procedure CompRegistro1; procedure CompRegistro2; procedure CompRegistro3; public _NORMA_: integer; NrError: integer; CRLF: string; FNomFic: string; // Nombre del archivo en disco // CABECERA FICHERO FechaFichero: TDateTime; EntReceptora: string; //4 SucReceptora: string; //4 // CABECERA REMESA NumRemesa: string; //4 IdCedente: string; //15 AboEnt: string; //4 AboOfi: string; //4 AboDC: string; //2 AboCC: string; //10 AdeEnt: string; //4 AdeOfi: string; //4 AdeDC: string; //2 AdeCC: string; //10 ImpEnt: string; //4 ImpSuc: string; //4 ImpDC: string; //2 ImpCC: string; //10 // REGISTRO REMESA // (I) RegNumRecibo: string; // 7 RegCodigoINE: string; // 9 RegPlazaLibr: string; // 20 RegImpEfecto: double; // 9 RegVtoEfecto: TDateTime; // 6 // (II) RegCodEnt: string; // 4 RegCodOfi: string; // 4 RegDC: string; // 2 RegCC: string; // 10 RegLibrador: string; // 34 RegLibrado: string; // 34 RegInfoAdic: string; // 30 // (III) RegDomicilio: string; // 34 RegCodPostal: string; // 5 RegPoblacion: string; // 20 RegNIF: string; // 9 constructor Create(AOwner: TComponent); override; procedure Abrir; procedure Cerrar; procedure IniCabeceraFichero; procedure IniCabeceraRemesa; procedure IniRegistro; procedure CompCabeceraFichero; procedure CompCabeceraRemesa; procedure CompRegistro; procedure CompFinRemesa; published property NomFichero: string read FNomFic write FNomFic; property Procedimiento: TProcedimiento read prProced write prProced default prPrimero; property Euros: boolean read FEuro write FEuro default False; property Depura: boolean read FDepura write FDepura default False; property EnCasoError: TNotifyEvent read FEnCasoError write FEnCasoError; end; implementation constructor TCVBNorma32CSB.Create(AOwner: TComponent); begin inherited Create(AOwner); {Asignar la propiedades por defecto} _32_ := 32; _19_ := 19; _58_ := 58; _LL_ := high(pReg); _INDICA_ := '<--'; _CERO_ := '0'; _SPCE_ := ' '; _MSK_PT_ := '0000000000'; _MSK_EU_ := '00000000.00'; end; //******************************************************************************* procedure TCVBNorma32CSB.Abrir; begin HayError := False; AssignFile(NFic, FNomFic); {$I+} rewrite(Nfic, _LL_); {$I-} if IOResult <> 0 then error(0); fSumaImpRecibos := 0.0; fSumaImpRemesas := 0.0; iNumRecibos := 0; iNumRemesas := 0; iTotalLineas := 0; iTotalRecibos := 0; IniCabeceraFichero; IniCabeceraRemesa; IniRegistro; if CRLF = '' then CRLF := #13 + #10; end; procedure TCVBNorma32CSB.IniCabeceraFichero; begin FechaFichero := 0; EntReceptora := ''; SucReceptora := ''; end; procedure TCVBNorma32CSB.IniCabeceraRemesa; begin NumRemesa := '0001'; // <-------------------------------------------- AboEnt := ''; AboOfi := ''; AboDC := ''; AboCC := ''; AdeEnt := ''; AdeOfi := ''; AdeDC := ''; AdeCC := ''; ImpEnt := ''; ImpSuc := ''; ImpDC := ''; ImpCC := ''; end; procedure TCVBNorma32CSB.IniRegistro; begin // (I) RegNumRecibo := ''; RegCodigoINE := ''; RegPlazaLibr := ''; RegImpEfecto := 0.0; RegVtoEfecto := 0; // (II) RegCodEnt := ''; RegCodOfi := ''; RegDC := ''; RegCC := ''; RegLibrador := ''; RegLibrado := ''; RegInfoAdic := ''; // (III) RegDomicilio := ''; RegCodPostal := ''; RegPoblacion := ''; RegNIF := ''; end; procedure TCVBNorma32CSB.CompCabeceraFichero; begin HayError := False; sReg := ''; ChequearDatos(CABECERA_GENERAL); // A sReg := '02' + '65'; sReg := sReg + Ajusta('', 'I', 2, _SPCE_); //2 // B sReg := sReg + Ajusta(FormatDateTime('ddmmyy', FechaFichero), 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta('1', 'I', 4, _CERO_); //4 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 // C sReg := sReg + Ajusta('', 'I', 15, _SPCE_); //15 sReg := sReg + Ajusta('', 'I', 4, _SPCE_); //4 sReg := sReg + Ajusta('', 'I', 4, _SPCE_); //4 sReg := sReg + Ajusta(EntReceptora, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta(SucReceptora, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 // D sReg := sReg + Ajusta('', 'I', 61, _SPCE_); //61 // E sReg := sReg + Ajusta('', 'I', 24, _SPCE_); //24 sReg := sReg + CRLF; //2 if not (length(sReg) = _LL_) then Error(_LL_); StrPCopy(@pReg, sReg); Blockwrite(NFic, pReg, 1); Inc(iTotalLineas); end; procedure TCVBNorma32CSB.CompCabeceraRemesa; begin HayError := False; sReg := ''; ChequearDatos(CABECERA_REMESA); Inc(iNumRemesas); // A sReg := '11' + '65'; sReg := sReg + Ajusta('', 'I', 2, _SPCE_); //2 // B sReg := sReg + Ajusta(FormatDateTime('ddmmyy', FechaFichero), 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta(IntToStr(iNumRemesas), 'I', 4, _CERO_); //4 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 // C sReg := sReg + Ajusta(IdCedente, 'D', 15, _SPCE_); //15 sReg := sReg + '1'; sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta('', 'I', 5, _SPCE_); //5 sReg := sReg + Ajusta('', 'I', 4, _SPCE_); //4 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 // D sReg := sReg + Ajusta(AboEnt, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta(AboOfi, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta(AboDC, 'I', 2, _CERO_); //2 sReg := sReg + Ajusta(AboCC, 'I', 10, _CERO_); //10 sReg := sReg + Ajusta(AdeEnt, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta(AdeOfi, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta(AdeDC, 'I', 2, _CERO_); //2 sReg := sReg + Ajusta(AdeCC, 'I', 10, _CERO_); //10 sReg := sReg + Ajusta(ImpEnt, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta(ImpSuc, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta(ImpDC, 'I', 2, _CERO_); //2 sReg := sReg + Ajusta(ImpCC, 'I', 10, _CERO_); //10 sReg := sReg + Ajusta('', 'I', 1, _SPCE_); //1 // E sReg := sReg + Ajusta('', 'I', 24, _SPCE_); //24 sReg := sReg + CRLF; //2 if not (length(sReg) = _LL_) then Error(_LL_); StrPCopy(@pReg, sReg); Blockwrite(NFic, pReg, 1); Inc(iTotalLineas); end; procedure TCVBNorma32CSB.CompFinRemesa; var sTotImp, cIT : string; iP : integer; begin HayError := False; sReg := ''; ChequearDatos(FIN_REMESA); // A sReg := '71' + '65'; sReg := sReg + Ajusta('', 'I', 2, _SPCE_); //2 // B sReg := sReg + Ajusta(FormatDateTime('ddmmyy', FechaFichero), 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta(NumRemesa, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 // C sReg := sReg + Ajusta('', 'I', 37, _SPCE_); //37 // D sReg := sReg + Ajusta('', 'I', 10, _SPCE_); //10 sTotImp := FormatFloat(_MSK_EU_, fSumaImpRecibos); iP := pos(',', sTotImp); if iP < 1 then iP := pos('.', sTotImp); cIT := copy(sTotImp, 1, iP - 1); sTotImp := cIT + copy(sTotImp, iP + 1, 2); sReg := sReg + Ajusta(sTotImp, 'I', 10, _CERO_); // 10 sReg := sReg + Ajusta('', 'I', 10, _SPCE_); //10 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta('', 'I', 7, _SPCE_); //7 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 // E sReg := sReg + Ajusta('', 'I', 5, _SPCE_); //5 { Nº de registros de la remesa incluidos la cabecera y éste mismo: Num.registros = 1 (cabecera) + (3 registros * Num.recibos) + 1 (este pie) } sReg := sReg + Ajusta(IntToStr(1 + (3*iNumRecibos) + 1), 'I', 7, _CERO_); //7 sReg := sReg + Ajusta(IntToStr(iNumRecibos), 'I', 6, _CERO_); //6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); //6 sReg := sReg + CRLF; //2 if not (length(sReg) = _LL_) then Error(_LL_); StrPCopy(@pReg, sReg); Blockwrite(NFic, pReg, 1); Inc(iTotalLineas); // Acumular la suma de los importes de las remesas en el fichero fSumaImpRemesas := fSumaImpRemesas + fSumaImpRecibos; // Poner a cero la suma de los recibos y el número de recibos fSumaImpRecibos := 0.0; iNumRecibos := 0; end; procedure TCVBNorma32CSB.CompRegistro; begin CompRegistro1; CompRegistro2; CompRegistro3; // Acumular la suma de los recibos en la remesa fSumaImpRecibos := fSumaImpRecibos + RegImpEfecto; // Acumular el nº de recibos en la remesa Inc(iNumRecibos); Inc(iTotalRecibos); end; procedure TCVBNorma32CSB.CompRegistro1; var sTotImp, cIT : string; iP: integer; begin HayError := False; sReg := ''; ChequearDatos(REGISTRO1); // A sReg := '25' + '65'; sReg := sReg + Ajusta('', 'I', 2, _SPCE_); // 2 // B // Convertir referencia EL/0001 - 1 => EL00001-1 RegNumRecibo := StringReplace(RegNumRecibo, '/', '0', []); RegNumRecibo := StringReplace(RegNumRecibo, ' - ', '-', []); sReg := sReg + Ajusta(RegNumRecibo, 'D', 15, _SPCE_); // 15 sReg := sReg + Ajusta(FormatDateTime('ddmmyy', FechaFichero), 'I', 6, _SPCE_); // 6 sReg := sReg + Ajusta(NumRemesa, 'I', 4, _CERO_); // 4 // C sReg := sReg + Ajusta(RegCodigoINE, 'D', 9, _SPCE_); // 9 sReg := sReg + Ajusta('', 'I', 2, _SPCE_); // 2 // D sReg := sReg + Ajusta(RegPlazaLibr, 'D', 20, _SPCE_); // 20 sReg := sReg + Ajusta('', 'I', 1, _SPCE_); // 1 // E sReg := sReg + Ajusta('', 'I', 15, _SPCE_); // 15 sReg := sReg + Ajusta('', 'I', 9, _SPCE_); // 9 sTotImp := FormatFloat(_MSK_EU_, RegImpEfecto); iP := pos(',', sTotImp); if iP < 1 then iP := pos('.', sTotImp); cIT := copy(sTotImp, 1, iP - 1); sTotImp := cIT + copy(sTotImp, iP + 1, 2); sReg := sReg + Ajusta(sTotImp, 'I', 9, _CERO_); // 9 sReg := sReg + Ajusta('', 'I', 15, _SPCE_); // 15 sReg := sReg + Ajusta(FormatDateTime('ddmmyy', RegVtoEfecto), 'I', 6, _SPCE_); // 6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); // 6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); // 6 sReg := sReg + Ajusta('', 'I', 1, _SPCE_); // 1 sReg := sReg + Ajusta('', 'I', 4, _SPCE_); // 4 // F sReg := sReg + Ajusta('', 'I', 16, _SPCE_); // 16 sReg := sReg + CRLF; //2 if not (length(sReg) = _LL_) then Error(_LL_); StrPCopy(@pReg, sReg); Blockwrite(NFic, pReg, 1); Inc(iTotalLineas); end; procedure TCVBNorma32CSB.CompRegistro2; begin HayError := False; sReg := ''; ChequearDatos(REGISTRO2); // A sReg := '26' + '65'; sReg := sReg + Ajusta('', 'I', 2, _SPCE_); // 2 // B sReg := sReg + Ajusta(RegNumRecibo, 'D', 15, _SPCE_); // 15 sReg := sReg + Ajusta('', 'I', 2, _SPCE_); // 2 sReg := sReg + Ajusta('2', 'I', 1, _SPCE_); // 1 sReg := sReg + Ajusta('000000', 'I', 6, _CERO_); // 6 sReg := sReg + Ajusta('2', 'I', 1, _SPCE_); // 1 sReg := sReg + Ajusta('0', 'I', 1, _SPCE_); // 1 // C sReg := sReg + Ajusta(RegCodEnt, 'I', 4, _CERO_); //4 sReg := sReg + Ajusta(RegCodOfi, 'I', 4, _CERO_); //4 if Length(RegDC) = 0 then RegDC := '**'; sReg := sReg + Ajusta(RegDC, 'I', 2, _CERO_); //2 sReg := sReg + Ajusta(RegCC, 'I', 10, _CERO_); //10 // D sReg := sReg + Ajusta(RegLibrador, 'D', 34, _SPCE_); // 34 sReg := sReg + Ajusta(RegLibrado, 'D', 34, _SPCE_); // 34 sReg := sReg + Ajusta(RegInfoAdic, 'D', 30, _SPCE_); // 30 sReg := sReg + CRLF; //2 if not (length(sReg) = _LL_) then Error(_LL_); StrPCopy(@pReg, sReg); Blockwrite(NFic, pReg, 1); Inc(iTotalLineas); end; procedure TCVBNorma32CSB.CompRegistro3; begin HayError := False; sReg := ''; ChequearDatos(REGISTRO3); // A sReg := '27' + '65'; sReg := sReg + Ajusta('', 'I', 2, _SPCE_); // 2 // B sReg := sReg + Ajusta(RegNumRecibo, 'D', 15, _SPCE_); // 15 sReg := sReg + Ajusta('', 'I', 2, _SPCE_); // 2 sReg := sReg + Ajusta(RegDomicilio, 'D', 34, _SPCE_); // 34 sReg := sReg + Ajusta(RegCodPostal, 'I', 5, _SPCE_); // 5 sReg := sReg + Ajusta(RegPoblacion, 'D', 20, _SPCE_); // 20 sReg := sReg + Ajusta(RegCodigoINE, 'I', 2, _SPCE_); // 2 sReg := sReg + Ajusta('', 'I', 7, _SPCE_); // 7 sReg := sReg + Ajusta(RegNIF, 'I', 9, _SPCE_); // 9 sReg := sReg + Ajusta('', 'I', 50, _SPCE_); // 50 sReg := sReg + CRLF; //2 if not (length(sReg) = _LL_) then Error(_LL_); StrPCopy(@pReg, sReg); Blockwrite(NFic, pReg, 1); Inc(iTotalLineas); end; procedure TCVBNorma32CSB.Cerrar; var sTotImp, cIT : string; iP: integer; begin HayError := False; sReg := ''; Inc(iTotalLineas); // A sReg := '98' + '65'; sReg := sReg + Ajusta('', 'I', 2, _SPCE_); // 2 // B sReg := sReg + Ajusta('', 'I', 22, _SPCE_); // 22 // C sReg := sReg + Ajusta('', 'I', 37, _SPCE_); // 37 // D sReg := sReg + Ajusta('', 'I', 10, _SPCE_); // 10 sTotImp := FormatFloat(_MSK_EU_, fSumaImpRemesas); iP := pos(',', sTotImp); if iP < 1 then iP := pos('.', sTotImp); cIT := copy(sTotImp, 1, iP - 1); sTotImp := cIT + copy(sTotImp, iP + 1, 2); sReg := sReg + Ajusta(sTotImp, 'I', 10, _CERO_); // 10 sReg := sReg + Ajusta('', 'I', 10, _SPCE_); // 10 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); // 6 sReg := sReg + Ajusta('', 'I', 7, _SPCE_); // 7 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); // 6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); // 6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); // 6 // E sReg := sReg + Ajusta(IntToStr(iNumRemesas), 'I', 5, _CERO_); //5 sReg := sReg + Ajusta(IntToStr(iTotalLineas), 'I', 7, _CERO_); //7 sReg := sReg + Ajusta(IntToStr(iTotalRecibos), 'I', 6, _CERO_); //6 sReg := sReg + Ajusta('', 'I', 6, _SPCE_); // 6 sReg := sReg + CRLF; //2 if not (length(sReg) = _LL_) then Error(_LL_); StrPCopy(@pReg, sReg); Blockwrite(NFic, pReg, 1); CloseFile(NFic); end; procedure TCVBNorma32CSB.ChequearDatos(Parte: TCVBParte); var bError: boolean; begin { bError := False; if Parte = CABECERA_GENERAL then begin if ((Presentador = '') or (NomCliPres = '') or (EntRecepPres = '') or (OfiRecepPres = '')) then begin if Presentador = '' then Presentador := _INDICA_; if NomCliPres = '' then NomCliPres := _INDICA_; if EntRecepPres = '' then EntRecepPres := _INDICA_; if OfiRecepPres = '' then OfiRecepPres := _INDICA_; bError := True; end; end else if iParte = 2 then begin if ((Ordenante = '') or (NomCliOrd = '') or (EntOrde = '') or (OfiOrde = '') or (CcOrde = '')) then begin if Ordenante = '' then Ordenante := _INDICA_; if NomCliOrd = '' then NomCliOrd := _INDICA_; if EntOrde = '' then EntOrde := _INDICA_; if OfiOrde = '' then OfiOrde := _INDICA_; if CcOrde = '' then CcOrde := _INDICA_; bError := True; end; end else if (iParte = 3) or (iParte = 4) then begin if ((Referencia = '') or (NomTitDom = '') or (EntTitDom = '') or (OfiTitDom = '') or (ccTitDom = '')) then begin if Referencia = '' then Referencia := _INDICA_; if NomTitDom = '' then NomTitDom := _INDICA_; if EntTitDom = '' then EntTitDom := _INDICA_; if OfiTitDom = '' then OfiTitDom := _INDICA_; if ccTitDom = '' then ccTitDom := _INDICA_; bError := True; end; end; if bError then ShowMessage('' + CRLF + 'Faltan datos al procesar el siguiente registro: ' + CRLF + CRLF + 'Código Cli/Pro: ' + Referencia + CRLF + 'Nombre Titular: ' + NomTitDom + CRLF + 'Entidad Domiciliar: ' + EntTitDom + CRLF + 'Oficina Domiciliar: ' + OfiTitDom + CRLF + 'Cuenta Domiciliar: ' + ccTitDom + CRLF + 'Presentador: ' + Presentador + CRLF + 'Nombre Cliente Pres:' + NomCliPres + CRLF + 'Entidad Receptora P:' + EntRecepPres + CRLF + 'Oficina Receptora P:' + OfiRecepPres + CRLF + 'Ordenante: ' + Ordenante + CRLF + 'Nombre Cliente Ord.:' + NomCliOrd + CRLF + 'Entidad Ordenante: ' + EntOrde + CRLF + 'Oficina Ordenante: ' + OfiOrde + CRLF + 'Cuenta Ordenante: ' + CcOrde ); if iParte = 3 then begin if bError then begin if ((fImportePts = 0) and (FEuro = False)) or ((fImporteEu = 0) and (FEuro = True)) then begin ShowMessage('¡¡¡ El importe no puede ser cero !!!'); Error(27); end; end; end;} end; procedure TCVBNorma32CSB.Error(iErr: integer); begin NrError := iErr; HayError := True; if Assigned(FEnCasoError) then FEnCasoError(Self) else if FDepura = False then begin CloseFile(NFic); if NrError = _LL_ then raise Exception.Create('Error en la longitud de la línea') else raise Exception.Create('Error en la generación del fichero'); end; end; end.