unit uUnidadesMedidaController;

interface


uses
  Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem,
  uIDataModuleUnidadesMedida, uBizUnidadesMedida;

type
  IUnidadesMedidaController = interface(IControllerBase)
  ['{8D56360B-0AAA-41FA-9C48-90C586B07E37}']
    function BuscarTodos: IBizUnidadMedida;
    procedure VerTodos(AUnidadesMedida: IBizUnidadMedida);
    procedure Anadir(AUnidadMedida : IBizUnidadMedida);
    function Eliminar(AUnidadMedida : IBizUnidadMedida): Boolean;
    function Guardar(AUnidadMedida : IBizUnidadMedida): Boolean;
    procedure DescartarCambios(AUnidadMedida : IBizUnidadMedida);
    function Localizar(AUnidadesMedida: IBizUnidadMedida; ADescripcion:String): Boolean;
    function DarListaUnidadesMedida: TStringList;
  end;

  TUnidadesMedidaController = class(TControllerBase, IUnidadesMedidaController)
  protected
    FDataModule : IDataModuleUnidadesMedida;

    procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
    function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;

    function ValidarUnidadesMedida(AUnidadMedida: IBizUnidadMedida): Boolean;

    //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de
    //este controller
    procedure AsignarDataModule; virtual;
  public
    constructor Create; override;
    destructor Destroy; override;

    function Eliminar(AUnidadMedida : IBizUnidadMedida): Boolean;
    function Guardar(AUnidadMedida : IBizUnidadMedida): Boolean;
    procedure DescartarCambios(AUnidadMedida : IBizUnidadMedida); virtual;
    procedure Anadir(AUnidadMedida : IBizUnidadMedida);
    function BuscarTodos: IBizUnidadMedida;
    procedure VerTodos(AUnidadesMedida: IBizUnidadMedida);
    function Localizar(AUnidadesMedida: IBizUnidadMedida; ADescripcion:String): Boolean;
    function DarListaUnidadesMedida: TStringList;
  end;

implementation

uses
  cxControls, DB, uEditorRegistryUtils, schUnidadesMedidaClient_Intf,
  uIEditorUnidadesMedida, uDataModuleUnidadesMedida,
  uDAInterfaces, uDataTableUtils,
  uDateUtils, uROTypes, DateUtils, Controls, Windows;

{ TUnidadesMedidaController }

procedure TUnidadesMedidaController.Anadir(AUnidadMedida: IBizUnidadMedida);
begin
  AUnidadMedida.Insert;
end;

procedure TUnidadesMedidaController.AsignarDataModule;
begin
  FDataModule := TDataModuleUnidadesMedida.Create(Nil);
end;

function TUnidadesMedidaController.BuscarTodos: IBizUnidadMedida;
begin
  Result := FDataModule.GetItems;
end;

constructor TUnidadesMedidaController.Create;
begin
  inherited;
  AsignarDataModule;
end;

function TUnidadesMedidaController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean;
begin
  Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf);
end;

function TUnidadesMedidaController.DarListaUnidadesMedida: TStringList;
var
  AUnidadesMedida: IBizUnidadMedida;
begin
  AUnidadesMedida := BuscarTodos;
  AUnidadesMedida.DataTable.Active := True;
  Result := TStringList.Create;
  try
    with Result do
    begin
      AUnidadesMedida.DataTable.First;
      while not AUnidadesMedida.DataTable.EOF do
      begin
        Add(AUnidadesMedida.DESCRIPCION);
        AUnidadesMedida.DataTable.Next;
      end;
    end;
  finally
    AUnidadesMedida := NIL;
  end;
end;

procedure TUnidadesMedidaController.DescartarCambios(AUnidadMedida: IBizUnidadMedida);
begin
  if not Assigned(AUnidadMedida) then
    raise Exception.Create ('Almacen no asignado');

  ShowHourglassCursor;
  try
    if (AUnidadMedida.State in dsEditModes) then
      AUnidadMedida.Cancel;

    AUnidadMedida.DataTable.CancelUpdates;
  finally
    HideHourglassCursor;
  end;
end;

destructor TUnidadesMedidaController.Destroy;
begin
  FDataModule := Nil;
  inherited;
end;

function TUnidadesMedidaController.ValidarUnidadesMedida(AUnidadMedida: IBizUnidadMedida): Boolean;
begin
  Result := False;

  if not Assigned(AUnidadMedida) then
    raise Exception.Create ('UnidadMedida no asignada');

  if (AUnidadMedida.DataTable.State in dsEditModes) then
      AUnidadMedida.DataTable.Post;

  Result := True;
end;

procedure TUnidadesMedidaController.VerTodos(AUnidadesMedida: IBizUnidadMedida);
var
  AEditor : IEditorUnidadesMedida;
begin
  AEditor := NIL;
  CreateEditor('EditorUnidadesMedida', IEditorUnidadesMedida, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
      AEditor.UnidadesMedida := AUnidadesMedida;
      AEditor.ShowModal;
    finally
      AEditor.Release;
    end;
end;

function TUnidadesMedidaController.Eliminar(AUnidadMedida: IBizUnidadMedida): Boolean;
begin
  if not Assigned(AUnidadMedida) then
    raise Exception.Create ('Almacen no asignada');

  ShowHourglassCursor;
  try
    if (AUnidadMedida.State in dsEditModes) then
      AUnidadMedida.Cancel;

    AUnidadMedida.Delete;
    AUnidadMedida.DataTable.ApplyUpdates;
    HideHourglassCursor;
    Result := True;
  finally
    HideHourglassCursor;
  end;
end;

procedure TUnidadesMedidaController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
begin
  inherited;
//
end;

function TUnidadesMedidaController.Guardar(AUnidadMedida: IBizUnidadMedida): Boolean;
begin
  Result := False;

  if not Assigned(AUnidadMedida) then
    raise Exception.Create ('Almacen no asignada');

  if ValidarUnidadesMedida(AUnidadMedida) then
  begin
    ShowHourglassCursor;
    try
      AUnidadMedida.DataTable.ApplyUpdates;
      Result := True;
    finally
      HideHourglassCursor;
    end;
  end;
end;

function TUnidadesMedidaController.Localizar(AUnidadesMedida: IBizUnidadMedida; ADescripcion: String): Boolean;
begin
  Result := True;
  ShowHourglassCursor;
  try
    with AUnidadesMedida.DataTable do
    begin
      DisableControls;
      First;
      if not Locate(fld_UnidadesMedidaDESCRIPCION, ADescripcion, []) then
         Result := False;
      EnableControls;
    end;
  finally
    HideHourglassCursor;
  end;
end;

end.
