unit uBizMontajes; interface uses uDAInterfaces, uDADataTable, schMontajesClient_Intf, Classes, DBGrids, uDBSelectionList, DB, uExceptions, Controls, uBizContacto, uBizPresupuestosCliente, uBizInformesBase; Const SITUACION_PENDIENTE = 'Pendiente'; SITUACION_PENDIENTERECEPCION = 'Pendiente recepción'; SITUACION_PENDIENTEMONTAJE = 'Pendiente montaje'; SITUACION_PENDIENTEPAGO = 'Pendiente pago'; SITUACION_PAGADO = 'Pagado y terminado'; Type TEnumSituacion = (sitPendientes, sitPendienteRecepcion, sitPendienteMontaje, sitPendientePago, sitPagado); IBizFichaBeneficiosAux = interface(IFichaBeneficios_Aux) ['{640104F5-36DA-4A00-9355-E731B83BCE99}'] end; IBizFichaBeneficiosMontaje = interface(IFichaBeneficios) ['{1A7191CB-6F5C-4E1C-9024-E71C5718EF8B}'] procedure AnadirFichaBeneficiosDefecto(const pCodigoMontaje: integer; const Tipo: String); end; IBizMontaje = interface(IMONTAJES) ['{03F707D7-E00A-43D7-B14D-7450C0C9771F}'] procedure Show; procedure ShowAll; procedure Preview; procedure Print; function ShowForSelect : TModalResult; function GetCliente: IBizCliente; procedure SetCliente(Value: IBizCliente); property Cliente: IBizCliente read GetCliente write SetCliente; function GetPresupuesto: IBizPresupuestos; procedure SetPresupuesto(Value: IBizPresupuestos); property Presupuesto: IBizPresupuestos read GetPresupuesto write SetPresupuesto; function GetFichaBeneficios: IBizFichaBeneficiosMontaje; procedure SetFichaBeneficios(Value: IBizFichaBeneficiosMontaje); property FichaBeneficios: IBizFichaBeneficiosMontaje read GetFichaBeneficios write SetFichaBeneficios; function GetTipoFichaBeneficios: String; procedure SetTipoFichaBeneficios(Value: String); property TipoFichaBeneficios: String read GetTipoFichaBeneficios write SetTipoFichaBeneficios; procedure PreviewLabels; procedure PrintLabels; function GetLabelCount: Integer; procedure SetLabelCount(Value: Integer); property LabelCount: Integer read GetLabelCount write SetLabelCount; end; TBizMontajeDataTableRules = class(TMONTAJESDataTableRules, IBizMontaje, IApplyUpdateFailedException, ISelectedRowList, IBizInformesAware) private FCliente : IBizCliente; FPresupuesto : IBizPresupuestos; FFichaBeneficios : IBizFichaBeneficiosMontaje; FFichaBeneficiosLink: TDADataSource; FTipoFichaBeneficios : String; FSelectedRows : TSelectedRowList; FLabelCount : Integer; procedure ShowToSelect; function OnApplyUpdateFailed: Boolean; procedure BeforeApplyUpdates(Sender: TDADataTable; const Delta: IDADelta); procedure AfterApplyUpdates(Sender: TDADataTable); procedure OnPostError(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); override; procedure AsignarReferencia; protected function GetLabelCount: Integer; procedure SetLabelCount(Value: Integer); function GetCliente: IBizCliente; procedure SetCliente(Value: IBizCliente); function GetPresupuesto: IBizPresupuestos; procedure SetPresupuesto(Value: IBizPresupuestos); function GetFichaBeneficios: IBizFichaBeneficiosMontaje; procedure SetFichaBeneficios(Value: IBizFichaBeneficiosMontaje); function GetTipoFichaBeneficios: String; procedure SetTipoFichaBeneficios(Value: String); procedure OnNewRecord(Sender: TDADataTable); override; function GetSelectedRows : TSelectedRowList; virtual; procedure ShowApplyUpdateFailed (const Error: EDAApplyUpdateFailed); virtual; procedure BeforeDelete(Sender: TDADataTable); override; public constructor Create(aDataTable: TDADataTable); override; destructor Destroy; override; procedure Show; virtual; procedure ShowAll; virtual; procedure Preview; procedure Print; virtual; function ShowForSelect : TModalResult; virtual; property SelectedRows : TSelectedRowList read GetSelectedRows; property Cliente: IBizCliente read GetCliente write SetCliente; property Presupuesto: IBizPresupuestos read GetPresupuesto write SetPresupuesto; property FichaBeneficios: IBizFichaBeneficiosMontaje read GetFichaBeneficios write SetFichaBeneficios; property TipoFichaBeneficios: String read GetTipoFichaBeneficios write SetTipoFichaBeneficios; procedure PreviewLabels; procedure PrintLabels; property LabelCount: Integer read GetLabelCount write SetLabelCount; end; TBizFichaBeneficiosAuxDataTableRules = class(TFichaBeneficios_AuxDataTableRules, IBizFichaBeneficiosAux) end; TBizFichaBeneficiosMontajeDataTableRules = class(TFichaBeneficiosDataTableRules, IBizFichaBeneficiosMontaje, IApplyUpdateFailedException) protected procedure OnNewRecord(Sender: TDADataTable); override; procedure ShowApplyUpdateFailed (const Error: EDAApplyUpdateFailed); virtual; public procedure AnadirFichaBeneficiosDefecto(const pCodigoMontaje: integer; const Tipo: String); end; procedure ValidarMontaje (const AMontaje : IBizMontaje); implementation uses Windows, Dialogs, uDACDSDataTable, SysUtils, uDataModuleBase, uDataModuleUsuarios, uEditorUtils, uDataModuleMontajes, Variants, Forms, uDataModuleContactos, uDataModulePresupuestos; procedure ValidarMontaje (const AMontaje : IBizMontaje); begin // end; { TBizMontajeDataTableRules } { ************************** TBizMontajeDataTableRules ************************** } procedure TBizMontajeDataTableRules.OnNewRecord(Sender: TDADataTable); begin inherited; CODIGOEMPRESA := dmBase.CodigoEmpresa; USUARIO := dmUsuarios.LoginInfo.UserID; FECHAALTA := Date; FECHAINICIO := Date; CODIGO := dmMontajes.GetNextAutoinc('GEN_MONTAJES'); SITUACION := SITUACION_PENDIENTERECEPCION; //Añadimos la ficha de beneficios por defecto FichaBeneficios.AnadirFichaBeneficiosDefecto(CODIGO, FTipoFichaBeneficios); end; procedure TBizMontajeDataTableRules.Show; begin ShowEditor(IBizMontaje, Self, etItem); end; procedure TBizMontajeDataTableRules.Preview; begin dmMontajes.PreviewFicha(Self.CODIGO); end; procedure TBizMontajeDataTableRules.ShowApplyUpdateFailed( const Error: EDAApplyUpdateFailed); begin if (Pos(AUF_FKVIOLATION, Error.Message) > 0) then MessageBox(0, 'No se puede borrar este montaje porque tiene pedidos asociados', 'Atención', MB_ICONWARNING or MB_OK); end; function TBizMontajeDataTableRules.GetSelectedRows: TSelectedRowList; begin Result := FSelectedRows; end; function TBizMontajeDataTableRules.OnApplyUpdateFailed: Boolean; begin // end; procedure TBizMontajeDataTableRules.ShowToSelect; begin // end; constructor TBizMontajeDataTableRules.Create(aDataTable: TDADataTable); begin inherited; FLabelCount := 4; // 4 etiquetas por hoja por defecto FCliente := Nil; FPresupuesto := Nil; FFichaBeneficiosLink := TDADataSource.Create(NIL); FTipoFichaBeneficios := 'Cocina'; //Por defecto el tipo de ficha es de cocina FSelectedRows := TSelectedRowList.Create(aDataTable); aDataTable.OnBeforeApplyUpdates := BeforeApplyUpdates; aDataTable.OnAfterApplyUpdates := AfterApplyUpdates; end; destructor TBizMontajeDataTableRules.Destroy; begin FCliente := Nil; FPresupuesto := Nil; FFichaBeneficios := Nil; FFichaBeneficiosLink.Free; FSelectedRows.Free; inherited; end; procedure TBizMontajeDataTableRules.ShowAll; begin // ShowEditor(IBizProveedor, Self, etItems); end; function TBizMontajeDataTableRules.ShowForSelect: TModalResult; begin Result := ShowEditor(IBizMontaje, Self, etSelectItems); end; function TBizMontajeDataTableRules.GetCliente: IBizCliente; begin if not Assigned(FCliente) then FCliente := dmContactos.GetCliente(CODIGOCONTACTO) else if (CODIGOCONTACTO <> FCliente.Codigo) and not (FCliente.DataTable.State in dsEditModes) then dmContactos.GetContacto(FCliente, CODIGOCONTACTO); if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; Result := FCliente; end; procedure TBizMontajeDataTableRules.SetCliente(Value: IBizCliente); var bEnEdicion : Boolean; begin bEnEdicion := (DataTable.State in dsEditModes); if not bEnEdicion then Edit; FCliente := Value; if Assigned(FCliente) then begin CODIGOCONTACTO := FCliente.CODIGO; Post; if bEnEdicion then Edit; end end; function TBizMontajeDataTableRules.GetPresupuesto: IBizPresupuestos; begin if not Assigned(FPresupuesto) then FPresupuesto := dmPresupuestos.GetPresupuesto(CODIGOPRESUPUESTO) else if (CODIGOPRESUPUESTO <> FPresupuesto.Codigo) and not (FPresupuesto.DataTable.State in dsEditModes) then FPresupuesto := dmPresupuestos.GetPresupuesto(CODIGOPRESUPUESTO); if not FPresupuesto.DataTable.Active then FPresupuesto.DataTable.Active := True; Result := FPresupuesto; end; procedure TBizMontajeDataTableRules.SetPresupuesto(Value: IBizPresupuestos); var bEnEdicion : Boolean; begin if Assigned(FPresupuesto) and (length(FPresupuesto.REFERENCIA) <> 0) then dmPresupuestos.setReferencia(FPresupuesto, Null); bEnEdicion := (DataTable.State in dsEditModes); if not bEnEdicion then Edit; FPresupuesto := Value; if Assigned(FPresupuesto) then begin CODIGOPRESUPUESTO := FPresupuesto.CODIGO; Self.Cliente := FPresupuesto.Cliente; Post; if bEnEdicion then Edit; end end; procedure TBizMontajeDataTableRules.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 : asignarReferencia; // ctDelete : end; end; procedure TBizMontajeDataTableRules.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 cliente de este montaje', 'Atención', MB_ICONWARNING or MB_OK) else if (Pos('presupuesto', Error.Message) > 0) then MessageBox(0, 'Debe indicar el presupuesto de este montaje', 'Atención', MB_ICONWARNING or MB_OK) else if (Pos('Fecha', Error.Message) > 0) then MessageBox(0, 'Debe indicar la fecha de inicio de este montaje', 'Atención', MB_ICONWARNING or MB_OK) else raise Error; end else raise Error; end; procedure TBizMontajeDataTableRules.asignarReferencia; begin if Length(Self.Presupuesto.REFERENCIA) = 0 then begin if not (Self.DataTable.State in dsEditModes) then Self.DataTable.Edit; Self.REFERENCIA := dmMontajes.DarNuevaReferencia(Self.Presupuesto.TIPO); Self.Post; dmPresupuestos.setReferencia(Self.Presupuesto, Self.REFERENCIA); showmessage('La referencia asignada al montaje y a su presupuesto asociado es ' + Self.REFERENCIA); end; end; procedure TBizMontajeDataTableRules.AfterApplyUpdates(Sender: TDADataTable); begin try Self.Presupuesto.DataTable.ApplyUpdates; except on E: EDAApplyUpdateFailed do raise Exception.Create('Error al asignar referencia al presupuesto'); end; end; procedure TBizMontajeDataTableRules.BeforeDelete(Sender: TDADataTable); begin inherited; if not dmMontajes.PuedoEliminarMontaje(CODIGO) then raise Exception.Create('No se puede borrar este montaje porque tiene pedidos asociados o artículos reservados'); end; { TBizFichaBeneficiosMontajeDataTableRules } procedure TBizFichaBeneficiosMontajeDataTableRules.AnadirFichaBeneficiosDefecto(const pCodigoMontaje: integer; const Tipo: String); var FichaBeneficiosAux: IFichaBeneficios_Aux; begin FichaBeneficiosAux := dmMontajes.darFichaBeneficiosAux(Tipo); try with FichaBeneficiosAux.DataTable do begin Active := True; while not Eof do begin Self.Insert; Self.CODIGOMONTAJE := pCodigoMontaje; Self.NUMCONCEPTO := FichaBeneficiosAux.NUMCONCEPTO; Self.DESCRIPCION := FichaBeneficiosAux.DESCRIPCION; Self.Post; Next; end; end; finally FichaBeneficiosAux.DataTable.Close; FichaBeneficiosAux := Nil; end; end; procedure TBizFichaBeneficiosMontajeDataTableRules.OnNewRecord( Sender: TDADataTable); begin inherited; NUMCONCEPTO := dmMontajes.GetNextAutoinc('GEN_FICHABENEFICIOS'); DESCRIPCION := 'DESCRIPCION'; COMPRA := 0; VENTA := 0; end; procedure TBizFichaBeneficiosMontajeDataTableRules.ShowApplyUpdateFailed(const Error: EDAApplyUpdateFailed); begin // end; procedure TBizMontajeDataTableRules.Print; begin dmMontajes.PrintFicha(Self.CODIGO); end; function TBizMontajeDataTableRules.GetLabelCount: Integer; begin Result := FLabelCount; end; procedure TBizMontajeDataTableRules.PreviewLabels; begin dmMontajes.PreviewEtiquetas(Self.CODIGO, FLabelCount); end; procedure TBizMontajeDataTableRules.PrintLabels; begin dmMontajes.PrintEtiquetas(Self.CODIGO, FLabelCount); end; procedure TBizMontajeDataTableRules.SetLabelCount(Value: Integer); begin FLabelCount := Value; end; function TBizMontajeDataTableRules.GetFichaBeneficios: IBizFichaBeneficiosMontaje; begin Result := FFichaBeneficios; end; procedure TBizMontajeDataTableRules.SetFichaBeneficios( Value: IBizFichaBeneficiosMontaje); begin FFichaBeneficios := Value; FFichaBeneficiosLink.DataTable := Self.DataTable; FFichaBeneficios.DataTable.MasterSource := FFichaBeneficiosLink; end; function TBizMontajeDataTableRules.GetTipoFichaBeneficios: String; begin Result := FTipoFichaBeneficios; end; procedure TBizMontajeDataTableRules.SetTipoFichaBeneficios(Value: String); begin FTipoFichaBeneficios := Value; end; initialization RegisterDataTableRules('BizMontaje', TBizMontajeDataTableRules); RegisterDataTableRules('BizFichaBeneficiosMontaje', TBizFichaBeneficiosMontajeDataTableRules); RegisterDataTableRules('BizFichaBeneficiosAux', TBizFichaBeneficiosAuxDataTableRules); finalization end.