unit uPedidosProveedorController; interface uses SysUtils, uDADataTable, uEditorDBItem, uControllerBase, uIDataModulePedidosProveedor, uProveedoresController, uDetallesPedidoProveedorController, uBizPedidosProveedor; type IPedidosProveedorController = interface(IObservador) ['{404FFA2F-D683-447D-91E6-C9A7322934D8}'] function GetProveedorController: IProveedoresController; procedure SetProveedorController(const Value: IProveedoresController); property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController; function GetDetallesController: IDetallesPedidoProveedorController; procedure SetDetallesController(const Value: IDetallesPedidoProveedorController); property DetallesController: IDetallesPedidoProveedorController read GetDetallesController write SetDetallesController; function Buscar(const ID: Integer): IBizPedidoProveedor; function BuscarTodos: IBizPedidoProveedor; procedure Ver(APedido : IBizPedidoProveedor); procedure VerTodos(APedidos: IBizPedidoProveedor); function Nuevo : IBizPedidoProveedor; procedure Anadir(APedido : IBizPedidoProveedor); procedure Eliminar(const ID : Integer); overload; procedure Eliminar(APedido : IBizPedidoProveedor); overload; procedure Guardar(APedido : IBizPedidoProveedor); procedure DescartarCambios(APedido : IBizPedidoProveedor); function Existe(const ID: Integer) : Boolean; function Duplicar(APedido: IBizPedidoProveedor): IBizPedidoProveedor; procedure Preview(APedido : IBizPedidoProveedor); procedure Print(APedido : IBizPedidoProveedor); end; TPedidosProveedorController = class(TObservador, IPedidosProveedorController) protected FDataModule : IDataModulePedidosProveedor; FProveedorController : IProveedoresController; FDetallesController : IDetallesPedidoProveedorController; function GetProveedorController: IProveedoresController; procedure SetProveedorController(const Value: IProveedoresController); procedure RecuperarProveedor(APedido : IBizPedidoProveedor); function GetDetallesController: IDetallesPedidoProveedorController; procedure SetDetallesController(const Value: IDetallesPedidoProveedorController); //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de //este controller procedure AsignarDataModule; virtual; procedure RecuperarObjetos(APedido: IBizPedidoProveedor); virtual; procedure AsignarEditor(out AEditor: IEditorDBItem); virtual; procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override; function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean; procedure FiltrarEmpresa(APedido: IBizPedidoProveedor); function _Vacio : IBizPedidoProveedor; procedure AsignarID(APedido: IBizPedidoProveedor; const NuevoID:Integer); function ValidarPedido(APedido: IBizPedidoProveedor): Boolean; virtual; public property ProveedorController: IProveedoresController read GetProveedorController write SetProveedorController; property DetallesController: IDetallesPedidoProveedorController read GetDetallesController write SetDetallesController; constructor Create; destructor Destroy; override; procedure Eliminar(const ID : Integer); overload; procedure Eliminar(APedido : IBizPedidoProveedor); overload; procedure Guardar(APedido : IBizPedidoProveedor); procedure DescartarCambios(APedido : IBizPedidoProveedor); virtual; function Existe(const ID: Integer) : Boolean; virtual; procedure Anadir(APedido : IBizPedidoProveedor); function Buscar(const ID: Integer): IBizPedidoProveedor; function BuscarTodos: IBizPedidoProveedor; function Nuevo : IBizPedidoProveedor; procedure Ver(APedido : IBizPedidoProveedor); procedure VerTodos(APedidos: IBizPedidoProveedor); function Duplicar(APedido: IBizPedidoProveedor): IBizPedidoProveedor; procedure Preview(APedido : IBizPedidoProveedor); procedure Print(APedido : IBizPedidoProveedor); end; implementation uses uROTypes, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils, uIEditorPedidosProveedor, uDataModulePedidosProveedor, uBizDetallesPedidoProveedor, uBizContactos, uDataTableUtils, uDataModuleUsuarios, schPedidosProveedorClient_Intf, uDAInterfaces, uPedidosProveedorReportController, uDateUtils, uIEditorPedidoProveedor; { TPedidosProveedorController } procedure TPedidosProveedorController.Anadir(APedido: IBizPedidoProveedor); begin APedido.Insert; end; procedure TPedidosProveedorController.AsignarDataModule; begin FDataModule := TDataModulePedidosProveedor.Create(Nil); end; procedure TPedidosProveedorController.AsignarEditor(out AEditor: IEditorDBItem); begin CreateEditor('EditorPedidoProveedor', IEditorPedidoProveedor, AEditor); end; procedure TPedidosProveedorController.AsignarID(APedido: IBizPedidoProveedor; const NuevoID:Integer); begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignada'); if not Assigned(FDetallesController) then raise Exception.Create ('Controller detalles no asignado'); { ¡¡¡ OJO !!! Primero cambiamos el ID de las tablas detalles porque si cambiamos antes el ID de la cabecera deja de funcionar la relacion M/D y no encontraríamos las filas detalle. --> MASTER.ID = DETAIL.ID_FACTURA <-- } FDetallesController.AsignarID(APedido.Detalles, NuevoID, APedido.EsNuevo, (FDataModule as IDataModulePedidosProveedor)); if APedido.EsNuevo then begin APedido.Edit; APedido.ID := NuevoID; APedido.Post; end; end; function TPedidosProveedorController.Buscar(const ID: Integer): IBizPedidoProveedor; begin Result := FDataModule.GetItem(ID); FiltrarEmpresa(Result); end; function TPedidosProveedorController.BuscarTodos: IBizPedidoProveedor; begin Result := FDataModule.GetItems; FiltrarEmpresa(Result); end; constructor TPedidosProveedorController.Create; begin AsignarDataModule; FProveedorController := TProveedoresController.Create; FDetallesController := TDetallesPedidoProveedorController.Create; FDetallesController.addObservador(Self); end; function TPedidosProveedorController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean; begin Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf); end; procedure TPedidosProveedorController.DescartarCambios(APedido: IBizPedidoProveedor); begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignada'); ShowHourglassCursor; try if (APedido.State in dsEditModes) then APedido.Cancel; APedido.DataTable.CancelUpdates; finally HideHourglassCursor; end; end; destructor TPedidosProveedorController.Destroy; begin FDataModule := Nil; FProveedorController := Nil; FDetallesController := Nil; inherited; end; function TPedidosProveedorController.Duplicar( APedido: IBizPedidoProveedor): IBizPedidoProveedor; begin Result := Self._Vacio; ShowHourglassCursor; try DuplicarRegistros(APedido.DataTable, Result.DataTable, mdrActual); DuplicarRegistros(APedido.Detalles.DataTable, Result.Detalles.DataTable, mdrTodos); // Hay que dejar algunos campos como si fuera un presupuesto nuevo Result.Edit; with Result do begin ID_EMPRESA := dmUsuarios.IDEmpresaActual; USUARIO := dmUsuarios.LoginInfo.Usuario; FECHA_PEDIDO := DateOf(Now); SITUACION := SITUACION_PEDIDO_PENDIENTE; FECHA_CONFIRMACION := 0; FECHA_ENTREGA := 0; INCIDENCIAS_ACTIVAS := 0; end; Result.Post; finally HideHourglassCursor; end; end; function TPedidosProveedorController.ValidarPedido(APedido: IBizPedidoProveedor): Boolean; var AFechaPagado : TDateTime; begin Result := False; if not Assigned(APedido) then raise Exception.Create ('Pedido no asignada'); if not Assigned(FDetallesController) then raise Exception.Create ('Controller detalles no asignado'); if (APedido.DataTable.State in dsEditModes) then APedido.DataTable.Post; //Tambien hacemos post de sus tablas hija if (APedido.Detalles.DataTable.State in dsEditModes) then APedido.Detalles.DataTable.Post; //VALIDACION if (APedido.ID_PROVEEDOR < 0) or (not Assigned(APedido.Proveedor)) or (APedido.Proveedor.IsEmpty) then raise Exception.Create('Debe indicar el proveedor de esta pedido'); if (EsFechaVacia(APedido.FECHA_PEDIDO)) then raise Exception.Create('Debe indicar la fecha de este pedido'); if Length(APedido.REFERENCIA) = 0 then raise Exception.Create('Debe indicar una referencia para este pedido'); // Asegurarse de valores en campos "automáticos" APedido.Edit; try APedido.USUARIO := dmUsuarios.LoginInfo.Usuario; if Assigned(APedido.Proveedor) then APedido.ID_PROVEEDOR := APedido.Proveedor.ID; Result := True; finally APedido.Post; end; end; procedure TPedidosProveedorController.Ver(APedido: IBizPedidoProveedor); var AEditor : IEditorDBItem; begin AEditor := NIL; ShowHourglassCursor; try RecuperarObjetos(APedido); AsignarEditor(AEditor); with (AEditor as IEditorPedidoProveedor) do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Pedido := APedido; end; finally HideHourglassCursor; end; if Assigned(AEditor) then try AEditor.ShowModal; finally AEditor := NIL; end; end; procedure TPedidosProveedorController.VerTodos(APedidos: IBizPedidoProveedor); var AEditor : IEditorPedidosProveedor; begin AEditor := NIL; ShowHourglassCursor; try CreateEditor('EditorPedidosProveedor', IEditorPedidosProveedor, AEditor); with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Pedidos := APedidos; end; finally HideHourglassCursor; end; if Assigned(AEditor) then try AEditor.ShowEmbedded; finally AEditor := NIL; end; end; function TPedidosProveedorController._Vacio: IBizPedidoProveedor; begin Result := Buscar(ID_NULO); end; procedure TPedidosProveedorController.Eliminar(const ID: Integer); var APedido : IBizPedidoProveedor; begin APedido := Buscar(ID); if not Assigned(APedido) then raise Exception.Create(Format('No se ha encontrado el pedido con ID = %d', [ID])); Eliminar(APedido); APedido := NIL; end; procedure TPedidosProveedorController.Eliminar(APedido: IBizPedidoProveedor); begin if not Assigned(APedido) then raise Exception.Create ('Pedido no asignada'); ShowHourglassCursor; try if (APedido.State in dsEditModes) then APedido.Cancel; APedido.Delete; APedido.DataTable.ApplyUpdates; finally HideHourglassCursor; end; end; procedure TPedidosProveedorController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); var APedido : IBizPedidoProveedor; ADetalles : IBizDetallesPedidoProveedor; begin inherited; if Supports(ADataTable, IBizDetallesPedidoProveedor, ADetalles) and Supports(ADetalles.DataTable.MasterSource.DataTable, IBizPedidoProveedor, APedido) then begin APedido.Edit; try APedido.IMPORTE_TOTAL := FDetallesController.DarTotalImporteTotal(ADetalles); finally APedido.Post; end; end; end; procedure TPedidosProveedorController.RecuperarObjetos(APedido: IBizPedidoProveedor); begin if not Assigned(APedido.Proveedor) or (APedido.ID_PROVEEDOR <> APedido.Proveedor.ID) then RecuperarProveedor(APedido); end; procedure TPedidosProveedorController.RecuperarProveedor( APedido: IBizPedidoProveedor); begin APedido.Proveedor := (FProveedorController.Buscar(APedido.ID_PROVEEDOR) as IBizProveedor); end; function TPedidosProveedorController.Existe(const ID: Integer): Boolean; var APedido : IBizPedidoProveedor; begin try APedido := Buscar(ID); Result := Assigned(APedido) and (APedido.ID = ID); finally APedido := NIL; end; end; procedure TPedidosProveedorController.FiltrarEmpresa( APedido: IBizPedidoProveedor); begin if APedido.DataTable.Active then APedido.DataTable.Active := False; // Filtrar los presupuestos actuales por empresa with APedido.DataTable.Where do begin if NotEmpty then AddOperator(opAND); AddCondition(fld_PedidosProveedorID_EMPRESA, cEqual, dmUsuarios.IDEmpresaActual); end; end; procedure TPedidosProveedorController.SetProveedorController(const Value: IProveedoresController); begin FProveedorController := Value; end; procedure TPedidosProveedorController.SetDetallesController(const Value: IDetallesPedidoProveedorController); begin FDetallesController := Value; end; procedure TPedidosProveedorController.Guardar(APedido: IBizPedidoProveedor); var NuevoID: Integer; begin if ValidarPedido(APedido) then begin ShowHourglassCursor; try if APedido.EsNuevo then NuevoID := FDataModule.GetNextID(APedido.DataTable.LogicalName) else NuevoID := APedido.ID; AsignarID(APedido, NuevoID); APedido.DataTable.ApplyUpdates; finally HideHourglassCursor; end; end; end; function TPedidosProveedorController.Nuevo: IBizPedidoProveedor; var APedido : IBizPedidoProveedor; begin APedido := FDataModule.NewItem; FiltrarEmpresa(APedido); APedido.DataTable.Active := True; APedido.Insert; Result := APedido; end; procedure TPedidosProveedorController.Preview(APedido: IBizPedidoProveedor); var AReportController : IPedidosProveedorReportController; begin AReportController := TPedidosProveedorReportController.Create; try AReportController.Preview(APedido.ID); finally AReportController := NIL; end; end; procedure TPedidosProveedorController.Print(APedido: IBizPedidoProveedor); var AReportController : IPedidosProveedorReportController; begin AReportController := TPedidosProveedorReportController.Create; try AReportController.Print(APedido.ID); finally AReportController := NIL; end; end; function TPedidosProveedorController.GetProveedorController: IProveedoresController; begin Result := FProveedorController; end; function TPedidosProveedorController.GetDetallesController: IDetallesPedidoProveedorController; begin Result := FDetallesController; end; end.