unit uBizFacturasProveedor; interface uses uDAInterfaces, uDADataTable, Classes, uBizContacto, DB, uBizImportesDetalleBase, uBizImportesCabeceraBase, uDBSelectionList, uExceptions, uBizInformesBase, schFacturasProveedorClient_Intf; const BIZ_FACTURASPROVEEDOR = 'Client.FacturasProveedor'; SITUACION_PENDIENTE = 'Pendiente'; SITUACION_PAGADO = 'Pagado'; type IBizFacturasProveedor = interface(IFacturasProveedor) ['{1D9E1949-8CC3-4776-BA2C-7E1F4A73A432}'] function GetProveedor: IBizProveedor; procedure SetProveedor(Value: IBizProveedor); property Proveedor: IBizProveedor read GetProveedor write SetProveedor; procedure Show; procedure CopyFrom(AFacturaProveedor : IBizFacturasProveedor); end; TBizFacturasProveedor = class(TFacturasProveedorDataTableRules, IBizFacturasProveedor, IBizImportesCabecera, ISelectedRowList, IApplyUpdateFailedException) private FProveedor : IBizProveedor; FSelectedRows : TSelectedRowList; protected procedure ShowApplyUpdateFailed (const Error: EDAApplyUpdateFailed); function GetProveedor: IBizProveedor; procedure SetProveedor(Value: IBizProveedor); procedure OnNewRecord(Sender: TDADataTable); override; function GetSelectedRows : TSelectedRowList; procedure BeforeDelete(Sender: TDADataTable); override; procedure OnPostError(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); override; procedure BeforeApplyUpdates(Sender : TDADataTable; const Delta : IDADelta); public procedure RecalcularImporte; property Proveedor: IBizProveedor read GetProveedor write SetProveedor; procedure Show; procedure CopyFrom(AFacturaProveedor : IBizFacturasProveedor); overload; constructor Create(aDataTable: TDADataTable); override; destructor Destroy; override; property SelectedRows : TSelectedRowList read GetSelectedRows; end; procedure ValidarFacturaProveedor (const AFacturaProveedor : IBizFacturasProveedor); implementation uses Windows, Dialogs, uDACDSDataTable, SysUtils, uEditorUtils, Variants, Math, uDataModuleContactos, Controls, Forms, uDataModuleBase, uDataModuleUsuarios, uDataTableUtils, uDataModuleFacturasProveedor; var FCancelInsert : Boolean; procedure ValidarFacturaProveedor (const AFacturaProveedor : IBizFacturasProveedor); begin if (FloatToStr(AFacturaProveedor.FECHAFACTURA) = '0') then raise Exception.Create('Debe indicar la fecha de esta factura'); if not Assigned(AFacturaProveedor.Proveedor) or (AFacturaProveedor.Proveedor.DataTable.IsEmpty) then raise Exception.Create('Debe indicar el proveedor de esta factura'); end; constructor TBizFacturasProveedor.Create(aDataTable: TDADataTable); begin inherited; FProveedor := NIL; FSelectedRows := TSelectedRowList.Create(aDataTable); aDataTable.OnBeforeApplyUpdates := BeforeApplyUpdates; end; destructor TBizFacturasProveedor.Destroy; begin FProveedor := NIL; FSelectedRows.Free; inherited; end; function TBizFacturasProveedor.GetProveedor: IBizProveedor; begin if not Assigned(FProveedor) or (CODIGOPROVEEDOR <> FProveedor.Codigo) and not (FProveedor.DataTable.State in dsEditModes) then begin FProveedor := dmContactos.GetProveedor(CODIGOPROVEEDOR); if not FProveedor.DataTable.Active then FProveedor.DataTable.Active := True; if not FProveedor.DataTable.IsEmpty then // Está vacío si la factura es nueva y no tiene proveedor begin FProveedor.Edit; FProveedor.NOMBRE := NOMBRE; FProveedor.NIFCIF := NIFCIF; FProveedor.CALLE := CALLE; FProveedor.CODIGOPOSTAL := CODIGOPOSTAL; FProveedor.PROVINCIA := PROVINCIA; FProveedor.POBLACION := POBLACION; FProveedor.Post; end; end; Result := FProveedor; end; procedure TBizFacturasProveedor.CopyFrom(AFacturaProveedor : IBizFacturasProveedor); var ACursor: TCursor; begin { if not (State in dsEditModes) then Edit; ACursor := Screen.Cursor; Screen.Cursor := crHourGlass; Application.ProcessMessages; try CODIGOEMPRESA := APresupuesto.CODIGOEMPRESA; CODIGOCONTACTO := APresupuesto.CODIGOCONTACTO; BASEIMPONIBLE := APresupuesto.BASEIMPONIBLE; DESCUENTO := APresupuesto.DESCUENTO; IVA := APresupuesto.IVA; OBSERVACIONES := APresupuesto.OBSERVACIONES; FORMAPAGO := APresupuesto.FORMAPAGO; CODIGOPRESUPUESTO := APresupuesto.CODIGO; Proveedor := APresupuesto.Proveedor; Detalles.CopyFrom(APresupuesto.Detalles); RecalcularImporte; MessageBox(0, 'Se ha copiado correctamente el presupuesto elegido en este albarán.', 'Presupuesto copiado', MB_ICONWARNING or MB_OK); finally Screen.Cursor := ACursor; end;} end; procedure TBizFacturasProveedor.OnNewRecord(Sender: TDADataTable); begin inherited; CODIGOEMPRESA := dmBase.CodigoEmpresa; USUARIO := dmUsuarios.LoginInfo.UserID; FECHAALTA := Date; FECHAFACTURA := Date; CODIGO := dmFacturasProveedor.GetNextAutoinc; end; procedure TBizFacturasProveedor.SetProveedor(Value: IBizProveedor); var bEnEdicion : Boolean; begin bEnEdicion := (DataTable.State in dsEditModes); if not bEnEdicion then Edit; FProveedor := Value; if Assigned(FProveedor) then begin CODIGOPROVEEDOR := FProveedor.CODIGO; NOMBRE := FProveedor.NOMBRE; NIFCIF := FProveedor.NIFCIF; CALLE := FProveedor.CALLE; CODIGOPOSTAL := FProveedor.CODIGOPOSTAL; PROVINCIA := FProveedor.PROVINCIA; POBLACION := FProveedor.POBLACION; if not bEnEdicion then Post; end end; procedure TBizFacturasProveedor.Show; begin ShowEditor(IBizFacturasProveedor, Self, etItem); end; function TBizFacturasProveedor.GetSelectedRows: TSelectedRowList; begin Result := FSelectedRows; end; procedure TBizFacturasProveedor.ShowApplyUpdateFailed( const Error: EDAApplyUpdateFailed); begin if (Pos(AUF_FKVIOLATION, Error.Message) > 0) then MessageBox(0, 'No se puede borrar este albarán porque tiene una factura asociada', 'Atención', MB_ICONWARNING or MB_OK); end; procedure TBizFacturasProveedor.BeforeDelete(Sender: TDADataTable); begin inherited; if not dmFacturasProveedor.PuedoEliminarFactura(CODIGO) then raise Exception.Create('No se puede borrar esta factura porque...'); end; procedure TBizFacturasProveedor.OnPostError(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); begin inherited; Action := daAbort; if (Pos(AUF_HAVEVALUE, Error.Message) > 0) then begin if (Pos('contacto', Error.Message) > 0) then MessageBox(0, 'Debe indicar el proveedor de esta factura', 'Atención', MB_ICONWARNING or MB_OK) else if (Pos('Fecha albarán', Error.Message) > 0) then MessageBox(0, 'Debe indicar la fecha de esta factura', 'Atención', MB_ICONWARNING or MB_OK) else raise Error; end else raise Error; end; procedure TBizFacturasProveedor.BeforeApplyUpdates(Sender: TDADataTable; const Delta: IDADelta); var i : integer; begin for i := 0 to Delta.Count - 1 do case Delta.Changes[i].ChangeType of ctInsert, ctUpdate : ValidarFacturaProveedor(Self); //ctDelete : end; end; procedure TBizFacturasProveedor.RecalcularImporte; begin RecalcularImportesCabecera(Self.DataTable); end; initialization RegisterDataTableRules(BIZ_FACTURASPROVEEDOR, TBizFacturasProveedor); finalization end.