unit uEditorAlbaranProveedor; 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, uCustomView, uViewBase, JvComponentBase, StdCtrls, pngimage, AppEvnts, cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, cxDBEdit, uViewIncidencias, uAlbaranesProveedorController, uViewDetallesBase, uViewDetallesAlbaranProveedor, dxLayoutLookAndFeels, JvExComCtrls, JvStatusBar, uViewTotales, uIEditorAlbaranProveedor, uBizAlbaranesProveedor, uViewAlbaranProveedor, uViewDetallesDTO, uViewDetallesArticulos, uDAInterfaces, cxLabel; type TfEditorAlbaranProveedor = class(TfEditorDBItem, IEditorAlbaranProveedor) pagContenido: TTabSheet; pagInicidencias: TTabSheet; frViewIncidenciasCli: TfrViewIncidencias; dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList; dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel; frViewDetallesAlbaranProveedor1: TfrViewDetallesAlbaranProveedor; frViewTotales1: TfrViewTotales; procedure FormShow(Sender: TObject); procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction); procedure pgPaginasChanging(Sender: TObject; var AllowChange: Boolean); procedure frViewTotales1edtDescuentoPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); procedure frViewTotales1edtIVAPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); procedure frViewTotales1ePortePropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); // procedure frViewDatosYSeleccionContactoedtlNombrePropertiesChange(Sender: TObject); private procedure RecalcularPortePorUnidad; protected FAlbaran: IBizAlbaranProveedor; FViewAlbaran: IViewAlbaranProveedor; FController : IAlbaranesProveedorController; function GetController : IAlbaranesProveedorController; procedure SetController (const Value : IAlbaranesProveedorController); virtual; function GetAlbaran: IBizAlbaranProveedor; procedure SetAlbaran(const Value: IBizAlbaranProveedor); virtual; function GetViewAlbaran: IViewAlbaranProveedor; procedure SetViewAlbaran(const Value: IViewAlbaranProveedor); procedure GuardarInterno; override; procedure EliminarInterno; override; procedure PrevisualizarInterno; override; procedure ImprimirInterno; override; function PuedoImprimir: Boolean; override; property ViewAlbaran: IViewAlbaranProveedor read GetViewAlbaran write SetViewAlbaran; procedure OnProveedorChanged(Sender : TObject); //Si queremos crear otra vista para el editor heredado solo tendriamos que //sobreescribir este metodo procedure AsignarVista; virtual; public procedure PonerTitulos(const ATitulo: string = ''); override; property Controller : IAlbaranesProveedorController read GetController write SetController; property Albaran: IBizAlbaranProveedor read GetAlbaran write SetAlbaran; constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; implementation uses uViewDatosYSeleccionProveedor, uDataModuleUsuarios, uProveedoresController, uBizDireccionesContacto, uDialogUtils, uDataTableUtils, uFactuGES_App; {$R *.dfm} { TfEditorAlbaranProveedor } { **************************** TfEditorAlbaranProveedor **************************** } procedure TfEditorAlbaranProveedor.AsignarVista; var AViewAlbaranProveedor: TfrViewAlbaranProveedor; begin AViewAlbaranProveedor := TfrViewAlbaranProveedor.create(Self); with AViewAlbaranProveedor do begin Parent := pagGeneral; Align := alClient; dxLayoutControl1.LookAndFeel := dxLayoutOfficeLookAndFeel1; end; ViewAlbaran := AViewAlbaranProveedor; end; constructor TfEditorAlbaranProveedor.Create(AOwner: TComponent); begin inherited; AsignarVista; pgPaginas.ActivePageIndex := 0; end; procedure TfEditorAlbaranProveedor.CustomEditorClose(Sender: TObject; var Action: TCloseAction); begin inherited; FViewAlbaran := NIL; FAlbaran := NIL; end; destructor TfEditorAlbaranProveedor.Destroy; begin // Utilizar mejor OnClose; inherited; end; procedure TfEditorAlbaranProveedor.EliminarInterno; begin if (Application.MessageBox('¿Desea borrar este albarán de proveedor?', 'Atención', MB_YESNO) = IDYES) then begin FController.Eliminar(FAlbaran); inherited end end; procedure TfEditorAlbaranProveedor.FormShow(Sender: TObject); begin inherited; if not Assigned(FViewAlbaran) then raise Exception.Create('No hay ninguna vista asignada'); if not Assigned(Albaran) then raise Exception.Create('No hay ningún Albaran asignado'); Albaran.DataTable.Active := True; pgPaginas.ActivePage := pagGeneral; end; procedure TfEditorAlbaranProveedor.frViewTotales1edtDescuentoPropertiesValidate( Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); begin inherited; FAlbaran.DESCUENTO := DisplayValue; end; procedure TfEditorAlbaranProveedor.frViewTotales1edtIVAPropertiesValidate( Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); begin inherited; FAlbaran.IVA := DisplayValue; end; procedure TfEditorAlbaranProveedor.frViewTotales1ePortePropertiesValidate( Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); begin inherited; if (not VarIsNull(DisplayValue)) and (length(DisplayValue) > 0) then FAlbaran.IMPORTE_PORTE := DisplayValue else FAlbaran.IMPORTE_PORTE := 0; RecalcularPortePorUnidad; end; function TfEditorAlbaranProveedor.GetController: IAlbaranesProveedorController; begin Result := FController; end; function TfEditorAlbaranProveedor.GetAlbaran: IBizAlbaranProveedor; begin Result := FAlbaran; end; function TfEditorAlbaranProveedor.GetViewAlbaran: IViewAlbaranProveedor; begin Result := FViewAlbaran; end; procedure TfEditorAlbaranProveedor.GuardarInterno; var bEsNuevo : Boolean; begin inherited; ShowHourglassCursor; // frViewDetallesAlbaranProveedor1.SaveGridStatus; frViewDetallesAlbaranProveedor1.BeginUpdate; try bEsNuevo := FAlbaran.EsNuevo; FController.Guardar(FAlbaran); finally frViewDetallesAlbaranProveedor1.EndUpdate; // frViewDetallesAlbaranProveedor1.RestoreGridStatus; HideHourglassCursor; end; if bEsNuevo then ShowInfoMessage('El albarán se ha dado de alta con el código ' + FAlbaran.REFERENCIA); Modified := False; end; function TfEditorAlbaranProveedor.PuedoImprimir: Boolean; begin Result := inherited PuedoImprimir and (not Albaran.Proveedor.IDIsNull); end; procedure TfEditorAlbaranProveedor.ImprimirInterno; var AllItems: Boolean; begin inherited; AllItems := False; FController.Print(FAlbaran, AllItems); end; procedure TfEditorAlbaranProveedor.OnProveedorChanged(Sender: TObject); begin if Assigned(FAlbaran) then begin FAlbaran.Proveedor := ViewAlbaran.ViewProveedorAlbaran.Proveedor; // Si el pedido tiene detalles hay que mirar si los descuentos // para los artículos hay que cambiarlos. if (FAlbaran.Detalles.RecordCount > 0) then begin FController.DetallesController.ActualizarDetalles(FAlbaran.Detalles, FAlbaran.Proveedor); end; end; end; procedure TfEditorAlbaranProveedor.pgPaginasChanging(Sender: TObject; var AllowChange: Boolean); begin inherited; if (not Assigned(FAlbaran)) or (FAlbaran.ID_PROVEEDOR = 0) then begin ShowWarningMessage('Antes de introducir conceptos debe elegir un proveedor para este albarán'); AllowChange := False; end; end; procedure TfEditorAlbaranProveedor.PonerTitulos(const ATitulo: string); var FTitulo : String; begin FTitulo := ATitulo; if (FTitulo = '') and Assigned(FAlbaran) then begin if FAlbaran.EsNuevo then FTitulo := 'Nuevo albarán de proveedor' else FTitulo := 'Albarán de proveedor' + ' - ' + FAlbaran.Proveedor.Nombre end; inherited PonerTitulos(FTitulo); Self.Caption := FTitulo + ' (' + AppFactuGES.EmpresaActiva.NOMBRE + ')'; end; procedure TfEditorAlbaranProveedor.PrevisualizarInterno; var AllItems: Boolean; begin inherited; AllItems := False; FController.Preview(FAlbaran, AllItems); end; procedure TfEditorAlbaranProveedor.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(FAlbaran.IMPORTE_PORTE, FAlbaran.Detalles) end; procedure TfEditorAlbaranProveedor.SetController(const Value: IAlbaranesProveedorController); begin FController := Value; if Assigned(FController) then begin frViewDetallesAlbaranProveedor1.Controller := Controller.DetallesController; end; end; procedure TfEditorAlbaranProveedor.SetAlbaran(const Value: IBizAlbaranProveedor); begin FAlbaran := Value; if Assigned(FAlbaran) then begin dsDataTable.DataTable := FAlbaran.DataTable; frViewTotales1.DADataSource.DataTable := dsDataTable.DataTable; frViewIncidenciasCli.DADataSource.DataTable := dsDataTable.DataTable; if Assigned(FViewAlbaran) then begin ViewAlbaran.ViewProveedorAlbaran.OnProveedorChanged := NIL; try FViewAlbaran.Albaran := FAlbaran; frViewDetallesAlbaranProveedor1.Detalles := FAlbaran.Detalles; frViewDetallesAlbaranProveedor1.Albaran := FAlbaran; //Para poder sacar los descuento del articulos segun el proveedor seleccionado finally ViewAlbaran.ViewProveedorAlbaran.OnProveedorChanged := OnProveedorChanged; end; end; end; end; procedure TfEditorAlbaranProveedor.SetViewAlbaran(const Value: IViewAlbaranProveedor); begin FViewAlbaran := Value; if Assigned(FViewAlbaran) and Assigned(Albaran) then FViewAlbaran.Albaran := Albaran; end; end.