unit uProveedoresController;

interface

uses
  uCustomEditor,
  uContactosController, uBizContactos, uBizDireccionesContacto, uDireccionesContactoController,
  uIEditorProveedores, uIEditorProveedor, uIDataModuleContactos, uIDataModuleProveedores;

type
  IProveedoresController = interface(IContactosController)
    ['{50F10D01-5120-470D-A61D-99FE8A76DF93}']
    function BuscarTodosTiendaWeb: IBizProveedor;
    function EsEliminable(AProveedor: IBizContacto): Boolean;
    function Eliminar(AProveedor: IBizContacto; AllItems: Boolean = false): Boolean; overload;
    procedure Preview(AProveedor : IBizProveedor; AllItems: Boolean = false);
    procedure Print(AProveedor : IBizProveedor; AllItems: Boolean = false);
    procedure SetTieneSubcuenta(AProveedor: IBizProveedor; AValue: Boolean);
    procedure SetIgnorarContabilidad(AProveedor: IBizProveedor; AValue: Boolean);
  end;

  TProveedoresController = class(TContactosController, IProveedoresController)
  protected
    FDireccionesController : IDireccionesContactoController;
    function ValidarContacto(AContacto: IBizContacto): Boolean; override;
    procedure FiltrarEjercicio(AContacto : IBizContacto); virtual;
  public
    constructor Create; override;
    destructor Destroy; override;

    function Buscar(const ID: Integer): IBizContacto; override;
    function BuscarTodos: IBizContacto; override;
    function BuscarTodosTiendaWeb: IBizProveedor;
    function Nuevo : IBizContacto; override;
    function Guardar(AContacto : IBizContacto): Boolean; override;
    procedure Ver(AContacto : IBizContacto); override;
    procedure VerTodos(AContactos: IBizContacto); override;
    function ElegirContacto(AContactos : IBizContacto;
      AMensaje: String; AMultiSelect: Boolean): IBizContacto; override;
    function EsEliminable(AProveedor: IBizContacto): Boolean;
    function Eliminar(AProveedor: IBizContacto; AllItems: Boolean = false): Boolean; overload;
    procedure Preview(AProveedor : IBizProveedor; AllItems: Boolean = false);
    procedure Print(AProveedor : IBizProveedor; AllItems: Boolean = false);
    procedure SetTieneSubcuenta(AProveedor: IBizProveedor; AValue: Boolean);
    procedure SetIgnorarContabilidad(AProveedor: IBizProveedor; AValue: Boolean);
  end;

implementation

uses
  Classes, SysUtils, cxControls, Dialogs, uDataModuleProveedores, uEditorRegistryUtils,
  uDataTableUtils, uDADataTable, DB, schContactosClient_Intf, uListadosContactosReportController,
  uIEditorElegirProveedores, Controls, uEditorGridBase, JSDialogs, JSDialog,
  uDAInterfaces, uFactuGES_App, Windows, uIntegerListUtils;

{ TProveedoresController }

function TProveedoresController.Buscar(const ID: Integer): IBizContacto;
begin
  Result := (FDataModule as IDataModuleProveedores).GetItem(ID);
  FiltrarEmpresa(Result);
  FiltrarEjercicio(Result);  
end;

function TProveedoresController.BuscarTodos: IBizContacto;
begin
  Result := (FDataModule as IDataModuleProveedores).GetItems;
  FiltrarEmpresa(Result);
  FiltrarEjercicio(Result);  
end;

function TProveedoresController.BuscarTodosTiendaWeb: IBizProveedor;
begin
  Result := (FDataModule as IDataModuleProveedores).GetItemsTiendaWeb;
  FiltrarEmpresa(Result);
  FiltrarEjercicio(Result);  
end;

constructor TProveedoresController.Create;
begin
  inherited;
  FDataModule := TDataModuleProveedores.Create(Nil);
  FDireccionesController := TDireccionesContactoController.Create;
end;

destructor TProveedoresController.Destroy;
begin
  FDireccionesController := NIL;
  inherited;
end;

function TProveedoresController.ElegirContacto(AContactos: IBizContacto;
  AMensaje: String; AMultiSelect: Boolean): IBizContacto;
var
  AEditor : IEditorElegirProveedores;
begin
  Result := NIL;

  CreateEditor('EditorElegirProveedores', IEditorElegirProveedores, AEditor);
  if Assigned(AEditor) then
    try
       AEditor.Contactos := AContactos;
       AEditor.Controller := Self;
       AEditor.MultiSelect := AMultiSelect;
       AEditor.Mensaje := AMensaje;
       if IsPositiveResult(AEditor.ShowModal) then
         Result := AEditor.ContactosSeleccionados;
    finally
      AEditor.Release;
      AEditor := NIL;
    end;
end;

function TProveedoresController.Eliminar(AProveedor: IBizContacto; AllItems: Boolean): Boolean;
//En el caso de eliminar almenos un elemento del conjunto se devuelve true
var
  bEliminado: Boolean;

begin
  bEliminado := False;
  if not Assigned(AProveedor) then
    raise Exception.Create ('Contacto no asignado');

  ShowHourglassCursor;
  try
    if not AProveedor.DataTable.Active then
      AProveedor.DataTable.Active := True;

    if (AProveedor.State in dsEditModes) then
      AProveedor.Cancel;

    //Siempre eliminaremos el seleccionado
    if EsEliminable(AProveedor) then
    begin
      AProveedor.Delete;
      bEliminado := True;
    end;

    //En el caso de querer eliminar todos los items del objeto AProveedor
    if AllItems then
    begin
       with AProveedor.DataTable do
       begin
         First;
         while not EOF do
         begin
           if EsEliminable(AProveedor) then
           begin
              AProveedor.Delete;
              bEliminado := True
           end
           else Next;
         end;
       end;
    end;

    if bEliminado then
    begin
       AProveedor.DataTable.ApplyUpdates;
       Result := True;
    end
    else
       Result := False;

  finally
    HideHourglassCursor;
  end;
end;

function TProveedoresController.EsEliminable(AProveedor: IBizContacto): Boolean;
begin
  if not Assigned(AProveedor) then
     raise Exception.Create ('Contacto no asignado: EsEliminable');

  Result := True;
end;

procedure TProveedoresController.FiltrarEjercicio(AContacto: IBizContacto);
var
  Condicion: TDAWhereExpression;

begin
  if Assigned(AContacto)
  and Assigned((AContacto as IBizProveedor).SubCuentas) then
  begin
    if (AContacto as IBizProveedor).SubCuentas.DataTable.Active then
       (AContacto as IBizProveedor).SubCuentas.DataTable.Active := False;

    // Filtrar los presupuestos actuales por empresa
    with (AContacto as IBizProveedor).SubCuentas.DataTable.DynamicWhere do
    begin
      // (ID_EMPRESA >= ID)
      Condicion := NewBinaryExpression(NewField('', fld_SubCuentasContactoID_EJERCICIO), NewConstant(AppFactuGES.EjercicioActivo.ID, datInteger), dboEqual);

      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;
  end;
end;

function TProveedoresController.Guardar(AContacto: IBizContacto): Boolean;
begin
  Result := inherited Guardar(AContacto);
  (AContacto as IBizProveedor).SubCuentas.DataTable.Refresh;
end;

function TProveedoresController.Nuevo: IBizContacto;
var
  AContacto : IBizProveedor;
begin
  AContacto := (FDataModule as IDataModuleProveedores).NewItem;
  FiltrarEmpresa(AContacto);
  FiltrarEjercicio(Result);    
  AContacto.DataTable.Active := True;
  AContacto.Insert;
  Result := AContacto;
end;

procedure TProveedoresController.Preview(AProveedor: IBizProveedor; AllItems: Boolean);
var
  AReportController : IListadosContactosReportController;
  ListaID: TIntegerList;

begin
  AReportController := TListadosContactosReportController.Create;
  ListaID := TIntegerList.Create;

  try
   //Si deseamos previsualizar todos los items del objeto albaran
   if AllItems then
   begin
     with AProveedor.DataTable do
     begin
       First;
       while not EOF do
       begin
         ListaID.Add(AProveedor.ID);
         Next;
       end;
     end;
   end
   //Solo previsualizamos el item seleccionado
   else
     ListaID.Add(AProveedor.ID);

    AReportController.PreviewInformeEtiquetas(ListaID);
  finally
    AReportController := NIL;
    FreeANDNil(ListaID);
  end;
end;

procedure TProveedoresController.Print(AProveedor: IBizProveedor; AllItems: Boolean);
var
  AReportController : IListadosContactosReportController;
  ListaID: TIntegerList;

begin
  AReportController := TListadosContactosReportController.Create;
  ListaID := TIntegerList.Create;

  try
   //Si deseamos previsualizar todos los items del objeto albaran
   if AllItems then
   begin
     with AProveedor.DataTable do
     begin
       First;
       while not EOF do
       begin
         ListaID.Add(AProveedor.ID);
         Next;
       end;
     end;
   end
   //Solo previsualizamos el item seleccionado
   else
     ListaID.Add(AProveedor.ID);

    AReportController.PrintInformeEtiquetas(ListaID);

  finally
    AReportController := NIL;
    FreeANDNil(ListaID);
  end;
end;

procedure TProveedoresController.SetIgnorarContabilidad(AProveedor: IBizProveedor; AValue: Boolean);
var
  AEdit: Boolean;
begin

  with AProveedor.DataTable do
  begin
    AEdit := Editing;
    if not AEdit then
       Edit;

    if AValue then
       AProveedor.IGNORAR_CONTABILIDAD := 1
    else
       AProveedor.IGNORAR_CONTABILIDAD := 0;
    Post;

    if AEdit then
       Edit;
  end;
end;

procedure TProveedoresController.SetTieneSubcuenta(AProveedor: IBizProveedor; AValue: Boolean);
var
  AEdit: Boolean;
begin

  with AProveedor.DataTable do
  begin
    AEdit := Editing;
    if not AEdit then
       Edit;

    if AValue then
       AProveedor.TIENE_SUBCUENTA := 1
    else
       AProveedor.TIENE_SUBCUENTA := 0;
    Post;

    if AEdit then
       Edit;
  end;
end;

function TProveedoresController.ValidarContacto(
  AContacto: IBizContacto): Boolean;
begin
  Result := inherited ValidarContacto(AContacto);
  if Result then
  begin
    with (AContacto as IBizProveedor) do
    begin
      if (SubCuentas.DataTable.State in dsEditModes) then
          SubCuentas.DataTable.Post;
    end;
  end;
end;

procedure TProveedoresController.Ver(AContacto: IBizContacto);
var
  AEditor : IEditorProveedor;
begin
  AEditor := NIL;	

  CreateEditor('EditorProveedor', IEditorProveedor, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Contacto := AContacto;
      AEditor.Controller := Self;
      AEditor.ShowModal;
    finally
      AEditor.Release;
      AEditor := NIL;
    end;
end;

procedure TProveedoresController.VerTodos(AContactos: IBizContacto);
var
  AEditor : IEditorProveedores;
begin
  AEditor := NIL;

  CreateEditor('EditorProveedores', IEditorProveedores, AEditor);
  if Assigned(AEditor) then
     with AEditor do
     begin
       Contactos := AContactos;
       Controller := Self;
       MultiSelect := True;
       ShowEmbedded;
     end;
end;

end.
