unit uInventarioController; interface uses Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem, uIDataModuleInventario, uBizInventario, uArticulosProveedorController, uAlmacenesController; type IInventarioController = interface(IObservador) ['{FB1DE6BA-ADCC-4A83-B4D4-37DC5892766B}'] procedure Anadir(AInventario : IBizInventario); function Eliminar(AInventario : IBizInventario; Todos: Boolean; ApplyUpdates: Boolean): Boolean; function Trasladar(AInventario : IBizInventario; Todos: Boolean): Boolean; // procedure RecibirArticulos(Const APedido: IBizPedidosProveedor; Const CodigoAlmacenDes: Integer); overload; procedure RecibirArticulos(Const CodigoAlmacenDes: Integer); overload; procedure GuardarArticulosUnitarios(AInventario : IBizInventario); // function Trasladar: Boolean; // function Liberar: Boolean; // function Reservar(Const AMontaje: IBizMontaje): Boolean; overload; // function Reservar(Const CodigoMontaje: Integer): Boolean; overload; // function Eliminar: Boolean; function Buscar(const ID: Integer): IBizInventario; function BuscarTodos: IBizInventario; procedure VerTodos(AInventario: IBizInventario); procedure Ver(AInventario : IBizInventario); function ExtraerSeleccionados(AArticulos: IBizInventario) : IBizInventario; { function Nuevo : IBizArticulo; overload; procedure Anadir(AArticulo : IBizArticulo); procedure Eliminar(const ID : Integer); overload; function Eliminar(AArticulo : IBizArticulo): Boolean; overload; procedure Guardar(AArticulo : IBizArticulo); procedure DescartarCambios(AArticulo : IBizArticulo); function Existe(const ID: Integer) : Boolean; function Duplicar(AArticulo: IBizArticulo): IBizArticulo; procedure Preview(AArticulo : IBizArticulo); procedure Print(AArticulo : IBizArticulo); } end; TInventarioController = class(TObservador, IInventarioController) private FAlmacenesController: IAlmacenesController; FArticulosController : IArticulosProveedorController; function GetAlmacenesController: IAlmacenesController; function GetArticulosController: IArticulosProveedorController; procedure SetAlmacenesController(const Value: IAlmacenesController); procedure SetArticulosController(const Value: IArticulosProveedorController); protected FDataModule : IDataModuleInventario; procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override; procedure AssignarID(AInventario: IBizInventario; ADataModule : IDataModuleInventario); virtual; function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean; function _Vacio : IBizInventario; procedure FiltrarEmpresa(AInventario: IBizInventario); function ValidarInventario(AInventario: IBizInventario): Boolean; //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de //este controller procedure AsignarDataModule; virtual; procedure RecuperarObjetos(AInventario: IBizInventario); virtual; procedure AsignarEditor(out AEditor: IEditorDBItem); virtual; procedure ValidarObjetos; virtual; procedure AsignarCodigo(AInventario: IBizInventario); virtual; public property AlmacenesController: IAlmacenesController read GetAlmacenesController write SetAlmacenesController; property ArticulosController: IArticulosProveedorController read GetArticulosController write SetArticulosController; constructor Create; destructor Destroy; override; procedure Anadir(AInventario : IBizInventario); function Eliminar(AInventario : IBizInventario; Todos: Boolean; ApplyUpdates: Boolean): Boolean; function Trasladar(AInventario : IBizInventario; Todos: Boolean): Boolean; procedure RecibirArticulos(Const CodigoAlmacenDes: Integer); overload; procedure GuardarArticulosUnitarios(AInventario : IBizInventario); // function Liberar: Boolean; // function Reservar(Const AMontaje: IBizMontaje): Boolean; overload; // function Reservar(Const CodigoMontaje: Integer): Boolean; overload; // function Eliminar: Boolean; function Buscar(const ID: Integer): IBizInventario; function BuscarTodos: IBizInventario; procedure VerTodos(AInventario: IBizInventario); procedure Ver(AInventario : IBizInventario); function ExtraerSeleccionados(AArticulos: IBizInventario) : IBizInventario; { procedure Eliminar(const ID : Integer); overload; procedure Guardar(AArticulo : IBizArticulo); virtual; procedure DescartarCambios(AArticulo : IBizArticulo); virtual; function Existe(const ID: Integer) : Boolean; virtual; function Buscar(const ID: Integer): IBizArticulo; function BuscarTodos: IBizArticulo; function Duplicar(AArticulo: IBizArticulo): IBizArticulo; procedure Preview(AArticulo : IBizArticulo); procedure Print(AArticulo : IBizArticulo); } end; implementation uses cxControls, DB, schInventarioClient_Intf, uEditorRegistryUtils, uIEditorInventario, uDataModuleInventario, uDataModuleUsuarios, uDAInterfaces, uDataTableUtils, uDateUtils, uROTypes, DateUtils, Controls, Windows, dialogs, uBizAlmacenes, uBizArticulosProveedor, uIEditorEntradaArticulosInventario; { TInventarioController } { procedure TInventarioController.Anadir(AArticulo: IBizArticulo); begin AArticulo.Insert; end; } procedure TInventarioController.Anadir(AInventario: IBizInventario); var AArticulos: IBizArticuloProveedor; begin //Todos los cambios serán en caché hasta que el usuario decida guardar AArticulos := (FArticulosController.BuscarTodos as IBizArticuloProveedor); AArticulos := FArticulosController.ElegirArticulos(AArticulos, '', True); if Assigned(AArticulos) then AInventario.Copiar(AArticulos) end; procedure TInventarioController.AsignarCodigo(AInventario: IBizInventario); begin if (AInventario.EsNuevo) then AssignarID(AInventario, (FDataModule as IDataModuleInventario)); end; procedure TInventarioController.AsignarDataModule; begin FDataModule := TDataModuleInventario.Create(Nil); end; procedure TInventarioController.AsignarEditor(out AEditor: IEditorDBItem); begin CreateEditor('EditorEntradaArticulosInventario', IEditorEntradaArticulosInventario, AEditor); end; procedure TInventarioController.AssignarID(AInventario: IBizInventario; ADataModule : IDataModuleInventario); var NuevoIDCabecera : Integer; begin if not Assigned(AInventario) then raise Exception.Create ('Inventario no asignada'); NuevoIDCabecera := ADataModule.GetNextID(AInventario.DataTable.LogicalName); AInventario.Edit; AInventario.ID := NuevoIDCabecera; AInventario.Post; end; function TInventarioController.Buscar(const ID: Integer): IBizInventario; begin Result := (FDataModule as IDataModuleInventario).GetItem(ID); FiltrarEmpresa(Result); end; function TInventarioController.BuscarTodos: IBizInventario; begin Result := FDataModule.GetItems; FiltrarEmpresa(Result); end; constructor TInventarioController.Create; begin AsignarDataModule; FArticulosController := TArticulosProveedorController.Create; FAlmacenesController := TAlmacenesController.Create; end; function TInventarioController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean; begin Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf); end; { procedure TInventarioController.DescartarCambios(AArticulo: IBizArticulo); begin if not Assigned(AArticulo) then raise Exception.Create ('Articulo no asignado'); ShowHourglassCursor; try if (AArticulo.State in dsEditModes) then AArticulo.Cancel; AArticulo.DataTable.CancelUpdates; finally HideHourglassCursor; end; end; } destructor TInventarioController.Destroy; begin FDataModule := Nil; FArticulosController := Nil; FAlmacenesController := Nil; inherited; end; function TInventarioController.Eliminar(AInventario: IBizInventario; Todos: Boolean; ApplyUpdates: Boolean): Boolean; begin Result := False; if Assigned(AInventario) then begin ShowHourglassCursor; try if Todos then AInventario.DataTable.ClearRows else AInventario.DataTable.Delete; if ApplyUpdates then AInventario.DataTable.ApplyUpdates; Result := True; finally HideHourglassCursor; end; end; end; function TInventarioController.ExtraerSeleccionados(AArticulos: IBizInventario): IBizInventario; var ASeleccionados : IBizInventario; begin ASeleccionados := (Self.Buscar(ID_NULO) as IBizInventario); CopyDataTable(AArticulos.DataTable, ASeleccionados.DataTable, True); Result := ASeleccionados; end; { function TInventarioController.Eliminar: Boolean; begin end; function TInventarioController.Liberar: Boolean; begin end; } { function TInventarioController.Duplicar(AArticulo: IBizArticulo): IBizArticulo; begin Result := Self._Vacio; ShowHourglassCursor; try DuplicarRegistros(AArticulo.DataTable, Result.DataTable, mdrActual); // Hay que dejar algunos campos como si fuera un artículo nuevo Result.Edit; with Result do begin ID_EMPRESA := dmUsuarios.IDEmpresaActual; USUARIO := dmUsuarios.LoginInfo.Usuario; end; Result.Post; finally HideHourglassCursor; end; end; } function TInventarioController.ValidarInventario(AInventario: IBizInventario): Boolean; begin { Result := False; // Asegurarse de valores en campos "automáticos" AInventario.Edit; try AInventario.USUARIO := dmUsuarios.LoginInfo.Usuario; } Result := True; { finally AInventario.Post; end; } end; procedure TInventarioController.ValidarObjetos; begin // end; { procedure TInventarioController.Ver(AArticulo: IBizArticulo); var AEditor : IEditorDBItem; begin AEditor := NIL; ShowHourglassCursor; try RecuperarObjetos(AArticulo); AsignarEditor(AEditor); with (AEditor as IEditorArticulo) do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Articulo := AArticulo; end; finally HideHourglassCursor; end; if Assigned(AEditor) then AEditor.ShowModal; end; } procedure TInventarioController.Ver(AInventario: IBizInventario); var AEditor : IEditorDBItem; begin AEditor := NIL; ShowHourglassCursor; try RecuperarObjetos(AInventario); AsignarEditor(AEditor); with (AEditor as IEditorEntradaArticulosInventario) do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Articulos := AInventario; end; finally HideHourglassCursor; end; if Assigned(AEditor) then AEditor.ShowModal; end; procedure TInventarioController.VerTodos(AInventario: IBizInventario); var AEditor : IEditorInventario; begin AEditor := NIL; ShowHourglassCursor; try CreateEditor('EditorInventario', IEditorInventario, AEditor); with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Inventario := AInventario; end; finally HideHourglassCursor; end; if Assigned(AEditor) then AEditor.ShowEmbedded; end; function TInventarioController._Vacio: IBizInventario; begin Result := Buscar(ID_NULO); end; { procedure TInventarioController.Eliminar(const ID: Integer); var AArticulo : IBizArticulo; begin AArticulo := Buscar(ID); if not Assigned(AArticulo) then raise Exception.Create(Format('No se ha encontrado el artículo con ID = %d', [ID])); Eliminar(AArticulo); AArticulo := NIL; end; function TInventarioController.Eliminar(AArticulo: IBizArticulo): Boolean; begin Result := False; if not Assigned(AArticulo) then raise Exception.Create ('Articulo no asignada'); ShowHourglassCursor; try if (AArticulo.State in dsEditModes) then AArticulo.Cancel; AArticulo.Delete; AArticulo.DataTable.ApplyUpdates; HideHourglassCursor; Result := True; except on E: Exception do begin AArticulo.DataTable.CancelUpdates; HideHourglassCursor; if (Pos('FOREIGN KEY', E.Message) > 0) then MessageBox(0, 'No se puede borrar este artículo porque tiene artículos', 'Atención', MB_ICONWARNING or MB_OK); end; end; end; } procedure TInventarioController.RecibirArticulos(const CodigoAlmacenDes: Integer); var AInventario: IBizInventario; begin try AInventario := Buscar(ID_NULO); if not AInventario.DataTable.Active then AInventario.DataTable.Active := True; AInventario.IDAlmacenEntrada := CodigoAlmacenDes; Ver(AInventario); finally AInventario := Nil; end; end; procedure TInventarioController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); begin inherited; // end; procedure TInventarioController.RecuperarObjetos(AInventario: IBizInventario); begin // end; procedure TInventarioController.SetAlmacenesController(const Value: IAlmacenesController); begin FAlmacenesController := Value; end; procedure TInventarioController.SetArticulosController(const Value: IArticulosProveedorController); begin FArticulosController := Value end; function TInventarioController.Trasladar(AInventario: IBizInventario; Todos: Boolean): Boolean; var AAlmacenes : IBizAlmacen; begin Result := False; if Assigned(AInventario) then begin ShowHourglassCursor; try //Seleccionamos almacén AAlmacenes := FAlmacenesController.BuscarTodos; if not AAlmacenes.DataTable.Active then AAlmacenes.DataTable.Active := True; AAlmacenes := FAlmacenesController.VerLista(AAlmacenes); //Aginamos el nuevo almacén if Assigned(AAlmacenes) then begin if not AInventario.DataTable.Editing then AInventario.Edit; AInventario.ID_ALMACEN := AAlmacenes.ID; AInventario.Post; AInventario.DataTable.ApplyUpdates; Result := True; // if Todos // then AInventario.DataTable.ClearRows // else AInventario.DataTable.Delete; end; finally HideHourglassCursor; end; end; end; { function TInventarioController.Trasladar: Boolean; begin end; function TInventarioController.Existe(const ID: Integer): Boolean; var AArticulo : IBizArticulo; begin try AArticulo := Buscar(ID); Result := Assigned(AArticulo) and (AArticulo.ID = ID); finally AArticulo := NIL; end; end; } procedure TInventarioController.FiltrarEmpresa(AInventario: IBizInventario); begin if AInventario.DataTable.Active then AInventario.DataTable.Active := False; // Filtrar los inventario actuales por empresa with AInventario.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddText('ALMACENES.' + fld_InventarioID_EMPRESA + ' = ' + IntToStr(dmUsuarios.IDEmpresaActual)); CloseBraket; end; end; function TInventarioController.GetAlmacenesController: IAlmacenesController; begin Result := FAlmacenesController; end; function TInventarioController.GetArticulosController: IArticulosProveedorController; begin Result := FArticulosController; end; procedure TInventarioController.GuardarArticulosUnitarios(AInventario : IBizInventario); var AArticulosUnitarios: IBizInventario; i: Integer; begin AArticulosUnitarios := Buscar(ID_NULO); if not AArticulosUnitarios.DataTable.Active then AArticulosUnitarios.DataTable.Active := True; with AInventario do begin DataTable.First; while not DataTable.EOF do begin for i:=0 to (CANTIDAD - 1) do begin AArticulosUnitarios.Insert; AArticulosUnitarios.ID_ALMACEN := ID_ALMACEN; AArticulosUnitarios.ID_ARTICULO := ID_ARTICULO; if not DataTable.FieldByName(fld_INVENTARIOID_PEDIDO_PROVEEDOR).IsNull then AArticulosUnitarios.ID_PEDIDO_PROVEEDOR := ID_PEDIDO_PROVEEDOR; if not DataTable.FieldByName(fld_INVENTARIOID_PEDIDO_CLIENTE).IsNull then AArticulosUnitarios.ID_PEDIDO_CLIENTE := ID_PEDIDO_CLIENTE; AArticulosUnitarios.DESCRIPCION := DESCRIPCION; AArticulosUnitarios.Post; AssignarID(AArticulosUnitarios, (FDataModule as IDataModuleInventario)); end; DataTable.Next; end; DataTable.CancelUpdates; AArticulosUnitarios.DataTable.ApplyUpdates; end; end; { procedure TInventarioController.Guardar(AArticulo: IBizArticulo); begin if not Assigned(AArticulo) then raise Exception.Create ('Artículo no asignada'); ValidarObjetos; if ValidarArticulo(AArticulo) then begin ShowHourglassCursor; try if (AArticulo.DataTable.State in dsEditModes) then AArticulo.DataTable.Post; AsignarCodigo(AArticulo); AArticulo.DataTable.ApplyUpdates; finally HideHourglassCursor; end; end; end; function TInventarioController.Nuevo: IBizArticulo; var AArticulo : IBizArticulo; begin AArticulo := FDataModule.NewItem; FiltrarEmpresa(AArticulo); AArticulo.DataTable.Active := True; AArticulo.Insert; Result := AArticulo; end; } { procedure TInventarioController.Preview(AArticulo: IBizArticulo); var AReportController : IArticulosReportController; begin AReportController := TArticulosReportController.Create; try AReportController.Preview(AArticulo.ID); finally AReportController := NIL; end; end; procedure TInventarioController.Print(AArticulo: IBizArticulo); var AReportController : IArticulosReportController; begin AReportController := TArticulosReportController.Create; try AReportController.Print(AArticulo.ID); finally AReportController := NIL; end; end; } end.