{ =============================================================================== 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 uPagosProveedorController; interface uses Classes, SysUtils, uDADataTable, uControllerBase, uIDataModuleRecibosProveedor, uBizPagosProveedor; type IPagosProveedorController = interface(ISujeto) ['{4F907D80-B184-4557-BAB7-9FDA23260E64}'] function Anadir(APagosProveedor: IBizPagosProveedor; Const Fecha: String = ''): Boolean; procedure Modificar(APagosProveedor: IBizPagosProveedor; Const Fecha: String); function Eliminar(APagoCliente : IBizPagosProveedor): Boolean; function EliminarTodo(APagossCliente : IBizPagosProveedor): Boolean; procedure AsignarID(APagosProveedor: IBizPagosProveedor; IDCabecera: Integer; AEsNuevo:Boolean); end; TPagosProveedorController = class(TSujeto, IPagosProveedorController) protected FDataModule : IDataModuleRecibosProveedor; procedure AsignarDataModule; procedure AsignarDatos(APagosProveedor: IBizPagosProveedor; IDCabecera: Integer); public constructor Create; virtual; destructor Destroy; override; procedure AsignarID(APagosProveedor: IBizPagosProveedor; IDCabecera: Integer; AEsNuevo:Boolean); function Anadir(APagosProveedor: IBizPagosProveedor; Const Fecha: String = ''): Boolean; procedure Modificar(APagosProveedor: IBizPagosProveedor; Const Fecha: String); function Eliminar(APagoCliente : IBizPagosProveedor): Boolean; function EliminarTodo(APagosProveedor : IBizPagosProveedor): Boolean; end; implementation uses cxControls, DB, uEditorRegistryUtils,Dialogs, uDAInterfaces, uDataTableUtils, uDataModuleUsuarios, uDateUtils, uROTypes, DateUtils, Controls, Windows, Variants, schRecibosProveedorClient_Intf, uDataModuleRecibosProveedor; { TPagosProveedorController } function TPagosProveedorController.Anadir(APagosProveedor: IBizPagosProveedor; Const Fecha: String = ''): Boolean; { Si el pago introducido es un pago y no una devolución devolvemos true en caso de ser una devolución devolvemos false} begin APagosProveedor.Append; if Length(Fecha) = 0 then APagosProveedor.FECHA_PAGO := Date else APagosProveedor.FECHA_PAGO := StrToDate(Fecha); if (APagosProveedor.DataTable.RecordCount = 0) or ((APagosProveedor.DataTable.RecordCount mod 2) = 0) then APagosProveedor.TIPO := CTE_PAGO else APagosProveedor.TIPO := CTE_DEVOLUCION; Result := (APagosProveedor.TIPO = CTE_PAGO); APagosProveedor.Post; end; procedure TPagosProveedorController.AsignarDataModule; begin FDataModule := TDataModuleRecibosProveedor.Create(Nil); end; procedure TPagosProveedorController.AsignarDatos(APagosProveedor: IBizPagosProveedor; IDCabecera: Integer); begin inherited; APagosProveedor.Edit; APagosProveedor.ID := FDataModule.GetNextID(APagosProveedor.DataTable.LogicalName); APagosProveedor.ID_RECIBO := IDCabecera; APagosProveedor.Post end; procedure TPagosProveedorController.AsignarID(APagosProveedor: IBizPagosProveedor; IDCabecera: Integer; AEsNuevo:Boolean); begin with APagosProveedor do begin DataTable.DisableControls; try begin if not DataTable.Active then DataTable.Active := True; { ˇˇˇˇ OJO !!!! Para asignar el ID en los detalles hay que tener en cuenta una cosa: Si se cambia el ID, ese detalle ya no pertenece a esa cabecera porque ya no se cumple la condición de la relacion: Master.ID = Detail.ID_PRESUPUESTO. Por esa razón no sirve hacer un recorrido desde el principio hasta el final porque las detalles van desapareciendo según asignamos el valor al campo ID y nos mueve aleatoriamente la posición del registro actual. Es mejor hacer un bucle sencillo hasta que "se gasten" todos los detalles. Cuando el RecordCount llegue a 0 quiere decir que hemos tratado todos los detalles. El bucle cambia en el caso de ser llamada esta funcion desde modificar un presupuesto ya que en ese caso si que hay que hacer un recorrido total de las tuplas de detalle. } if AEsNuevo then begin while RecordCount > 0 do begin DataTable.First; AsignarDatos(APagosProveedor, IDCabecera); end end else begin DataTable.First; while not DataTable.EOF do begin if DataTable.FieldByName('ID').AsInteger < 0 then AsignarDatos(APagosProveedor, IDCabecera); DataTable.Next end; end; end; finally DataTable.EnableControls; end; end; end; constructor TPagosProveedorController.Create; begin AsignarDataModule; end; destructor TPagosProveedorController.Destroy; begin FDataModule := NIL; inherited; end; function TPagosProveedorController.Eliminar(APagoCliente: IBizPagosProveedor): Boolean; { En el caso de eliminar un pago del recibo devuelve true, mientras que si lo que se borra es una devolución devuelve false} begin Result := False; if not Assigned(APagoCliente) then raise Exception.Create ('IBizPagosProveedor no asignado'); ShowHourglassCursor; try if (APagoCliente.State in dsEditModes) then APagoCliente.Cancel; APagoCliente.Last; Result := (APagoCliente.TIPO = CTE_PAGO); APagoCliente.Delete; //Todo lo haremos en memoria ya que los pagos no tienen entidad propia //APagosProveedor.DataTable.ApplyUpdates; finally HideHourglassCursor; end; end; function TPagosProveedorController.EliminarTodo(APagosProveedor: IBizPagosProveedor): Boolean; begin if Assigned(APagosProveedor) then begin if not APagosProveedor.DataTable.Active then APagosProveedor.DataTable.Active := True; APagosProveedor.DataTable.ClearRows; //Todo lo haremos en memoria ya que los pagos no tienen entidad propia //APagosProveedor.DataTable.ApplyUpdates; end; end; procedure TPagosProveedorController.Modificar(APagosProveedor: IBizPagosProveedor; const Fecha: String); begin APagosProveedor.DataTable.Edit; APagosProveedor.FECHA_PAGO := StrToDate(Fecha); APagosProveedor.DataTable.Post; end; end.