unit uEditorPresupuestoCliente; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, uEditorDBItem, DB, uDADataTable, JvAppStorage, JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList, PngImageList, StdActns, ActnList, ComCtrls, TBX, TB2Item, TB2Dock, TB2Toolbar, ExtCtrls, JvExControls, JvNavigationPane, uCustomView, uViewBase, JvComponentBase, StdCtrls, pngimage, AppEvnts, cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, cxDBEdit, uViewIncidencias, uPresupuestosClienteController, uViewDetallesBase, dxLayoutLookAndFeels, JvExComCtrls, JvStatusBar, uViewTotales, uIEditorPresupuestoCliente, uBizPresupuestosCliente, uViewPresupuestoCliente, uViewDetallesDTO, uViewDetallesArticulos, uViewDetallesPresupuestoCliente, uDAInterfaces; type TfEditorPresupuestoCliente = class(TfEditorDBItem, IEditorPresupuestoCliente) pagContenido: TTabSheet; pagInicidencias: TTabSheet; frViewIncidenciasCli: TfrViewIncidencias; dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList; dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel; frViewTotales1: TfrViewTotales; frViewDetallesPresupuestoCliente1: TfrViewDetallesPresupuestoCliente; pagPortada: TTabSheet; pagMemoria: TTabSheet; eIncidencias: TcxDBMemo; cxDBMemo1: TcxDBMemo; procedure FormShow(Sender: TObject); procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction); procedure pgPaginasChanging(Sender: TObject; var AllowChange: Boolean); procedure frViewTotales1ePortePropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); private procedure RecalcularPortePorUnidad; protected FPresupuesto: IBizPresupuestoCliente; FViewPresupuesto: IViewPresupuestoCliente; FController : IPresupuestosClienteController; function GetController : IPresupuestosClienteController; procedure SetController (const Value : IPresupuestosClienteController); virtual; function GetPresupuesto: IBizPresupuestoCliente; procedure SetPresupuesto(const Value: IBizPresupuestoCliente); virtual; function GetViewPresupuesto: IViewPresupuestoCliente; procedure SetViewPresupuesto(const Value: IViewPresupuestoCliente); procedure PrevisualizarInterno; override; procedure ImprimirInterno; override; procedure GuardarInterno; override; procedure EliminarInterno; override; property ViewPresupuesto: IViewPresupuestoCliente read GetViewPresupuesto write SetViewPresupuesto; procedure OnClienteChanged(Sender : TObject); //Si queremos crear otra vista para el editor heredado solo tendriamos que //sobreescribir este metodo procedure AsignarVista; virtual; procedure PonerTitulos(const ATitulo: string = ''); override; public property Controller : IPresupuestosClienteController read GetController write SetController; property Presupuesto: IBizPresupuestoCliente read GetPresupuesto write SetPresupuesto; constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; implementation uses uViewDatosYSeleccionCliente, uDataModuleUsuarios, uClientesController, uBizDireccionesContacto, uDialogUtils; {$R *.dfm} { TfEditorPresupuestoCliente } { **************************** TfEditorPresupuestoCliente **************************** } procedure TfEditorPresupuestoCliente.AsignarVista; var AViewPresupuestoCliente: TfrViewPresupuestoCliente; begin AViewPresupuestoCliente := TfrViewPresupuestoCliente.create(Self); with AViewPresupuestoCliente do begin Parent := pagGeneral; Align := alClient; dxLayoutControl1.LookAndFeel := dxLayoutOfficeLookAndFeel1; end; ViewPresupuesto := AViewPresupuestoCliente; end; constructor TfEditorPresupuestoCliente.Create(AOwner: TComponent); begin inherited; pgPaginas.ActivePageIndex := 0; AsignarVista; end; procedure TfEditorPresupuestoCliente.CustomEditorClose(Sender: TObject; var Action: TCloseAction); begin inherited; FViewPresupuesto := NIL; FPresupuesto := NIL; end; destructor TfEditorPresupuestoCliente.Destroy; begin // Utilizar mejor OnClose; inherited; end; procedure TfEditorPresupuestoCliente.EliminarInterno; begin if (ShowConfirmMessage('¿Desea borrar este Presupuesto de cliente?', '') = IDYES) then begin FController.Eliminar(FPresupuesto); inherited end end; procedure TfEditorPresupuestoCliente.FormShow(Sender: TObject); begin inherited; if not Assigned(FViewPresupuesto) then raise Exception.Create('No hay ninguna vista asignada'); if not Assigned(Presupuesto) then raise Exception.Create('No hay ningún Presupuesto asignado'); Presupuesto.DataTable.Active := True; pgPaginas.ActivePage := pagGeneral; end; procedure TfEditorPresupuestoCliente.frViewTotales1ePortePropertiesValidate( Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); begin inherited; if not VarIsNull(DisplayValue) then FPresupuesto.IMPORTE_PORTE := DisplayValue else FPresupuesto.IMPORTE_PORTE := 0; RecalcularPortePorUnidad; end; function TfEditorPresupuestoCliente.GetController: IPresupuestosClienteController; begin Result := FController; end; function TfEditorPresupuestoCliente.GetPresupuesto: IBizPresupuestoCliente; begin Result := FPresupuesto; end; function TfEditorPresupuestoCliente.GetViewPresupuesto: IViewPresupuestoCliente; begin Result := FViewPresupuesto; end; procedure TfEditorPresupuestoCliente.GuardarInterno; var bEsNuevo : Boolean; begin inherited; bEsNuevo := False; ShowHourglassCursor; // frViewDetallesPresupuestoCliente1.SaveGridStatus; frViewDetallesPresupuestoCliente1.BeginUpdate; try bEsNuevo := FPresupuesto.EsNuevo; FController.Guardar(FPresupuesto); finally frViewDetallesPresupuestoCliente1.EndUpdate; // frViewDetallesPresupuestoCliente1.RestoreGridStatus; HideHourglassCursor; end; if bEsNuevo then ShowInfoMessage('El Presupuesto se ha dado de alta con el código ' + FPresupuesto.REFERENCIA); Modified := False; end; procedure TfEditorPresupuestoCliente.ImprimirInterno; begin inherited; if not Modified then FController.Print(FPresupuesto); end; procedure TfEditorPresupuestoCliente.OnClienteChanged(Sender: TObject); var AClientesController : IClientesController; ADireccion : IBizDireccionesContacto; begin if Assigned(FPresupuesto) then begin FPresupuesto.Cliente := ViewPresupuesto.ViewClientePresupuesto.Cliente; AClientesController := TClientesController.Create; try if not AClientesController.TieneDatosBancarios(FPresupuesto.Cliente) then MessageBox(0, 'Este cliente no tiene datos bancarios en su ficha', 'Atención', MB_ICONWARNING or MB_OK); case FPresupuesto.Cliente.Direcciones.RecordCount of 0 : begin FController.QuitarDireccionEnvio(FPresupuesto); MessageBox(0, '¡Atención! Este cliente no tiene ' + #10#13 + 'ninguna dirección de envío en su ficha', 'Atención', MB_ICONWARNING or MB_OK); FPresupuesto.Edit; FPresupuesto.IMPORTE_PORTE := 0; end; 1 : begin FController.CopiarDireccionEnvio(FPresupuesto.Cliente.Direcciones, FPresupuesto); FPresupuesto.Edit; FPresupuesto.IMPORTE_PORTE := FPresupuesto.Cliente.Direcciones.PORTE; end else begin ADireccion := AClientesController.ElegirDireccionEntrega(FPresupuesto.Cliente.Direcciones, ''); try if Assigned(ADireccion) then begin FController.CopiarDireccionEnvio(ADireccion, FPresupuesto); FPresupuesto.Edit; FPresupuesto.IMPORTE_PORTE := ADireccion.PORTE; end; finally ADireccion := NIL; end; end; end; // Si el Presupuesto tiene detalles hay que mirar si los descuentos y otros campos // para los artículos hay que cambiarlos. if (FPresupuesto.Detalles.RecordCount > 0) then FController.DetallesController.ActualizarDetalles(FPresupuesto.Detalles, FPresupuesto.Cliente); finally AClientesController := NIL; end; end; end; procedure TfEditorPresupuestoCliente.pgPaginasChanging(Sender: TObject; var AllowChange: Boolean); begin inherited; if (not Assigned(FPresupuesto)) or (FPresupuesto.ID_CLIENTE = 0) then begin ShowWarningMessage('Antes de introducir conceptos debe elegir un cliente para este Presupuesto'); AllowChange := False; end; end; procedure TfEditorPresupuestoCliente.PonerTitulos(const ATitulo: string); var FTitulo : String; begin FTitulo := ATitulo; if (FTitulo = '') and Assigned(FPresupuesto) then begin if FPresupuesto.EsNuevo then FTitulo := 'Nuevo Presupuesto de cliente' else FTitulo := 'Presupuesto de cliente' + ' - ' + FPresupuesto.Cliente.Nombre + ' - ' + FPresupuesto.SITUACION; end; inherited PonerTitulos(FTitulo); // Self.Caption := FTitulo + ' (' + dmUsuarios.EmpresaActual.NOMBRE + ')'; end; procedure TfEditorPresupuestoCliente.PrevisualizarInterno; begin inherited; if not Modified then FController.Preview(FPresupuesto); end; procedure TfEditorPresupuestoCliente.RecalcularPortePorUnidad; begin //Esta lógica se llamará en el editor porque es para facilitar el rellenado de información del documento //no puede ir en la clase de negocio porque no es una lógica que tenga sentido fuera del editor. if Assigned(Controller) and Assigned(Controller.DetallesController) then Controller.DetallesController.DesglosarPorteDetalles(FPresupuesto.IMPORTE_PORTE, FPresupuesto.Detalles) end; procedure TfEditorPresupuestoCliente.SetController(const Value: IPresupuestosClienteController); begin FController := Value; if Assigned(FController) then begin ViewPresupuesto.ViewClientePresupuesto.Controller := Controller.ClienteController; frViewDetallesPresupuestoCliente1.Controller := Controller.DetallesController; end; end; procedure TfEditorPresupuestoCliente.SetPresupuesto(const Value: IBizPresupuestoCliente); begin FPresupuesto := Value; if Assigned(FPresupuesto) then begin dsDataTable.DataTable := FPresupuesto.DataTable; frViewIncidenciasCli.DADataSource.DataTable := dsDataTable.DataTable; frViewTotales1.DADataSource.DataTable := dsDataTable.DataTable; if Assigned(FViewPresupuesto) then begin FViewPresupuesto.Presupuesto := FPresupuesto; ViewPresupuesto.ViewClientePresupuesto.Cliente := FPresupuesto.Cliente; ViewPresupuesto.ViewClientePresupuesto.OnClienteChanged := OnClienteChanged; frViewDetallesPresupuestoCliente1.Detalles := FPresupuesto.Detalles; frViewDetallesPresupuestoCliente1.Presupuesto := FPresupuesto; //Para poder sacar los descuento del articulos segun el cliente seleccionado end; end; end; procedure TfEditorPresupuestoCliente.SetViewPresupuesto(const Value: IViewPresupuestoCliente); begin FViewPresupuesto := Value; if Assigned(FViewPresupuesto) and Assigned(Presupuesto) then FViewPresupuesto.Presupuesto := Presupuesto; end; end.