AbetoDesign_FactuGES2/Source/Modulos/Banca electronica/Utiles/CVBNorma32CSB.pas
2013-06-03 16:01:08 +00:00

717 lines
19 KiB
ObjectPascal

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.