unit uGestorInformesController;

interface


uses
  Classes, SysUtils, uDADataTable, uControllerBase, uROTypes, uIDataModuleGestorInformes,
  uIEditorInformeBase;

type
  IGestorInformesController = interface(IControllerBase)
  ['{5A556B66-AF8F-46F7-B12E-B8336CE07F6D}']
    function GetDataModule: IDataModuleGestorInformes;
    property DataModule: IDataModuleGestorInformes read GetDataModule;
//    procedure Preview(AFactura : IBizFacturaCliente; AllItems: Boolean = false);
//    procedure Print(AFactura : IBizFacturaCliente; AllItems: Boolean = false);

    //MODULO PRESUPUESTOS DE CLIENTE
    procedure VerInformeListadoPresupuestos;

    //MODULO FACTURAS DE CLIENTE
    procedure VerInformeIVAClientes;
    procedure VerInformeListadoFacturasCli;
    procedure VerInformeListadoFacturasCliPendientes;

    //MODULO RECIBOS DE CLIENTE
    procedure VerInformeListadoRecibosCliPendientes;
    procedure VerInformeListadoRecibosCliente;

    //MODULO FACTURAS DE PROVEEDOR
    procedure VerInformeIVAProveedores;
    procedure VerInformeListadoFacturasProv;
    procedure VerInformeListadoFacturasProvPendientes;

    //MODULO RECIBOS DE PROVEEDOR
    procedure VerInformeListadoRecibosProvPendientes;
    procedure VerInformeListadoRecibosProveedor;
  end;

  TGestorInformesController = class(TControllerBase, IGestorInformesController)
  private
    FDataModule : IDataModuleGestorInformes;

    function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
    function GetDataModule: IDataModuleGestorInformes;

//    procedure FiltrarEmpresa(AFactura: IBizFacturaCliente);

  public
    constructor Create; override;
    destructor Destroy; override;
{
    function Buscar(const ID: Integer): IBizFacturaCliente;
    function BuscarTodos: IBizFacturaCliente;
    function BuscarTodasPendientesComision(IdAgente: Integer; IdComision: Integer; IdFacturasAsociadas: String): IBizFacturaCliente;
    procedure Ver(AFactura : IBizFacturaCliente);
    procedure VerTodos(AFacturas: IBizFacturaCliente);

    procedure Preview(AFactura : IBizFacturaCliente; AllItems: Boolean = false);
    procedure Print(AFactura : IBizFacturaCliente; AllItems: Boolean = false);
}
    property DataModule: IDataModuleGestorInformes read GetDataModule;

    //MODULO PRESUPUESTOS DE CLIENTE
    procedure VerInformeListadoPresupuestos;

    //MODULO FACTURAS DE CLIENTE
    procedure VerInformeIVAClientes;
    procedure VerInformeListadoFacturasCli;
    procedure VerInformeListadoFacturasCliPendientes;

    //MODULO RECIBOS DE CLIENTE
    procedure VerInformeListadoRecibosCliPendientes;
    procedure VerInformeListadoRecibosCliente;

    //MODULO FACTURAS DE PROVEEDOR
    procedure VerInformeIVAProveedores;
    procedure VerInformeListadoFacturasProv;
    procedure VerInformeListadoFacturasProvPendientes;

    //MODULO RECIBOS DE PROVEEDOR
    procedure VerInformeListadoRecibosProvPendientes;
    procedure VerInformeListadoRecibosProveedor;

  end;

implementation

uses
  Windows, Controls, cxControls, DB, uEditorRegistryUtils, uFactuGES_App,
  uDAInterfaces, uDataTableUtils, uDateUtils, uNumUtils,
  DateUtils, Forms, uIntegerListUtils, uDataModuleGestorInformes,
  uSistemaFunc, uDialogElegirEMail, uEMailUtils, Dialogs,
  uIEditorInformePresupuestosReport,
  uIEditorInformeIVAClientesReport, uIEditorInformeFacturasClienteReport,
  uIEditorInformeFacturasClientePendientesReport, uIEditorInformeRecibosClienteReport,
  uIEditorInformeRecibosCliPendientesReport,
  uIEditorInformeIVAProveedoresReport, uIEditorInformeFacturasProveedorReport,
  uIEditorInformeFacturasProveedorPendientesReport, uIEditorInformeRecibosProveedorReport,
  uIEditorInformeRecibosProvPendientesReport,
  uIEditorInformePedidosReport;


{procedure CopiarArticulosPedido(AOrigen: IBizDetallesPedidoCliente;
  ADestino : IBizDetallesFacturaCliente);
var
  i : integer;
  ADetallesController : IDetallesFacturaClienteController;
begin
  if not Assigned(AOrigen) then
    raise Exception.Create ('Origen no asignado (CopiarArticulosPedido)');

  if not Assigned(ADestino) then
    raise Exception.Create ('Destino no asignado (CopiarArticulosPedido)');

  if not AOrigen.DataTable.Active then
    AOrigen.DataTable.Active := True;

  if not ADestino.DataTable.Active then
    ADestino.DataTable.Active := True;

  ADetallesController := TDetallesFacturaClienteController.Create;
  try
      //OJO IMPORTANTE
      //Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para
      //obligarle siempre a recalcular los detalles una sola vez
      ADetallesController.BeginUpdate(ADestino);

    AOrigen.DataTable.First;
    for i := 0 to AOrigen.DataTable.RecordCount - 1 do
    begin
      ADetallesController.Add(ADestino, TIPO_DETALLE_CONCEPTO);
      ADestino.Edit;
      ADestino.REFERENCIA := AOrigen.REFERENCIA;
      if AOrigen.ID_ARTICULO > 0 then
         ADestino.ID_ARTICULO := AOrigen.ID_ARTICULO;
      ADestino.CONCEPTO := AOrigen.CONCEPTO;
      ADestino.CANTIDAD := AOrigen.CANTIDAD;
      ADestino.IMPORTE_UNIDAD := AOrigen.IMPORTE_UNIDAD;
      ADestino.IMPORTE_TOTAL := AOrigen.IMPORTE_TOTAL;
      ADestino.DESCUENTO := AOrigen.DESCUENTO;
      ADestino.IMPORTE_PORTE := AOrigen.IMPORTE_PORTE;
      ADestino.VISIBLE := AOrigen.VISIBLE;
      ADestino.REFERENCIA_PROVEEDOR := AOrigen.REFERENCIA_PROVEEDOR;
      ADestino.Post;
      AOrigen.Next;
    end;
  finally
      ADetallesController.EndUpdate(ADestino);
    ADetallesController := NIL;
  end;
end;}



{ TGestorInformesController }


{
function TGestorInformesController.Buscar(const ID: Integer): IBizFacturaCliente;
begin
//  Result := (FDataModule as IDataModuleFacturasCliente).GetItem(ID);
//  FiltrarEmpresa(Result);
end;

function TGestorInformesController.BuscarTodasPendientesComision(IdAgente:Integer; IdComision: Integer; IdFacturasAsociadas: String): IBizFacturaCliente;
var
  Condicion: TDAWhereExpression;
begin
{  ShowHourglassCursor;
  try
    Result := BuscarTodos;
    with Result.DataTable.DynamicWhere do
    begin
      //Todas las facturas de un agente determinado
      Condicion := NewBinaryExpression(NewField('', fld_FacturasClienteID_AGENTE), NewConstant(IdAgente, datInteger), dboEqual);

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

    with Result.DataTable.DynamicWhere do
    begin
      //Todas aquellas que no esten asociadas a ninguna comisión o asociadas a la comisión,
      //pero no asociadas en el editor de la comision, esto es porque se puede agregar y quitar
      //facturas y todos los cambios estan el cache y por lo tanto al pedir las facturas a seleccionar
      //debemos tener en cuenta dichso cambios en cache
      Condicion := NewBinaryExpression(NewField('', fld_FacturasClienteID_COMISION_LIQUIDADA), NewNull(), dboEqual);

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

{REPASARRRRRRR
    //Quitamos aquellas que ya están asociadas
    if length(IdFacturasAsociadas) > 0 then
       with Result.DataTable.DynamicWhere do
       begin
         Condicion := NewBinaryExpression(NewField('', fld_FacturasClienteID), ' not in (' + IdFacturasAsociadas + ')');, dboEqual);

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

    with Result.DataTable.Where do
    begin

        CLOSEBraket;
        AddOperator(opOR);

        OpenBraket;
          //En caso de ser facturas ya asociadas lo limitamos a la comision actual
          //ya que no debemos poder elegir facturas asociadas a otras comisiones
          OpenBraket;
          AddText(fld_FacturasClienteID_COMISION_LIQUIDADA + ' = ' + IntToStr(IdComision));
          CloseBraket;
          //En el caso de que halla facturas asociadas
          if length(IdFacturasAsociadas) > 0 then
          begin
            AddOperator(opAND);
            OpenBraket;
            AddText(fld_FacturasClienteID + ' not in (' + IdFacturasAsociadas + ')');
            CloseBraket;
          end;
        CloseBraket;

      CloseBraket;
    end;

  finally
    HideHourglassCursor;
  end;
end;

function TGestorInformesController.BuscarTodos: IBizFacturaCliente;
begin
//  Result := FDataModule.GetItems;
 // FiltrarEmpresa(Result);
end;
}

constructor TGestorInformesController.Create;
begin
  inherited;
  FDataModule := TDataModuleGestorInformes.Create(Nil);
end;


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

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

function TGestorInformesController.GetDataModule: IDataModuleGestorInformes;
begin
  Result := FDataModule;
end;

procedure TGestorInformesController.VerInformeIVAClientes;
var
  AStream: Binary;
  AEditor : IEditorInformeIVAClientesReport;
begin
  AEditor := NIL;
  CreateEditor('EditorInformeIVAClientesReport', IEditorInformeIVAClientesReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AEditor.Title := 'Listado de IVA de facturas de cliente';
      AStream := FDataModule.GenerarInformeIVAClientes(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.ListaIDClientes,
        AEditor.DesglosadoCliente, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

procedure TGestorInformesController.VerInformeIVAProveedores;
var
  AStream: Binary;
  AEditor : IEditorInformeIVAProveedoresReport;
begin
  AEditor := NIL;

  CreateEditor('EditorInformeIVAProveedoresReport', IEditorInformeIVAProveedoresReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AEditor.Title := 'Listado de IVA de facturas de proveedor';
      AStream := FDataModule.GenerarInformeIVAProveedores(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin,
        AEditor.ListaIDProveedores, AEditor.DesglosadoProveedor,
        AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

procedure TGestorInformesController.VerInformeListadoFacturasCli;
var
  AStream: Binary;
  AEditor : IEditorInformeFacturasClienteReport;
begin
  AEditor := NIL;

  CreateEditor('EditorInformeFacturasClienteReport', IEditorInformeFacturasClienteReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AEditor.Title := 'Listado de facturas de cliente';
      AStream := FDataModule.GenerarInformeListadoFacturasCli(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.ListaIDClientes,
        AEditor.DesglosadoCliente, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

procedure TGestorInformesController.VerInformeListadoFacturasCliPendientes;
var
  AStream: Binary;
  AEditor : IEditorInformeFacturasClientePendientesReport;
begin
  AEditor := NIL;

  CreateEditor('EditorInformeFacturasClientePendientesReport', IEditorInformeFacturasClientePendientesReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AEditor.Title := 'Listado de facturas de cliente pendientes';
      AStream := FDataModule.GenerarInformeListadoFacturasCliPendientes(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.ListaIDClientes,
        AEditor.DesglosadoCliente, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

procedure TGestorInformesController.VerInformeListadoFacturasProv;
var
  AStream: Binary;
  AEditor : IEditorInformeFacturasProveedorReport;
begin
  AEditor := NIL;
  CreateEditor('EditorInformeFacturasProveedorReport', IEditorInformeFacturasProveedorReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AEditor.Title := 'Listado de facturas de proveedor';
      AStream := FDataModule.GenerarInformeListadoFacturasProv(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.FechaVenInicio, AEditor.FechaVenFin, AEditor.ListaIDProveedores,
        AEditor.DesglosadoProveedor, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

procedure TGestorInformesController.VerInformeListadoFacturasProvPendientes;
var
  AStream: Binary;
  AEditor : IEditorInformeFacturasProveedorPendientesReport;
begin
  AEditor := NIL;
  CreateEditor('EditorInformeFacturasProveedorPendientesReport', IEditorInformeFacturasProveedorPendientesReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AEditor.Title := 'Listado de facturas de proveedor pendientes';
      AStream := FDataModule.GenerarInformeListadoFacturasProvPendientes(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.FechaVenInicio, AEditor.FechaVenFin, AEditor.ListaIDProveedores,
        AEditor.DesglosadoProveedor, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

procedure TGestorInformesController.VerInformeListadoPresupuestos;
var
  AStream: Binary;
  AEditor : IEditorInformePresupuestosReport;
begin
  AEditor := NIL;

  CreateEditor('EditorInformePresupuestosReport', IEditorInformePresupuestosReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AEditor.Title := 'Listado de presupuestos de cliente';
      AStream := FDataModule.GenerarInformeListadoPresupuestos(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.ListaIDClientes,
        AEditor.DesglosadoCliente, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

procedure TGestorInformesController.VerInformeListadoRecibosCliente;
var
  AStream: Binary;
  AEditor : IEditorInformeRecibosClienteReport;
begin
  AEditor := NIL;
  CreateEditor('EditorInformeRecibosClienteReport', IEditorInformeRecibosClienteReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AStream := FDataModule.GenerarInformeListadoRecibosCliente(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.FechaVenInicio, AEditor.FechaVenFin, AEditor.ListaIDClientes,
        AEditor.DesglosadoCliente, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

procedure TGestorInformesController.VerInformeListadoRecibosCliPendientes;
var
  AStream: Binary;
  AEditor : IEditorInformeRecibosCliPendientesReport;
begin
  AEditor := NIL;

  CreateEditor('EditorInformeRecibosCliPendientesReport', IEditorInformeRecibosCliPendientesReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AStream := FDataModule.GenerarInformeListadoRecibosCliPendientes(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.FechaVenInicio, AEditor.FechaVenFin, AEditor.ListaIDClientes,
        AEditor.DesglosadoCliente, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;


procedure TGestorInformesController.VerInformeListadoRecibosProveedor;
var
  AStream: Binary;
  AEditor : IEditorInformeRecibosProveedorReport;
begin
  AEditor := NIL;

  CreateEditor('EditorInformeRecibosProveedorReport', IEditorInformeRecibosProveedorReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AStream := FDataModule.GenerarInformeListadoRecibosProveedor(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.FechaVenInicio, AEditor.FechaVenFin, AEditor.ListaIDProveedores,
        AEditor.DesglosadoProveedor, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

procedure TGestorInformesController.VerInformeListadoRecibosProvPendientes;
var
  AStream: Binary;
  AEditor : IEditorInformeRecibosProvPendientesReport;
begin
  AEditor := NIL;

  CreateEditor('EditorInformeRecibosProvPendientesReport', IEditorInformeRecibosProvPendientesReport, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self;
      AStream := FDataModule.GenerarInformeListadoRecibosProvPendientes(AppFactuGES.EmpresaActiva.ID,
        AEditor.FechaInicio, AEditor.FechaFin, AEditor.FechaVenInicio, AEditor.FechaVenFin, AEditor.ListaIDProveedores,
        AEditor.DesglosadoProveedor, AEditor.ImporteMinimo);
      AEditor.LoadFromStream(AStream);
      AEditor.Preview;
    finally
      AEditor.Release;
      AEditor := Nil;
      FreeAndNil(AStream);
    end;
end;

{
procedure TGestorInformesController.Ver(AFactura: IBizFacturaCliente);
var
  AEditor : IEditorFacturaCliente;
begin
  AEditor := NIL;
{  ShowHourglassCursor;
  try
    RecuperarCliente(AFactura);
    CreateEditor('EditorFacturaCliente', IEditorFacturaCliente, AEditor);

    if Assigned(AEditor) then
      with AEditor do
      begin
        try
          Controller := Self; //OJO ORDEN MUY IMPORTANTE
          Factura := AFactura;

          //MODO CONSULTAR
          if not EsModificable(AFactura) then
          begin
             SetDataTableReadOnly(AFactura.DataTable, True);
             ReadOnly := True;
          end;

          ShowModal;

          //MODO CONSULTAR (Se deja la tabla como estaba)
          if ReadOnly then
             SetDataTableReadOnly(AFactura.DataTable, False);
        finally
          AEditor.Release;
        end;
      end;
  finally
    AEditor := NIL;
    HideHourglassCursor;
  end;
end;

procedure TGestorInformesController.VerTodos(AFacturas: IBizFacturaCliente);
var
  AEditor : IEditorFacturasCliente;
begin
  AEditor := NIL;
{
    CreateEditor('EditorFacturasCliente', IEditorFacturasCliente, AEditor);
    if Assigned(AEditor) then
      with AEditor do
      begin
          Controller := Self; //OJO ORDEN MUY IMPORTANTE
          Facturas := AFacturas;
          MultiSelect := True;
          ShowEmbedded;
      end;
end;


procedure TGestorInformesController.FiltrarEmpresa(AFactura: IBizFacturaCliente);
var
  Condicion: TDAWhereExpression;
begin
{  if AFactura.DataTable.Active then
    AFactura.DataTable.Active := False;

  // Filtrar las facturas actuales por empresa
  with AFactura.DataTable.DynamicWhere do
  begin
    // (ID_EMPRESA >= ID)
    Condicion := NewBinaryExpression(NewField('', fld_FacturasClienteID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual);

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

procedure TGestorInformesController.SetClienteController(const Value: IClientesController);
begin
  FClienteController := Value;
end;

procedure TGestorInformesController.SetDetallesController(const Value: IDetallesFacturaClienteController);
begin
  FDetallesController := Value;
end;
}
{
procedure TGestorInformesController.informe;
begin

  FDataModule.getInforme;
//showmessage('alla voy')
end;

{
procedure TGestorInformesController.Preview(AFactura: IBizFacturaCliente; AllItems: Boolean = false);
var
//  AReportController : IFacturasClienteReportController;
  ID_Facturas: TIntegerList;

begin
{
  AReportController := TFacturasClienteReportController.Create;
  ID_Facturas := TIntegerList.Create;

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

    AReportController.Preview(ID_Facturas);

  finally
    AReportController := NIL;
    FreeANDNIL(ID_Facturas);
  end;
end;

procedure TGestorInformesController.Print(AFactura: IBizFacturaCliente; AllItems: Boolean = false);
var
//  AReportController : IFacturasClienteReportController;
  ID_Facturas: TIntegerList;

begin
{
  AReportController := TFacturasClienteReportController.Create;
  ID_Facturas := TIntegerList.Create;

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

    AReportController.Print(ID_Facturas);

  finally
    AReportController := NIL;
    FreeANDNIL(ID_Facturas);
  end;
end;
}

end.
