AlonsoYSal_FactuGES2/Source/Modulos/Recibos de proveedor/Controller/uRecibosProveedorController.pas

993 lines
35 KiB
ObjectPascal
Raw Normal View History

{
===============================================================================
Copyright (<EFBFBD>) 2007. Rodax Software.
===============================================================================
Los contenidos de este fichero son propiedad de Rodax Software titular del
copyright. Este fichero s<EFBFBD>lo podr<EFBFBD> ser copiado, distribuido y utilizado,
en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
acuerdo con los t<EFBFBD>rminos y condiciones establecidas en el acuerdo/contrato
bajo el que se suministra.
-----------------------------------------------------------------------------
Web: www.rodax-software.com
===============================================================================
Fecha primera versi<EFBFBD>n:
Versi<EFBFBD>n actual: 1.0.0
Fecha versi<EFBFBD>n actual:
===============================================================================
Modificaciones:
Fecha Comentarios
---------------------------------------------------------------------------
===============================================================================
}
unit uRecibosProveedorController;
interface
uses
Classes, SysUtils, uDADataTable, uControllerBase,
uPagosProveedorController, uProveedoresController, uBizDireccionesContacto,
uBizRecibosProveedor, uIDataModuleRecibosProveedor;
type
IRecibosProveedorController = interface(IControllerBase)
['{763DF610-3540-42BE-A09A-35AABFAF2DA1}']
function GetProveedorController: IProveedoresController;
procedure SetProveedorController(const Value: IProveedoresController);
property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController;
function GetPagosController: IPagosProveedorController;
procedure SetPagosController(const Value: IPagosProveedorController);
property PagosController: IPagosProveedorController read GetPagosController write SetPagosController;
procedure Anadir(ARecibosProveedor : IBizRecibosProveedor);
function AnadirPago(ARecibosProveedor : IBizRecibosProveedor; FechaPago: String =''; AIgnorarContabilidad: Integer = 1; AIdSubCuenta: Integer = 0; ASubCuenta: String = ''): Boolean;
function AnadirPagos(ARecibosProveedor : IBizRecibosProveedor; FechaPago: String =''; AIgnorarContabilidad: Integer = 1; AIdSubCuenta: Integer = 0; ASubCuenta: String = ''): Boolean;
procedure ModificarPago(ARecibosProveedor : IBizRecibosProveedor; FechaPago: String =''; AIgnorarContabilidad : Integer = 1; AIdSubCuenta: Integer = 0; ASubCuenta: String = '');
function Eliminar(ARecibosProveedor : IBizRecibosProveedor; AllItems: Boolean = false): Boolean;
function EliminarPago(ARecibosProveedor : IBizRecibosProveedor): Boolean;
function EliminarTodo(ARecibosProveedor : IBizRecibosProveedor): Boolean;
function Guardar(ARecibosProveedor : IBizRecibosProveedor): Boolean;
procedure DescartarCambios(ARecibosProveedor : IBizRecibosProveedor);
function Duplicar(ARecibosProveedor: IBizRecibosProveedor): IBizRecibosProveedor;
function Nuevo : IBizRecibosProveedor;
procedure RecuperarProveedor(AReciboProveedor : IBizRecibosProveedor);
function Buscar(const ID: Integer): IBizRecibosProveedor;
function BuscarTodos: IBizRecibosProveedor;
function BuscarRecibosRemesa(const ID_REMESA: Integer): IBizRecibosProveedor;
function BuscarRecibosFactura(const ID_FACTURA: Integer): IBizRecibosProveedor;
function BuscarRecibosACompensar(const Recibo: IBizRecibosProveedor): IBizRecibosProveedor;
function BuscarRecibosARemesar(const AListaVisibles, AListaNoVisibles: TStringList): IBizRecibosProveedor;
procedure VerTodos(ARecibosProveedor: IBizRecibosProveedor);
procedure Ver(ARecibosProveedor: IBizRecibosProveedor);
function ExtraerSeleccionados(ARecibosProveedor: IBizRecibosProveedor) : IBizRecibosProveedor;
procedure AsignarRemesa(ARecibos : IBizRecibosProveedor; ID_REMESA: Integer; AIgnorarContabilidad : Integer; ASubCuenta: Integer);
procedure QuitarRemesa(ARecibos : IBizRecibosProveedor);
procedure SetSituacionCobrados(ARecibos : IBizRecibosProveedor; WithDeltas: Boolean=False);
function ElegirRecibos(ARecibos : IBizRecibosProveedor; AMensaje: String; AMultiSelect: Boolean): IBizRecibosProveedor;
procedure CopiarDireccion (const ADireccionEnvio: IBizDireccionesContacto; ARecibo: IBizRecibosProveedor);
function ElegirRecibosCompensados(ARecibo : IBizRecibosProveedor): Boolean;
procedure QuitarReciboCompensado(ARecibo : IBizRecibosProveedor);
function EsEliminable(ARecibo : IBizRecibosProveedor): Boolean;
procedure Preview(ARecibosProveedor : IBizRecibosProveedor);
procedure Print(ARecibosProveedor : IBizRecibosProveedor);
function DarListaAnosRecibos: TStringList;
procedure FiltrarAno(ARecibo: IBizRecibosProveedor; ADynWhereDataTable: WideString; const Ano: String);
end;
TRecibosProveedorController = class(TControllerBase, IRecibosProveedorController)
private
function ImporteTotalModificado(ARecibosProveedor: IBizRecibosProveedor;
var ImporteRestante: Currency): Boolean;
procedure FiltrarEmpresa(ARecibo: IBizRecibosProveedor);
protected
FDataModule : IDataModuleRecibosProveedor;
FPagosController : IPagosProveedorController;
FProveedorController : IProveedoresController;
function GetProveedorController: IProveedoresController;
procedure SetProveedorController(const Value: IProveedoresController);
function GetPagosController: IPagosProveedorController;
procedure SetPagosController(const Value: IPagosProveedorController);
function _Vacio : IBizRecibosProveedor;
function ValidarReciboProveedor(ARecibosProveedor: IBizRecibosProveedor): Boolean;
procedure AsignarDataModule;
function DarNuevaReferencia(ID_FACTURA : Integer; REFERENCIA: String): String;
public
property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController;
property PagosController: IPagosProveedorController read GetPagosController write SetPagosController;
constructor Create; override;
destructor Destroy; override;
procedure RecuperarProveedor(AReciboProveedor : IBizRecibosProveedor);
procedure Anadir(ARecibosProveedor : IBizRecibosProveedor);
function AnadirPago(ARecibosProveedor : IBizRecibosProveedor; FechaPago: String =''; AIgnorarContabilidad: Integer = 1; AIdSubCuenta: Integer = 0; ASubCuenta: String = ''): Boolean;
function AnadirPagos(ARecibosProveedor : IBizRecibosProveedor; FechaPago: String =''; AIgnorarContabilidad: Integer = 1; AIdSubCuenta: Integer = 0; ASubCuenta: String = ''): Boolean;
procedure ModificarPago(ARecibosProveedor : IBizRecibosProveedor; FechaPago: String =''; AIgnorarContabilidad : Integer = 1; AIdSubCuenta: Integer = 0; ASubCuenta: String = '');
function Eliminar(ARecibosProveedor : IBizRecibosProveedor; AllItems: Boolean = false): Boolean;
function EliminarPago(ARecibosProveedor : IBizRecibosProveedor): Boolean;
function EliminarTodo(ARecibosProveedor : IBizRecibosProveedor): Boolean;
function Guardar(ARecibosProveedor : IBizRecibosProveedor): Boolean;
procedure DescartarCambios(ARecibosProveedor : IBizRecibosProveedor);
function Duplicar(ARecibosProveedor: IBizRecibosProveedor): IBizRecibosProveedor;
function Nuevo : IBizRecibosProveedor;
function Buscar(const ID: Integer): IBizRecibosProveedor;
function BuscarTodos: IBizRecibosProveedor;
function BuscarRecibosRemesa(const ID_REMESA: Integer): IBizRecibosProveedor;
function BuscarRecibosFactura(const ID_FACTURA: Integer): IBizRecibosProveedor;
function BuscarRecibosACompensar(const Recibo: IBizRecibosProveedor): IBizRecibosProveedor;
function BuscarRecibosARemesar(const AListaVisibles, AListaNoVisibles: TStringList): IBizRecibosProveedor;
procedure VerTodos(ARecibosProveedor: IBizRecibosProveedor);
procedure Ver(ARecibosProveedor: IBizRecibosProveedor);
function ExtraerSeleccionados(ARecibosProveedor: IBizRecibosProveedor) : IBizRecibosProveedor;
function ElegirRecibos(ARecibos : IBizRecibosProveedor; AMensaje: String; AMultiSelect: Boolean): IBizRecibosProveedor;
function ElegirRecibosCompensados(ARecibo : IBizRecibosProveedor): Boolean;
procedure CopiarDireccion (const ADireccionEnvio: IBizDireccionesContacto; ARecibo: IBizRecibosProveedor);
procedure AsignarRemesa(ARecibos : IBizRecibosProveedor; ID_REMESA: Integer; AIgnorarContabilidad : Integer; ASubCuenta: Integer);
procedure QuitarRemesa(ARecibos : IBizRecibosProveedor);
procedure QuitarReciboCompensado(ARecibo : IBizRecibosProveedor);
procedure SetSituacionCobrados(ARecibos : IBizRecibosProveedor; WithDeltas: Boolean=False);
function EsEliminable(ARecibo : IBizRecibosProveedor): Boolean;
procedure Preview(ARecibosProveedor : IBizRecibosProveedor);
procedure Print(ARecibosProveedor : IBizRecibosProveedor);
function DarListaAnosRecibos: TStringList;
procedure FiltrarAno(ARecibo: IBizRecibosProveedor; ADynWhereDataTable: WideString; const Ano: String);
end;
implementation
uses
Forms, uNumUtils, cxControls, DB, uEditorRegistryUtils, Dialogs,
uDAInterfaces, uDataTableUtils, uDataModuleUsuarios, uFactuGES_App,
uDateUtils, uROTypes, DateUtils, Controls, Windows, Variants,
uRecibosProveedorReportController, uBizContactos, uDADelta,
schRecibosProveedorClient_Intf, uIEditorRecibosProveedor, uIEditorReciboProveedor,
uDataModuleRecibosProveedor, uIEditorFechaPagoProveedor, uIEditorElegirRecibosProveedor;
{ TRecibosProveedorController }
procedure TRecibosProveedorController.Anadir(ARecibosProveedor: IBizRecibosProveedor);
begin
ARecibosProveedor.Insert;
end;
function TRecibosProveedorController.AnadirPago(ARecibosProveedor: IBizRecibosProveedor; FechaPago: String =''; AIgnorarContabilidad: Integer = 1; AIdSubCuenta: Integer = 0; ASubCuenta: String = ''): Boolean;
begin
Result := False;
// Se cancela la operaci<63>n
if Length(FechaPago) = 0 then
raise Exception.Create('Debe indicar la fecha del pago.');
//Liberamos el recibo aunque ya este libre
if not ARecibosProveedor.DataTable.Editing then
ARecibosProveedor.DataTable.Edit;
ARecibosProveedor.ID_REMESA := 0;
ARecibosProveedor.REFERENCIA_REMESA := '';
ARecibosProveedor.DataTable.Post;
//Finalmente a<>adimos el pago (pago o devolucion)
if PagosController.Anadir(ARecibosProveedor.Pagos, FechaPago, AIgnorarContabilidad, AIdSubCuenta, ASubCuenta) then
begin
ARecibosProveedor.Edit;
ARecibosProveedor.SITUACION := CTE_PAGADO;
Result := True;
end
//Podremos modificar si anulamos el pago mediante una devoluci<63>n
else
begin
ARecibosProveedor.Edit;
ARecibosProveedor.SITUACION := CTE_DEVUELTO;
Result := False;
end;
end;
function TRecibosProveedorController.AnadirPagos(
ARecibosProveedor: IBizRecibosProveedor; FechaPago: String;
AIgnorarContabilidad, AIdSubCuenta: Integer; ASubCuenta: String): Boolean;
begin
if Assigned(ARecibosProveedor) then
with ARecibosProveedor.DataTable do
begin
First;
while not EOF do
begin
if (ARecibosProveedor.SITUACION = CTE_PENDIENTE) then
Self.AnadirPago(ARecibosProveedor, FechaPago, AIgnorarContabilidad, AIdSubCuenta, ASubCuenta);
Next;
end;
end;
end;
procedure TRecibosProveedorController.AsignarDataModule;
begin
FDataModule := TDataModuleRecibosProveedor.Create(Nil);
end;
procedure TRecibosProveedorController.AsignarRemesa(ARecibos: IBizRecibosProveedor; ID_REMESA: Integer; AIgnorarContabilidad : Integer; ASubCuenta: Integer);
begin
if Assigned(ARecibos) then
begin
With ARecibos.DataTable do
begin
First;
While not EOF do
begin
if (ARecibos.ID_REMESA <> ID_REMESA) then
begin
ARecibos.Edit;
//A<>adimos el cobro automatico por la remesa y volvemos a asignar ID
//para que asigne un ID nuevo para el pago, porque aqui si hay maestro-detalle
AnadirPago(ARecibos, DateToStr(Date), AIgnorarContabilidad, ASubCuenta); //->Ojo el orden es importante
ARecibos.ID_REMESA := ID_REMESA;
end;
Next;
end;
end;
end;
end;
function TRecibosProveedorController.BuscarTodos: IBizRecibosProveedor;
begin
Result := FDataModule.GetItems;
FiltrarEmpresa(Result);
end;
procedure TRecibosProveedorController.CopiarDireccion(const ADireccionEnvio: IBizDireccionesContacto;
ARecibo: IBizRecibosProveedor);
var
bEnEdicion : Boolean;
begin
if not Assigned(ARecibo) then
raise Exception.Create ('Recibo no asignado (CopiarDireccion)');
if not Assigned(ADireccionEnvio) then
raise Exception.Create ('No se ha indicado la direcci<63>n (CopiarDireccion)');
if ARecibo.DataTable.Active then
ARecibo.DataTable.Active := True;
if ADireccionEnvio.DataTable.Active then
ADireccionEnvio.DataTable.Active := True;
bEnEdicion := (ARecibo.DataTable.State in dsEditModes);
if not bEnEdicion then
ARecibo.Edit;
ShowHourglassCursor;
ARecibo.Edit;
try
ARecibo.CALLE := ADireccionEnvio.CALLE;
ARecibo.POBLACION := ADireccionEnvio.POBLACION;
ARecibo.CODIGO_POSTAL := ADireccionEnvio.CODIGO_POSTAL;
ARecibo.PROVINCIA := ADireccionEnvio.PROVINCIA;
ARecibo.NIF_CIF := ADireccionEnvio.NIF_CIF;
ARecibo.NOMBRE := ADireccionEnvio.NOMBRE;
if not bEnEdicion then
ARecibo.Post;
finally
HideHourglassCursor;
end;
end;
constructor TRecibosProveedorController.Create;
begin
inherited;
AsignarDataModule;
FPagosController := TPagosProveedorController.Create;
FProveedorController := TProveedoresController.Create;
// FPagosController.addObservador(Self); //PETA NO SE PORQUE
end;
function TRecibosProveedorController.Buscar(const ID: Integer): IBizRecibosProveedor;
begin
Result := (FDataModule as IDataModuleRecibosProveedor).GetItem(ID);
FiltrarEmpresa(Result);
end;
function TRecibosProveedorController.BuscarRecibosFactura(const ID_FACTURA: Integer): IBizRecibosProveedor;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarTodos;
// Filtrar los recibos de una determinada factura
with Result.DataTable.DynamicWhere do
begin
// (ID_FACTURA = ID_FACTURA)
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorID_FACTURA), NewConstant(ID_FACTURA, datInteger), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
function TRecibosProveedorController.BuscarRecibosACompensar(const Recibo: IBizRecibosProveedor): IBizRecibosProveedor;
var
Condicion: TDAWhereExpression;
begin
if not Assigned(Recibo) then
raise Exception.Create ('IBizReciboProveedor no asignado (BuscarRecibosACompensar)');
ShowHourglassCursor;
try
Result := BuscarTodos;
with Result.DataTable.DynamicWhere do
begin
//No podr<64> compensarse un recibo a si mismo
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorID), NewConstant(Recibo.ID, datInteger), dboNotEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
with Result.DataTable.DynamicWhere do
begin
//Solo podr<64> compensar recibos del mismo proveedor
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorID_PROVEEDOR), NewConstant(Recibo.ID_PROVEEDOR, datInteger), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
with Result.DataTable.DynamicWhere do
begin
//Omitimos los recibos compensados
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorID_RECIBO_COMPENSADO), NewNull(), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
with Result.DataTable.DynamicWhere do
begin
//Solo dejaremos remesar aquellos recibos que no esten cobrados (Pendientes/Devueltos)
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorSITUACION), NewConstant(CTE_PAGADO, datString), dboNotEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
function TRecibosProveedorController.BuscarRecibosARemesar(const AListaVisibles, AListaNoVisibles: TStringList): IBizRecibosProveedor;
var
Condicion: TDAWhereExpression;
i: Integer;
begin
ShowHourglassCursor;
try
Result := BuscarTodos;
with Result.DataTable.DynamicWhere do
begin
//Omitimos los recibos compensados
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorID_RECIBO_COMPENSADO), NewNull(), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
with Result.DataTable.DynamicWhere do
begin
//Solo dejaremos remesar aquellos recibos que no esten pagados (Pendientes/Devueltos)
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorSITUACION), NewConstant(CTE_PAGADO, datString), dboNotEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
//En este caso vamos a quitar de la lista de recibos pendientes aquellos que ya hemos
//a<>adido a la remesa pero que estan en memoria ya que todavia no se ha guarado en BD
for i := 0 to AListaNoVisibles.Count - 1 do
with Result.DataTable.DynamicWhere do
begin
//Solo dejaremos remesar aquellos recibos que no esten cobrados (Pendientes/Devueltos)
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorID), NewConstant(AListaNoVisibles.Strings[i], datString), dboNotEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
//En el caso contrario no hacemos nada, porque si se elimina un recibo de la remesa
//y sin guardar los cambios damos a a<>adir el recibo todavia est<73> cobrado y no se que efectos
//secundarios puede provocar
//AListaVisibles
finally
HideHourglassCursor;
end;
end;
function TRecibosProveedorController.BuscarRecibosRemesa(const ID_REMESA: Integer): IBizRecibosProveedor;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarTodos;
// Filtrar los recibos de una determinada remesa
with Result.DataTable.DynamicWhere do
begin
// (ID_REMESA = ID)
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorID_REMESA), NewConstant(ID_REMESA, datInteger), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
finally
HideHourglassCursor;
end;
end;
function TRecibosProveedorController._Vacio: IBizRecibosProveedor;
begin
Result := Buscar(ID_NULO);
end;
function TRecibosProveedorController.DarListaAnosRecibos: TStringList;
begin
Result := FDataModule.GetAnosItems;
end;
function TRecibosProveedorController.DarNuevaReferencia(ID_FACTURA: Integer; REFERENCIA: String): String;
var
ARecibosProveedor: IBizRecibosProveedor;
NumReferencia : Integer;
Cadena : String;
begin
try
ARecibosProveedor := BuscarRecibosFactura(ID_FACTURA);
ARecibosProveedor.DataTable.Active := True;
NumReferencia := ARecibosProveedor.DataTable.RecordCount;
Cadena := Copy(REFERENCIA, 0, Pos('-', REFERENCIA));
Result := Cadena + ' ' + IntToStr((NumReferencia + 1));
finally
ARecibosProveedor := Nil;
end;
end;
procedure TRecibosProveedorController.DescartarCambios(ARecibosProveedor: IBizRecibosProveedor);
begin
if not Assigned(ARecibosProveedor) then
raise Exception.Create ('IBizRecibosProveedor no asignado');
ShowHourglassCursor;
try
if (ARecibosProveedor.State in dsEditModes) then
ARecibosProveedor.Cancel;
ARecibosProveedor.DataTable.CancelUpdates;
finally
HideHourglassCursor;
end;
end;
destructor TRecibosProveedorController.Destroy;
begin
FDataModule := NIL;
FPagosController := NIL;
FProveedorController := NIL;
inherited;
end;
function TRecibosProveedorController.Duplicar(ARecibosProveedor: IBizRecibosProveedor): IBizRecibosProveedor;
begin
Result := Self._Vacio;
ShowHourglassCursor;
try
DuplicarRegistros(ARecibosProveedor.DataTable, Result.DataTable, mdrActual);
// Descomentar esto si hay detalles
// (EN ESTE CASO NO NOS INTERESA COPIAR LOS PAGOS DEL RECIBO DUPLIACDO)
// DuplicarRegistros(ARecibosProveedor.Detalles.DataTable, Result.Detalles.DataTable, mdrTodos);
// <20>CUIDADO! Hay que dejar algunos campos como si fuera todo nuevo
Result.Edit;
with Result do
begin
// Ejemplos
// ID_EMPRESA := dmUsuarios.IDEmpresaActual;
// USUARIO := dmUsuarios.LoginInfo.Usuario;
// REFERENCIA := ''; //Para que se asigne una nueva
// FECHA_FACTURA := DateOf(Now);
// SITUACION := SITUACION_PENDIENTE;
end;
Result.Post;
finally
HideHourglassCursor;
end;
end;
function TRecibosProveedorController.ValidarReciboProveedor(ARecibosProveedor: IBizRecibosProveedor): Boolean;
var
ImporteRestante: Double;
begin
Result := False;
if not Assigned(ARecibosProveedor) then
raise Exception.Create ('IBizRecibosProveedor no asignado');
if (ARecibosProveedor.DataTable.State in dsEditModes) then
ARecibosProveedor.DataTable.Post;
// Tambien hacemos post de sus tablas hija
if (ARecibosProveedor.Pagos.DataTable.State in dsEditModes) then
ARecibosProveedor.Pagos.DataTable.Post;
if ARecibosProveedor.DataTable.FieldByName(fld_RecibosProveedorFECHA_EMISION).IsNull then
raise Exception.Create('Debe indicar la fecha de emisi<73>n del recibo.');
if ARecibosProveedor.DataTable.FieldByName(fld_RecibosProveedorFECHA_VENCIMIENTO).IsNull then
raise Exception.Create('Debe indicar la fecha de vencimiento del recibo.');
{ Asegurarse de valores en campos "autom<6F>ticos" tanto
en MODIFICACI<EFBFBD>N como en INSERCI<EFBFBD>N. }
ARecibosProveedor.Edit;
try
ARecibosProveedor.USUARIO := AppFactuGES.UsuarioActivo.UserName;
Result := True;
finally
ARecibosProveedor.Post;
end;
Result := True;
end;
procedure TRecibosProveedorController.Ver(ARecibosProveedor: IBizRecibosProveedor);
var
AEditor : IEditorReciboProveedor;
begin
AEditor := NIL;
RecuperarProveedor(ARecibosProveedor);
CreateEditor('EditorReciboProveedor', IEditorReciboProveedor, AEditor);
if Assigned(AEditor) then
try
AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
AEditor.Recibo := ARecibosProveedor;
AEditor.ShowModal;
finally
AEditor.Release;
AEditor := NIL;
end;
end;
procedure TRecibosProveedorController.VerTodos(ARecibosProveedor: IBizRecibosProveedor);
var
AEditor : IEditorRecibosProveedor;
begin
AEditor := NIL;
CreateEditor('EditorRecibosProveedor', IEditorRecibosProveedor, AEditor);
if Assigned(AEditor) then
with AEditor do
begin
Controller := Self; //OJO ORDEN MUY IMPORTANTE
RecibosProveedor := ARecibosProveedor;
MultiSelect := True;
ShowEmbedded;
end;
end;
function TRecibosProveedorController.ElegirRecibos(ARecibos: IBizRecibosProveedor; AMensaje: String;
AMultiSelect: Boolean): IBizRecibosProveedor;
var
AEditor : IEditorElegirRecibosProveedor;
begin
Result := NIL;
CreateEditor('EditorElegirRecibosProveedor', IEditorElegirRecibosProveedor, AEditor);
if Assigned(AEditor) then
try
AEditor.Controller := Self;
AEditor.RecibosProveedor := ARecibos;
AEditor.MultiSelect := AMultiSelect;
AEditor.Mensaje := AMensaje;
if IsPositiveResult(AEditor.ShowModal) then
Result := AEditor.RecibosProveedorSeleccionados;
finally
AEditor.Release;
AEditor := NIL;
end;
end;
function TRecibosProveedorController.ElegirRecibosCompensados(ARecibo: IBizRecibosProveedor): Boolean;
var
ARecibosACompensar: IBizRecibosProveedor;
begin
ARecibosACompensar := Self.ElegirRecibos(BuscarRecibosACompensar(ARecibo), 'Elija los recibos que desea compensar', True);
if Assigned(ARecibosACompensar) then
begin
ShowHourglassCursor;
try
DuplicarRegistros(ARecibosACompensar.DataTable, ARecibo.RecibosCompensados.DataTable, mdrTodos, True, True, False);
Result := True;
finally
HideHourglassCursor;
ARecibosACompensar := Nil;
end;
end;
end;
function TRecibosProveedorController.Eliminar(ARecibosProveedor: IBizRecibosProveedor; AllItems: Boolean = false): Boolean;
//En el caso de eliminar almenos un elemento del conjunto se devuelve true
var
bEliminado: Boolean;
begin
bEliminado := False;
if not Assigned(ARecibosProveedor) then
raise Exception.Create ('ARecibosProveedor no asignado');
ShowHourglassCursor;
try
if not ARecibosProveedor.DataTable.Active then
ARecibosProveedor.DataTable.Active := True;
if (ARecibosProveedor.State in dsEditModes) then
ARecibosProveedor.Cancel;
//Siempre eliminaremos el seleccionado
if EsEliminable(ARecibosProveedor) then
begin
ARecibosProveedor.Delete;
bEliminado := True;
end;
//En el caso de querer eliminar todos los items del objeto ARecibosProveedor
if AllItems then
begin
with ARecibosProveedor.DataTable do
begin
First;
while not EOF do
begin
if EsEliminable(ARecibosProveedor) then
begin
ARecibosProveedor.Delete;
bEliminado := True
end
else Next;
end;
end;
end;
if bEliminado then
begin
ARecibosProveedor.DataTable.ApplyUpdates;
Result := True;
end
else
Result := False;
finally
HideHourglassCursor;
end;
end;
function TRecibosProveedorController.EliminarPago(ARecibosProveedor: IBizRecibosProveedor): Boolean;
begin
Result := PagosController.Eliminar(ARecibosProveedor.Pagos);
end;
function TRecibosProveedorController.EliminarTodo(ARecibosProveedor: IBizRecibosProveedor): Boolean;
begin
if Assigned(ARecibosProveedor) then
begin
if not ARecibosProveedor.DataTable.Active then
ARecibosProveedor.DataTable.Active := True;
ARecibosProveedor.DataTable.ClearRows;
ARecibosProveedor.DataTable.ApplyUpdates;
end;
end;
function TRecibosProveedorController.EsEliminable(ARecibo: IBizRecibosProveedor): Boolean;
begin
if not Assigned(ARecibo) then
raise Exception.Create ('Recibo no asignado: EsEliminable');
Result := (ARecibo.SITUACION = CTE_PENDIENTE) AND (ARecibo.ID_FACTURA < 1);
end;
procedure TRecibosProveedorController.RecuperarProveedor(AReciboProveedor: IBizRecibosProveedor);
begin
AReciboProveedor._Proveedor := (FProveedorController.Buscar(AReciboProveedor.ID_PROVEEDOR) as IBizProveedor);
end;
function TRecibosProveedorController.GetPagosController: IPagosProveedorController;
begin
Result := FPagosController;
end;
function TRecibosProveedorController.GetProveedorController: IProveedoresController;
begin
Result := FProveedorController;
end;
procedure TRecibosProveedorController.SetPagosController(const Value: IPagosProveedorController);
begin
FPagosController := Value;
end;
procedure TRecibosProveedorController.SetProveedorController(const Value: IProveedoresController);
begin
FProveedorController := Value;
end;
procedure TRecibosProveedorController.SetSituacionCobrados(ARecibos: IBizRecibosProveedor; WithDeltas: Boolean);
begin
if Assigned(ARecibos) then
begin
ARecibos.DataTable.DisableControls;
try
DesconectarTabla(ARecibos.DataTable);
with ARecibos.DataTable do
begin
First;
while not Eof do
begin
if not Editing then Edit;
ARecibos.SITUACION := CTE_PAGADO;
Post;
Next;
end;
First;
end;
finally
ConectarTabla(ARecibos.DataTable);
ARecibos.DataTable.EnableControls;
end;
end;
end;
function TRecibosProveedorController.ImporteTotalModificado(ARecibosProveedor : IBizRecibosProveedor; var ImporteRestante: Currency) : Boolean;
var
HayCambio: TDADeltaChange;
begin
Result := False;
ImporteRestante := 0;
HayCambio := ARecibosProveedor.DataTable.Delta.FindChange(ARecibosProveedor.RecNo);
if (Assigned(HayCambio)) and
(HayCambio.OldValueByName[fld_RecibosProveedorIMPORTE] <> 0) then
begin
ImporteRestante := HayCambio.OldValueByName[fld_RecibosProveedorIMPORTE] - ARecibosProveedor.IMPORTE;
if ImporteRestante <> 0 then
Result := True;
end;
end;
function TRecibosProveedorController.Guardar(ARecibosProveedor: IBizRecibosProveedor): Boolean;
var
NuevoID : Integer;
ANuevoReciboProveedor : IBizRecibosProveedor;
ImporteRestante : Currency;
begin
Result := False;
ANuevoReciboProveedor := NIL;
ImporteRestante := 0;
if ValidarReciboProveedor(ARecibosProveedor) then
begin
ShowHourglassCursor;
try
//Si el recibo est<73> asociado a una factura y el importe ha cambiado se debe hacer un recibo nuevo con el importe restante
if (ARecibosProveedor.ID_FACTURA > 0) and (ImporteTotalModificado(ARecibosProveedor, ImporteRestante)) then
begin
ANuevoReciboProveedor := Duplicar(ARecibosProveedor);
ANuevoReciboProveedor.Edit;
ANuevoReciboProveedor.REFERENCIA := DarNuevaReferencia(ARecibosProveedor.ID_FACTURA, ARecibosProveedor.REFERENCIA);
ANuevoReciboProveedor.IMPORTE := ImporteRestante;
ANuevoReciboProveedor.DESCRIPCION := 'RECIBO ' + ANuevoReciboProveedor.REFERENCIA + ' - ' + CifraToLetras(ImporteRestante);
ANuevoReciboProveedor.Post;
ARecibosProveedor.Edit;
ARecibosProveedor.DESCRIPCION := 'RECIBO ' + ARecibosProveedor.REFERENCIA + ' - ' + CifraToLetras(ARecibosProveedor.IMPORTE);
ARecibosProveedor.Post;
end;
ARecibosProveedor.DataTable.ApplyUpdates;
if Assigned(ANuevoReciboProveedor) then
ANuevoReciboProveedor.DataTable.ApplyUpdates;
Result := True;
finally
ANuevoReciboProveedor := NIL;
HideHourglassCursor;
end;
end;
end;
procedure TRecibosProveedorController.ModificarPago(ARecibosProveedor: IBizRecibosProveedor; FechaPago: String =''; AIgnorarContabilidad : Integer = 1; AIdSubCuenta: Integer = 0; ASubCuenta: String = '');
begin
if Length(FechaPago) > 0 then
PagosController.Modificar(ARecibosProveedor.Pagos, FechaPago, AIgnorarContabilidad, AIdSubCuenta, ASubCuenta);
end;
function TRecibosProveedorController.Nuevo: IBizRecibosProveedor;
var
ARecibo : IBizRecibosProveedor;
begin
ARecibo := Buscar(ID_NULO);
ARecibo.DataTable.Active := True;
Anadir(ARecibo);
Result := ARecibo;
end;
function TRecibosProveedorController.ExtraerSeleccionados(ARecibosProveedor: IBizRecibosProveedor): IBizRecibosProveedor;
var
ASeleccionados : IBizRecibosProveedor;
begin
ASeleccionados := (Self.Buscar(ID_NULO) as IBizRecibosProveedor);
CopyDataTableDA5(ARecibosProveedor.DataTable, ASeleccionados.DataTable, True);
Result := ASeleccionados;
end;
procedure TRecibosProveedorController.FiltrarAno(ARecibo: IBizRecibosProveedor; ADynWhereDataTable: WideString; const Ano: String);
var
Condicion: TDAWhereExpression;
FechaIni: String;
FechaFin: String;
begin
ARecibo.DataTable.DynamicWhere.Clear;
ARecibo.DataTable.DynamicWhere.Xml := ADynWhereDataTable;
if (Ano <> 'Todos') then
begin
// Filtrar las facturas actuales por empresa
FechaIni := '01/01/' + Ano;
FechaFin := '31/12/' + Ano;
with ARecibo.DataTable.DynamicWhere do
begin
// (FECHA_INICIO between FECHA_FIN)
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorFECHA_EMISION), NewConstant(FechaIni, datString), dboGreaterOrEqual);
Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_RecibosProveedorFECHA_EMISION), NewConstant(FechaFin, datString), dboLessOrEqual), Condicion, dboAnd);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Condicion, Expression, dboAnd);
end;
end;
end;
procedure TRecibosProveedorController.FiltrarEmpresa(ARecibo: IBizRecibosProveedor);
var
Condicion: TDAWhereExpression;
begin
if ARecibo.DataTable.Active then
ARecibo.DataTable.Active := False;
// Filtrar los recibos actuales por empresa
with ARecibo.DataTable.DynamicWhere do
begin
// (ID_EMPRESA >= ID)
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
end;
procedure TRecibosProveedorController.Preview(ARecibosProveedor: IBizRecibosProveedor);
var
AReportController : IRecibosProveedorReportController;
begin
AReportController := TRecibosProveedorReportController.Create;
try
AReportController.Preview(ARecibosProveedor.ID);
finally
AReportController := NIL;
end;
end;
procedure TRecibosProveedorController.Print(ARecibosProveedor: IBizRecibosProveedor);
var
AReportController : IRecibosProveedorReportController;
begin
AReportController := TRecibosProveedorReportController.Create;
try
AReportController.Print(ARecibosProveedor.ID);
finally
AReportController := NIL;
end;
end;
procedure TRecibosProveedorController.QuitarReciboCompensado(ARecibo: IBizRecibosProveedor);
var
IdRecibo: Variant;
begin
IdRecibo := ARecibo.RecibosCompensados.ID;
ARecibo.RecibosCompensados.DataTable.First;
while ARecibo.RecibosCompensados.DataTable.Locate('ID', IdRecibo,[]) do
begin
ARecibo.RecibosCompensados.DataTable.Delete;
ARecibo.RecibosCompensados.DataTable.First;
end;
end;
procedure TRecibosProveedorController.QuitarRemesa(ARecibos: IBizRecibosProveedor);
begin
if Assigned(ARecibos) then
begin
if ARecibos.Pagos.DataTable.RecordCount = 0 then
Exit;
//Eliminamos el cobro generado por la remesa y quitamos el ID_REMESA del recibo
ARecibos.Pagos.DataTable.Last;
ARecibos.Pagos.Delete;
ARecibos.DataTable.Edit;
ARecibos.ID_REMESA := 0;
ARecibos.DataTable.Post;
end;
end;
end.