Tecsitel_FactuGES2/Source/Modulos/Obras/Controller/uObrasController.pas

497 lines
13 KiB
ObjectPascal

unit uObrasController;
interface
uses
Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem,
uIDataModuleObras, uBizObras, uBizDireccionesContacto;
type
IObrasController = interface(IControllerBase)
['{FC563E47-7634-4227-9E4F-ED15C5C3A783}']
function Buscar(const ID: Integer): IBizObra;
function BuscarTodos: IBizObra;
procedure Ver(AObra : IBizObra);
procedure VerTodos(AObras: IBizObra);
function VerLista(AObras: IBizObra): IBizObra;
function Nuevo : IBizObra; overload;
procedure Anadir(AObra : IBizObra);
function Eliminar(const ID : Integer): Boolean; overload;
function Eliminar(AObra : IBizObra): Boolean; overload;
function Guardar(AObra : IBizObra): Boolean;
procedure DescartarCambios(AObra : IBizObra);
function Existe(const ID: Integer) : Boolean;
function Duplicar(AObra: IBizObra): IBizObra;
procedure Preview(AObra : IBizObra);
procedure Print(AObra : IBizObra);
procedure QuitarDireccion(AObra: IBizObra);
procedure CopiarDireccion (const ADireccionEnvio: IBizDireccionesContacto; AObra: IBizObra);
end;
TObrasController = class(TControllerBase, IObrasController)
protected
FDataModule : IDataModuleObras;
procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
// procedure AssignarID(AObra: IBizObra; ADataModule : IDataModuleObras); virtual;
function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
function _Vacio : IBizObra;
procedure FiltrarEmpresa(AObra: IBizObra);
function ValidarObra(AObra: IBizObra): 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(AObra: IBizObra); virtual;
procedure ValidarObjetos; virtual;
// procedure AsignarCodigo(AObra: IBizObra); virtual;
public
constructor Create; override;
destructor Destroy; override;
function Eliminar(const ID : Integer): Boolean; overload;
function Eliminar(AObra : IBizObra): Boolean; overload;
function Guardar(AObra : IBizObra): Boolean;
procedure DescartarCambios(AObra : IBizObra); virtual;
function Existe(const ID: Integer) : Boolean; virtual;
procedure Anadir(AObra : IBizObra);
function Buscar(const ID: Integer): IBizObra;
function BuscarTodos: IBizObra;
function Nuevo : IBizObra; overload;
procedure Ver(AObra : IBizObra);
procedure VerTodos(AObras: IBizObra);
function VerLista(AObras: IBizObra): IBizObra;
function Duplicar(AObra: IBizObra): IBizObra;
procedure Preview(AObra : IBizObra);
procedure Print(AObra : IBizObra);
procedure QuitarDireccion(AObra: IBizObra);
procedure CopiarDireccion (const ADireccionEnvio: IBizDireccionesContacto; AObra: IBizObra);
end;
implementation
uses
cxControls, DB, uEditorRegistryUtils, schObrasClient_Intf,
uIEditorObras, uIEditorObra, uDataModuleObras,
uDataModuleUsuarios, uDAInterfaces, uDataTableUtils, uFactuGES_App,
uDateUtils, uROTypes, DateUtils, Controls, Windows, uIEditorListaObras;
{ TObrasController }
procedure TObrasController.Anadir(AObra: IBizObra);
begin
AObra.Insert;
end;
{procedure TObrasController.AsignarCodigo(AObra: IBizObra);
begin
if (AObra.EsNuevo) then
AssignarID(AObra, (FDataModule as IDataModuleObras));
end;}
procedure TObrasController.AsignarDataModule;
begin
FDataModule := TDataModuleObras.Create(Nil);
end;
{procedure TObrasController.AssignarID(AObra: IBizObra; ADataModule : IDataModuleObras);
var
NuevoIDCabecera : Integer;
begin
if not Assigned(AObra) then
raise Exception.Create ('Obra no asignada');
NuevoIDCabecera := ADataModule.GetNextID(AObra.DataTable.LogicalName);
AObra.Edit;
AObra.ID := NuevoIDCabecera;
AObra.Post;
end;}
function TObrasController.Buscar(const ID: Integer): IBizObra;
begin
Result := (FDataModule as IDataModuleObras).GetItem(ID);
FiltrarEmpresa(Result);
end;
function TObrasController.BuscarTodos: IBizObra;
begin
Result := FDataModule.GetItems;
FiltrarEmpresa(Result);
end;
procedure TObrasController.CopiarDireccion(const ADireccionEnvio: IBizDireccionesContacto; AObra: IBizObra);
var
bEnEdicion : Boolean;
begin
if not Assigned(AObra) then
raise Exception.Create ('Obra no asignada (CopiarDireccion)');
if not Assigned(ADireccionEnvio) then
raise Exception.Create ('No se ha indicado la dirección (CopiarDireccionEnvio)');
if AObra.DataTable.Active then
AObra.DataTable.Active := True;
if ADireccionEnvio.DataTable.Active then
ADireccionEnvio.DataTable.Active := True;
bEnEdicion := (AObra.DataTable.State in dsEditModes);
if not bEnEdicion then
AObra.Edit;
ShowHourglassCursor;
AObra.Edit;
try
AObra.CALLE := ADireccionEnvio.CALLE;
AObra.POBLACION := ADireccionEnvio.POBLACION;
AObra.CODIGO_POSTAL := ADireccionEnvio.CODIGO_POSTAL;
AObra.PROVINCIA := ADireccionEnvio.PROVINCIA;
AObra.TELEFONO := ADireccionEnvio.TELEFONO;
AObra.PERSONA_CONTACTO := ADireccionEnvio.PERSONA_CONTACTO;
if not bEnEdicion then
AObra.Post;
finally
HideHourglassCursor;
end;
end;
constructor TObrasController.Create;
begin
inherited;
AsignarDataModule;
end;
function TObrasController.CreateEditor(const AName: String;
const IID: TGUID; out Intf): Boolean;
begin
Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf);
end;
procedure TObrasController.DescartarCambios(AObra: IBizObra);
begin
if not Assigned(AObra) then
raise Exception.Create ('Obra no asignado');
ShowHourglassCursor;
try
if (AObra.State in dsEditModes) then
AObra.Cancel;
AObra.DataTable.CancelUpdates;
finally
HideHourglassCursor;
end;
end;
destructor TObrasController.Destroy;
begin
FDataModule := Nil;
inherited;
end;
function TObrasController.Duplicar(AObra: IBizObra): IBizObra;
begin
Result := Self._Vacio;
ShowHourglassCursor;
try
DuplicarRegistros(AObra.DataTable, Result.DataTable, mdrActual);
// Hay que dejar algunos campos como si fuera una obra nuevo
Result.Edit;
with Result do
begin
ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
USUARIO := AppFactuGES.UsuarioActivo.UserName;
end;
Result.Post;
finally
HideHourglassCursor;
end;
end;
function TObrasController.ValidarObra(AObra: IBizObra): Boolean;
begin
Result := False;
if not Assigned(AObra) then
raise Exception.Create ('Obra no asignada');
if (AObra.DataTable.State in dsEditModes) then
AObra.DataTable.Post;
if Length(AObra.NOMBRE) = 0 then
raise Exception.Create('Debe indicar al menos el nombre de esta obra.');
// Asegurarse de valores en campos "automáticos"
AObra.Edit;
try
AObra.USUARIO := AppFactuGES.UsuarioActivo.UserName;
Result := True;
finally
AObra.Post;
end;
end;
procedure TObrasController.ValidarObjetos;
begin
//
end;
procedure TObrasController.Ver(AObra: IBizObra);
var
AEditor : IEditorDBItem;
begin
AEditor := NIL;
ShowHourglassCursor;
try
RecuperarObjetos(AObra);
CreateEditor('EditorObra', IEditorObra, AEditor);
if Assigned(AEditor) then
with (AEditor as IEditorObra) do
begin
Controller := Self; //OJO ORDEN MUY IMPORTANTE
Obra := AObra;
ShowModal;
Release;
end;
finally
AEditor := NIL;
HideHourglassCursor;
end;
end;
function TObrasController.VerLista(AObras: IBizObra): IBizObra;
var
AEditor : IEditorListaObras;
begin
AEditor := NIL;
Result := NIL;
ShowHourglassCursor;
try
CreateEditor('EditorListaObras', IEditorListaObras, AEditor);
if Assigned(AEditor) then
with AEditor do
begin
Obras := AObras;
if IsPositiveResult(ShowModal) then
Result := ObraSeleccionado;
Release;
end;
finally
AEditor := NIL;
HideHourglassCursor;
end;
end;
procedure TObrasController.VerTodos(AObras: IBizObra);
var
AEditor : IEditorObras;
begin
AEditor := NIL;
ShowHourglassCursor;
try
CreateEditor('EditorObras', IEditorObras, AEditor);
if Assigned(AEditor) then
with AEditor do
begin
Controller := Self; //OJO ORDEN MUY IMPORTANTE
Obras := AObras;
ShowEmbedded;
end;
finally
HideHourglassCursor;
end;
end;
function TObrasController._Vacio: IBizObra;
begin
Result := Buscar(ID_NULO);
end;
function TObrasController.Eliminar(const ID: Integer): Boolean;
var
AObra : IBizObra;
begin
AObra := Buscar(ID);
if not Assigned(AObra) then
raise Exception.Create(Format('No se ha encontrado el Obra con ID = %d', [ID]));
Result := Eliminar(AObra);
AObra := NIL;
end;
function TObrasController.Eliminar(AObra: IBizObra): Boolean;
begin
Result := False;
if not Assigned(AObra) then
raise Exception.Create ('Obra no asignada');
ShowHourglassCursor;
try
if (AObra.State in dsEditModes) then
AObra.Cancel;
AObra.Delete;
AObra.DataTable.ApplyUpdates;
HideHourglassCursor;
Result := True;
except
on E: Exception do
begin
AObra.DataTable.CancelUpdates;
HideHourglassCursor;
if (Pos('FOREIGN KEY', E.Message) > 0) then
MessageBox(0, 'No se puede borrar esta obra porque tiene artículos', 'Atención', MB_ICONWARNING or MB_OK);
end;
end;
end;
procedure TObrasController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
begin
inherited;
//
end;
procedure TObrasController.RecuperarObjetos(AObra: IBizObra);
begin
//
end;
function TObrasController.Existe(const ID: Integer): Boolean;
var
AObra : IBizObra;
begin
try
AObra := Buscar(ID);
Result := Assigned(AObra) and (AObra.ID = ID);
finally
AObra := NIL;
end;
end;
procedure TObrasController.FiltrarEmpresa(AObra: IBizObra);
var
Condicion: TDAWhereExpression;
begin
if AObra.DataTable.Active then
AObra.DataTable.Active := False;
// Filtrar los Obras actuales por empresa
with AObra.DataTable.DynamicWhere do
begin
// (ID_EMPRESA >= ID)
Condicion := NewBinaryExpression(NewField('', fld_ObrasID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
end;
function TObrasController.Guardar(AObra: IBizObra): Boolean;
begin
Result := False;
if not Assigned(AObra) then
raise Exception.Create ('Obra no asignada');
ValidarObjetos;
if ValidarObra(AObra) then
begin
ShowHourglassCursor;
try
// AsignarCodigo(AObra);
AObra.DataTable.ApplyUpdates;
Result := True;
finally
HideHourglassCursor;
end;
end;
end;
function TObrasController.Nuevo: IBizObra;
var
AObra : IBizObra;
begin
AObra := FDataModule.NewItem;
FiltrarEmpresa(AObra);
AObra.DataTable.Active := True;
AObra.Insert;
Result := AObra;
end;
procedure TObrasController.Preview(AObra: IBizObra);
//var
// AReportController : IObrasReportController;
begin
{ AReportController := TObrasReportController.Create;
try
AReportController.Preview(AObra.ID);
finally
AReportController := NIL;
end;
}
end;
procedure TObrasController.Print(AObra: IBizObra);
//var
// AReportController : IObrasReportController;
begin
{ AReportController := TObrasReportController.Create;
try
AReportController.Print(AObra.ID);
finally
AReportController := NIL;
end;
}
end;
procedure TObrasController.QuitarDireccion(AObra: IBizObra);
var
bEnEdicion : Boolean;
begin
if not Assigned(AObra) then
raise Exception.Create ('Obra no asignada (QuitarDireccion)');
if AObra.DataTable.Active then
AObra.DataTable.Active := True;
bEnEdicion := (AObra.DataTable.State in dsEditModes);
if not bEnEdicion then
AObra.Edit;
ShowHourglassCursor;
AObra.Edit;
try
AObra.DataTable.FieldByName(fld_ObrasCALLE).Clear;
AObra.DataTable.FieldByName(fld_ObrasPOBLACION).Clear;
AObra.DataTable.FieldByName(fld_ObrasCODIGO_POSTAL).Clear;
AObra.DataTable.FieldByName(fld_ObrasPROVINCIA).Clear;
AObra.DataTable.FieldByName(fld_ObrasTELEFONO).Clear;
AObra.DataTable.FieldByName(fld_ObrasPERSONA_CONTACTO).Clear;
if not bEnEdicion then
AObra.Post;
finally
HideHourglassCursor;
end;
end;
end.