387 lines
10 KiB
ObjectPascal
387 lines
10 KiB
ObjectPascal
|
|
unit uArticulosController;
|
|||
|
|
|
|||
|
|
interface
|
|||
|
|
|
|||
|
|
|
|||
|
|
uses
|
|||
|
|
Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem,
|
|||
|
|
uIDataModuleArticulos, uBizArticulos;
|
|||
|
|
|
|||
|
|
type
|
|||
|
|
IArticulosController = interface(IObservador)
|
|||
|
|
['{C7EA6486-7BE4-468E-A27A-621E1BA13430}']
|
|||
|
|
function Buscar(const ID: Integer): IBizArticulo;
|
|||
|
|
function BuscarTodos: IBizArticulo;
|
|||
|
|
procedure Ver(AArticulo : IBizArticulo);
|
|||
|
|
procedure VerTodos(AArticulos: IBizArticulo);
|
|||
|
|
function Nuevo : IBizArticulo;
|
|||
|
|
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);
|
|||
|
|
|
|||
|
|
function ExtraerSeleccionados(AArticulos: IBizArticulo) : IBizArticulo;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
TArticulosController = class(TObservador, IArticulosController)
|
|||
|
|
protected
|
|||
|
|
FDataModule : IDataModuleArticulos;
|
|||
|
|
|
|||
|
|
procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
|
|||
|
|
procedure AssignarID(AArticulo: IBizArticulo; ADataModule : IDataModuleArticulos); 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
|
|||
|
|
constructor Create;
|
|||
|
|
destructor Destroy; override;
|
|||
|
|
|
|||
|
|
procedure Eliminar(const ID : Integer); overload;
|
|||
|
|
function Eliminar(AArticulo : IBizArticulo): Boolean; overload;
|
|||
|
|
procedure Guardar(AArticulo : IBizArticulo); virtual;
|
|||
|
|
procedure DescartarCambios(AArticulo : IBizArticulo); virtual;
|
|||
|
|
function Existe(const ID: Integer) : Boolean; virtual;
|
|||
|
|
procedure Anadir(AArticulo : IBizArticulo); virtual;
|
|||
|
|
function Buscar(const ID: Integer): IBizArticulo; virtual;
|
|||
|
|
function BuscarTodos: 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;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
implementation
|
|||
|
|
|
|||
|
|
uses
|
|||
|
|
cxControls, DB, uEditorRegistryUtils, schArticulosClient_Intf,
|
|||
|
|
uIEditorArticulos, uIEditorArticulo, uDataModuleArticulos,
|
|||
|
|
uDataModuleUsuarios, uDAInterfaces, uDataTableUtils,
|
|||
|
|
uDateUtils, uROTypes, DateUtils, Controls, Windows;
|
|||
|
|
|
|||
|
|
{ TArticulosController }
|
|||
|
|
|
|||
|
|
procedure TArticulosController.Anadir(AArticulo: IBizArticulo);
|
|||
|
|
begin
|
|||
|
|
AArticulo.Insert;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
procedure TArticulosController.AsignarDataModule;
|
|||
|
|
begin
|
|||
|
|
FDataModule := TDataModuleArticulos.Create(Nil);
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
procedure TArticulosController.AssignarID(AArticulo: IBizArticulo; ADataModule : IDataModuleArticulos);
|
|||
|
|
var
|
|||
|
|
NuevoIDCabecera : Integer;
|
|||
|
|
begin
|
|||
|
|
if not Assigned(AArticulo) then
|
|||
|
|
raise Exception.Create ('Articulo no asignado');
|
|||
|
|
|
|||
|
|
NuevoIDCabecera := ADataModule.GetNextID(AArticulo.DataTable.LogicalName);
|
|||
|
|
|
|||
|
|
AArticulo.Edit;
|
|||
|
|
AArticulo.ID := NuevoIDCabecera;
|
|||
|
|
AArticulo.Post;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
function TArticulosController.Buscar(const ID: Integer): IBizArticulo;
|
|||
|
|
begin
|
|||
|
|
Result := (FDataModule as IDataModuleArticulos).GetItem(ID);
|
|||
|
|
FiltrarEmpresa(Result);
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
function TArticulosController.BuscarTodos: IBizArticulo;
|
|||
|
|
begin
|
|||
|
|
Result := FDataModule.GetItems;
|
|||
|
|
FiltrarEmpresa(Result);
|
|||
|
|
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;
|
|||
|
|
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<72>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;
|
|||
|
|
var
|
|||
|
|
AFechaPagado : TDateTime;
|
|||
|
|
begin
|
|||
|
|
Result := False;
|
|||
|
|
|
|||
|
|
if Length(AArticulo.DESCRIPCION) = 0 then
|
|||
|
|
raise Exception.Create('Debe indicar al menos la descripci<63>n de este art<72>culo.');
|
|||
|
|
|
|||
|
|
// Asegurarse de valores en campos "autom<6F>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
|
|||
|
|
AEditor.ShowModal;
|
|||
|
|
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;
|
|||
|
|
|
|||
|
|
procedure TArticulosController.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<72>culo con ID = %d', [ID]));
|
|||
|
|
|
|||
|
|
Eliminar(AArticulo);
|
|||
|
|
AArticulo := 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<72>culo porque tiene art<72>culos', 'Atenci<63>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;
|
|||
|
|
|
|||
|
|
procedure TArticulosController.Guardar(AArticulo: IBizArticulo);
|
|||
|
|
begin
|
|||
|
|
if not Assigned(AArticulo) then
|
|||
|
|
raise Exception.Create ('Art<72>culo no asignado');
|
|||
|
|
|
|||
|
|
if ValidarArticulo(AArticulo) then
|
|||
|
|
begin
|
|||
|
|
ShowHourglassCursor;
|
|||
|
|
try
|
|||
|
|
if (AArticulo.DataTable.State in dsEditModes) then
|
|||
|
|
AArticulo.DataTable.Post;
|
|||
|
|
|
|||
|
|
if (AArticulo.EsNuevo) then
|
|||
|
|
AssignarID(AArticulo, (FDataModule as IDataModuleArticulos));
|
|||
|
|
|
|||
|
|
AArticulo.DataTable.ApplyUpdates;
|
|||
|
|
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.
|