unit uGestorDocumentosController;

interface

uses
  Classes, uROTypes, FactuGES_Intf, uControllerBase, uDataModuleGestorDocumentos;

type
  IGestorDocumentosController = interface(IControllerBase)
  ['{75EC4D1B-A7A2-4C81-B2DA-8688240D6EC2}']
    function DarListaDocumentos(const ID: Integer): TStringList;
    function DescargarFichero(const ID:Integer; const NombreFichero: String; const DestinoFichero: String): Boolean;
    function SubirFichero(const ID:Integer; const NombreFichero: String; const Fichero: Binary): Boolean;
    procedure SincronizarDocumentos(const ID: Integer; FListaDocumentos: TStringList; Directorio: String);
    function EliminarDirectorio(const ID: Integer): Boolean;

    function GetAlmacen: TRdxAlmacenes;
    procedure SetAlmacen(const Value: TRdxAlmacenes);
    property Almacen: TRdxAlmacenes read GetAlmacen write SetAlmacen;
  end;

  TGestorDocumentosController = class(TControllerBase, IGestorDocumentosController)

  protected
    FDataModule : IDataModuleGestorDocumentos;
    FAlmacen : TRdxAlmacenes;

    //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de
    //este controller
    procedure AsignarDataModule; virtual;
    procedure SetAlmacen(const Value: TRdxAlmacenes);
    function GetAlmacen: TRdxAlmacenes;

  public
    constructor Create; override;
    destructor Destroy; override;

    property Almacen: TRdxAlmacenes read GetAlmacen write SetAlmacen;

    function DarListaDocumentos(const ID: Integer): TStringList;
    function DescargarFichero(const ID:Integer; const NombreFichero: String; const DestinoFichero: String): Boolean;
    function SubirFichero(const ID:Integer; const NombreFichero: String; const Fichero: Binary): Boolean;
    procedure SincronizarDocumentos(const ID: Integer; FListaDocumentos: TStringList; Directorio: String);
    function EliminarDirectorio(const ID: Integer): Boolean;
  end;

implementation
{ TGestorDocumentosController }

uses SysUtils, Dialogs;

procedure TGestorDocumentosController.AsignarDataModule;
begin
  FDataModule := TDataModuleGestorDocumentos.Create(Nil);
end;

constructor TGestorDocumentosController.Create;
begin
  inherited;
  AsignarDataModule;
  FAlmacen := TRdxAlmacenes_Presupuestos;
end;

function TGestorDocumentosController.DarListaDocumentos(
  const ID: Integer): TStringList;
begin
  Result := FDataModule.DarListaDocumentos(ID, Almacen);
end;

function TGestorDocumentosController.DescargarFichero(const ID: Integer;
  const NombreFichero, DestinoFichero: String): Boolean;
begin
  Result := FDataModule.DescargarFichero(ID, Almacen, NombreFichero, DestinoFichero);
end;

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

function TGestorDocumentosController.EliminarDirectorio(const ID: Integer): Boolean;
begin
  Result := FDataModule.EliminarID(ID, Almacen);
end;

function TGestorDocumentosController.GetAlmacen: TRdxAlmacenes;
begin
  Result := FAlmacen;
end;

procedure TGestorDocumentosController.SetAlmacen(const Value: TRdxAlmacenes);
begin
  FAlmacen := Value;
end;

procedure TGestorDocumentosController.SincronizarDocumentos(const ID: Integer;
  FListaDocumentos: TStringList; Directorio: String);
var
  ListaDocumentosServidor: TStringList;
  ANombreFichero: String;
  AFichero: Binary;
  i, j: Integer;
begin
  //Eliminamos todos los documentos del servidor que ya no existan en el cliente.
  ListaDocumentosServidor := DarListaDocumentos(ID);
  for i:= 0 to ListaDocumentosServidor.Count - 1 do
      if not FListaDocumentos.Find(ListaDocumentosServidor.Strings[i], j) then
         if not FDataModule.EliminarFichero(ID, Almacen, ListaDocumentosServidor.Strings[i]) then
            ShowMessage('Error al borrar fichero' + ListaDocumentosServidor.Strings[i]);

  //Subimos todos los ficheros que existan al servidor (de momento no se miran fechas)
  for i := 0 to FListaDocumentos.Count - 1 do
  begin
    ANombreFichero := Directorio + FListaDocumentos.Strings[i];
    if FileExists(ANombreFichero) then
    begin
       AFichero := Binary.Create;
       AFichero.LoadFromFile(ANombreFichero);
       SubirFichero(ID, ExtractFileName(ANombreFichero), AFichero);
    end;
  end;
end;

function TGestorDocumentosController.SubirFichero(const ID: Integer; 
  const NombreFichero: String; const Fichero: Binary): Boolean;
begin
  Result := FDataModule.SubirFichero(ID, Almacen, NombreFichero, Fichero);
end;

end.
