{
===============================================================================
  Copyright (©) 2002. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 31-12-2003
  Versión actual: 1.0.1
  Fecha versión actual: 02-04-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    02-04-2004    Se ha eliminado el atributo SERIE (P8 MULTIEMPRESA)
===============================================================================
}

unit InformeTrimestralCompras;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, InformeBase, FR_IBXDB, FR_Shape, FR_DSet, FR_DBSet, FR_Class,
  DB, IBCustomDataSet, IBQuery, RdxEmpresaActiva, TablaFacturasProveedor;

type
  TdmInformeTrimestralCompras = class(TdmInformeBase)
    TablaCab: TfrDBDataSet;
    TablaDet: TfrDBDataSet;
    TablaTrimestres: TIBQuery;
    TablaFacturas: TIBQuery;
    TablaRes: TfrDBDataSet;
    TablaResumen: TIBQuery;
  private
    FTipo : TTipoFacturaProveedor;
    FCodigoTrimestre : Variant;
    FListaCodTiposOp : TStringList;
    FListaDesTiposOp : TStringList;
    function RellenarListaTipoOp : boolean;
  protected
    procedure RellenarCabecera(Band: TfrBand); override;
    procedure PrepararConsultas; override;
    procedure PrepararInforme; override;

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Tipo : TTipoFacturaProveedor read FTipo write FTipo;
    property CodigoTrimestre : variant read FCodigoTrimestre write FCodigoTrimestre;
  end;

var
  dmInformeTrimestralCompras: TdmInformeTrimestralCompras;

implementation

{$R *.dfm}

uses
  IBSQL, StrFunc, Mensajes, Constantes, Literales, BaseDatos, TablaEmpresas;

{ TdmInformeBase1 }

constructor TdmInformeTrimestralCompras.Create(AOwner: TComponent);
begin
  inherited;
  FListaCodTiposOp := TStringList.Create;
  FListaDesTiposOp := TStringList.Create;
end;

procedure TdmInformeTrimestralCompras.PrepararConsultas;
var
  i, ContAux: integer;
begin
  inherited;

  if (not RellenarListaTipoOp) then
    raise Exception.Create('No se puede realizar el informe');

  with TablaTrimestres do
  begin
    Database := FBaseDatos;
    Transaction := FTransaccion;
    SQL.Clear;
    SQL.Add('select EXTRACT (YEAR FROM FECHAINI) as ANO, NOMBRE, FECHAINI, FECHAFIN from TRIMESTRES ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and CODIGO = :CODIGO');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := FCodigoTrimestre;
    Prepare;
  end;

  with TablaFacturas do
  begin
    Database := FBaseDatos;
    Transaction := FTransaccion;
    SQL.Clear;
    SQL.Add('select EXTRACT (MONTH FROM FECHAFACTURA) as MES, EXTRACT (DAY FROM FECHAFACTURA) as DIA, REFERENCIA, ');
    SQL.Add('NIFCIF, NOMBRE, ');

    if Tipo = tipGeneral
    then ContAux := 13
    else ContAux := 2;
    for i := 0 to ContAux do
    begin
      if i < FListaCodTiposOp.Count then
        SQL.Add('case TIPOFACTURA when ' + FListaCodTiposOp.Strings[i] + ' then (BASEIMPONIBLE - IMPORTEDESCUENTO) else null end as OP' + IntToStr(i) + ', ')
      else
        SQL.Add('0 as OP' + IntToStr(i) + ', ');
    end;

    SQL.Add('IVA, IMPORTEIVA, IMPORTETOTAL ');
    SQL.Add('from FACTURASPROVEEDOR');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and CODIGOTRIMESTRE = :CODIGO ');

    if Tipo = tipGeneral
    then SQL.Add('and TIPOFACTURA between 0 and 13 ')
    else SQL.Add('and TIPOFACTURA between 50 and 51 ');

    SQL.Add('order by FECHAFACTURA, NOMBRE');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := FCodigoTrimestre;
    Prepare;
  end;

  with TablaResumen do
  begin
    Database := FBaseDatos;
    Transaction := FTransaccion;
    SQL.Clear;
    SQL.Add('select T.CODIGO, T.DESCRIPCION, SUM((F.BASEIMPONIBLE - F.IMPORTEDESCUENTO)) BASEIMPONIBLE, SUM(F.IMPORTEIVA) IMPORTEIVA, SUM(F.IMPORTETOTAL) IMPORTETOTAL');
    SQL.Add('from FACTURASPROVEEDOR F, TIPOSFACTURAS T');
    SQL.Add('where F.TIPOFACTURA = T.CODIGO');
    SQL.Add('and F.CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and F.CODIGOTRIMESTRE = :CODIGO');

    if Tipo = tipGeneral
    then SQL.Add('and TIPOFACTURA between 0 and 13 ')
    else SQL.Add('and TIPOFACTURA between 50 and 51 ');

    SQL.Add('group by T.CODIGO, T.DESCRIPCION');
    SQL.Add('order by T.CODIGO, T.DESCRIPCION');
    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := FCodigoTrimestre;
    Prepare;
  end;
end;

procedure TdmInformeTrimestralCompras.RellenarCabecera(Band: TfrBand);
var
  iCont, i : Integer;
  Objeto : TfrView;
begin
  inherited;
  with Band do
  begin
    for iCont := 0 to Objects.Count - 1 do
    begin
      Objeto := Objects[iCont];

      if (Objeto is TfrMemoView) then
      begin
        if (Objeto.Name = 'Empresa') then
        begin
         (Objeto as TfrMemoView).Memo.Clear;
         (Objeto as TfrMemoView).Memo.Add('Empresa: ' + EmpresaActiva.NombreComercial);
        end
      end;

      if ((Objeto is TfrMemoView) and (Pos('eOP', Objeto.Name) > 0)) then
      begin
         (Objeto as TfrMemoView).Memo.Clear;
         i := Pos('eOP', Objeto.Name) + 3;
         i := StrToInt(System.Copy(Objeto.Name, i, length(Objeto.Name) - 3));
         if (FListaDesTiposOp.Count-1) >= i then
          (Objeto as TfrMemoView).Memo.Add(FListaDesTiposOp.Strings[i]);
      end;
    end;
  end;
end;

destructor TdmInformeTrimestralCompras.Destroy;
begin
  FreeAndNil(FListaCodTiposOp);
  FreeAndNil(FListaDesTiposOp);  
  inherited;
end;

function TdmInformeTrimestralCompras.RellenarListaTipoOp: boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO, DESCRIPCION');
    SQL.Add('from tiposfacturas');
    SQL.Add('where entidad = ''PROVEEDOR''');
    if Tipo = tipGeneral
    then SQL.Add('and codigo < 50')
    else SQL.Add('and codigo > 49');
    SQL.Add('order by codigo');
    try
      Prepare;
      ExecQuery;
      FListaCodTiposOp.Clear;
      FListaDesTiposOp.Clear;
      while not EOF do begin
        FListaCodTiposOp.Append(Fields[0].AsVariant);
        FListaDesTiposOp.Append(Fields[1].AsVariant);
        Next;
      end;
      result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmInformeTrimestralCompras.PrepararInforme;
begin
  if Tipo = tipGeneral
  then FNombreInforme := 'InformeTrimestralComprasGeneral.frf'
  else FNombreInforme := 'InformeTrimestralComprasInmovilizado.frf';

  inherited;
end;

end.
