unit uRptFacturasProveedor_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
  TRptFacturasProveedor = 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;
    vencimientos: TIBQuery;
    DataSource3: TDataSource;
    cabeceraDATOS_BANCARIOS: TIBStringField;
    vencimientosFECHA_VENCIMIENTO: TDateField;
    vencimientosIMPORTE_TOTAL: TIBBCDField;
    frxPDFExport1: TfrxPDFExport;
    tbl_InformeListadoFacturas: TDAMemDataTable;
    DADSInformeListadoFacturas: TDADataSource;
    frxDBInformeListadoFacturas: TfrxDBDataset;
    schReport: TDASchema;
    procedure DataModuleCreate(Sender: TObject);
  private
    FConnection: IDAConnection;
    function _GenerarInforme(const TipoInforme: String; const IdEmpresa: Integer; const FechaInicio: DateTime; const FechaFin: DateTime; const ListaIDProveedores: TIntegerArray; const ImporteMinimo: Currency): Binary;
  public
    function GenerarInformeIVA(const IdEmpresa: Integer; const FechaInicio: DateTime; const FechaFin: DateTime; const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary;
    function GenerarInformeListadoFacturas(const IdEmpresa: Integer; const FechaInicio: DateTime; const FechaFin: DateTime; const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary;
    function GenerarInformeListadoFacturasPendientes(const IdEmpresa: Integer; const FechaInicio: DateTime; const FechaFin: DateTime; const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary;
  end;

implementation

{$R *.dfm}

uses
  uDataModuleServer, schFacturasProveedorClient_Intf;

const
  rptInformeIVA = 'InformeIVAProveedores.fr3';
  rptInformeIVADesglosado = 'InformeIVAProveedoresDesglosado.fr3';
  rptInformeListadoFacturasProveedor = 'InformeListadoFacturasProveedor.fr3';
  rptInformeListadoFacturasProveedorDesglosado = 'InformeListadoFacturasProveedorDesglosado.fr3';
  rptInformeListadoFactuasProveedorPendiente = 'InformeListadoFacturasProveedorPendientes.fr3';
  rptInformeListadoFactuasProveedorPendienteDesglosado = 'InformeListadoFacturasProveedorPendientesDesglosado.fr3';

{ TRptFacturasProveedor }


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

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


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

begin

//DESGLOSADO POR PROVEEDOR EN ESTE INFORME NO SE DESGLOSARÁ POR PROVEEDOR
    if Desglosado then
       ATipoInforme := rptInformeIVADesglosado
    else
       ATipoInforme := rptInformeIVA;

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

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

//DESGLOSADO POR PROVEEDOR EN ESTE INFORME NO SE DESGLOSARÁ POR PROVEEDOR
    if Desglosado then
       ATipoInforme := rptInformeListadoFacturasProveedorDesglosado
    else
       ATipoInforme := rptInformeListadoFacturasProveedor;

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

function TRptFacturasProveedor.GenerarInformeListadoFacturasPendientes(
  const IdEmpresa: Integer; const FechaInicio, FechaFin: DateTime;
  const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean;
  const ImporteMinimo: Currency): Binary;
var
  Condicion: TDAWhereExpression;
  ATipoInforme: String;

begin
    if tbl_InformeListadoFacturas.Active then
      tbl_InformeListadoFacturas.Active := False;

    // Filtrar el informe por situacion
    with tbl_InformeListadoFacturas.DynamicWhere do
    begin
      // (ID_EMPRESA >= ID)
      Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorSITUACION), NewConstant('PAGADA', datString), dboNotEqual);
      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;


//DESGLOSADO POR PROVEEDOR EN ESTE INFORME
    if Desglosado then
       ATipoInforme := rptInformeListadoFactuasProveedorPendienteDesglosado
    else
       ATipoInforme := rptInformeListadoFactuasProveedorPendiente;


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

function TRptFacturasProveedor._GenerarInforme(const TipoInforme: String;
  const IdEmpresa: Integer; const FechaInicio, FechaFin: DateTime;
  const ListaIDProveedores: 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_InformeListadoFacturas.Active then
      tbl_InformeListadoFacturas.Active := False;

    // Filtrar el informe por empresa
    with tbl_InformeListadoFacturas.DynamicWhere do
    begin
      // (ID_EMPRESA >= ID)
      Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorID_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_InformeListadoFacturas.DynamicWhere do
      begin
        // (FECHA_INICIO between FECHA_FIN)
        Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorFECHA_FACTURA), NewConstant(FechaInicio, datDateTime), dboGreaterOrEqual);
        Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_FacturasProveedorFECHA_FACTURA), NewConstant(FechaFin, datDateTime), dboLessOrEqual), Condicion, dboAnd);
        if IsEmpty then
           Expression := Condicion
        else
           Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
      end;
    end;

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

          // (ID_PROVEEDOR = ID)
          Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorID_PROVEEDOR), NewConstant(ListaIDProveedores.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_InformeListadoFacturas.DynamicWhere do
      begin
        // (IMPORTE_TOTAL > ImporteMinimo)
        Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorIMPORTE_TOTAL), NewConstant(ImporteMinimo, datCurrency), dboGreaterOrEqual);
        if IsEmpty then
           Expression := Condicion
        else
           Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
      end;
    end;


    tbl_InformeListadoFacturas.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;

end.
