{ =============================================================================== 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, 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ó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ó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ó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á 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._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); // ¡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ó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; 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á 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.