unit uRptPresupuestosCliente_Server;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, frxClass, frxDBSet, uDAScriptingProvider,
  uDADataTable, uDACDSDataTable, DB, uDAClasses, uDABINAdapter, uROTypes,
  uDAInterfaces, uDAMemDataTable, uDADataStreamer, uDABin2DataStreamer,
  frxGradient, frxChBox, frxCross, frxOLE, frxBarcode, frxRich, uDAEngine,
  IBSQL, IBDatabase, IBCustomDataSet, IBQuery, frxExportPDF, FactuGES_Intf;

type
  TRptPresupuestosCliente = class(TDataModule)
    DADSCabecera: TDADataSource;
    DADSDetalles: TDADataSource;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxOLEObject1: TfrxOLEObject;
    frxCrossObject1: TfrxCrossObject;
    frxCheckBoxObject1: TfrxCheckBoxObject;
    frxGradientObject1: TfrxGradientObject;
    frxDBCabecera: TfrxDBDataset;
    frxDBDetalles: TfrxDBDataset;
    tbl_Cabecera: TDAMemDataTable;
    tbl_Detalles: TDAMemDataTable;
    frxReport: TfrxReport;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    capitulos: TIBQuery;
    DataSource3: TDataSource;
    detalles: TIBQuery;
    DataSource4: TDataSource;
    resumen: TIBQuery;
    resumenID: TIntegerField;
    resumenID_PRESUPUESTO: TIntegerField;
    resumenPOSICION: TIntegerField;
    resumenTIPO_DETALLE: TIBStringField;
    resumenCONCEPTO: TIBStringField;
    resumenIMPORTE_TOTAL: TIBBCDField;
    resumenVISIBLE: TSmallintField;
    frxDBCapitulos: TfrxDBDataset;
    frxDBResumen: TfrxDBDataset;
    DABin2DataStreamer1: TDABin2DataStreamer;
    cabecera: TIBQuery;
    cabeceraID: TIntegerField;
    cabeceraID_EMPRESA: TIntegerField;
    cabeceraFECHA_PRESUPUESTO: TDateField;
    cabeceraREFERENCIA: TIBStringField;
    cabeceraPORTADA: TMemoField;
    cabeceraMEMORIA: TMemoField;
    cabeceraOBSERVACIONES: TMemoField;
    cabeceraIMPORTE_NETO: TIBBCDField;
    cabeceraIMPORTE_PORTE: TIBBCDField;
    cabeceraDESCUENTO: TFloatField;
    cabeceraIMPORTE_DESCUENTO: TIBBCDField;
    cabeceraBASE_IMPONIBLE: TIBBCDField;
    cabeceraIVA: TFloatField;
    cabeceraID_CLIENTE: TIntegerField;
    cabeceraREFERENCIA_CLIENTE: TIBStringField;
    cabeceraCLIENTE_FINAL: TIBStringField;
    cabeceraNIF_CIF: TIBStringField;
    cabeceraNOMBRE: TIBStringField;
    cabeceraIMPORTE_IVA: TIBBCDField;
    cabeceraIMPORTE_TOTAL: TIBBCDField;
    cabeceraPERSONA_CONTACTO: TIBStringField;
    cabeceraCALLE: TIBStringField;
    cabeceraPOBLACION: TIBStringField;
    cabeceraPROVINCIA: TIBStringField;
    cabeceraCODIGO_POSTAL: TIBStringField;
    DADSCapitulos: TDADataSource;
    tbl_Capitulos: TDAMemDataTable;
    DADSResumen: TDADataSource;
    tbl_Resumen: TDAMemDataTable;
    DAMemDataTable1: TDAMemDataTable;
    DAMemDataTable2: TDAMemDataTable;
    frxPDFExport1: TfrxPDFExport;
    schReport: TDASchema;
    DataDictionary: TDADataDictionary;
    procedure DataModuleCreate(Sender: TObject);
  private
    FConnection: IDAConnection;
    procedure _GenerarPresupuesto(const AID : Integer);
  public
    function GenerarPresupuesto(const ListaID : TIntegerArray): Binary;
    function GenerarPresupuestoEnPDF(const ListaID : TIntegerArray): Binary;
  end;

implementation

{$R *.dfm}

uses
  uDataModuleServer, schPresupuestosClienteClient_Intf;

const
  rptInforme = 'InfPresupuestoCliente.fr3';


{ TRptPresupuestosProveedor }


procedure TRptPresupuestosCliente.DataModuleCreate(Sender: TObject);
begin
  schReport.ConnectionManager := dmServer.ConnectionManager;
  FConnection := dmServer.DarNuevaConexion;
  frxReport.EngineOptions.NewSilentMode := simReThrow;
end;

function TRptPresupuestosCliente.GenerarPresupuestoEnPDF(const ListaID: TIntegerArray): Binary;
var
  i: Integer;
begin
  Result := Binary.Create;
  //FConnection.BeginTransaction; <--- Creo que no va a hacer falta.

  try
    //Vamos generando todos y cada uno de los presupuestos recibidos
    for i := 0 to ListaID.Count - 1 do
        _GenerarPresupuesto(ListaID.Items[i]);

    frxPDFExport1.Stream := Result;
    frxReport.Export(frxPDFExport1)
  finally
    //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta.
  end;
end;

function TRptPresupuestosCliente.GenerarPresupuesto(const ListaID: TIntegerArray): Binary;
var
  i: Integer;
begin
  Result := Binary.Create;
  //FConnection.BeginTransaction; <--- Creo que no va a hacer falta.

  try
    //Vamos generando todos y cada uno de los presupuestos recibidos
    for i := 0 to ListaID.Count - 1 do
        _GenerarPresupuesto(ListaID.Items[i]);

    frxReport.PreviewPages.SaveToStream(Result);
  finally
    //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta.
  end;
end;

procedure TRptPresupuestosCliente._GenerarPresupuesto(const AID: Integer);
begin
  frxDBCabecera.DataSource := DADSCabecera;
  frxDBCapitulos.DataSource := DADSCapitulos;
  frxDBDetalles.DataSource := DADSDetalles;
  frxDBResumen.DataSource := DADSResumen;

  tbl_Cabecera.ParamByName('ID').AsInteger := AID;
  tbl_Capitulos.ParamByName('ID_PRESUPUESTO').AsInteger := AID;
  tbl_Detalles.ParamByName('ID_PRESUPUESTO').AsInteger := AID;
  tbl_Resumen.ParamByName('ID_PRESUPUESTO').AsInteger := AID;

  tbl_Cabecera.Active := True;
  tbl_Capitulos.Active := True;
  tbl_Detalles.Active := True;
  tbl_Resumen.Active := True;

  frxReport.LoadFromFile(DarRutaInformes + rptInforme, True);
  frxReport.PrepareReport(False);
end;

end.
