unit uRptAlbaranesProveedor_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, frxExportPDF, FactuGES_Intf, uDABin2DataStreamer;

type
  TRptAlbaranesProveedor = class(TDataModule)
    DADSCabecera: TDADataSource;
    DADSDetalles: TDADataSource;
    frxRichObject1: TfrxRichObject;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxOLEObject1: TfrxOLEObject;
    frxCrossObject1: TfrxCrossObject;
    frxCheckBoxObject1: TfrxCheckBoxObject;
    frxGradientObject1: TfrxGradientObject;
    frxChartObject1: TfrxChartObject;
    frxDBCabecera: TfrxDBDataset;
    frxDBDetalles: TfrxDBDataset;
    frxReport: TfrxReport;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    DataSource1: TDataSource;
    DataSource3: TDataSource;
    detalles: TIBQuery;
    cabecera: TIBQuery;
    detallesID: TIntegerField;
    detallesID_ALBARAN: TIntegerField;
    detallesPOSICION: TIntegerField;
    detallesTIPO_DETALLE: TIBStringField;
    detallesCONCEPTO: TIBStringField;
    detallesCANTIDAD: TIntegerField;
    detallesIMPORTE_UNIDAD: TIBBCDField;
    detallesIMPORTE_TOTAL: TIBBCDField;
    detallesREFERENCIA: TIBStringField;
    tbl_Cabecera: TDAMemDataTable;
    tbl_Detalles: TDAMemDataTable;
    frxPDFExport1: TfrxPDFExport;
    DABin2DataStreamer1: TDABin2DataStreamer;
    schReport: TDASchema;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
    procedure frxReportGetValue(const VarName: string; var Value: Variant);
  private
    FConnection: IDAConnection;
    FImprimirPrecio : Boolean;
    FImprimirRefProveedor : Boolean;
    //Genera cada uno de los albaranes a imprimir
    procedure _GenerarAlbaran(const AID: Integer);
  public
    function GenerarAlbaran(const AListaID : TIntegerArray;
      const ImprimirPrecio: Boolean = True;
      const ImprimirRefProveedor: Boolean = True): Binary;
    function GenerarAlbaranEnPDF(const ListaID : TIntegerArray;
      const ImprimirPrecio: Boolean = True;
      const ImprimirRefProveedor: Boolean = True): Binary;
  end;

implementation

{$R *.dfm}

uses
  uSistemaFunc, uDataModuleServer, schAlbaranesProveedorClient_Intf;

const
  rptInforme = 'InfAlbaranProveedor.fr3';

  { Dataset names for schReport }
  ds_InformeCabecera = 'Informe_Cabecera';
  ds_InformeDetalles = 'Informe_Detalles';


{ TRptAlbaranesProveedor }


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

  frxDBCabecera.DataSource := DADSCabecera;
  frxDBCabecera.CloseDataSource := False;

  frxDBDetalles.DataSource := DADSDetalles;
  frxDBDetalles.CloseDataSource := False;
end;

procedure TRptAlbaranesProveedor.DataModuleDestroy(Sender: TObject);
begin
    tbl_Cabecera.Active := False;
    tbl_Detalles.Active := False;
end;

procedure TRptAlbaranesProveedor.frxReportGetValue(const VarName: string;
  var Value: Variant);
begin
  if VarName = 'ImprimirPrecio' then
    Value := FImprimirPrecio;
  if VarName = 'ImprimirRefProveedor' then
    Value := FImprimirRefProveedor;
end;

function TRptAlbaranesProveedor.GenerarAlbaran(const AListaID : TIntegerArray;
      const ImprimirPrecio: Boolean = True;
      const ImprimirRefProveedor: Boolean = True): Binary;
var
  i: Integer;
begin
  Result := Binary.Create;
  FImprimirPrecio := ImprimirPrecio;
  FImprimirRefProveedor := ImprimirRefProveedor;
  try
    //Vamos generando todos y cada uno de los albaranes recibidos
    for i := 0 to AListaID.Count - 1 do
        _GenerarAlbaran(AListaID.Items[i]);
    frxReport.PreviewPages.SaveToStream(Result);
  finally
  end;
end;

function TRptAlbaranesProveedor.GenerarAlbaranEnPDF(const ListaID: TIntegerArray;
      const ImprimirPrecio: Boolean = True;
      const ImprimirRefProveedor: Boolean = True): Binary;
var
  i: Integer;
begin
  Result := Binary.Create;
  FImprimirPrecio := ImprimirPrecio;
  FImprimirRefProveedor := ImprimirRefProveedor;
  try
    //Vamos generando todos y cada uno de los presupuestos recibidos
    for i := 0 to ListaID.Count - 1 do
        _GenerarAlbaran(ListaID.Items[i]);

    frxPDFExport1.Stream := Result;
    frxReport.Export(frxPDFExport1)
  finally
  end;
end;

procedure TRptAlbaranesProveedor._GenerarAlbaran(const AID: Integer);
var
  AInforme: Variant;

begin
  FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  try
    tbl_Cabecera.Active := False;
    tbl_Detalles.Active := False;

    tbl_Cabecera.ParamByName('ID').AsInteger := AID;
    tbl_Detalles.ParamByName('ID_ALBARAN').AsInteger := AID;

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

    AInforme := DarRutaFichero(DarRutaInformes, rptInforme, tbl_Cabecera.FieldByName('ID_EMPRESA').AsString);
    if VarIsNull(AInforme) then
       raise Exception.Create (('Error Servidor: _GenerarFactura, no encuentra informe ' + rptInforme));

    frxReport.LoadFromFile(AInforme, True);
    frxReport.PrepareReport(False);
  finally
    FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  end;
end;

end.
