unit uRptFacturasCliente_Server;

interface

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

type
  TRptFacturasCliente = class(TDataModule)
    frxDBCabecera: TfrxDBDataset;
    frxDBDetalles: TfrxDBDataset;
    DataDictionary: TDADataDictionary;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    cabecera: TIBQuery;
    detalles: TIBQuery;
    DABINAdapter: TDABINAdapter;
    DADSCabecera: TDADataSource;
    DADSDetalles: TDADataSource;
    tbl_Detalles: TDAMemDataTable;
    tbl_Cabecera: TDAMemDataTable;
    frxCheckBoxObject1: TfrxCheckBoxObject;
    frxChartObject1: TfrxChartObject;
    frxGradientObject1: TfrxGradientObject;
    frxCrossObject1: TfrxCrossObject;
    frxOLEObject1: TfrxOLEObject;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxRichObject1: TfrxRichObject;
    frxReport: TfrxReport;
    cabeceraID: TIntegerField;
    cabeceraID_EMPRESA: TIntegerField;
    cabeceraREFERENCIA: TIBStringField;
    cabeceraTIPO: TIBStringField;
    cabeceraFECHA_FACTURA: TDateField;
    cabeceraBASE_IMPONIBLE: TIBBCDField;
    cabeceraSITUACION: TIBStringField;
    cabeceraDESCUENTO: TFloatField;
    cabeceraIMPORTE_DESCUENTO: TIBBCDField;
    cabeceraIVA: TFloatField;
    cabeceraIMPORTE_IVA: TIBBCDField;
    cabeceraRE: TFloatField;
    cabeceraIMPORTE_RE: TIBBCDField;
    cabeceraIMPORTE_TOTAL: TIBBCDField;
    cabeceraOBSERVACIONES: TMemoField;
    cabeceraNIF_CIF: TIBStringField;
    cabeceraID_CLIENTE: TIntegerField;
    cabeceraNOMBRE: TIBStringField;
    cabeceraCALLE: TIBStringField;
    cabeceraPROVINCIA: TIBStringField;
    cabeceraPOBLACION: TIBStringField;
    cabeceraCODIGO_POSTAL: TIBStringField;
    cabeceraRECARGO_EQUIVALENCIA: TSmallintField;
    cabeceraIMPORTE_NETO: TIBBCDField;
    cabeceraIMPORTE_PORTE: TIBBCDField;
    cabeceraFORMA_PAGO: TIBStringField;
    detallesID: TIntegerField;
    detallesID_FACTURA: TIntegerField;
    detallesPOSICION: TIntegerField;
    detallesTIPO_DETALLE: TIBStringField;
    detallesCONCEPTO: TIBStringField;
    detallesCANTIDAD: TIntegerField;
    detallesIMPORTE_UNIDAD: TIBBCDField;
    detallesDESCUENTO: TFloatField;
    detallesIMPORTE_TOTAL: TIBBCDField;
    detallesVISIBLE: TSmallintField;
    detallesREFERENCIA: TIBStringField;
    frxDBVencimientos: TfrxDBDataset;
    DADSVencimientos: TDADataSource;
    tbl_Vencimientos: TDAMemDataTable;
    vencimientos: TIBQuery;
    DataSource3: TDataSource;
    cabeceraDATOS_BANCARIOS: TIBStringField;
    vencimientosFECHA_VENCIMIENTO: TDateField;
    vencimientosIMPORTE_TOTAL: TIBBCDField;
    frxPDFExport1: TfrxPDFExport;
    schReport: TDASchema;
    procedure DataModuleCreate(Sender: TObject);
  private
    FConnection: IDAConnection;
    //Genera cada una de las facturas a imprimir
    procedure _GenerarFactura(const ID: Integer);
  public
    function GenerarFactura(const ListaID : TIntegerArray): Binary;
    function GenerarFacturaEnPDF(const ListaID : TIntegerArray): Binary;     
  end;

implementation

{$R *.dfm}

uses
  uDataModuleServer, schFacturasClienteClient_Intf;

const
  rptFacturaCliente = 'InfFacturaCliente.fr3';

  { Dataset names for schReport }
  ds_InformeFacturasCliente = 'InformeFacturasCliente';
  ds_InformeFacturasCliente_Detalles = 'InformeFacturasCliente_Detalles';
  ds_InformeFacturasCliente_Vencimientos = 'InformeFacturasCliente_Vencimientos';  


{ TRptFacturasCliente }


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

function TRptFacturasCliente.GenerarFactura(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 una de las facturas recibidas
    for i := 0 to ListaID.Count - 1 do
        _GenerarFactura(ListaID.Items[i]);

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

function TRptFacturasCliente.GenerarFacturaEnPDF(
  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 una de las facturas recibidas
    for i := 0 to ListaID.Count - 1 do
        _GenerarFactura(ListaID.Items[i]);

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

procedure TRptFacturasCliente._GenerarFactura(const ID: Integer);
//var
//  AStream: TMemoryStream;
//  dsMaster: IDADataset;
//  dsDetail: IDADataset;
//  dsVencimientos : IDADataset;
begin
//  AStream := TMemoryStream.Create;

  try
    frxDBCabecera.DataSource := DADSCabecera;
    frxDBDetalles.DataSource := DADSDetalles;
    frxDBVencimientos.DataSource := DADSVencimientos;

    tbl_Cabecera.ParamByName('ID').AsInteger := ID;
    tbl_Detalles.ParamByName('ID_FACTURA').AsInteger := ID;
    tbl_Vencimientos.ParamByName('ID_FACTURA').AsInteger := ID;

    tbl_Cabecera.Active := True;
    tbl_Detalles.Active := True;
    tbl_Vencimientos.Active := True;

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

  finally
//    AStream.Free;
//    dsMaster := Nil;
//    dsDetail := Nil;
  end;
end;

end.
