unit uBizRecibosCliente; interface uses uDAInterfaces, uDADataTable, Classes, uBizContacto, DB, uDBSelectionList, uExceptions, uBizInformesBase, schRecibosClienteClient_Intf; const BIZ_RECIBOSCLIENTE = 'Client.RecibosCliente'; type IBizRecibosCliente = interface(IRecibosCliente) ['{362DC7FF-2017-43B9-8F2C-A29C4F550C0B}'] function GetCliente: IBizContacto; procedure SetCliente(Value: IBizContacto); property Cliente: IBizContacto read GetCliente write SetCliente; procedure Show; procedure CopyFrom(AReciboCliente : IBizRecibosCliente); end; TBizRecibosCliente = class(TRecibosClienteDataTableRules, IBizRecibosCliente, ISelectedRowList, IApplyUpdateFailedException, IBizInformesAware) private FCliente : IBizContacto; FSelectedRows : TSelectedRowList; protected function GetCliente: IBizContacto; procedure SetCliente(Value: IBizContacto); procedure OnNewRecord(Sender: TDADataTable); override; procedure ShowApplyUpdateFailed (const Error: EDAApplyUpdateFailed); function GetSelectedRows : TSelectedRowList; procedure OnPostError(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); override; procedure BeforeApplyUpdates(Sender : TDADataTable; const Delta : IDADelta); public property Cliente: IBizContacto read GetCliente write SetCliente; constructor Create(aDataTable: TDADataTable); override; destructor Destroy; override; procedure Show; virtual; procedure Preview; procedure Print; property SelectedRows : TSelectedRowList read GetSelectedRows; procedure CopyFrom(AReciboCliente : IBizRecibosCliente); end; procedure ValidarReciboCliente (const AReciboCliente : IBizRecibosCliente); implementation uses Windows, Dialogs, uDACDSDataTable, SysUtils, uEditorUtils, Variants, Math, uDataModuleContactos, Controls, Forms, uDataModuleBase, uDataTableUtils, uDataModuleRecibosCliente, LiteralesRecibosCliente; procedure ValidarReciboCliente (const AReciboCliente : IBizRecibosCliente); begin if (FloatToStr(AReciboCliente.FECHARECIBO) = '0') then raise Exception.Create(msgLitFechaObligatorio); if not Assigned(AReciboCliente.Cliente) or (AReciboCliente.Cliente.DataTable.IsEmpty) then raise Exception.Create(msgLitClienteObligatorio); end; constructor TBizRecibosCliente.Create(aDataTable: TDADataTable); begin inherited; FCliente := NIL; FSelectedRows := TSelectedRowList.Create(aDataTable); aDataTable.OnBeforeApplyUpdates := BeforeApplyUpdates; end; destructor TBizRecibosCliente.Destroy; begin FCliente := NIL; FSelectedRows.Free; inherited; end; function TBizRecibosCliente.GetCliente: IBizContacto; begin if not Assigned(FCliente) or ((CODIGOCONTACTO <> FCliente.Codigo) and not (FCliente.DataTable.State in dsEditModes)) then begin FCliente := dmContactos.GetContacto(CODIGOCONTACTO); if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; if not FCliente.DataTable.IsEmpty then // Está vacío si la factura es nueva y no tiene cliente begin FCliente.Edit; FCliente.NOMBRE := NOMBRE; FCliente.NIFCIF := NIFCIF; FCliente.CALLE := CALLE; FCliente.CODIGOPOSTAL := CODIGOPOSTAL; FCliente.PROVINCIA := PROVINCIA; FCliente.POBLACION := POBLACION; FCliente.Post; end; end; Result := FCliente; end; procedure TBizRecibosCliente.CopyFrom(AReciboCliente : IBizRecibosCliente); var ACursor: TCursor; begin if not (State in dsEditModes) then Edit; ACursor := Screen.Cursor; Screen.Cursor := crHourGlass; Application.ProcessMessages; try CODIGO := dmRecibosCliente.GetNextAutoinc; FECHAALTA := dmBase.Fecha; USUARIO := dmBase.Usuario; FECHARECIBO := AReciboCliente.FECHARECIBO; IMPORTE := AReciboCliente.IMPORTE; TEXTO := AReciboCliente.TEXTO; CODIGOCONTACTO := AReciboCliente.CODIGOCONTACTO; Cliente := AReciboCliente.Cliente; if not AReciboCliente.DataTable.FieldByName(fld_RecibosClienteCODIGOOBRA).IsNull then CODIGOOBRA := AReciboCliente.CODIGOOBRA; Post; MessageBox(0, 'Se ha duplicado correctamente el recibo elegida.', 'Recibo duplicado', MB_ICONWARNING or MB_OK); finally Screen.Cursor := ACursor; end; end; procedure TBizRecibosCliente.OnNewRecord(Sender: TDADataTable); begin inherited; USUARIO := dmBase.Usuario; FECHAALTA := dmBase.Fecha; FECHARECIBO := dmBase.Fecha; CODIGO := dmRecibosCliente.GetNextAutoinc; IMPORTE := 0; end; procedure TBizRecibosCliente.Preview; begin dmRecibosCliente.Preview(Self.CODIGO); end; procedure TBizRecibosCliente.SetCliente(Value: IBizContacto); var bEnEdicion : Boolean; begin bEnEdicion := (DataTable.State in dsEditModes); if not bEnEdicion then Edit; FCliente := Value; if Assigned(FCliente) then begin CODIGOCONTACTO := FCliente.CODIGO; NOMBRE := FCliente.NOMBRE; NIFCIF := FCliente.NIFCIF; CALLE := FCliente.CALLE; CODIGOPOSTAL := FCliente.CODIGOPOSTAL; PROVINCIA := FCliente.PROVINCIA; POBLACION := FCliente.POBLACION; if not bEnEdicion then Post; end end; procedure TBizRecibosCliente.Show; begin ShowEditor(IBizRecibosCliente, Self, etItem); end; function TBizRecibosCliente.GetSelectedRows: TSelectedRowList; begin Result := FSelectedRows; end; procedure TBizRecibosCliente.ShowApplyUpdateFailed(const Error: EDAApplyUpdateFailed); begin if (Pos(AUF_FKVIOLATION, Error.Message) > 0) then MessageBox(0, PChar(msgLitErrorBorrar), 'Atención', MB_ICONWARNING or MB_OK); end; procedure TBizRecibosCliente.Print; begin dmRecibosCliente.Print(Self.CODIGO); end; procedure TBizRecibosCliente.OnPostError(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); begin inherited; Action := daAbort; if (Pos('Nombre', Error.Message) > 0) then MessageBox(0, PChar(msgLitClienteObligatorio), 'Atención', MB_ICONWARNING or MB_OK) else if (Pos('Fecha', Error.Message) > 0) then MessageBox(0, PChar(msgLitFechaObligatorio), 'Atención', MB_ICONWARNING or MB_OK) else raise Error; end; procedure TBizRecibosCliente.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 : ValidarReciboCliente(Self); //ctDelete : end; end; initialization RegisterDataTableRules(BIZ_RECIBOSCLIENTE, TBizRecibosCliente); finalization end.