{
===============================================================================
  Copyright (©) 2005. 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: 08-06-2005
  Versión actual: 1.0.0
  Fecha versión actual: 08-06-2005
===============================================================================
  Modificaciones:

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

unit TablaObras;

interface

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

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

  //Contador
  Contadores, RdxGestorContadores;

type
  TTipoListaObras = (tsoAbiertas, tsoCerradas, tsoTodas);

  TDatosObra = class(TObjeto)
  public
    CodigoContrato : String;
    FechaAlta : String;
    Usuario : String;
    CodigoDocumento : String;
    FechaFin : String;
    Nombre : String;
    Calle : String;
    Numero : String;
    Piso : String;
    CodigoPostal : String;
    Poblacion : String;
    Provincia : String;
    Telefono1 : String;
    Telefono2 : String;
    Movil1 : String;
    Movil2 : String;
    Fax : String;
    //Correo : String;
    PersonaContacto : String;
    UltimoCambio : String;

    constructor Create; overload;
    constructor Create(CodigoObra : String); overload;
    procedure ObtenerDatos; override;
    destructor Destroy; override;
  end;

  TListaObras = class(TListaObjetos)
  private
    FSituacion : TTipoListaObras;
    function GetObra(Index: Integer): TDatosObra;
  protected
    procedure ObtenerLista; override;
  public
    constructor Create; overload; override;
    constructor Create(Situacion : TTipoListaObras); overload;
    destructor Destroy; override;
    property Obras[Index: Integer] : TDatosObra read GetObra;
  end;

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

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    procedure InicializarGridObras(var vGrid: TcxGridDBTableView);
    function CrearObra(CodigoContrato: Variant): Boolean;
    function AbrirObra(Codigo: Variant): Boolean;
    function CerrarObra(Codigo: Variant; Fecha: TDateTime): Boolean;
  end;

var
  dmTablaObras: TdmTablaObras;

implementation

{$R *.DFM}

uses
  IBErrorCodes, IB, Literales, Mensajes, Excepciones;

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

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

procedure TdmTablaObras.IniciarSQL;
begin
  with sqlConsultar do
  begin
    Add('select OBR.CODIGOCONTRATO, OBR.FECHAALTA, OBR.USUARIO, OBR.CODIGODOCUMENTO, ');
    Add('OBR.FECHAFIN, CON.NOMBRE AS NOMBRE, CON.CALLE || '' '' || CON.NUMERO ');
    Add('|| '' '' || CON.PISO AS DIR1, ');
    Add('CON.CODIGOPOSTAL ||'' '' || CON.POBLACION || '' '' || CON.PROVINCIA AS DIR2, ');
    Add('CON.TELEFONO1 AS TELF, OBR.OBSERVACIONES, OBR.ULTIMOCAMBIO ');
    Add('from OBRAS OBR, CONTRATOSCLIENTE CON ');
    Add('where OBR.CODIGOCONTRATO = :CODIGOCONTRATO AND ');
    Add('CON.CODIGO = OBR.CODIGOCONTRATO');
  end;

  with sqlModificar do
  begin
    Add('update OBRAS set');
    Add('FECHAFIN = :FECHAFIN,');
    Add('OBSERVACIONES = :OBSERVACIONES,');
    Add('CODIGODOCUMENTO = :CODIGODOCUMENTO,');    
    Add('ULTIMOCAMBIO = :ULTIMOCAMBIO');
    Add('where CODIGOCONTRATO = :CODIGOCONTRATO');
  end;

  with sqlEliminar do
  begin
    Add('delete from OBRAS');
    Add('where CODIGOCONTRATO = :CODIGOCONTRATO');
  end;

  with sqlGrid do
  begin
    Add('select OBR.CODIGOCONTRATO, OBR.FECHAALTA, OBR.USUARIO, OBR.CODIGODOCUMENTO, ');
    Add('OBR.FECHAFIN, CON.NOMBRE AS NOMBRE, CON.CALLE || '' '' || CON.NUMERO ');
    Add('|| '' '' || CON.PISO AS DIR1, ');
    Add('CON.CODIGOPOSTAL ||'' '' || CON.POBLACION || '' '' || CON.PROVINCIA AS DIR2, ');
    Add('CON.TELEFONO1 AS TELF, OBR.OBSERVACIONES, OBR.ULTIMOCAMBIO ');
    Add('from OBRAS OBR, CONTRATOSCLIENTE CON ');
    Add('where CON.CODIGO = OBR.CODIGOCONTRATO');
  end;
end;

procedure TdmTablaObras.InicializarGridObras (var vGrid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with vGrid do begin
    ClearItems;
    OptionsView.Footer := True;

    {Columna CODIGOCONTRATO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGOCONTRATO';
    Columna.Caption := 'Contrato';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;

    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 obras';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna FECHAALTA}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAALTA';
    Columna.Caption := 'Inicio montaje';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soDescending;
    {Columna NOMBRE}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRE';
    Columna.Caption := 'Nombre';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soAscending;
    {Columna TELEFONO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'TELF';
    Columna.Caption := 'Teléfono';
    Columna.Width := tamColTelefono;
    Columna.Options.Filtering := False;
    {Columna FECHAFIN}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'FECHAFIN';
    Columna.Caption := 'Fin de montaje';
    Columna.Width := tamColFecha;
    Columna.Options.Filtering := False;
  end;
end;

{ TDatosObra }

constructor TDatosObra.Create(CodigoObra: String);
begin
  inherited Create;
  CodigoContrato := CodigoObra;
  // Recuperar los datos
  ObtenerDatos;
end;

constructor TDatosObra.Create;
begin
  inherited Create;
end;

destructor TDatosObra.Destroy;
begin
  inherited;
end;

procedure TDatosObra.ObtenerDatos;
var
  oSQL : TIBSQL;
begin
  if EsCadenaVacia(CodigoContrato) and EsCadenaVacia(Nombre) then
     raise Exception.Create(msgObrFaltaObr);

  oSQL := TIBSQL.Create(NIL);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOCONTRATO, OBR.FECHAALTA as FECHAALTA, OBR.USUARIO as USUARIO, OBR.CODIGODOCUMENTO as CODIGODOCUMENTO, ');
    SQL.Add('OBR.FECHAFIN as FECHAFIN, CON.NOMBRE AS NOMBRE, CON.CALLE as CALLE, CON.NUMERO as NUMERO, ');
    SQL.Add('CON.PISO AS PISO, CON.CODIGOPOSTAL AS CODIGOPOSTAL, CON.POBLACION AS POBLACION, ');
    SQL.Add('CON.PROVINCIA AS PROVINCIA, CON.TELEFONO1 AS TELEFONO1, ');
    SQL.Add('CON.TELEFONO2 AS TELEFONO2, CON.MOVIL1 as MOVIL1, CON.MOVIL2 AS MOVIL2, CON.FAX AS FAX, ');
    SQL.Add('CON.PERSONACONTACTO AS PERSONACONTACTO, ');
    SQL.Add('OBR.OBSERVACIONES AS OBSERVACIONES, OBR.ULTIMOCAMBIO AS ULTIMOCAMBIO');
    SQL.Add('from OBRAS OBR, CONTRATOSCLIENTE CON ');
    SQL.Add('where CON.CODIGO = OBR.CODIGOCONTRATO ');

//    SQL.Add('select CODIGOCONTRATO, FECHAALTA, USUARIO, CODIGODOCUMENTO,');
//    SQL.Add('FECHAFIN, OBSERVACIONES, ULTIMOCAMBIO'); //NOMBRE, CALLE, NUMERO, PISO, CODIGOPOSTAL,');
//    SQL.Add('POBLACION, PROVINCIA, PERSONACONTACTO, TELEFONO1,');
//    SQL.Add('TELEFONO2, MOVIL1, MOVIL2, FAX, CORREO');
//    SQL.Add('from OBRAS');

    if (not EsCadenaVacia(CodigoContrato)) then
    begin
      SQL.Add('AND OBR.CODIGOCONTRATO = :CODIGOCONTRATO');
      ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
    end;
{    else begin
      SQL.Add('where NOMBRE = :NOMBRE');
      ParamByName('NOMBRE').AsString := Nombre;
    end;}

    try
      Prepare;
      ExecQuery;

      // Compruebo si se han recuperado datos
      if (RecordCount > 0) then
      begin
        CodigoContrato := FieldByName('CODIGOCONTRATO').AsString;
        FechaAlta := FieldByName('FECHAALTA').AsString;
        Usuario := FieldByName('USUARIO').AsString;
        CodigoDocumento := FieldByName('CODIGODOCUMENTO').AsString;
        FechaFin := FieldByName('FECHAFIN').AsString;
        UltimoCambio := FieldByName('ULTIMOCAMBIO').AsString;

        Nombre := FieldByName('NOMBRE').AsString;
        Calle := FieldByName('CALLE').AsString;
        Numero := FieldByName('NUMERO').AsString;
        Piso := FieldByName('PISO').AsString;
        CodigoPostal := FieldByName('CODIGOPOSTAL').AsString;
        Poblacion := FieldByName('POBLACION').AsString;
        Provincia := FieldByName('PROVINCIA').AsString;
        Telefono1 := FieldByName('TELEFONO1').AsString;
        Telefono2 := FieldByName('TELEFONO2').AsString;
        Movil1 := FieldByName('MOVIL1').AsString;
        Movil2 := FieldByName('MOVIL2').AsString;
        Fax := FieldByName('FAX').AsString;
        //Correo := FieldByName('CORREO').AsString;
        PersonaContacto := FieldByName('PERSONACONTACTO').AsString;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaObras.CrearObra(CodigoContrato: Variant): Boolean;
var
  oSQL : TIBSQL;
  Contador : String;
begin
  Result := False;

  if EsCadenaVacia(CodigoContrato) then
     Exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;

    SQL.Add('insert into obras');
    SQL.Add('(CODIGOCONTRATO, FECHAALTA, USUARIO, CODIGODOCUMENTO)');
    SQL.Add('select CODIGO, :FECHAALTA, :USUARIO, CODIGODOCUMENTO');
    SQL.Add('from CONTRATOSCLIENTE');
    SQL.Add('where CODIGO = :CODIGOCONTRATO');

    ParamByName('CODIGOCONTRATO').AsString := CodigoContrato;
    ParamByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha;
    ParamByName('USUARIO').AsString := dmBaseDatos.Usuario;
    try
      Prepare;
      ExecQuery;
      Result := True;
    except
      on E : EIBError do begin
        if E.IBErrorCode = isc_unique_key_violation
        then VerMensajeFmt(msgObrErrAnadir,[CodigoContrato])
        else TratarExcepcion(E);
        Close;
        Transaction := NIL;
        Free;
      end;
    else
      begin
        Close;
        Transaction := NIL;
        Free;
      end;
    end;
  end;
end;

function TdmTablaObras.AbrirObra(Codigo: Variant): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  if esCadenaVacia(Codigo) then
     exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update OBRAS ');
    SQL.Add('set FECHAFIN = Null ');
    SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO');
    try
      ParamByName('CODIGOCONTRATO').AsString := Codigo;
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

function TdmTablaObras.CerrarObra(Codigo: Variant; Fecha: TDateTime): Boolean;
var
  oSQL : TIBSQL;
begin
  Result := False;

  if esCadenaVacia(Codigo) then
     exit;

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('update OBRAS ');
    SQL.Add('set FECHAFIN = :FECHA ');
    SQL.Add('where CODIGOCONTRATO = :CODIGOCONTRATO');
    try
      ParamByName('CODIGOCONTRATO').AsString := Codigo;
      ParamByName('FECHA').AsDateTime := Fecha;
      Prepare;
      ExecQuery;
      Result := True;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TListaObras }

constructor TListaObras.Create;
begin
  inherited;
  FSituacion := tsoTodas;
  ObtenerLista;
end;

constructor TListaObras.Create(Situacion: TTipoListaObras);
begin
  inherited Create;
  FSituacion := Situacion;
  ObtenerLista;
end;

destructor TListaObras.Destroy;
begin
  inherited;
end;

function TListaObras.GetObra(Index: Integer): TDatosObra;
begin
  Result := TDatosObra(FLista.Items[Index]);
end;

procedure TListaObras.ObtenerLista;
var
  oSQL : TIBSQL;
  Obra : TDatosObra;
begin
  oSQL := TIBSQL.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGOCONTRATO ');
    SQL.Add('from OBRAS');
    case FSituacion of
      tsoAbiertas : SQL.Add('where FECHAFIN is null ');
      tsoCerradas : SQL.Add('where FECHAFIN is not null ');
    end;

    SQL.Add('order by FECHAALTA desc');

    try
      Prepare;
      ExecQuery;
      while not EOF do begin
        Obra := TDatosObra.Create(FieldByName('CODIGOCONTRATO').AsString);
        FLista.Add(Obra);
        Next;
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

end.
