unit InformeEstFacturasCliPro;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  InformeEstadistico, Db, RxMemDS, StdCtrls, RdxComboBox, dxCntner, dxTL,
  dxDBCtrl, dxDBGrid, ExtCtrls, RdxTitulos, RdxPaneles,

  IBCustomDataSet, BaseDatos, IBSQL, IB, Excepciones, TeEngine, TeeFunci,
  Series, TeeProcs, Chart, DBChart, IBDatabase, Grids, DBGrids, RdxBotones,
  RdxBarras, Tipos;

type
  TfrInformeEstFacturasCliPro = class(TfrInformeEstadistico)
    pnlResumen2: TRdxPanel;
    cResumen2: TRdxCabecera;
    pnlDatosResumen2: TPanel;
    pnlGrid2: TPanel;
    gridResumen2: TdxDBGrid;
    pnlTitulosResumen2: TPanel;
    DBChart1: TDBChart;
    Series1: TBarSeries;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    DataSource1: TDataSource;
    IBDataSet1: TIBDataSet;
    IBDataSet3: TIBDataSet;
    IBDataSet2: TIBDataSet;
    Series4: TBarSeries;
    Label3: TLabel;
    Label4: TLabel;
    Label7: TLabel;
    Label10: TLabel;
    pnlA1T1: TLabel;
    pnlA2T1: TLabel;
    pnlA3T1: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    dsResumen2: TDataSource;
    TablaResumen2Mem: TRxMemoryData;
    Label1: TLabel;
    Label13: TLabel;
    etiComp: TLabel;

    procedure gridCustomDrawCell(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxTreeListColumn;
      ASelected, AFocused, ANewItemRow: Boolean; var AText: String;
      var AColor: TColor; AFont: TFont; var AAlignment: TAlignment;
      var ADone: Boolean); override;

    procedure bCancelarClick(Sender: TObject);
    procedure bImprimirClick(Sender: TObject);

  private
    FTotAno11: Double;
    FTotAno21: Double;

    TablaResumen1 : TIBDataSet;
    sqlResumen1 : TStrings;
    TablaResumen2 : TIBDataSet;
    sqlResumen2 : TStrings;
    TablaResumen3 : TIBDataSet;
    sqlResumen3 : TStrings;

    procedure LimpiarTotales;
    function CalcularPre(var TotalAno1: Double; var TotalAno2: Double): Boolean;
    function GenerarTablaInforme: TRxMemoryData;

    function InicializarResumen1: Boolean;
    function FinalizarResumen1: Boolean;
    function CalcularResumen1: Boolean;
    procedure InicializarGridResumen1(var Grid: TdxDBGrid);

    function InicializarResumen2: Boolean;
    function FinalizarResumen2: Boolean;
    function CalcularResumen2: Boolean;
    procedure InicializarGridResumen2(var Grid: TdxDBGrid);

  protected
    function InicializarFiltros: Boolean; override;
    function InicializarCamposTMem: Boolean; override;
    function InicializarGrids: Boolean; override;
    function CalcularDatos: Boolean; override;

    function InicializarResumenes: Boolean; override;
    function RefrescarResumenes: Boolean; override;
    function FinalizarResumenes: Boolean; override;

    procedure SetAno2(const Value: Variant); override;
  public
    constructor Create (AOwner : TComponent;Const Entidad : TRdxEntidad); overload;
  end;

var
  frInformeEstFacturasCliPro: TfrInformeEstFacturasCliPro;

implementation

uses Literales, Constantes, dxGrClms, Mensajes, TablaPresupuestos, RdxEmpresaActiva,
StrFunc, InfEstReportFacturasCliPro, TablaFacturasCliente, TablaFacturasProveedor,
Configuracion, SysFunc;

{$R *.DFM}

{ TfrInformeEstPresupuestos }


{ TfrInformeEstPresupuestos }

function TfrInformeEstFacturasCliPro.CalcularDatos: Boolean;
var
  Aux: Double;
  i: Integer;
  Aux2: String;

begin
  LimpiarTotales;
  FTotAno11:= 0;
  FTotAno21:= 0;
  CalcularPre(FTotAno11,FTotAno21);

  if FTotAno11 <> 0 then
     pnlA1T1.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno11);

  //Solo calculamos totales en el caso de que se comparen dos años
  if not varIsNull(Ano2) then
  begin
    if FTotAno21 <> 0 then
       pnlA2T1.Caption := FormatFloat(DISPLAY_EUROS2, FTotAno21);

    if CalcularPorcentaje(FTotAno11, FTotAno21, True) < 0 then
      pnlA3T1.Font.Color := COLOR_PORCENTAJENEG
    else
      pnlA3T1.Font.Color := COLOR_PORCENTAJEPOS;
    if CalcularPorcentaje(FTotAno11, FTotAno21, True) <> 0 then
       pnlA3T1.Caption := FormatFloat(DISPLAY_PORCENTAJE, CalcularPorcentaje(FTotAno11, FTotAno21, True));
  end;

  for i:=0 to DBChart1.SeriesList.CountActive-1 do
  begin
    Aux2 := DBChart1.SeriesList.Series[i].Title;
    if i=0
    then DBChart1.SeriesList.Series[i].Title := ('Total Facturado ' + cbxFiltro2.Text)
    else DBChart1.SeriesList.Series[i].Title := ('Total Facturado ' + cbxFiltro3.Text);

    DBChart1.SeriesList.Series[i].XLabelsSource := CTE_CAMPO2;
    DBChart1.SeriesList.Series[i].XValues.ValueSource := CTE_CAMPO1;
    DBChart1.SeriesList.Series[i].YValues.ValueSource := 'IMPORTETOTAL';
  end;
end;

function TfrInformeEstFacturasCliPro.CalcularPre(var TotalAno1: Double;
var TotalAno2: Double): Boolean;
var
  oSQL: TIBSQL;
  Semaforo: Boolean; //Semaforo para controlar la pasada del Ano2 y asi empezar
  Contador: Integer; //a compara con los datos de la tabla de memoria en lugar de
                     //el recordset
begin
  Result := False;
  Semaforo := False;

  //PREPARAMOS LA SENTENCIA SQL A LANZAR
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;

    SQL.Add('select EXTRACT(YEAR FROM FECHAALTA) as ANO');
    //Calculamos el intervalo correspondiente a cada una de las posibilidades
    Case Intervalo of
      tiMensual :    SQL.Add(',EXTRACT(MONTH FROM FECHAALTA) as NFILA');
      tiTrimestral : SQL.Add(',CAST((DIV(EXTRACT(MONTH FROM FECHAALTA),4)+1) AS SMALLINT) as NFILA');
      tiSemestral :  SQL.Add(',CAST((DIV(EXTRACT(MONTH FROM FECHAALTA),8)+1) AS SMALLINT) as NFILA');
    end;
    SQL.Add(',SUM(IMPORTETOTAL) as IMPORTETOTAL');

//TIPO INFORME FACTURASCLIENTE/FACTURASPROVEEDOR
    Case Entidad of
      entInfEstFacPro: SQL.Add('from FACTURASPROVEEDOR');
      entVacia, entInfEstFacCli: SQL.Add('from FACTURASCLIENTE');
    end;

    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and (EXTRACT(YEAR FROM FECHAALTA) = :ANO1');
    SQL.Add('or EXTRACT(YEAR FROM FECHAALTA) = :ANO2)');
    SQL.Add('group by 1,2');

    if (not VarIsNull(Ano2)) and (Ano1 < Ano2)
    then SQL.Add('order by 1,2 asc')
    else SQL.Add('order by 1 desc,2 asc');
    try
      ParamByName('CODIGOEMPRESA').AsString := EmpresaActiva.Codigo;
      ParamByName('ANO1').AsString := Ano1;
      //En el caso de no compara con otro año se busca solo el año1
      if VarIsNull(Ano2)
      then ParamByName('ANO2').AsString := Ano1
      else ParamByName('ANO2').AsString := Ano2;
      Prepare;
      ExecQuery;

//Rellenamos los grid resultado
      TMemAnoCom1.First;
      TMemAnoCom2.First;
      TMemComparativa.First;
      TMemGraficoAno1.First;
      TMemGraficoAno2.First;

//Inicio de recorrido del resultado
      while not EOF do begin

//Rellenamos los datos del Año1
        if (FieldByName('ANO').AsString = Ano1) then
        begin
          //En el caso de solo tener datos en ciertos intervalos, los que no tienen datos los
          //no los rellenamos
          while TMemAnoCom1.FieldByName(CTE_CAMPO1).AsInteger <> FieldByName(CTE_CAMPO1).AsInteger do
          begin
            TMemAnoCom1.Next;
            TMemGraficoAno1.Next;
          end;
          //Metemos el dato obtenido en la sql en su intervalo correspondiente
          TMemAnoCom1.Edit;
          TMemAnoCom1.FieldByName('IMPORTETOTAL').AsFloat := FieldByName('IMPORTETOTAL').AsFloat;
          TMemAnoCom1.Post;
          TMemGraficoAno1.Edit;
          TMemGraficoAno1.FieldByName('IMPORTETOTAL').AsFloat := FieldByName('IMPORTETOTAL').AsFloat;
          TMemGraficoAno1.Post;
          //Vamos incrementando la suma total
          TotalAno1 := TotalAno1 + FieldByName('IMPORTETOTAL').AsFloat;
          TMemAnoCom1.Next;
          TMemGraficoAno1.Next;
        end

//Rellenamos los datos del Año2
        else
        begin
          //Si es la primera tupla del recordset de este año establecemos el semaforo
          //y la tabla de datos del Año1 en el primer elemento para tener en cuenta los
          //datos de dicha tabla en lugar de los del recordset para el Año1
          if not Semaforo then
          begin
            TMemAnoCom1.First;
            Semaforo := True;
          end
          else
            TMemAnoCom1.Next;

          //En el caso de solo tener datos en ciertos intervalos, los que no tienen datos los
          //no los rellenamos
          while TMemAnoCom2.FieldByName(CTE_CAMPO1).AsInteger <> FieldByName(CTE_CAMPO1).AsInteger do
          begin
            //Calculamos TablaComaprativa
            //En el caso de no existir el valor en Año1 o Año2 de este determinado intervalo
            //no rellenariamos calculo ninguno
            if (not VarIsNull(TMemAnoCom1.FieldByName('IMPORTETOTAL').AsVariant))
            and (not VarIsNull(TMemAnoCom2.FieldByName('IMPORTETOTAL').AsVariant)) then
            begin
              TMemComparativa.Edit;
              TMemComparativa.FieldByName('PORCENTAJE').AsFloat := TMemAnoCom1.FieldByName('IMPORTETOTAL').AsFloat;
              TMemComparativa.Post;
            end;
            TMemComparativa.Next;
            TMemAnoCom2.Next;
            TMemAnoCom1.Next;
            TMemGraficoAno2.Next;
          end;

          //Metemos el dato obtenido en la sql en su intervalo correspondiente y calculamos
          TMemAnoCom2.Edit;
          TMemAnoCom2.FieldByName('IMPORTETOTAL').AsFloat := FieldByName('IMPORTETOTAL').AsFloat;
          TMemAnoCom2.Post;
          TMemGraficoAno2.Edit;
          TMemGraficoAno2.FieldByName('IMPORTETOTAL').AsFloat := FieldByName('IMPORTETOTAL').AsFloat;
          TMemGraficoAno2.Post;
          //Calculamos TablaComaprativa
          //En el caso de no existir el valor en Año1 o Año2 de este determinado intervalo
          //no rellenariamos calculo ninguno
          if (not VarIsNull(TMemAnoCom1.FieldByName('IMPORTETOTAL').AsVariant))
          and (not VarIsNull(TMemAnoCom2.FieldByName('IMPORTETOTAL').AsVariant)) then
          begin
            TMemComparativa.Edit;
            TMemComparativa.FieldByName('PORCENTAJE').AsFloat := CalcularPorcentaje(TMemAnoCom1.FieldByName('IMPORTETOTAL').AsFloat, TMemAnoCom2.FieldByName('IMPORTETOTAL').AsFloat, True);
            TMemComparativa.Post;
          end;
          //Vamos incrementando la suma total
          TotalAno2 := TotalAno2 + FieldByName('IMPORTETOTAL').AsFloat;
          TMemComparativa.Next;
          TMemAnoCom2.Next;
          TMemGraficoAno2.Next;
        end;

        Next;
      end;
//Fin de recorrido del resultado
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TfrInformeEstFacturasCliPro.CalcularResumen1: Boolean;
var
  NumeroCampo : Integer;
  ImporteTotal : Double;
  Contador : Integer;

begin
  with TablaResumen1 do
  begin
    Close;
    Params.ByName('CODIGOEMPRESA').AsString := EmpresaActiva.Codigo;
    Params.ByName('ANO').AsString := Ano1;
    Prepare;
    Open;
    //Borramos tabla y copiamos nuevamente la estructura
    TablaResumen1Mem.Close;
    TablaResumen1Mem.CopyStructure(TablaResumen1);
    //Añadimos el campo numero de fila
    TablaResumen1Mem.FieldDefs.Add(CTE_CAMPO1,ftInteger);
    TablaResumen1Mem.FieldDefs.Items[TablaResumen1Mem.FieldDefs.IndexOf(CTE_CAMPO1)].CreateField(Self);

    //Primera pasada donde sumamos el importe total
    ImporteTotal := 0;
    First;
    while not EOF do
    begin
      ImporteTotal := ImporteTotal + FieldByName('IMPORTETOTAL').AsFloat;
      Next;
    end;

    //Segunda pasada donde rellenamos con los primeros Top N de la lista
    if not IsEmpty then
    begin
      TablaResumen1Mem.DisableControls;
      TablaResumen1Mem.Open;
      First;
      Contador := 0;
      while ((not EOF) and (Contador < TopN)) do
      begin
        TablaResumen1Mem.Append;
        TablaResumen1Mem.FieldByName(CTE_CAMPO1).AsInteger := Contador + 1;

        for NumeroCampo := 0 to FieldCount-1 do
        begin
          if Fields[NumeroCampo].FieldName = 'PORCENTAJE' then
             TablaResumen1Mem.Fields[NumeroCampo].AsFloat := CalcularPorcentaje(ImporteTotal, Fields[NumeroCampo].AsFloat, False)
          else
             TablaResumen1Mem.Fields[NumeroCampo].AsString := Fields[NumeroCampo].AsString;
        end;
        TablaResumen1Mem.Post;
        Contador := Contador + 1;
        Next;
      end;
      TablaResumen1Mem.EnableControls;
    end;

    //Calculamos el nuevo height
    Contador := Contador + 1;
    pnlGrid.Height := (gridResumen.DefaultRowHeight) * Contador;
  end;
end;

function TfrInformeEstFacturasCliPro.CalcularResumen2: Boolean;
var
  NumeroCampo : Integer;
  Contador : Integer;

begin
  with TablaResumen2 do
  begin
    Close;
    Params.ByName('CODIGOEMPRESA').AsString := EmpresaActiva.Codigo;
    Params.ByName('ANO').AsString := Ano1;
    Prepare;
    Open;
    //Borramos tabla y copiamos nuevamente la estructura
    TablaResumen2Mem.Close;
    TablaResumen2Mem.CopyStructure(TablaResumen2);
    //Añadimos el campo numero de fila
    TablaResumen2Mem.FieldDefs.Add(CTE_CAMPO1,ftInteger);
    TablaResumen2Mem.FieldDefs.Items[TablaResumen2Mem.FieldDefs.IndexOf(CTE_CAMPO1)].CreateField(Self);

    //Pasada donde rellenamos con los primeros Top N de la lista
    if not IsEmpty then
    begin
      TablaResumen2Mem.DisableControls;
      TablaResumen2Mem.Open;
      First;
      Contador := 0;
      while ((not EOF) and (Contador < TopN)) do
      begin
        TablaResumen2Mem.Append;
        TablaResumen2Mem.FieldByName(CTE_CAMPO1).AsInteger := Contador + 1;

        for NumeroCampo := 0 to FieldCount-1 do
        begin
          TablaResumen2Mem.Fields[NumeroCampo].AsString := Fields[NumeroCampo].AsString;
        end;
        TablaResumen2Mem.Post;
        Contador := Contador + 1;
        Next;
      end;
      TablaResumen2Mem.EnableControls;
    end;

    //Calculamos el nuevo height
    Contador := Contador + 1;
    pnlGrid2.Height := (gridResumen2.DefaultRowHeight) * Contador;
  end;
end;

function TfrInformeEstFacturasCliPro.FinalizarResumen1: Boolean;
begin
  sqlResumen1.Free;
  TablaResumen1Mem.Close;
  TablaResumen1.Close;
  TablaResumen1.UnPrepare;
  TablaResumen1.Free;
end;

function TfrInformeEstFacturasCliPro.FinalizarResumen2: Boolean;
begin
  sqlResumen2.Free;
  TablaResumen2Mem.Close;
  TablaResumen2.Close;
  TablaResumen2.UnPrepare;
  TablaResumen2.Free;
end;

function TfrInformeEstFacturasCliPro.FinalizarResumenes: Boolean;
begin
  FinalizarResumen1;
  FinalizarResumen2;
end;

procedure TfrInformeEstFacturasCliPro.gridCustomDrawCell(Sender: TObject;
  ACanvas: TCanvas; ARect: TRect; ANode: TdxTreeListNode;
  AColumn: TdxTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean;
  var AText: String; var AColor: TColor; AFont: TFont;
  var AAlignment: TAlignment; var ADone: Boolean);
var
  IndiceCol: Integer;

begin
  inherited;

  if ((Sender as TdxDBGrid).Name = gridComparativa.Name) then
  begin
    if (AColumn.Caption = 'PORCENTAJE') then
    begin
      IndiceCol := (Sender as TdxDBGrid).ColumnByFieldName('PORCENTAJE').Index;
      if (ANode.Values[IndiceCol] < 0) then
          AFont.Color := COLOR_PORCENTAJENEG
      else
          AFont.Color := COLOR_PORCENTAJEPOS;
    end;
  end;
end;

function TfrInformeEstFacturasCliPro.InicializarCamposTMem: Boolean;
begin
  inherited InicializarCamposTMem;

  //ANO1
  TMemAnoCom1.FieldDefs.Add('IMPORTETOTAL',ftFloat);
  TMemAnoCom1.FieldDefs.Items[TMemAnoCom1.FieldDefs.IndexOf('IMPORTETOTAL')].CreateField(Self);

  //ANO2
  TMemAnoCom2.FieldDefs.Add('IMPORTETOTAL',ftFloat);
  TMemAnoCom2.FieldDefs.Items[TMemAnoCom2.FieldDefs.IndexOf('IMPORTETOTAL')].CreateField(Self);

  //COMPARATIVA
  TMemComparativa.FieldDefs.Add('PORCENTAJE',ftFloat);
  TMemComparativa.FieldDefs.Items[TMemComparativa.FieldDefs.IndexOf('PORCENTAJE')].CreateField(Self);

  //Grafico
  TMemGraficoAno1.FieldDefs.Add('IMPORTETOTAL',ftFloat);
  TMemGraficoAno1.FieldDefs.Items[TMemGraficoAno1.FieldDefs.IndexOf('IMPORTETOTAL')].CreateField(Self);

  TMemGraficoAno2.FieldDefs.Add('IMPORTETOTAL',ftFloat);
  TMemGraficoAno2.FieldDefs.Items[TMemGraficoAno2.FieldDefs.IndexOf('IMPORTETOTAL')].CreateField(Self);
end;

function TfrInformeEstFacturasCliPro.InicializarFiltros: Boolean;
begin
  inherited InicializarFiltros;

//TIPO INFORME FACTURASCLIENTE/FACTURASPROVEEDOR
    Case Entidad of
      entInfEstFacPro: AnosMem := dmTablaFacturasProveedor.DarListaAnos(EmpresaActiva.Codigo, False);
      entVacia, entInfEstFacCli: AnosMem := dmTablaFacturasCliente.DarListaAnos(EmpresaActiva.Codigo, False);
    end;
end;

procedure TfrInformeEstFacturasCliPro.InicializarGridResumen1(
  var Grid: TdxDBGrid);
var
  Columna : TdxDBTreeListColumn;

begin
  gridResumen.ShowHeader := False;

  with Grid do begin
    DestroyColumns;
    {Columna CTE_CAMPO1}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := CTE_CAMPO1;
    Columna.Caption := 'NFila';
    Columna.Width := tamColCodigo2;
    Columna.Visible := False;
    {Columna CODIGO}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo2;
    Columna.Visible := False;
    {Columna NOMBRE}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColDescripcion2;
    {Columna NUMPRE}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'NUMFAC';
    Columna.Caption := 'Núm. facturas';
    Columna.Width := tamColPrecio;
    {Columna NUMPRE}
    Columna := CreateColumn(TdxDBGridCurrencyColumn);
    Columna.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'Importe total';
    Columna.Width := tamColPrecio;
    (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2;
    {Columna PORCENTAJE}
    Columna := CreateColumn(TdxDBGridCurrencyColumn);
    Columna.FieldName := 'PORCENTAJE';
    Columna.Caption := 'Porcentaje(%)';
    Columna.Width := tamColPorcentaje2;
    (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_PORCENTAJE;
  end;
end;

procedure TfrInformeEstFacturasCliPro.InicializarGridResumen2(
  var Grid: TdxDBGrid);
var
  Columna : TdxDBTreeListColumn;

begin
  gridResumen2.ShowHeader := False;

  with Grid do begin
    DestroyColumns;
    {Columna CODIGOCLIENTE}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := CTE_CAMPO1;
    Columna.Caption := 'NFila';
    Columna.Width := tamColCodigo2;
    Columna.Visible := False;
    {Columna CODIGOCLIENTE}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'CODIGOCLIENTE';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo2;
    Columna.Visible := False;
    {Columna NOMBRE}
    Columna := CreateColumn(TdxDBTreeListColumn);
    Columna.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColDescripcion2;
    {Columna IMPORTEDTO}
    Columna := CreateColumn(TdxDBGridCurrencyColumn);
    Columna.FieldName := 'IMPORTEDTO';
    Columna.Caption := 'IMPORTEDTO';
    Columna.Width := tamColPrecio;
    (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2;
    {Columna IMPORTETOTAL}
    Columna := CreateColumn(TdxDBGridCurrencyColumn);
    Columna.FieldName := 'IMPORTETOTAL';
    Columna.Caption := 'IMPORTETOTAL';
    Columna.Width := tamColPrecio;
    (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2;
    {Columna IMPORTECOBRADO}
    Columna := CreateColumn(TdxDBGridCurrencyColumn);
    Columna.FieldName := 'IMPORTECOBRADO';
    Columna.Caption := 'IMPORTECOBRADO';
    Columna.Width := tamColPrecio;
    (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2;
    {Columna PORCENTAJE}
    Columna := CreateColumn(TdxDBGridCurrencyColumn);
    Columna.FieldName := 'PORCENTAJE';
    Columna.Caption := 'Porcentaje(%)';
    Columna.Width := tamColPorcentaje2;
    (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_PORCENTAJE;
  end;
end;

function TfrInformeEstFacturasCliPro.InicializarGrids: Boolean;
var
  Columna : TdxDBTreeListColumn;

begin
  inherited InicializarGrids;

  //ANO1
  {Columna NUMPRE}
  Columna := gridAnoCom1.CreateColumn(TdxDBGridCurrencyColumn);
  Columna.FieldName := 'IMPORTETOTAL';
  Columna.Caption := 'IMPORTETOTAL';
  Columna.Width := tamColPrecio;
  (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2;

  //ANO2
  Columna := gridAnoCom2.CreateColumn(TdxDBGridCurrencyColumn);
  Columna.FieldName := 'IMPORTETOTAL';
  Columna.Caption := 'IMPORTETOTAL';
  Columna.Width := tamColPrecio;
  (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_EUROS2;

  //COMPARATIVA
  Columna := gridComparativa.CreateColumn(TdxDBGridCurrencyColumn);
  Columna.FieldName := 'PORCENTAJE';
  Columna.Caption := 'PORCENTAJE';
  Columna.Width := tamColPrecio;
  (Columna as TdxDBGridCurrencyColumn).DisplayFormat := DISPLAY_PORCENTAJE;

  gridIntervalo.ShowHeader := False;
  gridAnoCom1.ShowHeader := False;
  gridAnoCom2.ShowHeader := False;
  gridComparativa.ShowHeader := False;
end;

function TfrInformeEstFacturasCliPro.InicializarResumen1: Boolean;
begin
  Result := False;
  try
    sqlResumen1 := TStringList.Create;
    with sqlResumen1 do
    begin
//TIPO INFORME FACTURASCLIENTE/FACTURASPROVEEDOR
      Case Entidad of
        entInfEstFacPro: begin
                        Add('select EXTRACT(YEAR FROM P.FECHAALTA) as ANO, P.CODIGOPROVEEDOR as CODIGO, COALESCE(C.NOMBRE, P.NOMBRE) as NOMBRE, ');
                        Add('COUNT(P.CODIGO) as NUMFAC, SUM(P.IMPORTETOTAL) as IMPORTETOTAL, SUM(P.IMPORTETOTAL) as PORCENTAJE ');
                        Add('from FACTURASPROVEEDOR P left join PROVEEDORES C ');
                        Add('on P.CODIGOPROVEEDOR = C.CODIGO ');
                        Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
                        Add('and EXTRACT(YEAR FROM FECHAALTA) = :ANO ');
                        Add('group by 1,2,3 ');
                        Add('order by 1,5 desc ');
                      end;
        entVacia, entInfEstFacCli: begin
                        Add('select EXTRACT(YEAR FROM P.FECHAALTA) as ANO, P.CODIGOCLIENTE as CODIGO, COALESCE(C.NOMBRE, P.NOMBRE) as NOMBRE, ');
                        Add('COUNT(P.CODIGO) as NUMFAC, SUM(P.IMPORTETOTAL) as IMPORTETOTAL, SUM(P.IMPORTETOTAL) as PORCENTAJE ');
                        Add('from FACTURASCLIENTE P left join CLIENTES C ');
                        Add('on P.CODIGOCLIENTE = C.CODIGO ');
                        Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
                        Add('and EXTRACT(YEAR FROM FECHAALTA) = :ANO ');
                        Add('group by 1,2,3 ');
                        Add('order by 1,5 desc ');
                      end;
      end;
    end;

    TablaResumen1 := TIBDataSet.Create(Self);
    with TablaResumen1 do
    begin
      Database := dmBaseDatos.BD;
      Transaction := dmBaseDatos.Transaccion;
      SelectSQL.Assign(sqlResumen1);
    end;
    InicializarGridResumen1(gridResumen);
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrInformeEstFacturasCliPro.InicializarResumen2: Boolean;
begin
  Result := False;
  try
    sqlResumen2 := TStringList.Create;
    with sqlResumen2 do
    begin
//TIPO INFORME FACTURASCLIENTE/FACTURASPROVEEDOR
      Case Entidad of
        entInfEstFacPro: begin
                        Add('select EXTRACT(YEAR FROM P.FECHAALTA) as ANO, P.CODIGOPROVEEDOR as CODIGO, COALESCE(C.NOMBRE, P.NOMBRE) as NOMBRE,');
                        Add('SUM(P.IMPORTEDESCUENTO) as IMPORTEDTO, SUM(P.IMPORTETOTAL) as IMPORTETOTAL');
                        Add(',(SUM(P.IMPORTETOTAL) - SUM(P.IMPORTEDESCUENTO)) as IMPORTECOBRADO');

                        Add(', case when SUM(P.IMPORTETOTAL) = 0 then 0');
                        Add(' else ((SUM(P.IMPORTEDESCUENTO) * 100) / SUM(P.IMPORTETOTAL)) end');
                        Add(' as PORCENTAJE');

                        Add('from FACTURASPROVEEDOR P left join PROVEEDORES C');
                        Add('on P.CODIGOPROVEEDOR = C.CODIGO');
                        Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
                        Add('and EXTRACT(YEAR FROM FECHAALTA) = :ANO');
                        Add('group by 1,2,3');
                        Add('order by 1,4 desc,5 desc');
                      end;
        entVacia, entInfEstFacCli: begin
                        Add('select EXTRACT(YEAR FROM P.FECHAALTA) as ANO, P.CODIGOCLIENTE as CODIGO, COALESCE(C.NOMBRE, P.NOMBRE) as NOMBRE,');
                        Add('SUM(P.IMPORTEDESCUENTO) as IMPORTEDTO, SUM(P.IMPORTETOTAL) as IMPORTETOTAL');
                        Add(',(SUM(P.IMPORTETOTAL) - SUM(P.IMPORTEDESCUENTO)) as IMPORTECOBRADO');

                        Add(', case when SUM(P.IMPORTETOTAL) = 0 then 0');
                        Add(' else ((SUM(P.IMPORTEDESCUENTO) * 100) / SUM(P.IMPORTETOTAL)) end');
                        Add(' as PORCENTAJE');

                        Add('from FACTURASCLIENTE P left join CLIENTES C');
                        Add('on P.CODIGOCLIENTE = C.CODIGO');
                        Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
                        Add('and EXTRACT(YEAR FROM FECHAALTA) = :ANO');
                        Add('group by 1,2,3');
                        Add('order by 1,4 desc,5 desc');
                      end;
      end;
    end;

    TablaResumen2 := TIBDataSet.Create(Self);
    with TablaResumen2 do
    begin
      Database := dmBaseDatos.BD;
      Transaction := dmBaseDatos.Transaccion;
      SelectSQL.Assign(sqlResumen2);
    end;
    InicializarGridResumen2(gridResumen2);
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrInformeEstFacturasCliPro.InicializarResumenes: Boolean;
begin
  InicializarResumen1;
  InicializarResumen2;
end;

procedure TfrInformeEstFacturasCliPro.limpiarTotales;
begin
  pnlA1T1.Caption := '';
  pnlA2T1.Caption := '';
  pnlA3T1.Caption := '';
end;

function TfrInformeEstFacturasCliPro.RefrescarResumenes: Boolean;
begin
    CalcularResumen1;
    CalcularResumen2;
end;

procedure TfrInformeEstFacturasCliPro.bCancelarClick(Sender: TObject);
begin
  CloseFrame;
end;

procedure TfrInformeEstFacturasCliPro.bImprimirClick(Sender: TObject);
var
  lInforme: TdmInfEstReportFacturasCliPro;
  DatosGenerales: TRxMemoryData;

begin
  try
    //Creamos informe
    lInforme:= TdmInfEstReportFacturasCliPro.Create(Self);
    lInforme.Entidad := Entidad;

    //Asignamos la información al informe
    lInforme.Ano1 := Ano1;
    lInforme.Ano2 := Ano2;
    //Creamos una tabla con todos los datos del informe general, y la pasamos
    //al informe para que la copie, luego los destruimos
    DatosGenerales := GenerarTablaInforme;
    lInforme.setDatosGeneral(DatosGenerales);
    lInforme.A1T1 := pnlA1T1.Caption;
    lInforme.A2T1 := pnlA2T1.Caption;
    lInforme.A3T1 := pnlA3T1.Caption;

    //Creamos una imagen del grafico para luego insertarla en el informe
    lInforme.Fichero := DarFicheroBMPTemporal;
    DBChart1.SaveToBitmapFile(lInforme.Fichero);

    //Copiamos la información al informe
    lInforme.setDatosResumen1(TablaResumen1Mem);
    lInforme.setDatosResumen2(TablaResumen2Mem);

    //Imprimimos
//    lInforme.Previsualizar;
    lInforme.Imprimir;
  finally
    FreeAndNil(DatosGenerales);
    DeleteFile(lInforme.Fichero);
    FreeAndNil(lInforme);
  end;
end;

function TfrInformeEstFacturasCliPro.GenerarTablaInforme: TRxMemoryData;
var
  TablaAux: TRxMemoryData;
begin
//Creamos la tabla con los campos que vamos a tener
  TablaAux:= TRxMemoryData.Create(Self);
  with TablaAux do
  begin
    FieldDefs.Add('TITINTERVALO',ftString,20);
    FieldDefs.Items[FieldDefs.IndexOf('TITINTERVALO')].CreateField(Self);

    FieldDefs.Add('ANO1IMPORTETOTAL',ftString,50);
    FieldDefs.Items[FieldDefs.IndexOf('ANO1IMPORTETOTAL')].CreateField(Self);

    FieldDefs.Add('ANO2IMPORTETOTAL',ftString,50);
    FieldDefs.Items[FieldDefs.IndexOf('ANO2IMPORTETOTAL')].CreateField(Self);

    FieldDefs.Add('PORCENTAJE',ftString,50);
    FieldDefs.Items[FieldDefs.IndexOf('PORCENTAJE')].CreateField(Self);
  end;

  TablaAux.Open;

//Rellenamos el campo TITINTERVALO
  with TMemIntervalo do
  begin
    DisableControls;
    First;
    while not Eof do
    begin
      TablaAux.Append;
      TablaAux.FieldByName('TITINTERVALO').AsString := FieldByName('TITINTERVALO').AsString;
      TablaAux.Post;
      Next;
    end;
    EnableControls;
  end;

//Rellenamos los campos ANO1IMPORTETOTAL
  with TMemAnoCom1 do
  begin
    DisableControls;
    First;
    TablaAux.First;
    while not Eof do
    begin
      TablaAux.Edit;
      TablaAux.FieldByName('ANO1IMPORTETOTAL').AsString := FieldByName('IMPORTETOTAL').AsString;
      TablaAux.Post;
      TablaAux.Next;
      Next;
    end;
    EnableControls;
  end;

//Rellenamos los campos ANO2IMPORTETOTAL
  with TMemAnoCom2 do
  begin
    DisableControls;
    First;
    TablaAux.First;
    while not Eof do
    begin
      TablaAux.Edit;
      TablaAux.FieldByName('ANO2IMPORTETOTAL').AsString := FieldByName('IMPORTETOTAL').AsString;
      TablaAux.Post;
      TablaAux.Next;
      Next;
    end;
    EnableControls;
  end;

//Rellenamos los campos PORCENTAJE
  with TMemComparativa do
  begin
    DisableControls;
    First;
    TablaAux.First;
    while not Eof do
    begin
      TablaAux.Edit;
      TablaAux.FieldByName('PORCENTAJE').AsString := FieldByName('PORCENTAJE').AsString;
      TablaAux.Post;
      TablaAux.Next;
      Next;
    end;
    EnableControls;
  end;

  Result:= TablaAux;
end;

procedure TfrInformeEstFacturasCliPro.SetAno2(const Value: Variant);
begin
  inherited;
  if not VarIsNull(Ano2) then
     etiComp.Caption := msgInfEstTit31 + IntToStr(Ano1) + msgInfEstTit32 + IntToStr(Ano2)
  else
     etiComp.Caption := '';
end;

constructor TfrInformeEstFacturasCliPro.Create(AOwner : TComponent; Const Entidad: TRdxEntidad);
begin
  FEntidad := Entidad;
  inherited Create(AOwner);

  ConfigurarFrame(Self, Self.Entidad);
  case Entidad of
  entInfEstFacCli: begin
                     cGeneral.Caption := msgInfEstFacCliGeneral;
                     DBChart1.Title.Text.Text := 'Facturación de clientes';
                     cResumen1.Caption := msgInfEstFacCliResumen1;
                     cResumen2.Caption := msgInfEstFacCliResumen2;
                   end;
  entInfEstFacPro: begin
                     cGeneral.Caption := msgInfEstFacProGeneral;
                     DBChart1.Title.Text.Text := 'Facturación de proveedores';
                     cResumen2.Caption := msgInfEstFacProResumen2;
                     cResumen1.Caption := msgInfEstFacProResumen1;
                   end;
  end;
end;

end.
