This repository has been archived on 2024-11-28. You can view files and clone it, but cannot push or open issues or pull requests.
LuisLeon_FactuGES2/Source/Modulos/Banca electronica/Controller/uBancaElectronicaController.pas

681 lines
20 KiB
ObjectPascal

{
===============================================================================
Copyright (©) 2007. Rodax Software.
===============================================================================
Los contenidos de este fichero son propiedad de Rodax Software titular del
copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
bajo el que se suministra.
-----------------------------------------------------------------------------
Web: www.rodax-software.com
===============================================================================
Fecha primera versión:
Versión actual: 1.0.0
Fecha versión actual:
===============================================================================
Modificaciones:
Fecha Comentarios
---------------------------------------------------------------------------
===============================================================================
}
unit uBancaElectronicaController;
interface
uses
Classes, SysUtils, uDADataTable, uBizEmpresas,
uBizRemesasCliente;
type
IBancaElectronicaController = interface
['{8C646A34-AFDF-4F09-A8BA-D6D40B5A91B8}']
procedure GenerarFicheroNorma19 (const IDRemesa : Integer);
procedure GenerarFicheroNorma19SEPA (const IDRemesa : Integer);
procedure GenerarFicheroNorma32 (const IDRemesa : Integer);
end;
TBancaElectronicaController = class(TInterfacedObject, IBancaElectronicaController)
private
function VerEditorNorma19(var Entidad : String; var Oficina : String;
var AFechaCargo : TDateTime; var AFileName : String): Boolean;
function VerEditorNorma19SEPA(var Entidad : String; var Oficina : String;
var AFechaCargo : TDateTime; var AFileName : String): Boolean;
function VerEditorNorma32(var Identificador : String;
var ACodigoINE : String; var Entidad : String; var Oficina : String;
var AFileName : String): Boolean;
function ValidarRemesaParaSEPA(ARemesa : IBizRemesaCliente): Boolean;
function ValidarEmpresaParaSEPA(AEmpresa : IBizEmpresa) : Boolean;
public
procedure GenerarFicheroNorma19 (const IDRemesa : Integer);
procedure GenerarFicheroNorma19SEPA (const IDRemesa : Integer);
procedure GenerarFicheroNorma32 (const IDRemesa : Integer);
end;
implementation
uses
Forms, cxControls, Controls, Windows,
CVBNorma1958CSB, CVBNorma32CSB,
uEditorRegistryUtils, uStringsUtils,
uEmpresasController, schRemesasClienteClient_Intf,
uBizContactos, uClientesController,
uRemesasClienteController,
schRecibosClienteClient_Intf, Dialogs,
uIEditorExportacionNorma19, uIEditorExportacionNorma32, uBizRecibosCliente,
schContactosClient_Intf, schEmpresasClient_Intf,
uIEditorExportacionNorma19SEPA, CVBNorma19SEPA;
{ TBancaElectronicaController }
procedure TBancaElectronicaController.GenerarFicheroNorma19(
const IDRemesa: Integer);
var
ARemesasController : IRemesasClienteController;
AEmpresasController : IEmpresasController;
AClientesController : IClientesController;
ARemesa : IBizRemesaCliente;
AEmpresa : IBizEmpresa;
ACliente : IBizCliente;
ANorma19 : TCVBNorma1958CSB;
I: integer;
AEntidad : String;
AOficina : String;
begin
ARemesasController := TRemesasClienteController.Create;
AEmpresasController := TEmpresasController.Create;
AClientesController := TClientesController.Create;
ANorma19 := TCVBNorma1958CSB.Create(NIL);
ShowHourglassCursor;
try
ARemesa := ARemesasController.Buscar(IDRemesa);
ARemesa.DataTable.Active := True;
ARemesasController.RecuperarRecibos(ARemesa);
if ARemesa.ID <> IDRemesa then
raise Exception.CreateFmt('No existe la remesa con ID %d', [IDRemesa]);
AEmpresa := AEmpresasController.Buscar(ARemesa.ID_EMPRESA);
AEmpresa.DataTable.Active := True;
if AEmpresa.ID <> ARemesa.ID_EMPRESA then
raise Exception.CreateFmt('No existe la empresa con ID %d', [ARemesa.ID_EMPRESA]);
ANorma19.FNomFic := 'REM' + ARemesa.REFERENCIA + '.C19';
ANorma19.FecAbono := ARemesa.FECHA_REMESA;
// Buscar los datos bancarios
with AEmpresa.DatosBancarios do
begin
First;
if Locate('ID', ARemesa.ID_DATOS_BANCO, []) then
begin
AEntidad := ENTIDAD;
AOficina := SUCURSAL;
end;
end;
if not VerEditorNorma19(AEntidad, AOficina, ANorma19.FecAbono, ANorma19.FNomFic) then
Exit;
ANorma19.EntRecepPres := AEntidad;
ANorma19.OfiRecepPres := AOficina;
with ANorma19 do
begin
_NORMA_ := 19;
//ANorma19.Procedimiento := prPrimero; // <= ????????????????????????????????????
Euros := True;
Depura := True;
Abrir;
FecCargo := Now; // <= Fecha de generación del fichero
//FecVcto := ARemesa.FECHA_REMESA; // <= sólo para norma 58
// PRESENTADOR
Presentador := AEmpresa.NIF_CIF;
SufijoPres := ARemesa.SUFIJO_N19;
NomCliPres := AEmpresa.NOMBRE;
CompCabecera;
// el que cobra
Ordenante := AEmpresa.NIF_CIF;
SufijoOrd:= ARemesa.SUFIJO_N19;
NomCliOrd:= AEmpresa.NOMBRE;
EntOrde:= ARemesa.ENTIDAD;
OfiOrde:= ARemesa.SUCURSAL;
DcOrde:= ARemesa.DC;
CcOrde:= ARemesa.CUENTA;
LocalidadOrd:= '';
CodLocalOrd:= '';
//FecOrigFormCred:= <= Sólo para norma 58
CompOrdenante;
ARemesa.Recibos.DataTable.First;
for I := 0 to (ARemesa.Recibos.DataTable.RecordCount - 1) do
begin
ACliente := (AClientesController.Buscar(ARemesa.Recibos.ID_CLIENTE) as IBizCliente);
ACliente.DataTable.Active := True;
// el que paga
Referencia := ACliente.REFERENCIA;
NomTitDom := ARemesa.Recibos.NOMBRE_CLIENTE;
EntTitDom := ARemesa.Recibos.ENTIDAD_CLIENTE;
OfiTitDom := ARemesa.Recibos.SUCURSAL_CLIENTE;
DcTitDom := ARemesa.Recibos.DC_CLIENTE;
CcTitDom := ARemesa.Recibos.CUENTA_CLIENTE;
NomTitCta := ARemesa.Recibos.NOMBRE_CLIENTE;
DomTitCta := '';
PlzTitCta := '';
CPtTitCta := '';
CampConc1 := 'Recibo ' + ARemesa.Recibos.REFERENCIA;
fImporteEu := ARemesa.Recibos.IMPORTE_TOTAL;
CompRegistro;
ARemesa.Recibos.DataTable.Next;
end;
FinOrdenan;
Cerrar;
end;
finally
HideHourglassCursor;
ARemesasController := NIL;
AEmpresasController := NIL;
AClientesController := NIL;
AEmpresa := NIL;
FreeAndNil(ANorma19);
end;
end;
procedure TBancaElectronicaController.GenerarFicheroNorma19SEPA(
const IDRemesa: Integer);
var
ARemesasController : IRemesasClienteController;
AEmpresasController : IEmpresasController;
AClientesController : IClientesController;
ARemesa : IBizRemesaCliente;
AEmpresa : IBizEmpresa;
ACliente : IBizCliente;
ANorma19 : TCVBNorma19SEPA;
I: integer;
AEntidad : String;
AOficina : String;
begin
ARemesasController := TRemesasClienteController.Create;
AEmpresasController := TEmpresasController.Create;
AClientesController := TClientesController.Create;
try
ARemesa := ARemesasController.Buscar(IDRemesa);
ARemesa.DataTable.Active := True;
ARemesasController.RecuperarRecibos(ARemesa);
if ARemesa.ID <> IDRemesa then
raise Exception.CreateFmt('No existe la remesa con ID %d', [IDRemesa]);
AEmpresa := AEmpresasController.Buscar(ARemesa.ID_EMPRESA);
AEmpresa.DataTable.Active := True;
if AEmpresa.ID <> ARemesa.ID_EMPRESA then
raise Exception.CreateFmt('No existe la empresa con ID %d', [ARemesa.ID_EMPRESA]);
ANorma19 := TCVBNorma19SEPA.Create(NIL);
ANorma19.FNomFic := 'REM' + ARemesa.REFERENCIA + '.C19';
ANorma19.Fichero.Fecha := Date;
ANorma19.Fichero.Identificador := AEmpresa.NIF_CIF + ARemesa.REFERENCIA;
ANorma19.FechaCobro := Date;
// Buscar los datos bancarios
with AEmpresa.DatosBancarios do
begin
First;
if Locate('ID', ARemesa.ID_DATOS_BANCO, []) then
begin
AEntidad := ENTIDAD;
AOficina := SUCURSAL;
end;
end;
ValidarEmpresaParaSEPA(AEmpresa);
ValidarRemesaParaSEPA(ARemesa);
if not VerEditorNorma19(AEntidad, AOficina, ANorma19.FechaCobro, ANorma19.FNomFic) then
Exit;
ShowHourglassCursor;
ANorma19.Receptor.Entidad := AEntidad;
ANorma19.Receptor.Oficina := AOficina;
with ANorma19 do
begin
Depura := True;
Abrir;
// PRESENTADOR
if AEmpresa.DatosBancarios.NIF_CIF_PRESENTADORIsNull then
Presentador.NIFCIF := AEmpresa.NIF_CIF
else
Presentador.NIFCIF := AEmpresa.DatosBancarios.NIF_CIF_PRESENTADOR;
if AEmpresa.DatosBancarios.SUFIJO_PRESENTADORIsNull then
Presentador.Sufijo := AEmpresa.DatosBancarios.SUFIJO_ACREEDOR
else
Presentador.Sufijo := AEmpresa.DatosBancarios.SUFIJO_PRESENTADOR;
if AEmpresa.DatosBancarios.NOMBRE_PRESENTADORIsNull then
Presentador.Nombre := AEmpresa.NOMBRE
else
Presentador.Nombre := AEmpresa.DatosBancarios.NOMBRE_PRESENTADOR;
GenerarCabeceraPresentador;
// ACREEDOR
Acreedor.NIFCIF := AEmpresa.NIF_CIF;
Acreedor.Nombre := AEmpresa.NOMBRE;
Acreedor.Direccion1 := AEmpresa.CALLE;
if not AEmpresa.CODIGO_POSTALIsNull then
Acreedor.Direccion2 := AEmpresa.CODIGO_POSTAL + ' ';
Acreedor.Direccion2 := Acreedor.Direccion2 + AEmpresa.POBLACION;
Acreedor.Direccion3 := AEmpresa.PROVINCIA;
Acreedor.Pais := 'ES';
Acreedor.Sufijo := AEmpresa.DatosBancarios.SUFIJO_ACREEDOR;
Acreedor.CuentaIBAN := AEmpresa.DatosBancarios.IBAN;
GenerarCabeceraAcreedor;
ARemesa.Recibos.DataTable.First;
for I := 0 to (ARemesa.Recibos.DataTable.RecordCount - 1) do
begin
//ACliente := (AClientesController.Buscar(ARemesa.Recibos.ID_CLIENTE) as IBizCliente);
//ACliente.Open;
// DEUDOR
Deudor.Nombre := ARemesa.Recibos.NOMBRE_CLIENTE;
Deudor.Direccion1 := ARemesa.Recibos.CALLE_CLIENTE;
if not ARemesa.Recibos.CODIGO_POSTAL_CLIENTEIsNull then
Deudor.Direccion2 := ARemesa.Recibos.CODIGO_POSTAL_CLIENTE + ' ';
Deudor.Direccion2 := Deudor.Direccion2 + ARemesa.Recibos.POBLACION_CLIENTE;
Deudor.Direccion3 := ARemesa.Recibos.PROVINCIA_CLIENTE;
Deudor.Pais := 'ES';
Deudor.CuentaIBAN := ARemesa.Recibos.IBAN_CLIENTE;
Deudor.CodigoBIC := ARemesa.Recibos.SWIFT_CLIENTE;
Adeudo.Referencia := ARemesa.Recibos.REFERENCIA;
Adeudo.Importe := ARemesa.Recibos.IMPORTE_TOTAL;
GenerarRegistroAdeudo;
ARemesa.Recibos.DataTable.Next;
end;
GenerarTotalAcreedor;
Cerrar;
ShowMessage('Se ha generado el fichero');
end;
finally
HideHourglassCursor;
ARemesasController := NIL;
AEmpresasController := NIL;
AClientesController := NIL;
AEmpresa := NIL;
FreeAndNil(ANorma19);
end;
end;
procedure TBancaElectronicaController.GenerarFicheroNorma32(
const IDRemesa: Integer);
var
ARemesasController : IRemesasClienteController;
AEmpresasController : IEmpresasController;
AClientesController : IClientesController;
ARemesa : IBizRemesaCliente;
AEmpresa : IBizEmpresa;
ACliente : IBizCliente;
ANorma32 : TCVBNorma32CSB;
I: integer;
AEntidad : String;
AOficina : String;
ACodINE : String;
begin
ARemesasController := TRemesasClienteController.Create;
AEmpresasController := TEmpresasController.Create;
AClientesController := TClientesController.Create;
ANorma32 := TCVBNorma32CSB.Create(NIL);
ShowHourglassCursor;
Application.ProcessMessages;
try
ARemesa := ARemesasController.Buscar(IDRemesa);
ARemesa.DataTable.Active := True;
ARemesasController.RecuperarRecibos(ARemesa);
if ARemesa.ID <> IDRemesa then
raise Exception.CreateFmt('No existe la remesa con ID %d', [IDRemesa]);
AEmpresa := AEmpresasController.Buscar(ARemesa.ID_EMPRESA);
AEmpresa.DataTable.Active := True;
if AEmpresa.ID <> ARemesa.ID_EMPRESA then
raise Exception.CreateFmt('No existe la empresa con ID %d', [ARemesa.ID_EMPRESA]);
ANorma32.FNomFic := 'REM' + ARemesa.REFERENCIA + '.C32';
ANorma32.FechaFichero := Date;
// Buscar los datos bancarios
with AEmpresa.DatosBancarios do
begin
First;
if Locate('ID', ARemesa.ID_DATOS_BANCO, []) then
begin
AEntidad := ENTIDAD;
AOficina := SUCURSAL;
end;
end;
if not VerEditorNorma32(ANorma32.IdCedente, ACodINE, AEntidad,
AOficina, ANorma32.FNomFic) then
Exit;
with ANorma32 do
begin
_NORMA_ := 32;
Euros := True;
Depura := True;
Abrir;
// Cabecera del fichero
FechaFichero := NOW;
EntReceptora := AEntidad;
SucReceptora := AOficina;
CompCabeceraFichero;
// Cabecera de la remesa
NumRemesa := '0001'; //<-------------------------------------------------
AboEnt := ARemesa.ENTIDAD;
AboOfi := ARemesa.SUCURSAL;
AboDC := ARemesa.DC;
AboCC := ARemesa.CUENTA;
AdeEnt := ARemesa.ENTIDAD;
AdeOfi := ARemesa.SUCURSAL;
AdeDC := ARemesa.DC;
AdeCC := ARemesa.CUENTA;
ImpEnt := ARemesa.ENTIDAD;
ImpSuc := ARemesa.SUCURSAL;
ImpDC := ARemesa.DC;
ImpCC := ARemesa.CUENTA;
CompCabeceraRemesa;
ARemesa.Recibos.First;
for i := 0 to ARemesa.Recibos.RecordCount - 1 do
begin
RegNumRecibo := ARemesa.Recibos.REFERENCIA;
RegCodigoINE := ACodINE;
RegPlazaLibr := AEmpresa.POBLACION;
RegImpEfecto := ARemesa.Recibos.IMPORTE_TOTAL;
RegVtoEfecto := ARemesa.Recibos.FECHA_VENCIMIENTO;
// (II)
RegCodEnt := ARemesa.Recibos.ENTIDAD_CLIENTE;
RegCodOfi := ARemesa.Recibos.SUCURSAL_CLIENTE;
RegDC := ARemesa.Recibos.DC_CLIENTE;
RegCC := ARemesa.Recibos.CUENTA_CLIENTE;
RegLibrador := AEmpresa.NOMBRE;
RegLibrado := ARemesa.Recibos.NOMBRE_CLIENTE;
RegInfoAdic := '';
// (III)
ACliente := (AClientesController.Buscar(ARemesa.Recibos.ID_CLIENTE) as IBizCliente);
try
ACliente.DataTable.Active := True;
RegDomicilio := ACliente.CALLE;
RegCodPostal := ACliente.CODIGO_POSTAL;
RegPoblacion := ACliente.POBLACION;
RegNIF := ARemesa.Recibos.NIF_CIF_CLIENTE;
finally
ACliente := NIL;
end;
CompRegistro;
ARemesa.Recibos.Next;
end;
CompFinRemesa;
Cerrar;
end;
finally
HideHourglassCursor;
ARemesasController := NIL;
AEmpresasController := NIL;
AClientesController := NIL;
AEmpresa := NIL;
FreeAndNil(ANorma32);
end;
end;
function TBancaElectronicaController.ValidarEmpresaParaSEPA(
AEmpresa: IBizEmpresa): Boolean;
var
AMensaje : string;
begin
Result := False;
AMensaje := '';
if AEmpresa.DatosBancarios.IBANIsNull then
AMensaje := AMensaje + '- Falta el código IBAN' + #13 + #10;
// No obligar a tener código BIC/SWIFT
{if AEmpresa.DatosBancarios.SWIFTIsNull then
AMensaje := AMensaje + '- Falta el código BIC/SWIFT' + #13 + #10;}
if AEmpresa.DatosBancarios.SUFIJO_ACREEDORIsNull then
AMensaje := AMensaje + '- Falta el sufijo del acreedor' + #13 + #10;
if not EsCadenaVacia(AMensaje) then
begin
AMensaje := 'No se puede generar el fichero SEPA. Se han encontrado los siguientes problemas ' + #13 + #10 +
'en los datos bancarios (' + AEmpresa.DatosBancarios.NOMBRE + ')' + #13 + #10 +
'de la empresa (' + AEmpresa.NOMBRE + '):' + #13 + #10 + #13 + #10 + AMensaje;
raise Exception.Create (AMensaje)
end
else
Result := True;
end;
function TBancaElectronicaController.ValidarRemesaParaSEPA(
ARemesa: IBizRemesaCliente): Boolean;
var
AClienteController : TClientesController;
ACliente : IBizCliente;
ARecibo : IBizRecibosCliente;
i : integer;
AMensaje : string;
begin
Result := False;
AMensaje := '';
AClienteController := TClientesController.Create;
try
ARemesa.Recibos.First;
for i := 0 to ARemesa.Recibos.RecordCount - 1 do
begin
ACliente := (AClienteController.Buscar(ARemesa.Recibos.ID_CLIENTE) as IBizCliente);
ACliente.Open;
if ACliente.DatosBancarios.IBANIsNull then
AMensaje := AMensaje + '- Cliente ' + ACliente.NOMBRE + ': falta el código IBAN' + #13 + #10;
// No obligar a tener código BIC/SWIFT
{if ACliente.DatosBancarios.SWIFTIsNull then
AMensaje := AMensaje + '- Cliente ' + ACliente.NOMBRE + ': falta el código BIC/SWIFT' + #13 + #10;}
ACliente := NIL;
ARemesa.Recibos.Next;
end;
finally
FreeAndNil(AClienteController);
end;
if not EsCadenaVacia(AMensaje) then
begin
AMensaje := 'No se puede generar el fichero SEPA. Se han encontrado los siguientes problemas en los recibos de la remesa:' +
#13 + #10 + #13 + #10 + AMensaje;
raise Exception.Create (AMensaje)
end
else
Result := True;
end;
function TBancaElectronicaController.VerEditorNorma19 (
var Entidad : String; var Oficina : String; var AFechaCargo : TDateTime;
var AFileName : String): Boolean;
var
AEditor : IEditorExportacionNorma19;
begin
Result := False;
AEditor := NIL;
ShowHourglassCursor;
try
CreateEditor('EditorExportacionNorma19', IEditorExportacionNorma19, AEditor);
with AEditor do
begin
CodigoEntidad := Entidad;
CodigoAgencia := Oficina;
FechaCargo := AFechaCargo;
Fichero := AFileName;
end;
finally
HideHourglassCursor;
end;
if Assigned(AEditor) then
try
if (AEditor.ShowModal = mrOk) then
begin
Entidad := AEditor.CodigoEntidad;
Oficina := AEditor.CodigoAgencia;
AFechaCargo := AEditor.FechaCargo;
AFileName := AEditor.Fichero;
Result := True;
end;
AEditor.Release;
finally
AEditor := NIL;
end;
end;
function TBancaElectronicaController.VerEditorNorma19SEPA(var Entidad,
Oficina: String; var AFechaCargo: TDateTime; var AFileName: String): Boolean;
var
AEditor : IEditorExportacionNorma19SEPA;
begin
Result := False;
AEditor := NIL;
ShowHourglassCursor;
try
CreateEditor('EditorExportacionNorma19SEPA', IEditorExportacionNorma19SEPA, AEditor);
with AEditor do
begin
CodigoEntidad := Entidad;
CodigoAgencia := Oficina;
FechaCargo := AFechaCargo;
Fichero := AFileName;
end;
finally
HideHourglassCursor;
end;
if Assigned(AEditor) then
try
if (AEditor.ShowModal = mrOk) then
begin
Entidad := AEditor.CodigoEntidad;
Oficina := AEditor.CodigoAgencia;
AFechaCargo := AEditor.FechaCargo;
AFileName := AEditor.Fichero;
Result := True;
end;
AEditor.Release;
finally
AEditor := NIL;
end;
end;
function TBancaElectronicaController.VerEditorNorma32(var Identificador,
ACodigoINE: String; var Entidad, Oficina: String;
var AFileName: String): Boolean;
var
AEditor : IEditorExportacionNorma32;
begin
Result := False;
AEditor := NIL;
ShowHourglassCursor;
try
CreateEditor('EditorExportacionNorma32', IEditorExportacionNorma32, AEditor);
with AEditor do
begin
CodigoIdentif := Identificador;
CodigoINE := ACodigoINE;
CodigoEntidad := Entidad;
CodigoAgencia := Oficina;
Fichero := AFileName;
end;
finally
HideHourglassCursor;
end;
if Assigned(AEditor) then
try
if (AEditor.ShowModal = mrOk) then
begin
Identificador := AEditor.CodigoIdentif;
ACodigoINE := AEditor.CodigoINE;
Entidad := AEditor.CodigoEntidad;
Oficina := AEditor.CodigoAgencia;
AFileName := AEditor.Fichero;
Result := True;
end;
AEditor.Release;
finally
AEditor := NIL;
end;
end;
end.