unit uDataModulePresupuestosCliente;

interface

uses
  DB, Classes, SysUtils, uDADesigntimeCall,
  uRORemoteService, uROClient, uROBinMessage, uDAScriptingProvider,
  uDACDSDataTable, uROWinInetHttpChannel, uDADataTable, uDABINAdapter,

  uROTypes,
  uIDataModulePresupuestosCliente, uBizPresupuestosCliente, uBizDetallesPresupuestoCliente,
  uIDataModulePresupuestosClienteReport, uDataModuleBase, uDAInterfaces,
  uRODynamicRequest, uDADataStreamer, uDARemoteDataAdapter, uDABin2DataStreamer,
  uDAMemDataTable, uIntegerListUtils;

type
  TDataModulePresupuestosCliente = class(TDataModuleBase, IDataModulePresupuestosCliente, IDataModulePresupuestosClienteReport)
    RORemoteService: TRORemoteService;
    Bin2DataStreamer: TDABin2DataStreamer;
    rda_PresupuestosCliente: TDARemoteDataAdapter;
    tbl_PresupuestosCliente: TDAMemDataTable;
    ds_PresupuestosCliente: TDADataSource;
    tbl_PresupuestosCliente_Detalles: TDAMemDataTable;
    ds_PresupuestosCliente_Detalles: TDADataSource;
    RORemoteService1: TRORemoteService;
    procedure DAClientDataModuleCreate(Sender: TObject);

  private
    function _GetDetalles : IBizDetallesPresupuestoCliente;

  protected
    procedure AsignarClaseNegocio(APresupuesto: TDADataTable);

  public
    function GetItems : IBizPresupuestoCliente; overload;
    function GetItems(const AListaID: TIntegerList) : IBizPresupuestoCliente; overload;

    function GetItem(const ID : Integer) : IBizPresupuestoCliente;
    function NewItem : IBizPresupuestoCliente;

    // Report
    function GetRptPresupuestos(const AListaID: TIntegerList): Binary;
    function GetRptWordPresupuesto(const AID: Integer): Binary;
    function GetRptWordCertificadoTrabajos(const AID: Integer): Binary;
    function GetRptPDFPresupuesto(const AID: Integer): Binary;
  end;

implementation

{$R *.DFM}

uses
  cxControls, FactuGES_Intf,  uDataModuleConexion, Dialogs, DataAbstract4_Intf,
  uDataTableUtils, schPresupuestosClienteClient_Intf, uBizContactos;

{ TdmPresupuestosCliente }

procedure TDataModulePresupuestosCliente.AsignarClaseNegocio(APresupuesto: TDADataTable);
begin
  APresupuesto.BusinessRulesID := BIZ_CLIENT_PRESUPUESTO_CLIENTE;
end;

procedure TDataModulePresupuestosCliente.DAClientDataModuleCreate(Sender: TObject);
begin
  RORemoteService.Channel := dmConexion.Channel;
  RORemoteService.Message := dmConexion.Message;
end;

function TDataModulePresupuestosCliente.GetRptPDFPresupuesto(
  const AID: Integer): Binary;
var
  AParam : TIntegerArray;
begin
  AParam := TIntegerArray.Create;
  try
    AParam.Add(AID);
    Result := (RORemoteService as IsrvPresupuestosCliente).GenerarInformeEnPDF(AParam)
  finally
    FreeANDNIL(AParam)
  end;
end;

function TDataModulePresupuestosCliente.GetRptPresupuestos(const AListaID: TIntegerList): Binary;
var
  AParam : TIntegerArray;
begin
  AParam := AListaID.ToIntegerArray;
  try
    Result := (RORemoteService as IsrvPresupuestosCliente).GenerarInforme(AParam)
  finally
    FreeANDNIL(AParam)
  end;
end;

function TDataModulePresupuestosCliente.GetRptWordCertificadoTrabajos(
  const AID: Integer): Binary;
begin
  Result := (RORemoteService as IsrvPresupuestosCliente).GenerarCertificadoTrabajosEnWord(AID)
end;

function TDataModulePresupuestosCliente.GetRptWordPresupuesto(
  const AID: Integer): Binary;
begin
  Result := (RORemoteService as IsrvPresupuestosCliente).GenerarInformeEnWord(AID)
end;

function TDataModulePresupuestosCliente.NewItem: IBizPresupuestoCliente;
begin
  Result := GetItem(ID_NULO)
end;

{
function TDataModulePresupuestosCliente.SubirFichero(const ID: Integer; const NombreFichero: String; const Fichero: Binary): Boolean;
begin
 Result := False;
 try
   Result := (RORemoteService1 as IsrvGestorDocumentos).SubirFichero(TRdxAlmacenes_Presupuestos, ID, NombreFichero, Fichero);
 finally
   //
 end;
end;
}

function TDataModulePresupuestosCliente._GetDetalles: IBizDetallesPresupuestoCliente;
var
  ADetalles : TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    ADetalles := CloneDataTable(tbl_PresupuestosCliente_Detalles);
    with ADetalles do
    begin
      BusinessRulesID := BIZ_CLIENT_DETALLES_PRESUPUESTO_CLIENTE;
      DetailOptions := DetailOptions - [dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates];
    end;
    Result := (ADetalles as IBizDetallesPresupuestoCliente);
  finally
    HideHourglassCursor;
  end;
end;

function TDataModulePresupuestosCliente.GetItem(const ID: Integer): IBizPresupuestoCliente;
var
  Condicion: TDAWhereExpression;
begin
  ShowHourglassCursor;
  try
    Result := Self.GetItems;

    with Result.DataTable.DynamicWhere do
    begin
      // (ID = :ID)
      Condicion := NewBinaryExpression(NewField('', fld_PresupuestosClienteID), NewConstant(ID, datInteger), dboEqual);

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

  finally
    HideHourglassCursor;
  end;
end;

function TDataModulePresupuestosCliente.GetItems(
  const AListaID: TIntegerList): IBizPresupuestoCliente;
var
  Condicion: TDAWhereExpression;
  i : Integer;
  AArray : Array of TDAWhereExpression;
begin
  if not Assigned(AListaID) then
    raise Exception.Create('ListaID no asignada (GetItems)');
    
  ShowHourglassCursor;
  try
    Result := Self.GetItems;

    with Result.DataTable.DynamicWhere do
    begin
      // (ID in (1, 2, 3...)

      SetLength(AArray, AListaID.Count);
      for i := 0 to AListaID.Count - 1 do
        AArray[i] := NewConstant(AListaID[i], datInteger);

      Condicion := NewBinaryExpression(NewField('', fld_PresupuestosClienteID), NewList(AArray), dboIn);

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

  finally
    HideHourglassCursor;
  end;
end;

function TDataModulePresupuestosCliente.GetItems: IBizPresupuestoCliente;
var
  APresupuesto: TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    APresupuesto := CloneDataTable(tbl_PresupuestosCliente);
    AsignarClaseNegocio(APresupuesto);

    // EL CAMPO REFERENCIA TIENEN QUE SER AUTOREFRESH!!!!!
    APresupuesto.FieldByName(fld_PresupuestosClienteREFERENCIA).ServerAutoRefresh := TRUE;

    with TBizPresupuestoCliente(APresupuesto.BusinessEventsObj) do
         Detalles := _GetDetalles;

    Result := (APresupuesto as IBizPresupuestoCliente);

  finally
    HideHourglassCursor;
  end;
end;

end.
