unit uProveedoresController;

interface

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

type
  IProveedoresController = interface(IContactosController)
    ['{50F10D01-5120-470D-A61D-99FE8A76DF93}']
    function BuscarSubcontratas: IBizProveedor;    
    function BuscarTodosTiendaWeb: IBizProveedor;
    function ElegirDireccionEntrega(AProveedor: IBizProveedor; AMensaje: String): IBizDireccionesContacto;
    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);
    function DarListaDescripcionesProveedores: TStringList;
    procedure VerPedidosDeProveedor(AProveedor : IBizProveedor);
    procedure VerAlbaranesDeProveedor(AProveedor : IBizProveedor);
    procedure VerDevolucionesDeProveedor(AProveedor : IBizProveedor);
    procedure VerFacturasDeProveedor(AProveedor : IBizProveedor);
    procedure VerRecibosDeProveedor(AProveedor : IBizProveedor);
    function DarListaCuentasBancarias(const IdProveedor: Integer): TStringList;
  end;

  TProveedoresController = class(TContactosController, IProveedoresController)
  protected
    FDireccionesController : IDireccionesContactoController;
  public
    constructor Create; override;
    destructor Destroy; override;

    function Buscar(const ID: Integer): IBizContacto; override;
    function BuscarTodos: IBizContacto; override;
    function BuscarTodosTiendaWeb: IBizProveedor;
    function BuscarSubcontratas: IBizProveedor;
    function Nuevo : IBizContacto; override;
    procedure Ver(AContacto : IBizContacto); override;
    procedure VerTodos(AContactos: IBizContacto); override;
    function ElegirContacto(AContactos : IBizContacto;
      AMensaje: String; AMultiSelect: Boolean): IBizContacto; override;
    function ElegirDireccionEntrega(AProveedor: IBizProveedor;
      AMensaje: String): IBizDireccionesContacto;
    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);
    function DarListaDescripcionesProveedores: TStringList;
    procedure VerPedidosDeProveedor(AProveedor : IBizProveedor);
    procedure VerAlbaranesDeProveedor(AProveedor : IBizProveedor);
    procedure VerDevolucionesDeProveedor(AProveedor : IBizProveedor);
    procedure VerFacturasDeProveedor(AProveedor : IBizProveedor);
    procedure VerRecibosDeProveedor(AProveedor : IBizProveedor);
    function DarListaCuentasBancarias(const IdProveedor: Integer): TStringList;
  end;

implementation

uses
  SysUtils, Windows, cxControls, Dialogs, uDataModuleProveedores, uEditorRegistryUtils,
  uDataTableUtils, uDADataTable, DB, schContactosClient_Intf, uEtiquetasContactosReportController,
  uIEditorElegirProveedores, Controls, uIEditorElegirDireccionEntrega,
  uEditorGridBase, uDAInterfaces, uIntegerListUtils, uFactuGES_App,
  uPlugins_Intf, uModuleController;

{ TProveedoresController }

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

function TProveedoresController.BuscarSubcontratas: IBizProveedor;
var
  Condicion: TDAWhereExpression;
begin
  Result := BuscarTodos as IBizProveedor;
  with Result.DataTable.DynamicWhere do
  begin
    Condicion := NewBinaryExpression(NewField('', fld_ProveedoresSUBCONTRATA), NewConstant(1, datInteger), dboEqual);
    Clear;
    Expression := Condicion
  end;
end;

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

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

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

function TProveedoresController.DarListaCuentasBancarias(const IdProveedor: Integer): TStringList;
var
  AProveedor: IBizProveedor;
  Aux : String;

begin
  AProveedor := (Buscar(IdProveedor) as IBizProveedor);
  AProveedor.DataTable.Active := True;

  Result := TStringList.Create;
  ShowHourglassCursor;
  try
    with Result do
    begin
      AProveedor.DatosBancarios.DataTable.First;
      while not AProveedor.DatosBancarios.DataTable.EOF do
      begin
        Aux := Format('Nº de cuenta: %s %s %s %s  - Titular: %s ', [AProveedor.DatosBancarios.ENTIDAD,
          AProveedor.DatosBancarios.SUCURSAL, AProveedor.DatosBancarios.DC, AProveedor.DatosBancarios.CUENTA, AProveedor.DatosBancarios.TITULAR]);
        Add(Format('%s=%d', [Aux, AProveedor.DatosBancarios.ID]));
        AProveedor.DatosBancarios.DataTable.Next;
      end;
    end;
  finally
    AProveedor := NIL;
    HideHourglassCursor;
  end;
end;

function TProveedoresController.DarListaDescripcionesProveedores: TStringList;
begin
  Result := (FDataModule as IDataModuleProveedores).DarListaDescripcionesProveedores;
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.ElegirDireccionEntrega(AProveedor: IBizProveedor;
  AMensaje: String): IBizDireccionesContacto;
var
  AEditor : IEditorElegirDireccionEntrega;
begin
  Result := NIL;

  CreateEditor('EditorElegirDireccionEntrega', IEditorElegirDireccionEntrega, AEditor);
  if Assigned(AEditor) then
    try
       AEditor.Contacto := AProveedor;
       AEditor.Mensaje := AMensaje;
       if IsPositiveResult(AEditor.ShowModal) then
         Result := AEditor.DireccionSeleccionada;
    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;

    HideHourglassCursor;
  except
    on E: Exception do
    begin
      AProveedor.DataTable.CancelUpdates;
      HideHourglassCursor;
      if (Pos('FOREIGN KEY', E.Message) > 0) then
         MessageBox(0, 'No se pueden borrar el/los proveedor/es seleccionado/s porque, alguno/s de ellos tiene documentos dados de alta en la aplicación (pedidos, albaranes, facturas, etc)', 'Atención', MB_ICONWARNING or MB_OK);
    end;
  end;
end;

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

  Result := True;
end;

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

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

begin
  AReportController := TEtiquetasContactosReportController.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.Preview(ListaID);
  finally
    AReportController := NIL;
    FreeANDNil(ListaID);
  end;
end;

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

begin
  AReportController := TEtiquetasContactosReportController.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.Print(ListaID);

  finally
    AReportController := NIL;
    FreeANDNil(ListaID);
  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.VerAlbaranesDeProveedor(
  AProveedor: IBizProveedor);
var
  AModule : TModuleController;
  APlugin : IMCAlbaranesProveedor;
begin
  if not Assigned(AProveedor) then
    raise Exception.Create ('Proveedor no asignado (VerAlbaranesDeProveedor)');

  if AProveedor.DataTable.Active then
    AProveedor.DataTable.Active := True;

  AModule := AppFactuGES.GetModule(MODULENAME_ALBARANES_PROVEEDOR);
  if Assigned(AModule) then
    try
      if Supports(AModule, IMCAlbaranesProveedor, APlugin) then
        APlugin.VerAlbaranes(AProveedor.ID, AProveedor.NOMBRE);
    finally
      APlugin := NIL;
    end;
end;

procedure TProveedoresController.VerDevolucionesDeProveedor(
  AProveedor: IBizProveedor);
var
  AModule : TModuleController;
  APlugin : IMCAlbaranesProveedor;
begin
  if not Assigned(AProveedor) then
    raise Exception.Create ('Proveedor no asignado (VerDevolucionesDeProveedor)');

  if AProveedor.DataTable.Active then
    AProveedor.DataTable.Active := True;

  AModule := AppFactuGES.GetModule(MODULENAME_ALBARANES_PROVEEDOR);
  if Assigned(AModule) then
    try
      if Supports(AModule, IMCAlbaranesProveedor, APlugin) then
        APlugin.VerDevoluciones(AProveedor.ID, AProveedor.NOMBRE);
    finally
      APlugin := NIL;
    end;
end;

procedure TProveedoresController.VerFacturasDeProveedor(
  AProveedor: IBizProveedor);
var
  AModule : TModuleController;
  APlugin : IMCFacturasProveedor;
begin
  if not Assigned(AProveedor) then
    raise Exception.Create ('Proveedor no asignado (VerFacturasDeProveedor)');

  if AProveedor.DataTable.Active then
    AProveedor.DataTable.Active := True;

  AModule := AppFactuGES.GetModule(MODULENAME_FACTURAS_PROVEEDOR);
  if Assigned(AModule) then
    try
      if Supports(AModule, IMCFacturasProveedor, APlugin) then
        APlugin.VerFacturas(AProveedor.ID, AProveedor.NOMBRE);
    finally
      APlugin := NIL;
    end;
end;

procedure TProveedoresController.VerPedidosDeProveedor(
  AProveedor: IBizProveedor);
var
  AModule : TModuleController;
  APlugin : IMCPedidosProveedor;
begin
  if not Assigned(AProveedor) then
    raise Exception.Create ('Proveedor no asignado (VerPedidosDeProveedor)');

  if AProveedor.DataTable.Active then
    AProveedor.DataTable.Active := True;

  AModule := AppFactuGES.GetModule(MODULENAME_PEDIDOS_PROVEEDOR);
  if Assigned(AModule) then
    try
      if Supports(AModule, IMCPedidosProveedor, APlugin) then
        APlugin.VerPedidos(AProveedor.ID, AProveedor.NOMBRE);
    finally
      APlugin := NIL;
    end;
end;

procedure TProveedoresController.VerRecibosDeProveedor(
  AProveedor: IBizProveedor);
var
  AModule : TModuleController;
  APlugin : IMCRecibosProveedor;
begin
  if not Assigned(AProveedor) then
    raise Exception.Create ('Proveedor no asignado (VerRecibosDeProveedor)');

  if AProveedor.DataTable.Active then
    AProveedor.DataTable.Active := True;

  AModule := AppFactuGES.GetModule(MODULENAME_RECIBOS_PROVEEDOR);
  if Assigned(AModule) then
    try
      if Supports(AModule, IMCRecibosProveedor, APlugin) then
        APlugin.VerRecibos(AProveedor.ID, AProveedor.NOMBRE);
    finally
      APlugin := 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.
