unit uArticulosController; interface uses Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem, uIDataModuleArticulos, uBizArticulos, uProveedoresController, uBizContactos; type IArticulosController = interface(IObservador) ['{C7EA6486-7BE4-468E-A27A-621E1BA13430}'] function Buscar(const ID: Integer; AClienteID: Integer = -1): IBizArticulo; function BuscarInventariables: IBizArticulo; function BuscarTodos: IBizArticulo; overload; function BuscarTodos(ACliente: IBizCliente): IBizArticulo; overload; function BuscarTodos(AProveedor: IBizProveedor): IBizArticulo; overload; function BuscarReferencia(const Ref: String; AClienteID: Integer): IBizArticulo; function BuscarReferenciaProveedor(const Ref: String; AClienteID: Integer): IBizArticulo; procedure Ver(AArticulo : IBizArticulo); procedure VerTodos(AArticulos: IBizArticulo); function Nuevo : IBizArticulo; procedure Anadir(AArticulo : IBizArticulo); function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(AArticulo : IBizArticulo): Boolean; overload; function Guardar(AArticulo : IBizArticulo): Boolean; procedure DescartarCambios(AArticulo : IBizArticulo); function Existe(const ID: Integer) : Boolean; function Duplicar(AArticulo: IBizArticulo): IBizArticulo; procedure Preview(AArticulo : IBizArticulo); procedure Print(AArticulo : IBizArticulo); procedure ElegirProveedor(AArticulo : IBizArticulo); procedure AnadirProveedor(AArticulo : IBizArticulo); procedure VerProveedor(AArticulo : IBizArticulo); function ExtraerSeleccionados(AArticulos: IBizArticulo) : IBizArticulo; function ElegirArticulos(AArticulos : IBizArticulo; AMensaje: String; AMultiSelect: Boolean): IBizArticulo; procedure CalcularPrecioNeto(AArticulos: IBizArticulo); function GetProveedoresController: IProveedoresController; property ProveedoresController: IProveedoresController read GetProveedoresController; end; TArticulosController = class(TObservador, IArticulosController) protected FDataModule : IDataModuleArticulos; FProveedoresController: IProveedoresController; function GetProveedoresController: IProveedoresController; procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override; procedure AsignarID(AArticulo: IBizArticulo; const IDNuevo: Integer); virtual; function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean; function _Vacio : IBizArticulo; procedure FiltrarEmpresa(AArticulo: IBizArticulo); function ValidarArticulo(AArticulo: IBizArticulo): Boolean; virtual; procedure RecuperarObjetos(AArticulo: IBizArticulo); virtual; procedure AsignarDataModule; virtual; public property ProveedoresController: IProveedoresController read GetProveedoresController; constructor Create; virtual; destructor Destroy; override; function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(AArticulo : IBizArticulo): Boolean; overload; function Guardar(AArticulo : IBizArticulo): Boolean; procedure DescartarCambios(AArticulo : IBizArticulo); virtual; function Existe(const ID: Integer) : Boolean; virtual; procedure Anadir(AArticulo : IBizArticulo); virtual; function Buscar(const ID: Integer; AClienteID: Integer = -1): IBizArticulo; virtual; function BuscarTodos: IBizArticulo; overload; function BuscarInventariables: IBizArticulo; function BuscarTodos(ACliente: IBizCliente): IBizArticulo; overload; function BuscarTodos(ACliente: Integer): IBizArticulo; overload; function BuscarTodos(AProveedor: IBizProveedor): IBizArticulo; overload; function BuscarReferencia(const Ref: String; AClienteID: Integer = -1): IBizArticulo; virtual; function BuscarReferenciaProveedor(const Ref: String; AClienteID: Integer = -1): IBizArticulo; virtual; function Nuevo : IBizArticulo; virtual; procedure Ver(AArticulo : IBizArticulo); virtual; procedure VerTodos(AArticulos: IBizArticulo); virtual; function Duplicar(AArticulo: IBizArticulo): IBizArticulo; virtual; procedure Preview(AArticulo : IBizArticulo); virtual; procedure Print(AArticulo : IBizArticulo); virtual; function ExtraerSeleccionados(AArticulos: IBizArticulo) : IBizArticulo; virtual; function ElegirArticulos(AArticulos : IBizArticulo; AMensaje: String; AMultiSelect: Boolean): IBizArticulo; virtual; procedure CalcularPrecioNeto(AArticulos: IBizArticulo); procedure ElegirProveedor(AArticulo : IBizArticulo); procedure AnadirProveedor(AArticulo : IBizArticulo); procedure VerProveedor(AArticulo : IBizArticulo); end; implementation uses cxControls, DB, uEditorRegistryUtils, schArticulosClient_Intf, uIEditorArticulos, uIEditorArticulo, uIEditorElegirArticulos, uDataModuleArticulos, uDataModuleUsuarios, uDAInterfaces, uDataTableUtils, uDateUtils, uROTypes, DateUtils, Controls, Windows; { TArticulosController } procedure TArticulosController.Anadir(AArticulo: IBizArticulo); begin AArticulo.Insert; end; procedure TArticulosController.AnadirProveedor(AArticulo: IBizArticulo); var AProveedor : IBizContacto; begin inherited; AProveedor := (FProveedoresController.Nuevo as IBizProveedor); FProveedoresController.Ver(AProveedor); if Assigned(AProveedor) then begin if not AArticulo.DataTable.Editing then AArticulo.Edit; AArticulo.ID_PROVEEDOR := AProveedor.ID; AArticulo.NOMBRE_PROVEEDOR := AProveedor.NOMBRE; end; AProveedor := Nil; end; procedure TArticulosController.AsignarDataModule; begin FDataModule := TDataModuleArticulos.Create(Nil); FProveedoresController := TProveedoresController.Create; end; procedure TArticulosController.AsignarID(AArticulo: IBizArticulo; const IDNuevo: Integer); begin if not Assigned(AArticulo) then raise Exception.Create ('Articulo no asignado'); AArticulo.Edit; AArticulo.ID := IDNuevo; AArticulo.Post; end; function TArticulosController.Buscar(const ID: Integer; AClienteID: Integer = -1): IBizArticulo; begin if (AClienteID = -1) then Result := (FDataModule as IDataModuleArticulos).GetItem(ID) else Result := (FDataModule as IDataModuleArticulos).GetItem(ID, AClienteID); FiltrarEmpresa(Result); end; function TArticulosController.BuscarInventariables: IBizArticulo; begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddText('ARTICULOS.' + fld_ArticulosINVENTARIABLE + ' = 1'); CloseBraket; end; finally HideHourglassCursor; end; end; function TArticulosController.BuscarReferencia(const Ref: String; AClienteID: Integer = -1): IBizArticulo; begin ShowHourglassCursor; try if (AClienteID = -1) then Result := BuscarTodos else Result := BuscarTodos(AClienteID); with Result.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddText('UPPER(ARTICULOS.' + fld_ArticulosREFERENCIA + ') = UPPER(''' + Ref + ''')'); CloseBraket; end; finally HideHourglassCursor; end; end; function TArticulosController.BuscarReferenciaProveedor(const Ref: String; AClienteID: Integer = -1): IBizArticulo; begin ShowHourglassCursor; try if (AClienteID = -1) then Result := BuscarTodos else Result := BuscarTodos(AClienteID); with Result.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddText('UPPER(ARTICULOS.' + fld_ArticulosREFERENCIA_PROV + ') = UPPER(''' + Ref + ''')'); CloseBraket; end; finally HideHourglassCursor; end; end; function TArticulosController.BuscarTodos(ACliente: Integer): IBizArticulo; begin Result := FDataModule.GetItems(ACliente); FiltrarEmpresa(Result); end; function TArticulosController.BuscarTodos(ACliente: IBizCliente): IBizArticulo; begin if not Assigned(ACliente) then raise Exception.Create('Falta ACliente: BuscarTodos'); Result := BuscarTodos(ACliente.ID); end; function TArticulosController.BuscarTodos(AProveedor: IBizProveedor): IBizArticulo; begin if Assigned(AProveedor) then begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddText('ARTICULOS.' + fld_ArticulosID_PROVEEDOR + ' = ' + IntToStr(AProveedor.ID)); CloseBraket; end; finally HideHourglassCursor; end; end; end; function TArticulosController.BuscarTodos: IBizArticulo; begin Result := FDataModule.GetItems; FiltrarEmpresa(Result); end; procedure TArticulosController.CalcularPrecioNeto(AArticulos: IBizArticulo); var lPrecioNeto: Double; begin if Assigned(AArticulos) then begin with AArticulos do begin try ShowHourglassCursor; DataTable.DisableControls; if not DataTable.Active then DataTable.Active := True; //Calcular precio neto lPrecioNeto := PRECIO_COSTE - ((PRECIO_COSTE * DESCUENTO)/100); if (PRECIO_NETO <> lPrecioNeto) then begin if not DataTable.Editing then DataTable.Edit; PRECIO_NETO := lPrecioNeto; end; finally DataTable.EnableControls; HideHourglassCursor; end; end; end; end; constructor TArticulosController.Create; begin AsignarDataModule; end; function TArticulosController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean; begin Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf); end; procedure TArticulosController.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 TArticulosController.Destroy; begin FDataModule := Nil; FProveedoresController := Nil; inherited; end; function TArticulosController.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 TArticulosController.ValidarArticulo(AArticulo: IBizArticulo): Boolean; begin Result := False; if not Assigned(AArticulo) then raise Exception.Create ('Artículo no asignado'); if (AArticulo.DataTable.State in dsEditModes) then AArticulo.DataTable.Post; if Length(AArticulo.DESCRIPCION) = 0 then raise Exception.Create('Debe indicar al menos la descripción de este artículo.'); // Asegurarse de valores en campos "automáticos" AArticulo.Edit; try AArticulo.USUARIO := dmUsuarios.LoginInfo.Usuario; Result := True; finally AArticulo.Post; end; end; procedure TArticulosController.Ver(AArticulo: IBizArticulo); var AEditor : IEditorArticulo; begin AEditor := NIL; ShowHourglassCursor; try RecuperarObjetos(AArticulo); CreateEditor('EditorArticulo', IEditorArticulo, AEditor); with (AEditor as IEditorArticulo) do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Articulo := AArticulo; end; finally HideHourglassCursor; end; if Assigned(AEditor) then try AEditor.ShowModal; AEditor.Release; finally AEditor := NIL; end; end; procedure TArticulosController.VerProveedor(AArticulo: IBizArticulo); var AProveedor : IBizContacto; begin AProveedor := FProveedoresController.Buscar(AArticulo.ID_PROVEEDOR); FProveedoresController.Ver(AProveedor); if Assigned(AProveedor) then begin if not AArticulo.DataTable.Editing then AArticulo.Edit; AArticulo.ID_PROVEEDOR := AProveedor.ID; AArticulo.NOMBRE_PROVEEDOR := AProveedor.NOMBRE; end; AProveedor := Nil; end; procedure TArticulosController.VerTodos(AArticulos: IBizArticulo); var AEditor : IEditorArticulos; begin AEditor := NIL; ShowHourglassCursor; try RecuperarObjetos(AArticulos); CreateEditor('EditorArticulos', IEditorArticulos, AEditor); with (AEditor as IEditorArticulos) do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Articulos := AArticulos; end; finally HideHourglassCursor; end; if Assigned(AEditor) then AEditor.ShowEmbedded; end; function TArticulosController._Vacio: IBizArticulo; begin Result := Buscar(ID_NULO); end; function TArticulosController.Eliminar(const ID: Integer): Boolean; 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])); Result := Eliminar(AArticulo); AArticulo := NIL; end; function TArticulosController.ElegirArticulos(AArticulos: IBizArticulo; AMensaje: String; AMultiSelect: Boolean): IBizArticulo; var AEditor : IEditorElegirArticulos; begin Result := NIL; CreateEditor('EditorElegirArticulos', IEditorElegirArticulos, AEditor); try with AEditor do begin Controller := Self; Articulos := AArticulos; MultiSelect := AMultiSelect; Mensaje := AMensaje; if IsPositiveResult(ShowModal) then Result := ArticulosSeleccionados; Release; end; finally AEditor := NIL; end; end; procedure TArticulosController.ElegirProveedor(AArticulo: IBizArticulo); var AProveedor : IBizContacto; begin inherited; AProveedor := (FProveedoresController.ElegirContacto(FProveedoresController.BuscarTodos, '', False) as IBizProveedor); if Assigned(AProveedor) then begin if not AArticulo.DataTable.Editing then AArticulo.Edit; AArticulo.ID_PROVEEDOR := AProveedor.ID; AArticulo.NOMBRE_PROVEEDOR := AProveedor.NOMBRE; end; AProveedor := Nil; end; function TArticulosController.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 TArticulosController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); begin inherited; // end; procedure TArticulosController.RecuperarObjetos(AArticulo: IBizArticulo); begin // end; function TArticulosController.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; function TArticulosController.ExtraerSeleccionados(AArticulos: IBizArticulo): IBizArticulo; var ASeleccionados : IBizArticulo; begin ASeleccionados := (Self.Buscar(ID_NULO) as IBizArticulo); CopyDataTable(AArticulos.DataTable, ASeleccionados.DataTable, True); Result := ASeleccionados; end; procedure TArticulosController.FiltrarEmpresa(AArticulo: IBizArticulo); begin if AArticulo.DataTable.Active then AArticulo.DataTable.Active := False; // Filtrar los Articulos actuales por empresa with AArticulo.DataTable.Where do begin if NotEmpty then AddOperator(opAND); OpenBraket; AddText('Articulos.' + fld_ArticulosID_EMPRESA + ' = ' + IntToStr(dmUsuarios.IDEmpresaActual)); CloseBraket; end; end; function TArticulosController.GetProveedoresController: IProveedoresController; begin Result := FProveedoresController; end; function TArticulosController.Guardar(AArticulo: IBizArticulo): Boolean; var NuevoID: Integer; begin Result := False; if ValidarArticulo(AArticulo) then begin ShowHourglassCursor; try if (AArticulo.EsNuevo) then NuevoID := FDataModule.GetNextID(AArticulo.DataTable.LogicalName) else NuevoID := AArticulo.ID; AsignarID(AArticulo, NuevoID); AArticulo.DataTable.ApplyUpdates; Result := True; finally HideHourglassCursor; end; end; end; function TArticulosController.Nuevo: IBizArticulo; var AArticulo : IBizArticulo; begin AArticulo := FDataModule.NewItem; FiltrarEmpresa(AArticulo); AArticulo.DataTable.Active := True; AArticulo.Insert; Result := AArticulo; end; procedure TArticulosController.Preview(AArticulo: IBizArticulo); //var // AReportController : IArticulosReportController; begin { AReportController := TArticulosReportController.Create; try AReportController.Preview(AArticulo.ID); finally AReportController := NIL; end; } end; procedure TArticulosController.Print(AArticulo: IBizArticulo); //var // AReportController : IArticulosReportController; begin { AReportController := TArticulosReportController.Create; try AReportController.Print(AArticulo.ID); finally AReportController := NIL; end; } end; end.