unit uEditorPedidoProveedor; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uEditorDBItem, DB, uDADataTable, JvAppStorage, JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList, PngImageList, StdActns, ActnList, ComCtrls, TBX, TB2Item, TB2Dock, TB2Toolbar, ExtCtrls, JvExControls, JvNavigationPane, uViewPedidoProveedor, uCustomView, uViewBase, JvComponentBase, StdCtrls, pngimage, AppEvnts, cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, cxDBEdit, uViewIncidencias, uBizPedidosProveedor, uIEditorPedidoProveedor, uPedidosProveedorController, uViewDetallesBase, uViewDetallesPedidoProveedor, dxLayoutLookAndFeels, JvExComCtrls, JvStatusBar, uViewTotales, uViewDetallesDTO, uViewDetallesArticulos, uDAInterfaces; type TfEditorPedidoProveedor = class(TfEditorDBItem, IEditorPedidoProveedor) pagContenido: TTabSheet; pagInicidencias: TTabSheet; frViewIncidenciasProv: TfrViewIncidencias; frViewDetallesPedidoProveedor1: TfrViewDetallesPedidoProveedor; dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList; dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel; frViewTotales1: TfrViewTotales; 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 FPedido: IBizPedidoProveedor; FViewPedido: IViewPedidoProveedor; FController : IPedidosProveedorController; function GetController : IPedidosProveedorController; procedure SetController (const Value : IPedidosProveedorController); virtual; function GetPedido: IBizPedidoProveedor; procedure SetPedido(const Value: IBizPedidoProveedor); virtual; function GetViewPedido: IViewPedidoProveedor; procedure SetViewPedido(const Value: IViewPedidoProveedor); procedure GuardarInterno; override; procedure EliminarInterno; override; procedure PrevisualizarInterno; override; procedure ImprimirInterno; override; procedure OnProveedorChanged(Sender : TObject); //Si queremos crear otra vista para el editor heredado solo tendriamos que //sobreescribir este metodo procedure AsignarVista; virtual; property ViewPedido: IViewPedidoProveedor read GetViewPedido write SetViewPedido; public procedure PonerTitulos(const ATitulo: string = ''); override; property Controller : IPedidosProveedorController read GetController write SetController; property Pedido: IBizPedidoProveedor read GetPedido write SetPedido; constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; implementation uses uViewDatosYSeleccionProveedor, uDataModuleUsuarios, uGridUtils, uDialogUtils, uFactuGES_App; {$R *.dfm} { TfEditorPedidoProveedor } { **************************** TfEditorPedidoProveedor **************************** } procedure TfEditorPedidoProveedor.AsignarVista; var AViewPedidoProveedor: TfrViewPedidoProveedor; begin AViewPedidoProveedor := TfrViewPedidoProveedor.Create(Self); with AViewPedidoProveedor do begin Parent := pagGeneral; Align := alClient; dxLayoutControl1.LookAndFeel := dxLayoutOfficeLookAndFeel1; end; ViewPedido := AViewPedidoProveedor; end; constructor TfEditorPedidoProveedor.Create(AOwner: TComponent); begin inherited; pgPaginas.ActivePageIndex := 0; AsignarVista; end; procedure TfEditorPedidoProveedor.CustomEditorClose(Sender: TObject; var Action: TCloseAction); begin inherited; FViewPedido := NIL; FPedido := NIL; end; destructor TfEditorPedidoProveedor.Destroy; begin // Utilizar mejor OnClose; inherited; end; procedure TfEditorPedidoProveedor.EliminarInterno; begin if (Application.MessageBox('¿Desea borrar este pedido a proveedor?', 'Atención', MB_YESNO) = IDYES) then begin FController.Eliminar(FPedido); inherited end end; procedure TfEditorPedidoProveedor.FormShow(Sender: TObject); begin inherited; if not Assigned(FViewPedido) then raise Exception.Create('No hay ninguna vista asignada'); if not Assigned(Pedido) then raise Exception.Create('No hay ningún pedido asignado'); Pedido.DataTable.Active := True; pgPaginas.ActivePage := pagGeneral; end; procedure TfEditorPedidoProveedor.frViewTotales1ePortePropertiesValidate( Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); begin inherited; if not VarIsNull(DisplayValue) and (Length(DisplayValue) > 0) then FPedido.IMPORTE_PORTE := DisplayValue else FPedido.IMPORTE_PORTE := 0; RecalcularPortePorUnidad; end; function TfEditorPedidoProveedor.GetController: IPedidosProveedorController; begin Result := FController; end; function TfEditorPedidoProveedor.GetPedido: IBizPedidoProveedor; begin Result := FPedido; end; function TfEditorPedidoProveedor.GetViewPedido: IViewPedidoProveedor; begin Result := FViewPedido; end; procedure TfEditorPedidoProveedor.GuardarInterno; var bEsNuevo : Boolean; begin inherited; bEsNuevo := False; ShowHourglassCursor; // frViewDetallesPedidoProveedor1.SaveGridStatus; // Para guardar estado del grid frViewDetallesPedidoProveedor1.BeginUpdate; // Para que no se mueva el foco try bEsNuevo := FPedido.EsNuevo; FController.Guardar(FPedido); finally frViewDetallesPedidoProveedor1.EndUpdate; // frViewDetallesPedidoProveedor1.RestoreGridStatus; HideHourglassCursor; end; if bEsNuevo then ShowInfoMessage('El pedido se ha dado de alta con el código ' + FPedido.REFERENCIA); Modified := False; end; procedure TfEditorPedidoProveedor.ImprimirInterno; begin { inherited; FController.Print(FPedido); } end; procedure TfEditorPedidoProveedor.OnProveedorChanged(Sender: TObject); begin FPedido.Proveedor := ViewPedido.ViewProveedorPedido.Proveedor; // Si el pedido tiene detalles hay que mirar si los descuentos y otros campos // para los artículos hay que cambiarlos. if (FPedido.Detalles.RecordCount > 0) then FController.DetallesController.ActualizarDetalles(FPedido.Detalles, FPedido.Proveedor); end; procedure TfEditorPedidoProveedor.pgPaginasChanging(Sender: TObject; var AllowChange: Boolean); begin inherited; if (not Assigned(FPedido)) or (FPedido.ID_PROVEEDOR = 0) then begin ShowWarningMessage('Antes de introducir conceptos debe elegir un proveedor para este pedido'); AllowChange := False; end; end; procedure TfEditorPedidoProveedor.PonerTitulos(const ATitulo: string); var FTitulo : String; begin FTitulo := ATitulo; if (FTitulo = '') and Assigned(FPedido) then begin if FPedido.EsNuevo then FTitulo := 'Nuevo pedido a proveedor' else FTitulo := 'Pedido a proveedor' + ' - ' + FPedido.Proveedor.Nombre + ' - (' + FPedido.SITUACION + ')'; end; inherited PonerTitulos(FTitulo); Self.Caption := FTitulo + ' (' + AppFactuGES.EmpresaActiva.NOMBRE + ')'; end; procedure TfEditorPedidoProveedor.PrevisualizarInterno; begin { inherited; FController.Preview(FPedido); } end; procedure TfEditorPedidoProveedor.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(FPedido.IMPORTE_PORTE, FPedido.Detalles) end; procedure TfEditorPedidoProveedor.SetController(const Value: IPedidosProveedorController); begin FController := Value; if Assigned(FController) then begin ViewPedido.Controller := FController; frViewDetallesPedidoProveedor1.Controller := Controller.DetallesController; end; end; procedure TfEditorPedidoProveedor.SetPedido(const Value: IBizPedidoProveedor); begin FPedido := Value; if Assigned(FPedido) then begin dsDataTable.DataTable := FPedido.DataTable; frViewTotales1.DADataSource.DataTable := dsDataTable.DataTable; frViewIncidenciasProv.DADataSource.DataTable := dsDataTable.DataTable; if Assigned(FViewPedido) then begin FViewPedido.Pedido := FPedido; ViewPedido.ViewProveedorPedido.OnProveedorChanged := NIL; ViewPedido.ViewProveedorPedido.Proveedor := FPedido.Proveedor; ViewPedido.ViewProveedorPedido.OnProveedorChanged := OnProveedorChanged; frViewDetallesPedidoProveedor1.Detalles := FPedido.Detalles; frViewDetallesPedidoProveedor1.Pedido := FPedido; //Para poder sacar los articulos del proveedor seleccionado end; end; end; procedure TfEditorPedidoProveedor.SetViewPedido(const Value: IViewPedidoProveedor); begin FViewPedido := Value; if Assigned(FViewPedido) and Assigned(Pedido) then FViewPedido.Pedido := Pedido; end; end.