{
===============================================================================
  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: 01-12-2002
  Versión actual: 1.0.0
  Fecha versión actual: 01-12-2002
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit TablaTrimestres;

interface

uses
  //Generales
  SysUtils, Classes, Controls, IBSQL, cxGridDBTableView, cxCustomData, DB,
  //Particulares

  //Aplicacion
  Framework, StrFunc, Entidades, Constantes, BaseDatos, RdxEmpresaActiva;

const
  CTE_ABIERTO = 'A';
  CTE_CERRADO = 'C';

type
//Trimestres
//Tipo enumerado correspondientes a los trimestres que manejara la aplicacion
  TTrimestres = (entPrimerTrimestre,
                 entSegundoTrimestre,
                 entTercerTrimestre,
                 entCuartoTrimestre
   );

////////////////////////////////////////////////////////////////////////////////
//TListaTrimestres
////////////////////////////////////////////////////////////////////////////////
  TListaComboTrimestres = (tlcTriDefecto, tlcTriTodos, tlcTriAbiertos);

  TSituacionTrimestre = (tstAbierto, tstCerrado);
  TDatosTrimestre = class(TPersistent)
  public
    Codigo : String;
    Nombre : String;
    NombreCompleto : String;  // Año + nombre
    Situacion : TSituacionTrimestre;
    FechaIni : TDate;
    FechaFin : TDate;
    Predeterminado : Boolean;
  end;

  TListaTrimestres = class(TListaObjetos)
  private
    FSQL: TStringList;
    FTipo: TListaComboTrimestres;
    property Tipo: TListaComboTrimestres Read FTipo;

    function GetTrimestre(Index: Integer): TDatosTrimestre;
    procedure inicializarSQL;
  protected
    procedure AssignTo(Dest: TPersistent); override;
    procedure ObtenerLista; override;
    procedure ObtenerListaBD;
  public
    property Items[Index: Integer] : TDatosTrimestre read GetTrimestre;
    constructor Create(TipoLista: TListaComboTrimestres); overload;
    destructor Destroy; override;

    function getNumItem(Codigo: String): Integer;
    function getCodItem(NumOrden: Integer): String;
    function cargarLista(pItems: TStrings): Integer;
  end;


////////////////////////////////////////////////////////////////////////////////
//TdmTablaTrimestres
////////////////////////////////////////////////////////////////////////////////
  TdmTablaTrimestres = class(TDataModule)
  private
    function darCodigoTrimestre(Trimestre: TTrimestres; Ano: Variant): String; overload;
    function darDescripcionTrimestre(Entidad: TTrimestres) : String; overload;
    function darFechaIniTrimestre(Trimestre: TTrimestres; Ano: Integer): TDateTime; overload;
    function darFechaFinTrimestre(Trimestre: TTrimestres; Ano: Integer): TDateTime; overload;
    function existenTrimestres(CodigoEmpresa: Variant; Ano: Variant): Boolean;
    function insertarTrimestre(Trimestre: TTrimestres; CodigoEmpresa: Variant; Ano: Variant) : Boolean;
    function insertarTrimestres(CodigoEmpresa: Variant; Ano: Variant) : Boolean;

    function darDatosTrimestre(var Datos: TDatosTrimestre): Boolean;
    procedure IniciarSQLGrids;
  public
    sqlConsultarGridTrimestres : TStrings;

    function crearTrimestres(CodigoEmpresa: Variant; Ano: Variant): boolean;
    function darCodigoTrimestre(Ano: Variant; Trimestre: Integer): String; overload;
    function darAnoTrimestre(CodigoEmpresa: Variant; CodigoTrimestre : Variant): TDateTime; overload;
    function darDescripcionTrimestre(CodigoTrimestre : String): String; overload;
    function darTrimestreActual: String;
    function darDescripcionTrimestreActual: String;
    function darCodigoTrimestre(Fecha: TDateTime): String; overload;

    function darDescripcionCompletaTrimestre(CodigoTrimestre : String): String;
    function darFechaIniTrimestre(CodigoTrimestre : String): TDateTime; overload;
    function darFechaFinTrimestre(CodigoTrimestre : String): TDateTime; overload;
    function EstaTrimestreAbierto(CodigoTrimestre: String): boolean;
    procedure AbrirTrimestre(CodigoTrimestre : String);
    procedure CerrarTrimestre(CodigoTrimestre : String);
    procedure PredeterminarTrimestre(CodigoTrimestre : String);

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  end;

var
  dmTablaTrimestres: TdmTablaTrimestres;

const

//TRIMESTRES

    CaptionsTrimestres : array [TTrimestres] of string = (
               ('Primer trimestre'),                  //entPrimerTrimestre
               ('Segundo trimestre'),                 //entSegundoTrimestre
               ('Tercer trimestre'),                  //entTercerTrimestre
               ('Cuarto trimestre') 								  //entCuartoTrimestre
    );

////////////////////////////////////////////////////////////////////////////////
// TRIMESTRES
////////////////////////////////////////////////////////////////////////////////
  PRIMERO_INI = '01/01/';
  PRIMERO_FIN = '31/03/';
  SEGUNDO_INI = '01/04/';
  SEGUNDO_FIN = '30/06/';
  TERCERO_INI = '01/07/';
  TERCERO_FIN = '30/09/';
  CUARTO_INI = '01/10/';
  CUARTO_FIN = '31/12/';


implementation
{$R *.DFM}

uses
  TablaEmpresas, Variants;

////////////////////////////////////////////////////////////////////////////////
//TdmTablaTrimestres
////////////////////////////////////////////////////////////////////////////////
constructor TdmTablaTrimestres.Create (AOwner : TComponent);
begin
  inherited;

  { Grids }
  sqlConsultarGridTrimestres := TStringList.Create;
  IniciarSQLGrids;
end;

destructor TdmTablaTrimestres.Destroy;
begin
  { Grids }
  sqlConsultarGridTrimestres.Free;
  inherited;
end;

function TdmTablaTrimestres.existenTrimestres(CodigoEmpresa: Variant; Ano: Variant): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  if VarIsNull(CodigoEmpresa) then
     exit;


  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select count(CODIGO) as NUMTRIMESTRES');
    SQL.Add('from TRIMESTRES');
    SQL.Add(' where SUBSTR(FECHAINI, 3, 4) = :ANO');
    SQL.Add(' and CODIGOEMPRESA = :CODIGOEMPRESA');

  try
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;

    if VarIsNull(Ano)
    then ParamByName('ANO').AsString := Copy(dmBaseDatos.darAno,3,2)
    else ParamByName('ANO').AsString := Copy(Ano,3,2);

    Prepare;
    ExecQuery;
    Result := (FieldByName('NUMTRIMESTRES').AsInteger <> 0);
  finally
    Close;
    Transaction := NIL;
    Free;
  end;
  end;
end;

function TdmTablaTrimestres.DarDatosTrimestre(var Datos: TDatosTrimestre): Boolean;
var
  oSQL : TIBSQL;

begin
  Result := False;

  if EsCadenaVacia(Datos.Codigo) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select TR.CODIGOEMPRESA, TR.CODIGO, TR.NOMBRE, TR.SITUACION, ');
    SQL.Add('TR.FECHAINI, TR.FECHAFIN, EM.CODIGOTRIMESTRE ');
    SQL.Add('from TRIMESTRES TR, EMPRESAS EM');
    SQL.Add('where TR.CODIGOEMPRESA = :CODIGOEMPRESA ');
    SQL.Add('and EM.CODIGO = TR.CODIGOEMPRESA ');
    SQL.Add('and TR.CODIGO = :CODIGO');

    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGO').AsString := Datos.Codigo;
      Prepare;
      ExecQuery;

      if (RecordCount > 0) then
      begin
        with Datos do
        begin
          NOMBRE := FieldByName('NOMBRE').AsString;
          if FieldByName('SITUACION').AsString = CTE_ABIERTO then
            Situacion := tstAbierto
          else
            Situacion := tstCerrado;
          FECHAINI := FieldByName('FECHAINI').AsDate;
          FECHAFIN := FieldByName('FECHAFIN').AsDate;
          Predeterminado := (FieldByName('CODIGOTRIMESTRE').AsString = Datos.Codigo);
          NombreCompleto := FormatDateTime('yyyy', FechaIni) + ' ' + Nombre;
          Result := True;
        end;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaTrimestres.crearTrimestres(CodigoEmpresa: Variant; Ano: Variant): boolean;
begin
  Result := True;

  if not existenTrimestres(CodigoEmpresa, Ano) then
     Result := insertarTrimestres(CodigoEmpresa, Ano);
end;

function TdmTablaTrimestres.insertarTrimestre(Trimestre: TTrimestres; CodigoEmpresa: Variant; Ano: Variant): Boolean;
var
  oSQL : TIBSQL;

begin
  Result := False;

  if VarIsNull(CodigoEmpresa) then
    exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('insert into TRIMESTRES');
    SQL.Add('(CODIGOEMPRESA, CODIGO, NOMBRE, SITUACION, FECHAINI, FECHAFIN) ');
    SQL.Add('VALUES ');
    SQL.Add('(:CODIGOEMPRESA, :CODIGO, :NOMBRE, :SITUACION, :FECHAINI, :FECHAFIN)');

    ParamByName('CODIGOEMPRESA').AsVariant := CodigoEmpresa;
    ParamByName('CODIGO').AsString := darCodigoTrimestre(Trimestre, Ano);
    ParamByName('SITUACION').AsString := CTE_ABIERTO;
    ParamByName('NOMBRE').AsString := darDescripcionTrimestre(Trimestre);
    ParamByName('FECHAINI').AsDateTime := darFechaIniTrimestre(Trimestre, Ano);
    ParamByName('FECHAFIN').AsDateTime := darFechaFinTrimestre(Trimestre, Ano);
    try
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaTrimestres.insertarTrimestres(CodigoEmpresa: Variant; Ano: Variant): Boolean;
var
  AuxAno: Variant;
begin
  Result := False;

  if VarIsNull(Ano)
  then AuxAno := dmBaseDatos.DarAno
  else AuxAno := Ano;

  if not insertarTrimestre(entPrimerTrimestre, CodigoEmpresa, AuxAno) then begin
    exit;
  end;

  if not insertarTrimestre(entSegundoTrimestre, CodigoEmpresa, AuxAno) then begin
    exit;
  end;

  if not insertarTrimestre(entTercerTrimestre, CodigoEmpresa, AuxAno) then begin
    exit;
  end;

  if not insertarTrimestre(entCuartoTrimestre, CodigoEmpresa, AuxAno) then begin
    exit;
  end;

  Result := True;
end;

function TdmTablaTrimestres.darFechaIniTrimestre(Trimestre: TTrimestres; Ano: Integer): TDateTime;
begin
  case Trimestre of
    entPrimerTrimestre:  if (Ano = -1)
                         then Result := StrToDateTime(PRIMERO_INI + dmBaseDatos.darAno)
                         else Result := StrToDateTime(PRIMERO_INI + IntToStr(Ano));

    entSegundoTrimestre: if (Ano = -1)
                         then Result := StrToDateTime(SEGUNDO_INI + dmBaseDatos.darAno)
                         else Result := StrToDateTime(SEGUNDO_INI + IntToStr(Ano));

    entTercerTrimestre:  if (Ano = -1)
                         then Result := StrToDateTime(TERCERO_INI + dmBaseDatos.darAno)
                         else Result := StrToDateTime(TERCERO_INI + IntToStr(Ano));

    entCuartoTrimestre:  if (Ano = -1)
                         then Result := StrToDateTime(CUARTO_INI + dmBaseDatos.darAno)
                         else Result := StrToDateTime(CUARTO_INI + IntToStr(Ano));
  end;
end;

function TdmTablaTrimestres.darFechaFinTrimestre(Trimestre: TTrimestres; Ano: Integer): TDateTime;
begin
  case Trimestre of
    entPrimerTrimestre:  if (Ano = -1)
                         then Result := StrToDateTime(PRIMERO_FIN + dmBaseDatos.darAno)
                         else Result := StrToDateTime(PRIMERO_FIN + IntToStr(Ano));

    entSegundoTrimestre: if (Ano = -1)
                         then Result := StrToDateTime(SEGUNDO_FIN + dmBaseDatos.darAno)
                         else Result := StrToDateTime(SEGUNDO_FIN + IntToStr(Ano));

    entTercerTrimestre:  if (Ano = -1)
                         then Result := StrToDateTime(TERCERO_FIN + dmBaseDatos.darAno)
                         else Result := StrToDateTime(TERCERO_FIN + IntToStr(Ano));

    entCuartoTrimestre:  if (Ano = -1)
                         then Result := StrToDateTime(CUARTO_FIN + dmBaseDatos.darAno)
                         else Result := StrToDateTime(CUARTO_FIN + IntToStr(Ano));
  end;
end;

procedure TdmTablaTrimestres.IniciarSQLGrids;
begin
  with sqlConsultarGridTrimestres do
  begin
    Add('select CODIGO, cast(substr(extract(year from FECHAINI),3,4) as varchar(2)), NOMBRE, SITUACION, ');
    Add('FECHAINI, FECHAFIN ');
    Add('from TRIMESTRES ');
    Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    Add('union ');
    Add('select cast(substr(extract(year from FECHAINI),3,4) as varchar(3)), cast(''-1'' as varchar(2)), ');
    Add('cast(''Año ''||extract(year from FECHAINI) as varchar(100)), cast(''1'' as varchar(1)), ');
    Add('cast(''01.01.'' || extract(year from FECHAINI) as Date), cast(''31.12.'' || extract(year from FECHAINI) as Date) ');
    Add('from TRIMESTRES ');
  end;
end;

function TdmTablaTrimestres.EstaTrimestreAbierto(CodigoTrimestre: String): boolean;
var
  FTrimestre : TDatosTrimestre;
begin
  Result := False;
  if EsCadenaVacia(CodigoTrimestre) then
    Exit;

  FTrimestre := TDatosTrimestre.Create;
  try
    Result := (FTrimestre.Situacion = tstAbierto);
  finally
    FTrimestre.Free;
  end;
end;

function TdmTablaTrimestres.DarTrimestreActual: String;
begin
  Result := darCodigoTrimestre(dmBaseDatos.DarFecha);
end;

procedure TdmTablaTrimestres.AbrirTrimestre(CodigoTrimestre: String);
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update TRIMESTRES set ');
    SQL.Add('SITUACION = :SITUACION ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and CODIGO = :CODIGO');

    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := CodigoTrimestre;
    ParamByName('SITUACION').AsString := CTE_ABIERTO;
    try
      Prepare;
      ExecQuery;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaTrimestres.CerrarTrimestre(CodigoTrimestre: String);
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update TRIMESTRES set ');
    SQL.Add('SITUACION = :SITUACION ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add(' and CODIGO = :CODIGO');

    ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    ParamByName('CODIGO').AsString := CodigoTrimestre;
    ParamByName('SITUACION').AsString := CTE_CERRADO;
    try
      Prepare;
      ExecQuery;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaTrimestres.PredeterminarTrimestre(
  CodigoTrimestre: String);
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    try
      SQL.Clear;
      SQL.Add('update EMPRESAS set ');
      SQL.Add('CODIGOTRIMESTRE = :CODIGOTRIMESTRE');
      SQL.Add('where CODIGO = :CODIGOEMPRESA');
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGOTRIMESTRE').AsString := CodigoTrimestre;
      Prepare;
      ExecQuery;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TListaTrimestres }

function TdmTablaTrimestres.darFechaFinTrimestre(
  CodigoTrimestre: String): TDateTime;
var
  FDatosTrimestre : TDatosTrimestre;
begin
  FDatosTrimestre := TDatosTrimestre.Create;
  try
    FDatosTrimestre.Codigo := CodigoTrimestre;
    darDatosTrimestre(FDatosTrimestre);
    Result := FDatosTrimestre.FechaFin;
  finally
    FDatosTrimestre.Free;
  end;
end;

function TdmTablaTrimestres.darFechaIniTrimestre(
  CodigoTrimestre: String): TDateTime;
var
  FDatosTrimestre : TDatosTrimestre;
begin
  FDatosTrimestre := TDatosTrimestre.Create;
  try
    FDatosTrimestre.Codigo := CodigoTrimestre;
    darDatosTrimestre(FDatosTrimestre);
    Result := FDatosTrimestre.FechaIni;
  finally
    FDatosTrimestre.Free;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
//TListaTrimestres
////////////////////////////////////////////////////////////////////////////////
function TListaTrimestres.GetTrimestre(Index: Integer): TDatosTrimestre;
begin
  Result := TDatosTrimestre(FLista.Items[Index]);
end;

procedure TListaTrimestres.ObtenerListaBD;
var
  oSQL : TIBSQL;
  FTrimestre : TDatosTrimestre;
begin
  oSQL := TIBSQL.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Text := FSQL.Text;
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Prepare;
      ExecQuery;
      while not EOF do begin
        FTrimestre := TDatosTrimestre.Create();
        FTrimestre.Codigo := FieldByName('CODIGO').AsString;
        FTrimestre.Nombre := FieldByName('NOMBRE').AsString;
        if FieldByName('SITUACION').AsString = CTE_ABIERTO
        then FTrimestre.Situacion := tstAbierto
        else FTrimestre.Situacion := tstCerrado;
        FTrimestre.FechaIni := FieldByName('FECHAINI').AsDate;
        FTrimestre.FechaFin := FieldByName('FECHAFIN').AsDate;
        FTrimestre.Predeterminado := (FieldByName('CODIGOTRIMESTRE').AsString = FTrimestre.Codigo);
        FTrimestre.NombreCompleto := FormatDateTime('yyyy', FTrimestre.FechaIni) + ' - ' + FTrimestre.Nombre;
        FLista.Add(FTrimestre);
        Next;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TListaTrimestres.AssignTo(Dest: TPersistent);
begin
//
end;

function TListaTrimestres.cargarLista(pItems: TStrings): Integer;
//Carga todos los trimestres en el combox y devuelve el elemento determinado por defecto
var i: integer;
begin
  Result := 0;

  for i := 0 to FLista.Count - 1 do
  begin
    Case Tipo of
    tlcTriDefecto  : pItems.Add(Self.Items[i].Nombre);
    tlcTriTodos,
    tlcTriAbiertos : pItems.Add(Self.Items[i].NombreCompleto);
    end;

    if Self.Items[i].Predeterminado then
      Result := i;
  end;
end;

destructor TListaTrimestres.Destroy;
begin
  FSQL.Free;
  FSQL := nil;
  inherited;
end;

constructor TListaTrimestres.Create(TipoLista: TListaComboTrimestres);
begin
  inherited Create;
  FSQL := TStringList.Create;
  fTipo := TipoLista;

  case (Tipo) of
  tlcTriDefecto : ObtenerLista;

  tlcTriTodos,
  tlcTriAbiertos: begin
                    inicializarSQL;
                    ObtenerListaBD;
                  end;
  end;
end;

procedure TListaTrimestres.ObtenerLista;
var
  FTrimestre : TDatosTrimestre;
begin
  FTrimestre := TDatosTrimestre.Create();
  FTrimestre.Nombre := dmTablaTrimestres.darDescripcionTrimestre(entPrimerTrimestre);
  FTrimestre.Situacion := tstAbierto;
  FTrimestre.NombreCompleto := dmTablaTrimestres.darDescripcionTrimestre(entPrimerTrimestre);
  FLista.Add(FTrimestre);

  FTrimestre := TDatosTrimestre.Create();
  FTrimestre.Nombre := dmTablaTrimestres.darDescripcionTrimestre(entSegundoTrimestre);
  FTrimestre.Situacion := tstAbierto;
  FTrimestre.NombreCompleto := dmTablaTrimestres.darDescripcionTrimestre(entSegundoTrimestre);
  FLista.Add(FTrimestre);

  FTrimestre := TDatosTrimestre.Create();
  FTrimestre.Nombre := dmTablaTrimestres.darDescripcionTrimestre(entTercerTrimestre);
  FTrimestre.Situacion := tstAbierto;
  FTrimestre.NombreCompleto := dmTablaTrimestres.darDescripcionTrimestre(entTercerTrimestre);
  FLista.Add(FTrimestre);

  FTrimestre := TDatosTrimestre.Create();
  FTrimestre.Nombre := dmTablaTrimestres.darDescripcionTrimestre(entCuartoTrimestre);
  FTrimestre.Situacion := tstAbierto;
  FTrimestre.NombreCompleto := dmTablaTrimestres.darDescripcionTrimestre(entCuartoTrimestre);
  FLista.Add(FTrimestre);
end;

procedure TListaTrimestres.inicializarSQL;
begin
  case Tipo of
  tlcTriTodos    : Begin
                    with FSQL do
                    begin
                      Add('select TR.CODIGOEMPRESA, TR.CODIGO, TR.NOMBRE, TR.SITUACION, ');
                      Add('TR.FECHAINI, TR.FECHAFIN, EM.CODIGOTRIMESTRE ');
                      Add('from TRIMESTRES TR, EMPRESAS EM ');
                      Add('where TR.CODIGOEMPRESA = :CODIGOEMPRESA ');
                      Add('and EM.CODIGO = TR.CODIGOEMPRESA ');
                      Add('order by TR.FECHAINI');
                    end;
                   end;
  tlcTriAbiertos : Begin
                    with FSQL do
                    begin
                      Add('select TR.CODIGOEMPRESA, TR.CODIGO, TR.NOMBRE, TR.SITUACION, ');
                      Add('TR.FECHAINI, TR.FECHAFIN, EM.CODIGOTRIMESTRE ');
                      Add('from TRIMESTRES TR, EMPRESAS EM ');
                      Add('where TR.CODIGOEMPRESA = :CODIGOEMPRESA ');
                      Add('and EM.CODIGO = TR.CODIGOEMPRESA ');
                      Add('and TR.SITUACION = ''A'' ');
                      Add('order by TR.FECHAINI');
                    end;
                   end;
  end;
end;

function TdmTablaTrimestres.darCodigoTrimestre(Trimestre: TTrimestres; Ano: Variant): String;
begin
  case Trimestre of
    entPrimerTrimestre  : Result := copy(Ano,3,2) + '0';
    entSegundoTrimestre : Result := copy(Ano,3,2) + '1';
    entTercerTrimestre  : Result := copy(Ano,3,2) + '2';
    entCuartoTrimestre  : Result := copy(Ano,3,2) + '3';
  end;
end;

////////////////////////////////////////////////////////////////////////////////
//ENTIDADES
////////////////////////////////////////////////////////////////////////////////
function TdmTablaTrimestres.darDescripcionTrimestre (Entidad : TTrimestres) : string;
begin
  Result := StrCapitalize(CaptionsTrimestres [Entidad]);
end;

function TdmTablaTrimestres.darCodigoTrimestre(Ano: Variant; Trimestre: Integer): String;
begin
  Result := (copy(Ano,3,2) + IntToStr(Trimestre));
end;

function TdmTablaTrimestres.DarDescripcionTrimestreActual: String;
var
  Ano : String;
  Fecha : TDateTime;
begin
  Result := '';
  Ano := Copy(dmBaseDatos.DarAno, 3, 2);
  Fecha := dmBaseDatos.DarFecha;
  if (Fecha >= DarFechaIniTrimestre(entPrimerTrimestre, -1)) and
     (Fecha <= DarFechaFinTrimestre(entPrimerTrimestre, -1)) then
     Result := darDescripcionTrimestre(entPrimerTrimestre);
  if (Fecha >= DarFechaIniTrimestre(entSegundoTrimestre, -1)) and
     (Fecha <= DarFechaFinTrimestre(entSegundoTrimestre, -1)) then
     Result := darDescripcionTrimestre(entSegundoTrimestre);
  if (Fecha >= DarFechaIniTrimestre(entTercerTrimestre, -1)) and
     (Fecha <= DarFechaFinTrimestre(entTercerTrimestre, -1)) then
     Result := darDescripcionTrimestre(entTercerTrimestre);
  if (Fecha >= DarFechaIniTrimestre(entCuartoTrimestre, -1)) and
     (Fecha <= DarFechaFinTrimestre(entCuartoTrimestre, -1)) then
     Result := darDescripcionTrimestre(entCuartoTrimestre);
end;

{
function TListaTrimestres.getElemPredeterminado: TDatosTrimestre;
var i, j : integer;
begin
  Result := Nil;

  //Recorremos lista
  i := 0;
  while ((not Self.Items[i].Predeterminado) and (i < FLista.Count - 1)) do
    inc (i);

  if Self.Items[i].Predeterminado then
     Result := Self.Items[i];
end;
}

function TdmTablaTrimestres.darDescripcionTrimestre(CodigoTrimestre: String): String;
var
  Codigo : Integer;
begin
  Result := '';

  if esCadenaVacia(CodigoTrimestre) then
     exit;

  Codigo := StrToInt(Copy(CodigoTrimestre,3,1));
  Case Codigo of
    0: Result := darDescripcionTrimestre(entPrimerTrimestre);
    1: Result := darDescripcionTrimestre(entSegundoTrimestre);
    2: Result := darDescripcionTrimestre(entTercerTrimestre);
    3: Result := darDescripcionTrimestre(entCuartoTrimestre);
  end;
end;

function TdmTablaTrimestres.darAnoTrimestre(CodigoEmpresa: Variant; CodigoTrimestre: Variant): TDateTime;
var
  oSQL : TIBSQL;

begin
  Result := dmBaseDatos.DarFecha;

  if VarIsNull(CodigoEmpresa) or VarIsNull(CodigoTrimestre) then
    Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOEMPRESA, CODIGO, FECHAINI ');
    SQL.Add('from TRIMESTRES');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA ');
    SQL.Add('and CODIGO = :CODIGO');

    try
      ParamByName('CODIGOEMPRESA').AsVariant := CodigoEmpresa;
      ParamByName('CODIGO').AsString := CodigoTrimestre;
      Prepare;
      ExecQuery;

      if (RecordCount > 0) then
          Result := FieldByName('FECHAINI').AsDate;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TListaTrimestres.getNumItem(Codigo: String): Integer;
var
  i : integer;
begin
  i := 0;
  while ((Self.Items[i].Codigo <> Codigo) and (i < FLista.Count - 1)) do
    inc (i);

  if Self.Items[i].Codigo = Codigo
  then Result := i
  else Result := -1;
end;

function TListaTrimestres.getCodItem(NumOrden: Integer): String;
var i, j : integer;
begin
  Result := Self.Items[NumOrden].Codigo;
end;

function TdmTablaTrimestres.darDescripcionCompletaTrimestre(CodigoTrimestre: String): String;
var
  oSQL : TIBSQL;
begin
  if esCadenaVacia(CodigoTrimestre) then
    exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select NOMBRE, FECHAINI ');
    SQL.Add('from TRIMESTRES ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA');
    SQL.Add('and CODIGO = :CODIGO');
    try
      ParamByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      ParamByName('CODIGO').AsString := CodigoTrimestre;
      Prepare;
      ExecQuery;
      if (RecordCount > 0) then
        Result := copy (FieldByName('FECHAINI').AsString, 7,4) + ' - ' + FieldByName('NOMBRE').AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaTrimestres.darCodigoTrimestre(Fecha: TDateTime): String;
var
  Ano : String;
  CodTri : String;
begin
  Ano := Copy(dmBaseDatos.DarAno(Fecha), 3, 2);
  if (Fecha >= DarFechaIniTrimestre(entPrimerTrimestre, StrToInt(Ano))) and
     (Fecha <= DarFechaFinTrimestre(entPrimerTrimestre, StrToInt(Ano))) then
     CodTri := '0';
  if (Fecha >= DarFechaIniTrimestre(entSegundoTrimestre, StrToInt(Ano))) and
     (Fecha <= DarFechaFinTrimestre(entSegundoTrimestre, StrToInt(Ano))) then
     CodTri := '1';
  if (Fecha >= DarFechaIniTrimestre(entTercerTrimestre, StrToInt(Ano))) and
     (Fecha <= DarFechaFinTrimestre(entTercerTrimestre, StrToInt(Ano))) then
     CodTri := '2';
  if (Fecha >= DarFechaIniTrimestre(entCuartoTrimestre, StrToInt(Ano))) and
     (Fecha <= DarFechaFinTrimestre(entCuartoTrimestre, StrToInt(Ano))) then
     CodTri := '3';
  Result := Ano + CodTri;
end;

end.
