unit uRptPedidosProveedor_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;

type
  TRptPedidosProveedor = class(TDataModule)
    DABINAdapter: TDABINAdapter;
    frxDBCabecera: TfrxDBDataset;
    frxDBDetalles: TfrxDBDataset;
    frxReport: TfrxReport;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    cabecera: TIBQuery;
    detalles: TIBQuery;
    frxCheckBoxObject1: TfrxCheckBoxObject;
    frxChartObject1: TfrxChartObject;
    frxGradientObject1: TfrxGradientObject;
    frxCrossObject1: TfrxCrossObject;
    frxOLEObject1: TfrxOLEObject;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxRichObject1: TfrxRichObject;
    DADSCabecera: TDADataSource;
    DADSDetalles: TDADataSource;
    tbl_Detalles: TDAMemDataTable;
    tbl_Cabecera: TDAMemDataTable;
    detallesID: TIntegerField;
    detallesID_PEDIDO: TIntegerField;
    detallesPOSICION: TIntegerField;
    detallesTIPO_DETALLE: TIBStringField;
    detallesREFERENCIA: TIBStringField;
    detallesCONCEPTO: TIBStringField;
    detallesCANTIDAD: TIntegerField;
    detallesUNIDAD_MEDIDA: TIBStringField;
    detallesIMPORTE_UNIDAD: TIBBCDField;
    detallesIMPORTE_TOTAL: TIBBCDField;
    detallesREFERENCIA_PROVEEDOR: TIBStringField;
    detallesREFERENCIA_FABRICANTE: TIBStringField;
    cabeceraID: TIntegerField;
    cabeceraID_EMPRESA: TIntegerField;
    cabeceraREFERENCIA: TIBStringField;
    cabeceraFECHA_PEDIDO: TDateField;
    cabeceraOBSERVACIONES: TMemoField;
    cabeceraNOMBRE: TIBStringField;
    cabeceraFAX: TIBStringField;
    cabeceraPERSONA_CONTACTO: TIBStringField;
    cabeceraCODIGO_CLIENTE: TIBStringField;
    cabeceraCALLE: TIBStringField;
    cabeceraPOBLACION: TIBStringField;
    cabeceraPROVINCIA: TIBStringField;
    cabeceraCODIGO_POSTAL: TIBStringField;
    cabeceraENTREGAR_A: TIBStringField;
    frxPDFExport1: TfrxPDFExport;
    schReport: TDASchema;
    DataDictionary: TDADataDictionary;
    frxDBInformeListadoPedidos: TfrxDBDataset;
    DADSInformeListadoPedidos: TDADataSource;
    tbl_InformeListadoPedidos: TDAMemDataTable;
    procedure DataModuleCreate(Sender: TObject);
    procedure frxReportGetValue(const VarName: string; var Value: Variant);
  private
    FConnection: IDAConnection;
    FImprimirPrecio : Boolean;
    FImprimirRefProveedor : Boolean;
    procedure _GenerarPedido(const ID : Integer);
    function _GenerarInforme(const TipoInforme: String; const IdEmpresa: Integer; const FechaInicio: DateTime; const FechaFin: DateTime; const ListaIDClientes: TIntegerArray; const ImporteMinimo: Currency): Binary;

  public
    function GenerarPedido(const ListaID : TIntegerArray;
      const ImprimirPrecio: Boolean = True;
      const ImprimirRefProveedor: Boolean = True): Binary;

    function GenerarPedidoEnPDF(const ListaID: TIntegerArray;
      const ImprimirPrecio: Boolean = True;
      const ImprimirRefProveedor: Boolean = True): Binary;

    function GenerarInformeListadoPedidos(const IdEmpresa: Integer; const FechaInicio, FechaFin: DateTime; const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary;
  end;

implementation

{$R *.dfm}

uses
  uDataModuleServer, schPedidosProveedorClient_Intf;

const
  rptInforme = 'InfPedidoProveedor.fr3';
  rptInformeListadoPedidosDesglosado = 'InformeListadoPedidosDesglosado.fr3';
  rptInformeListadoPedidos = 'InformeListadoPedidos.fr3';

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


{ TRptPedidosProveedor }


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

  frxDBCabecera.DataSource := DADSCabecera;
  frxDBDetalles.DataSource := DADSDetalles;

end;

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

function TRptPedidosProveedor.GenerarInformeListadoPedidos(
  const IdEmpresa: Integer; const FechaInicio, FechaFin: DateTime;
  const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean;
  const ImporteMinimo: Currency): Binary;
var
  ATipoInforme: String;

begin

//DESGLOSADO POR CLIENTE EN ESTE INFORME NO SE DESGLOSARÁ POR CLIENTE
    if Desglosado then
       ATipoInforme := rptInformeListadoPedidosDesglosado
    else
       ATipoInforme := rptInformeListadoPedidos;

    Result := _GenerarInforme(ATipoInforme, IdEmpresa, FechaInicio, FechaFin, ListaIDProveedores, ImporteMinimo);

end;

function TRptPedidosProveedor.GenerarPedido(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 pedidos recibidos
    for i := 0 to ListaID.Count - 1 do
        _GenerarPedido(ListaID.Items[i]);

    frxReport.PreviewPages.SaveToStream(Result);
  finally
  end;
end;

function TRptPedidosProveedor._GenerarInforme(const TipoInforme: String;
  const IdEmpresa: Integer; const FechaInicio, FechaFin: DateTime;
  const ListaIDClientes: TIntegerArray; const ImporteMinimo: Currency): Binary;
var
  Condicion: TDAWhereExpression;
  i: Integer;

begin
  Result := Binary.Create;
  FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"

  try

    if tbl_InformeListadoPedidos.Active then
      tbl_InformeListadoPedidos.Active := False;

    // Filtrar el informe por empresa
    with tbl_InformeListadoPedidos.DynamicWhere do
    begin
      // (ID_EMPRESA >= ID)
      Condicion := NewBinaryExpression(NewField('', fld_PedidosProveedorID_EMPRESA), NewConstant(IdEmpresa, datInteger), dboEqual);
      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;

    // Filtrar el informe por fechas
    if  not VarIsNull(FechaInicio)
    and not VarIsNull(FechaFin) then
    begin
      with tbl_InformeListadoPedidos.DynamicWhere do
      begin
        // (FECHA_INICIO between FECHA_FIN)
        Condicion := NewBinaryExpression(NewField('', fld_PedidosProveedorFECHA_PEDIDO), NewConstant(FechaInicio, datDateTime), dboGreaterOrEqual);
        Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_PedidosProveedorFECHA_PEDIDO), NewConstant(FechaFin, datDateTime), dboLessOrEqual), Condicion, dboAnd);
        if IsEmpty then
           Expression := Condicion
        else
           Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
      end;
    end;

    // Filtrar el informe por cliente
    if  Assigned(ListaIDClientes) then
    begin
      with tbl_InformeListadoPedidos.DynamicWhere do
      begin
        for i := 0 to ListaIDClientes.Count - 1 do
        begin

          // (ID_CLIENTE = ID)
          Condicion := NewBinaryExpression(NewField('', fld_PedidosProveedorID_PROVEEDOR), NewConstant(ListaIDClientes.Items[i], datInteger), dboEqual);
          if IsEmpty then
             Expression := Condicion
          else
             Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
          end;
      end;
    end;

    // Filtrar el informe por importe minimo
    if  (ImporteMinimo > 0) then
    begin
      with tbl_InformeListadoPedidos.DynamicWhere do
      begin
        // (IMPORTE_TOTAL > ImporteMinimo)
        Condicion := NewBinaryExpression(NewField('', fld_PedidosProveedorIMPORTE_TOTAL), NewConstant(ImporteMinimo, datCurrency), dboGreaterOrEqual);
        if IsEmpty then
           Expression := Condicion
        else
           Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
      end;
    end;


    tbl_InformeListadoPedidos.Active := True;

    frxReport.LoadFromFile(DarRutaInformes + IntToStr(IdEmpresa) + '\' + TipoInforme, True);
    frxReport.Variables.Variables['FechaInicio'] := FechaInicio;
    frxReport.Variables.Variables['FechaFin'] := FechaFin;

    frxReport.PrepareReport(False);
    frxReport.PreviewPages.SaveToStream(Result);

  finally
    FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  end;
end;

procedure TRptPedidosProveedor._GenerarPedido(const ID: Integer);
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 := ID;
    tbl_Detalles.ParamByName('ID_PEDIDO').AsInteger := ID;

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

    frxReport.LoadFromFile(DarRutaInformes + tbl_Cabecera.FieldByName('ID_EMPRESA').AsString + '\' + rptInforme, True);
    frxReport.PrepareReport(False);
  finally
    FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  end;
end;

function TRptPedidosProveedor.GenerarPedidoEnPDF(
  const ListaID: TIntegerArray; const ImprimirPrecio: Boolean;
  const ImprimirRefProveedor: Boolean): 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 ListaID.Count - 1 do
        _GenerarPedido(ListaID.Items[i]);

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


end.
