{
===============================================================================
  Copyright (©) 2007. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 
  Versión actual: 1.0.0
  Fecha versión actual: 
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit uTiposIVAController;

interface

uses
  Classes, SysUtils, uDADataTable, uControllerBase,
  uBizTiposIVA, uIDataModuleTiposIVA;

type
  ITiposIVAController = interface(IObservador)
  ['{DD8BBB7C-3688-4FCA-80EF-47FB61175D62}']
    procedure Anadir(ATipoIVA : IBizTipoIVA);
    function Eliminar(ATipoIVA : IBizTipoIVA): Boolean;
    function Guardar(ATipoIVA : IBizTipoIVA): Boolean;
    procedure DescartarCambios(ATipoIVA : IBizTipoIVA);
		function Duplicar(ATipoIVA: IBizTipoIVA): IBizTipoIVA;

    function Buscar(const ID: Integer): IBizTipoIVA;
	  function BuscarTodos: IBizTipoIVA;
    procedure VerTodos(ATiposIVA: IBizTipoIVA);
    procedure Ver(ATipoIVA: IBizTipoIVA);
    function Localizar(ATiposIVA: IBizTipoIVA; ADescripcion:String): Boolean;
    function DarListaTiposIVA: TStringList;
    function ExtraerSeleccionados(ATipoIVA: IBizTipoIVA) : IBizTipoIVA;
  end;

  TTiposIVAController = class(TObservador, ITiposIVAController)
  protected
    FDataModule : IDataModuleTiposIVA;

  	function _Vacio : IBizTipoIVA;
    function ValidarTipoIVA(ATipoIVA: IBizTipoIVA): Boolean;
    procedure AsignarDataModule;
    procedure AsignarID(ATipoIVA: IBizTipoIVA; const IDNuevo: Integer);

  public
    constructor Create; virtual;
    destructor Destroy; override;

    procedure Anadir(ATipoIVA : IBizTipoIVA);
    function Eliminar(ATipoIVA : IBizTipoIVA): Boolean;
    function Guardar(ATipoIVA : IBizTipoIVA): Boolean;
    procedure DescartarCambios(ATipoIVA : IBizTipoIVA);
    function Duplicar(ATipoIVA: IBizTipoIVA): IBizTipoIVA;

	  function Buscar(const ID: Integer): IBizTipoIVA;
    function BuscarTodos: IBizTipoIVA;
    procedure VerTodos(ATiposIVA: IBizTipoIVA);
    procedure Ver(ATipoIVA: IBizTipoIVA);
    function Localizar(ATiposIVA: IBizTipoIVA; ADescripcion:String): Boolean;
    function DarListaTiposIVA: TStringList;
    function ExtraerSeleccionados(ATipoIVA: IBizTipoIVA) : IBizTipoIVA;
  end;

implementation

uses
  cxControls, DB, uEditorRegistryUtils, 
  uDAInterfaces, uDataTableUtils, 
  uDateUtils, uROTypes, DateUtils, Controls, Windows,
  
  schTiposIVAClient_Intf, uIEditorTiposIVA,
  uIEditorTipoIVA, uDataModuleTiposIVA;

{ TTiposIVAController }

procedure TTiposIVAController.Anadir(ATipoIVA: IBizTipoIVA);
begin
  ATipoIVA.Insert;
end;

procedure TTiposIVAController.AsignarDataModule;
begin
  FDataModule := TDataModuleTiposIVA.Create(Nil);
end;

procedure TTiposIVAController.AsignarID(ATipoIVA: IBizTipoIVA;
  const IDNuevo: Integer);
begin
  if not Assigned(ATipoIVA) then
    raise Exception.Create ('TipoIVA no asignado');

  if ATipoIVA.EsNuevo then
  begin
    ATipoIVA.Edit;
    ATipoIVA.ID := IDNuevo;
    ATipoIVA.Post;
  end;
end;

function TTiposIVAController.BuscarTodos: IBizTipoIVA;
begin
  Result := FDataModule.GetItems;
end;

constructor TTiposIVAController.Create;
begin
  AsignarDataModule;
end;

function TTiposIVAController.Buscar(const ID: Integer): IBizTipoIVA;
begin
  Result := (FDataModule as IDataModuleTiposIVA).GetItem(ID);
end;

function TTiposIVAController._Vacio: IBizTipoIVA;
begin
  Result := Buscar(ID_NULO);
end;

function TTiposIVAController.DarListaTiposIVA: TStringList;
var
  ATiposIVA: IBizTipoIVA;
begin
  ATiposIVA := BuscarTodos;
  ATiposIVA.DataTable.Active := True;
  Result := TStringList.Create;
  try
    with Result do
    begin
      ATiposIVA.DataTable.First;
      while not ATiposIVA.DataTable.EOF do
      begin
        Add(ATiposIVA.DESCRIPCION);
        ATiposIVA.DataTable.Next;
      end;
    end;
  finally
    ATiposIVA := NIL;
  end;
end;

procedure TTiposIVAController.DescartarCambios(ATipoIVA: IBizTipoIVA);
begin
  if not Assigned(ATipoIVA) then
    raise Exception.Create ('TipoIVA no asignado');

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

    ATipoIVA.DataTable.CancelUpdates;
  finally
    HideHourglassCursor;
  end;
end;

destructor TTiposIVAController.Destroy;
begin
  FDataModule := NIL;
  inherited;
end;


function TTiposIVAController.Duplicar(ATipoIVA: IBizTipoIVA): IBizTipoIVA;
begin
  Result := Self._Vacio;
  ShowHourglassCursor;
  try
    DuplicarRegistros(ATipoIVA.DataTable, Result.DataTable, mdrActual);
    
    // ¡CUIDADO! Hay que dejar algunos campos como si fuera todo nuevo
    Result.Edit;
    with Result do
    begin
    	// Ejemplos
      // ID_EMPRESA := dmUsuarios.IDEmpresaActual;
      // USUARIO := dmUsuarios.LoginInfo.Usuario;
      // REFERENCIA := ''; //Para que se asigne una nueva
      // FECHA_FACTURA := DateOf(Now);
      // SITUACION := SITUACION_PENDIENTE;
    end;

    Result.Post;
  finally
    HideHourglassCursor;
  end;
end;


function TTiposIVAController.ValidarTipoIVA(ATipoIVA: IBizTipoIVA): Boolean;
begin
  Result := False;

  if not Assigned(ATipoIVA) then
    raise Exception.Create ('TipoIVA no asignado');

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

  if Length(ATipoIVA.REFERENCIA) = 0 then
    raise Exception.Create('Debe indicar una referencia para este tipo de IVA.');

  if Length(ATipoIVA.DESCRIPCION) = 0 then
    raise Exception.Create('Debe indicar una descripción para este tipo de IVA.');

  Result := True;
end;

procedure TTiposIVAController.Ver(ATipoIVA: IBizTipoIVA);
var
  AEditor : IEditorTipoIVA;
begin
  AEditor := NIL;
  ShowHourglassCursor;
  try
    CreateEditor('EditorTipoIVA', IEditorTipoIVA, AEditor);
    with AEditor do
      TipoIVA := ATipoIVA;
  finally
    HideHourglassCursor;
  end;

  if Assigned(AEditor) then
    try
      AEditor.ShowModal;
      AEditor.Release;
    finally
      AEditor := NIL;
    end;
end;

procedure TTiposIVAController.VerTodos(ATiposIVA: IBizTipoIVA);
var
  AEditor : IEditorTiposIVA;
begin
  AEditor := NIL;
  ShowHourglassCursor;
  try
    CreateEditor('EditorTiposIVA', IEditorTiposIVA, AEditor);
    with AEditor do
      TiposIVA := ATiposIVA;
  finally
    HideHourglassCursor;
  end;

  if Assigned(AEditor) then
    try
      AEditor.ShowModal;
      AEditor.Release;
    finally
      AEditor := NIL;
    end; 
end;

function TTiposIVAController.Eliminar(ATipoIVA: IBizTipoIVA): Boolean;
begin
  Result := False;

  if not Assigned(ATipoIVA) then
    raise Exception.Create ('TipoIVA no asignado');

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

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

function TTiposIVAController.Guardar(ATipoIVA: IBizTipoIVA): Boolean;
var
  NuevoID : Integer;
begin
  Result := False;

  if ValidarTipoIVA(ATipoIVA) then
  begin
    ShowHourglassCursor;
    try
      if ATipoIVA.EsNuevo then
        NuevoID := FDataModule.GetNextID(ATipoIVA.DataTable.LogicalName)
      else
        NuevoID := ATipoIVA.ID;

      AsignarID(ATipoIVA, NuevoID);
      ATipoIVA.DataTable.ApplyUpdates;

      Result := True;
    finally
      HideHourglassCursor;
    end;
  end;
end;

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

function TTiposIVAController.ExtraerSeleccionados(ATipoIVA: IBizTipoIVA): IBizTipoIVA;
var
  ASeleccionados : IBizTipoIVA;
begin
  ASeleccionados := (Self.Buscar(ID_NULO) as IBizTipoIVA);
  CopyDataTable(ATipoIVA.DataTable, ASeleccionados.DataTable, True);
  Result := ASeleccionados;
end;

end.
