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

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

unit TablaAgenda;

interface

uses
  //Generales
  SysUtils, Classes, Controls, IBSQL, cxGridDBTableView, cxCustomData, DB,
  //Particulares
  cxGridDBCardView, cxMemo, cxTimeEdit, cxCalendar, StdCtrls, Variants,

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

  // Contador
  Contadores, RdxGestorContadores;

const
  CITA_BORRADA = 'X';

type
  TDatosVisita = class(TObjeto)
  public
    Codigo : Integer;
    Usuario : String;
    FechaIni : TDateTime;
    HoraIni : TTime;
    FechaFin : TDateTime;
    HoraFin : TTime;
    FechaAlta : TDateTime;
    UsuarioAlta : String;
    Descripcion : String;
    EntryID : Integer;
    Borrado : Boolean;
    constructor Create; overload;
    //constructor Create(EntryID : String); overload;
    constructor Create(Codigo : Integer); overload;
    procedure ObtenerDatos; override;
    procedure SalvarDatos;
    destructor Destroy; override;
  end;

/////////////////////////////////////////////////////////////////////////////////

type
  TdmTablaAgenda = class(TDataModule)
  private
    procedure IniciarSQL;
  public
    sqlInsertar : TStrings;
    sqlModificar : TStrings;
    sqlConsultar : TStrings;
    sqlEliminar : TStrings;
    sqlGrid : TStrings;

    function DarNuevoCodigo : Integer;

    function EliminarVisitas(Dia: TDateTime; Usuario: Variant) : Boolean;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;

    procedure InicializarTablaVisitas(Tabla: TPTabla);
    procedure InicializarGridVisitas(var vGrid: TcxGridDBCardView);
  end;

var
  dmTablaAgenda: TdmTablaAgenda;

implementation
{$R *.DFM}

uses
  Mensajes, Literales;

constructor TdmTablaAgenda.Create (AOwner : TComponent);
begin
  inherited;
  sqlInsertar := TStringList.Create;
  sqlModificar := TStringList.Create;
  sqlConsultar := TStringList.Create;
  sqlEliminar := TStringList.Create;
  sqlGrid := TStringList.Create;
  IniciarSQL;
end;

destructor TdmTablaAgenda.Destroy;
begin
  sqlInsertar.Free;
  sqlModificar.Free;
  sqlConsultar.Free;
  sqlEliminar.Free;
  sqlGrid.Free;
  inherited;
end;

procedure TdmTablaAgenda.IniciarSQL;
begin
  with sqlInsertar do
  begin
    Add('insert into AGENDA (');
    Add('CODIGO, USUARIO, FECHAINI, HORAINI, FECHAFIN, HORAFIN, FECHAALTA, USUARIOALTA, DESCRIPCION, ENTRYID, ULTIMOCAMBIO, BORRADO) ');
    Add('values (:CODIGO, :USUARIO, :FECHAINI, :HORAINI, :FECHAFIN, :HORAFIN, :FECHAALTA, :USUARIOALTA, :DESCRIPCION, :ENTRYID, CURRENT_TIME, :BORRADO)');
  end;

  with sqlModificar do
  begin
    Add('update AGENDA set ');
    Add('FECHAINI = :FECHAINI, ');
    Add('HORAINI = :HORAINI, ');
    Add('FECHAFIN = :FECHAFIN, ');
    Add('HORAFIN = :HORAFIN, ');
    Add('DESCRIPCION = :DESCRIPCION, ');
    Add('ENTRYID = :ENTRYID, ');
    Add('ULTIMOCAMBIO = CURRENT_TIME, ');
    Add('BORRADO = :BORRADO ');
    Add('where (CODIGO = :CODIGO)');
  end;

  with sqlEliminar do
  begin
    Add('delete from AGENDA ');
    Add('where (CODIGO = :CODIGO)');
  end;

  with sqlConsultar do
  begin
    Add('select * from AGENDA ');
    Add('where (CODIGO = :CODIGO)');
  end;

  with sqlGrid do
  begin
    Add('select * ');
    Add('from AGENDA ');
    Add('where USUARIO = :USUARIO ');
    Add('and FECHAINI = :FECHAINI ');
    Add('order by FECHAINI Desc, HORAINI Asc');
  end;
end;

procedure TdmTablaAgenda.InicializarGridVisitas(var vGrid: TcxGridDBCardView);
var
  Columna : TcxGridDBCardViewRow;
begin
  with vGrid do begin
    {Columna CODIGO}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Codigo';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.Visible := False;
    {Columna USUARIO}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'USUARIO';
    Columna.Caption := 'Usuario';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.Visible := False;
    {Columna FECHAALTA}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'FECHAALTA';
    Columna.Caption := 'Fecha Alta';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.Visible := False;
    {Columna USUARIOALTA}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'USUARIOALTA';
    Columna.Caption := 'Usuario alta';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.Visible := False;

    {Columna BORRADO}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'BORRADO';
    Columna.Caption := 'Borrado';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.Visible := False;

    {Columna FECHAINI}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'FECHAINI';
    Columna.Caption := 'Fecha inicio';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.Visible := True;
    Columna.PropertiesClassName := 'TcxDateEditProperties';
    with TcxDateEditProperties(Columna.Properties) do
    begin
      ShowTime := False;
      SaveTime := False;
      ImmediatePost := True;
    end;
    {Columna HORAINI}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'HORAINI';
    Columna.Caption := 'Hora inicio';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.PropertiesClassName := 'TcxTimeEditProperties';
    with TcxTimeEditProperties(Columna.Properties) do
    begin
      TimeFormat := tfHourMin;
      ImmediatePost := True;
    end;
    Columna.Visible := True;
    {Columna FECHAFIN}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'FECHAFIN';
    Columna.Caption := 'Fecha fin';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.Visible := True;
    Columna.PropertiesClassName := 'TcxDateEditProperties';
    with TcxDateEditProperties(Columna.Properties) do
    begin
      ShowTime := False;
      SaveTime := False;
      ImmediatePost := True;
    end;
    {Columna HORAFIN}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'HORAFIN';
    Columna.Caption := 'Hora fin';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.PropertiesClassName := 'TcxTimeEditProperties';
    with TcxTimeEditProperties(Columna.Properties) do
    begin
      TimeFormat := tfHourMin;
    end;
    Columna.Visible := True;
    {Columna DESCRIPCION}
    Columna := CreateRow;
    Columna.DataBinding.FieldName := 'DESCRIPCION';
    Columna.Caption := 'Descripción';
    Columna.CaptionAlignmentHorz := taRightJustify;
    Columna.PropertiesClassName := 'TcxMemoProperties';
    with TcxMemoProperties(Columna.Properties) do
    begin
      ScrollBars := ssVertical;
    end;
    Columna.Visible := True;
  end;
end;

function TdmTablaAgenda.EliminarVisitas(Dia: TDateTime; Usuario: Variant): Boolean;
var
  oSQL : TIBSQL;
begin
  // REALIZA UN BORRADO FÍSICO Y NO UNA BAJA LÓGICA EN LA AGENDA.
  // NO CAMBIAR PORQUE SE NECESITA ASÍ.

  Result := False;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('delete from AGENDA ');
    SQL.Add('where (FECHAINI = :FECHAINI)');
    SQL.Add('and (UPPER(USUARIO) = UPPER(:USUARIO))');
    try
      ParamByName('FECHAINI').AsDateTime := Dia;
      ParamByName('USUARIO').AsVariant := Usuario;
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaAgenda.InicializarTablaVisitas(Tabla: TPTabla);
begin
  with Tabla^.Fields do
  begin
    if FindField('HORAINI') <> NIL then
      with (FieldByName('HORAINI') as TDateTimeField) do begin
        DisplayFormat := DISPLAY_HORA;
      end;

    if FindField('HORAFIN') <> NIL then
      with (FieldByName('HORAFIN') as TDateTimeField) do begin
        DisplayFormat := DISPLAY_HORA;
      end;
  end;
end;

function TdmTablaAgenda.DarNuevoCodigo: Integer;
var
  oSQL : TIBSQL;
begin
  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select max(CODIGO) + 1  from AGENDA ');
    try
      Prepare;
      ExecQuery;
      Result := Fields[0].AsInteger;
      if Result = 0 then
        Result := 1;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TDatosVisita }

constructor TDatosVisita.Create;
begin
  inherited Create;
end;

constructor TDatosVisita.Create(Codigo: Integer);
begin
  inherited Create;
  Self.Codigo := Codigo;
  // Recuperar los datos
  ObtenerDatos;
end;

destructor TDatosVisita.Destroy;
begin
  inherited;
end;

procedure TDatosVisita.ObtenerDatos;
var
  oSQL : TIBSQL;
begin
  if (EntryID = 0) and EsCadenaVacia(Codigo) then
    raise Exception.Create('');

  oSQL := TIBSQL.Create(NIL);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * from AGENDA ');
    if not EsCadenaVacia(Codigo) then
    begin
      SQL.Add('where CODIGO = :CODIGO');
      ParamByName('CODIGO').AsInteger := Codigo;
    end
    else begin
      if not (EntryID = 0) then begin
        SQL.Add('where ENTRYID = :ENTRYID');
        ParamByName('ENTRYID').AsInteger := EntryID;
      end;
    end;

    try
      Prepare;
      ExecQuery;

      // Compruebo si se han recuperado datos
      if (RecordCount > 0) then
      begin
        Codigo := FieldByName('CODIGO').AsInteger;
        Usuario := FieldByName('USUARIO').AsString;
        FechaIni := FieldByName('FECHAINI').AsDate;
        HoraIni := FieldByName('HORAINI').AsTime;
        FechaFin := FieldByName('FECHAFIN').AsDate;
        HoraFin := FieldByName('HORAFIN').AsTime;
        FechaAlta := FieldByName('FECHAALTA').AsDateTime;
        UsuarioAlta := FieldByName('USUARIOALTA').AsString;
        Descripcion := FieldByName('DESCRIPCION').AsString;
        EntryID := FieldByName('ENTRYID').AsInteger;
        Borrado := not VarIsNull(FieldByName('BORRADO').AsVariant);
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TDatosVisita.SalvarDatos;
var
  oSQL : TIBSQL;
  EsInsercion : Boolean;
begin
  EsInsercion := False;
  oSQL := TIBSQL.Create(NIL);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;

    if (Codigo = 0) then
    begin
      Codigo := dmTablaAgenda.DarNuevoCodigo;
      SQL.Assign(dmTablaAgenda.sqlInsertar);
      ParamByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
      ParamByName('USUARIOALTA').AsString := dmBaseDatos.Usuario;
      ParamByName('USUARIO').AsString := UpperCase(Usuario);
      EsInsercion := True;
    end
    else
      SQL.Assign(dmTablaAgenda.sqlModificar);

    ParamByName('CODIGO').AsInteger := Codigo;
    ParamByName('FECHAINI').AsDate := FechaIni;
    ParamByName('HORAINI').AsTime := HoraIni;
    ParamByName('FECHAFIN').AsDate := FechaFin;
    ParamByName('HORAFIN').AsTime := HoraFin;
    ParamByName('DESCRIPCION').AsString := Descripcion;
    ParamByName('ENTRYID').AsInteger := EntryID;
    if Borrado then
      ParamByName('BORRADO').AsString := CITA_BORRADA
    else
      ParamByName('BORRADO').AsVariant := null;
    try
      Prepare;
      ExecQuery;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
