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

931 lines
32 KiB
ObjectPascal
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
===============================================================================
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 uRecibosProveedorController;
interface
uses
Classes, SysUtils, uDADataTable, uControllerBase,
uPagosProveedorController, uProveedoresController,
uBizRecibosProveedor, uIDataModuleRecibosProveedor;
type
IRecibosProveedorController = interface(IControllerBase)
['{763DF610-3540-42BE-A09A-35AABFAF2DA1}']
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 =''): Boolean;
procedure ModificarPago(ARecibosProveedor : IBizRecibosProveedor);
function Eliminar(ARecibosProveedor : IBizRecibosProveedor): 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 RecuperarCliente(AReciboProveedor : IBizRecibosProveedor);
function Buscar(const ID: Integer): IBizRecibosProveedor;
function BuscarTodos: IBizRecibosProveedor; overload;
function BuscarTodos(const ID_Proveedor: Integer): IBizRecibosProveedor; overload;
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;
const AVerModal : Boolean = False; const AWindowCaption: String = '';
const AHeaderText: String = '');
procedure Ver(ARecibosProveedor: IBizRecibosProveedor);
function ExtraerSeleccionados(ARecibosProveedor: IBizRecibosProveedor) : IBizRecibosProveedor;
procedure AsignarRemesa(ARecibos : IBizRecibosProveedor; ID_REMESA: Integer);
procedure QuitarRemesa(ARecibos : IBizRecibosProveedor);
procedure SetSituacionCobrados(ARecibos : IBizRecibosProveedor; WithDeltas: Boolean=False);
function ElegirRecibos(ARecibos : IBizRecibosProveedor; AMensaje: String; AMultiSelect: Boolean): IBizRecibosProveedor;
function ElegirRecibosCompensados(ARecibo : IBizRecibosProveedor): Boolean;
procedure QuitarReciboCompensado(ARecibo : IBizRecibosProveedor);
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;
FClienteController : 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 PagosController: IPagosProveedorController read GetPagosController write SetPagosController;
constructor Create; override;
destructor Destroy; override;
procedure RecuperarCliente(AReciboProveedor : IBizRecibosProveedor);
procedure Anadir(ARecibosProveedor : IBizRecibosProveedor);
function AnadirPago(ARecibosProveedor : IBizRecibosProveedor; FechaPago: String =''): Boolean;
procedure ModificarPago(ARecibosProveedor : IBizRecibosProveedor);
function Eliminar(ARecibosProveedor : IBizRecibosProveedor): 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; overload;
function BuscarTodos(const ID_Proveedor: Integer): IBizRecibosProveedor; overload;
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;
const AVerModal : Boolean = False; const AWindowCaption: String = '';
const AHeaderText: String = '');
procedure Ver(ARecibosProveedor: IBizRecibosProveedor);
function ExtraerSeleccionados(ARecibosProveedor: IBizRecibosProveedor) : IBizRecibosProveedor;
function ElegirRecibos(ARecibos : IBizRecibosProveedor; AMensaje: String; AMultiSelect: Boolean): IBizRecibosProveedor;
function ElegirRecibosCompensados(ARecibo : IBizRecibosProveedor): Boolean;
procedure AsignarRemesa(ARecibos : IBizRecibosProveedor; ID_REMESA: Integer);
procedure QuitarRemesa(ARecibos : IBizRecibosProveedor);
procedure QuitarReciboCompensado(ARecibo : IBizRecibosProveedor);
procedure SetSituacionCobrados(ARecibos : IBizRecibosProveedor; WithDeltas: Boolean=False);
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, uStringsUtils,
schRecibosProveedorClient_Intf, uIEditorRecibosProveedor, uIEditorReciboProveedor,
uDataModuleRecibosProveedor, uIEditorFechaPagoProveedor, uIEditorElegirRecibosProveedor;
{ TRecibosProveedorController }
procedure TRecibosProveedorController.Anadir(ARecibosProveedor: IBizRecibosProveedor);
begin
ARecibosProveedor.Insert;
end;
function TRecibosProveedorController.AnadirPago(ARecibosProveedor: IBizRecibosProveedor; FechaPago: String =''): Boolean;
var
AEditor : IEditorFechaPagoProveedor;
begin
Result := False;
//Pedimos la fecha del pago
if (Length(FechaPago) = 0) then
begin
CreateEditor('EditorFechaPagoProveedor', IEditorFechaPagoProveedor, AEditor);
if Assigned(AEditor) then
try
if (AEditor.ShowModal = mrOk) then
FechaPago := DateToStr(AEditor.FechaPago);
finally
AEditor.Release;
AEditor := NIL;
end;
end;
// Se cancela la operación
if Length(FechaPago) = 0 then
Exit;
//Finalmente añadimos el pago (pago o devolucion)
if PagosController.Anadir(ARecibosProveedor.Pagos, FechaPago) then
begin
ARecibosProveedor.Edit;
ARecibosProveedor.SITUACION := CTE_PAGADO;
Result := True;
end
//Podremos modificar si anulamos el pago mediante una devolución
else
begin
ARecibosProveedor.Edit;
ARecibosProveedor.SITUACION := CTE_DEVUELTO;
Result := False;
end;
end;
procedure TRecibosProveedorController.AsignarDataModule;
begin
FDataModule := TDataModuleRecibosProveedor.Create(Nil);
end;
procedure TRecibosProveedorController.AsignarRemesa(ARecibos: IBizRecibosProveedor; ID_REMESA: 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)); //->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;
constructor TRecibosProveedorController.Create;
begin
inherited;
AsignarDataModule;
FPagosController := TPagosProveedorController.Create;
FClienteController := 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á 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á 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á 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.BuscarTodos(
const ID_Proveedor: Integer): IBizRecibosProveedor;
var
Condicion: TDAWhereExpression;
begin
ShowHourglassCursor;
try
Result := BuscarTodos;
with Result.DataTable.DynamicWhere do
begin
Condicion := NewBinaryExpression(NewField('', fld_RecibosProveedorID_PROVEEDOR),
NewConstant(ID_Proveedor, 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;
FClienteController := 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);
// ¡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;
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ó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áticos" tanto
en MODIFICACIÓN como en INSERCIÓN. }
ARecibosProveedor.Edit;
try
ARecibosProveedor.USUARIO := AppFactuGES.UsuarioActivo.UserName;
finally
ARecibosProveedor.Post;
end;
Result := True;
end;
procedure TRecibosProveedorController.Ver(ARecibosProveedor: IBizRecibosProveedor);
var
AEditor : IEditorReciboProveedor;
begin
AEditor := NIL;
RecuperarCliente(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;
const AVerModal : Boolean = False; const AWindowCaption: String = '';
const AHeaderText: String = '');
var
AEditor : IEditorRecibosProveedor;
begin
AEditor := NIL;
CreateEditor('EditorRecibosProveedor', IEditorRecibosProveedor, AEditor);
if Assigned(AEditor) then
try
if not EsCadenaVacia(AWindowCaption) then
AEditor.WindowCaption := AWindowCaption;
if not EsCadenaVacia(AHeaderText) then
AEditor.HeaderText := AHeaderText;
AEditor.Controller := Self;
AEditor.RecibosProveedor := ARecibosProveedor;
if AVerModal then
AEditor.ShowModal
else
AEditor.ShowEmbedded;
finally
if AVerModal then
AEditor.Release;
AEditor := NIL;
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;
end;
end;
function TRecibosProveedorController.ElegirRecibosCompensados(ARecibo: IBizRecibosProveedor): Boolean;
var
ARecibosACompensar: IBizRecibosProveedor;
begin
Result := False;
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): Boolean;
begin
if not Assigned(ARecibosProveedor) then
raise Exception.Create ('IBizRecibosProveedor no asignado');
ShowHourglassCursor;
try
if (ARecibosProveedor.State in dsEditModes) then
ARecibosProveedor.Cancel;
ARecibosProveedor.Delete;
ARecibosProveedor.DataTable.ApplyUpdates;
HideHourglassCursor;
Result := True;
finally
HideHourglassCursor;
end;
end;
function TRecibosProveedorController.EliminarPago(ARecibosProveedor: IBizRecibosProveedor): Boolean;
begin
Result := PagosController.Eliminar(ARecibosProveedor.Pagos);
end;
function TRecibosProveedorController.EliminarTodo(ARecibosProveedor: IBizRecibosProveedor): Boolean;
begin
Result := False;
if Assigned(ARecibosProveedor) then
begin
if not ARecibosProveedor.DataTable.Active then
ARecibosProveedor.DataTable.Active := True;
ARecibosProveedor.DataTable.ClearRows;
ARecibosProveedor.DataTable.ApplyUpdates;
end;
end;
procedure TRecibosProveedorController.RecuperarCliente(
AReciboProveedor: IBizRecibosProveedor);
begin
AReciboProveedor._Proveedor := (FClienteController.Buscar(AReciboProveedor.ID_PROVEEDOR) as IBizProveedor);
end;
function TRecibosProveedorController.GetPagosController: IPagosProveedorController;
begin
Result := FPagosController;
end;
procedure TRecibosProveedorController.SetPagosController(const Value: IPagosProveedorController);
begin
FPagosController := 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
ANuevoReciboProveedor : IBizRecibosProveedor;
ImporteRestante : Currency;
begin
Result := False;
ANuevoReciboProveedor := NIL;
ImporteRestante := 0;
if ValidarReciboProveedor(ARecibosProveedor) then
begin
ShowHourglassCursor;
try
//Si el importe ha cambiado se debe hacer un recibo nuevo con el importe restante
if 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);
var
AEditor : IEditorFechaPagoProveedor;
FechaPago: String;
begin
//Pedimos la fecha del pago
CreateEditor('EditorFechaPagoProveedor', IEditorFechaPagoProveedor, AEditor);
if Assigned(AEditor) then
try
FechaPago:= '';
if (AEditor.ShowModal = mrOk) then
FechaPago := DateToStr(AEditor.FechaPago);
finally
AEditor.Release;
AEditor := NIL;
end;
if Length(FechaPago) > 0 then
PagosController.Modificar(ARecibosProveedor.Pagos, FechaPago);
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.