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

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

unit TablaEmpresas;

interface

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

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

type
  TDatosDireccionEmpresa = class(TObjeto)
  protected
    procedure ObtenerDatos; override;
  public
    CodigoEmpresa : Integer;
    CodigoDireccion : Integer;
    Calle : String;
    Numero : String;
    CodigoPostal : String;
    Poblacion : String;
    Provincia : String;
    Telefono : String;
    Fax : String;
    procedure SalvarDatos;
    procedure Eliminar;
  end;

  TListaDireccionesEmpresa = class(TListaObjetos)
  private
    FCodigoEmpresa : Integer;
    function GetDireccion(Index: Integer): TDatosDireccionEmpresa;
  protected
    procedure ObtenerLista; override;
  public
    property Items[Index: Integer] : TDatosDireccionEmpresa read GetDireccion;
    constructor Create(CodigoEmpresa : Integer);
    destructor Destroy; override;
  end;


  TDatosEmpresa = class(TObjeto)
  private
    FDirecciones : TListaDireccionesEmpresa;
  protected
    procedure ObtenerDatos; override;
  public
    Codigo : Integer;
    FechaAlta : String;
    Usuario : String;
    Nombre : String;
    NifCif : String;
    Correo : String;
    Web : String;
    NombreComercial : String;
    CodigoTrimestre : String;
    IvaDefecto : String;
    ValidezDefecto : Variant;
    IntervaloPagosCli : Real;
    LibroDefecto : String;
    Logotipo : TPicture;
    property Direcciones : TListaDireccionesEmpresa read FDirecciones;
    constructor Create; overload;
    constructor Create(CodigoEmpresa : Integer); overload;
    destructor Destroy; override;
  end;

  TdmTablaEmpresas = class(TDataModule)
  private
    procedure IniciarSQL;

  public
    sqlInsertar : TStrings;
    sqlModificar : TStrings;
    sqlConsultar : TStrings;
    sqlEliminar : TStrings;
    sqlGrid : TStrings;

    function DarNuevoCodigo : String;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    procedure InicializarGridEmpresas(var vGrid: TcxGridDBTableView);
  end;

var
  dmTablaEmpresas: TdmTablaEmpresas;

implementation

{$R *.DFM}

uses
  Literales;

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

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

procedure TdmTablaEmpresas.IniciarSQL;
begin
  with sqlInsertar do
  begin
    Add('INSERT INTO EMPRESAS (CODIGO, FECHAALTA, USUARIO, NOMBRE, NIFCIF, ');
    Add('CORREO, WEB, LOGOTIPO, NOMBRECOMERCIAL, CODIGOTRIMESTRE, IVADEFECTO, ');
    Add('VALIDEZDEFECTO, INTERVALOPAGOSCLI, LIBRODEFECTO) ');

    Add('VALUES (:CODIGO, :FECHAALTA, :USUARIO, :NOMBRE, :NIFCIF, ');
    Add(':CORREO, :WEB, :LOGOTIPO, :NOMBRECOMERCIAL, :CODIGOTRIMESTRE, :IVADEFECTO, ');
    Add(':VALIDEZDEFECTO, :INTERVALOPAGOSCLI, :LIBRODEFECTO)');
  end;

  with sqlModificar do
  begin
    Add('UPDATE EMPRESAS SET');
    Add('NOMBRE = :NOMBRE, ');
    Add('NIFCIF = :NIFCIF, ');
{    Add('CALLE = :CALLE, ');
    Add('NUMERO = :NUMERO, ');
    Add('CODIGOPOSTAL = :CODIGOPOSTAL, ');
    Add('POBLACION = :POBLACION, ');
    Add('PROVINCIA = :PROVINCIA, ');
    Add('TELEFONO = :TELEFONO, ');
    Add('FAX = :FAX, ');}
    Add('CORREO = :CORREO, ');
    Add('WEB = :WEB, ');
    Add('LOGOTIPO = :LOGOTIPO, ');
    Add('NOMBRECOMERCIAL = :NOMBRECOMERCIAL, ');
    Add('CODIGOTRIMESTRE = :CODIGOTRIMESTRE, ');
    Add('IVADEFECTO = :IVADEFECTO, ');
    Add('VALIDEZDEFECTO = :VALIDEZDEFECTO, ');
    Add('INTERVALOPAGOSCLI = :INTERVALOPAGOSCLI, ');
    Add('LIBRODEFECTO = :LIBRODEFECTO ');
    Add('WHERE (CODIGO = :CODIGO)');
  end;

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

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

  with sqlGrid do
  begin
    Add('select CODIGO, NIFCIF, LOGOTIPO, NOMBRECOMERCIAL');
    Add('from EMPRESAS ');
  end;
end;

function TdmTablaEmpresas.DarNuevoCodigo : String;
var
  oSQL : TIBSQL;
begin
  Result := '0';

  oSQL := TIBSQL.Create(Self);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select max(CODIGO) + 1 ');
    SQL.Add('from EMPRESAS ');
    try
      Prepare;
      ExecQuery;
      if not esCadenaVacia(Fields[0].AsString) then
         Result := Fields[0].AsString;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TdmTablaEmpresas.InicializarGridEmpresas (var vGrid: TcxGridDBTableView);
var
  Columna : TcxGridDBColumn;
begin
  with vGrid do begin
    OptionsView.Footer := True;

    {Columna CODIGO}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'CODIGO';
    Columna.Caption := 'Código';
    Columna.Width := tamColCodigo;
    Columna.Options.Filtering := False;
    Columna.Visible := False;
    {Columna NIFCIF}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NIFCIF';
    Columna.Caption := 'NIF/CIF';
    Columna.Width := tamColNIFCIF;
    Columna.Options.Filtering := False;
    with TcxGridDBTableSummaryItem(DataController.Summary.FooterSummaryItems.Add) do
    try
      try
        BeginUpdate;
        Column := Columna;
        FieldName := Columna.DataBinding.FieldName;
        Format := 'Total: 0 empresas';
        Kind := skCount;
      finally
        EndUpdate;
      end;
    except
      DataController.Summary.FooterSummaryItems.Delete(DataController.Summary.FooterSummaryItems.Count-1);
    end;

    {Columna NOMBRECOMERCIAL}
    Columna := CreateColumn;
    Columna.DataBinding.FieldName := 'NOMBRECOMERCIAL';
    Columna.Caption := 'Nombre comercial';
    Columna.Width := tamColNombre;
    Columna.Options.Filtering := False;
    Columna.SortOrder := soAscending;
  end;
end;

{ TDatosEmpresa }

constructor TDatosEmpresa.Create(CodigoEmpresa: Integer);
begin
  inherited Create;
  Codigo := CodigoEmpresa;
  // Recuperar los datos de la empresa
  ObtenerDatos;
end;

constructor TDatosEmpresa.Create;
begin
  inherited Create;
  FDirecciones := TListaDireccionesEmpresa.Create(Codigo);
end;

destructor TDatosEmpresa.Destroy;
begin
  if Assigned(FDirecciones) then
  begin
    FDirecciones.Free;
    FDirecciones := NIL;
  end;
  inherited;
end;

procedure TDatosEmpresa.ObtenerDatos;
var
  oSQL : TIBQuery;
  Stream : TIBDSBlobStream;
begin
  if EsCadenaVacia(Codigo) then
     raise Exception.Create(msgCliFaltaCli);

  oSQL := TIBQuery.Create(dmTablaEmpresas);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select * ');
    SQL.Add('from EMPRESAS ');
    SQL.Add('where CODIGO = :CODIGO');
    ParamByName('CODIGO').AsInteger := Codigo;

    try
      Prepare;
      Open;

      // Compruebo si se han recuperado datos
      if (RecordCount > 0) then
      begin
        Codigo := FieldByName('CODIGO').AsInteger;
        FechaAlta := FieldByName('FECHAALTA').AsString;
        Usuario := FieldByName('USUARIO').AsString;
        Nombre := FieldByName('NOMBRE').AsString;
        NifCif := FieldByName('NIFCIF').AsString;
        Correo := FieldByName('CORREO').AsString;
        Web := FieldByName('WEB').AsString;
        NombreComercial := FieldByName('NOMBRECOMERCIAL').AsString;
        CodigoTrimestre := FieldByName('CODIGOTRIMESTRE').AsString;
        IvaDefecto := FieldByName('IVADEFECTO').AsString;
        LibroDefecto := FieldByName('LIBRODEFECTO').AsString;        
        ValidezDefecto := FieldByName('VALIDEZDEFECTO').AsString;
        IntervaloPagosCli := FieldByName('INTERVALOPAGOSCLI').AsFloat;

        //En el caso de que tenga logotipo asociado
        if not esCadenaVacia(FieldByName('LOGOTIPO').AsVariant) then
        begin
          Stream := (oSQL.CreateBlobStream(FieldByName('LOGOTIPO'), bmReadWrite) as TIBDSBlobStream);
          Logotipo := TPicture.Create;
          Logotipo.Bitmap.LoadFromStream(Stream);
          Stream.Free;
        end;
        FDirecciones := TListaDireccionesEmpresa.Create(Codigo);
      end;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TDatosDireccionEmpresa }

procedure TDatosDireccionEmpresa.Eliminar;
var
  oSQL : TIBQuery;
  bEsInsercion : Boolean;
begin
  if (EsCadenaVacia(CodigoEmpresa)) or (EsCadenaVacia(CodigoDireccion)) then
     raise Exception.CreateFmt(msgEmpFaltaAlgo, ['el código']);

  bEsInsercion := True;
  oSQL := TIBQuery.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    with SQL do
    begin
      Add('delete from SUCURSALESEMPRESA ');
      Add('where CODIGOEMPRESA = :CODIGOEMPRESA and ');
      Add('CODIGO = :CODIGO ');
    end;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('CODIGO').AsInteger := CodigoDireccion;

    try
      Prepare;
      ExecSQL;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

procedure TDatosDireccionEmpresa.ObtenerDatos;
begin
  inherited;
  //
end;

procedure TDatosDireccionEmpresa.SalvarDatos;
var
  oSQL : TIBQuery;
  bEsInsercion : Boolean;
begin
  if (EsCadenaVacia(CodigoEmpresa)) or (EsCadenaVacia(CodigoDireccion)) then
     raise Exception.CreateFmt(msgEmpFaltaAlgo, ['el código']);

  bEsInsercion := True;
  oSQL := TIBQuery.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    with SQL do
    begin
      Add('select CODIGO from SUCURSALESEMPRESA ');
      Add('where CODIGOEMPRESA = :CODIGOEMPRESA and ');
      Add('CODIGO = :CODIGO ');
    end;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('CODIGO').AsInteger := CodigoDireccion;

    try
      Prepare;
      Open;

      // Compruebo si se han recuperado datos
      if (RecordCount > 0) then
        bEsInsercion := False
      else
        bEsInsercion := True;
    finally
      Close;
    end;

    with SQL do
    begin
      Clear;
      if bEsInsercion then begin
        Add('insert into SUCURSALESEMPRESA ( ');
        Add('CODIGOEMPRESA, CODIGO, FECHAALTA, USUARIO, ');
        Add('CALLE, NUMERO, CODIGOPOSTAL, POBLACION, ');
        Add('PROVINCIA, TELEFONO, FAX) ');
        Add('values ( ');
        Add(':CODIGOEMPRESA, :CODIGO, CURRENT_DATE, ');
        Add('CURRENT_USER, :CALLE, :NUMERO, ');
        Add(':CODIGOPOSTAL, :POBLACION, :PROVINCIA, ');
        Add(':TELEFONO, :FAX) ');
      end
      else begin
        Add('update SUCURSALESEMPRESA set ');
        Add('CALLE = :CALLE, ');
        Add('NUMERO = :NUMERO, ');
        Add('CODIGOPOSTAL = :CODIGOPOSTAL, ');
        Add('POBLACION = :POBLACION, ');
        Add('PROVINCIA = :PROVINCIA, ');
        Add('TELEFONO = :TELEFONO, ');
        Add('FAX = :FAX ');
        Add('WHERE (CODIGOEMPRESA = :CODIGOEMPRESA) AND (CODIGO = :CODIGO) ');
      end;
    end;
    ParamByName('CODIGOEMPRESA').AsInteger := CodigoEmpresa;
    ParamByName('CODIGO').AsInteger := CodigoDireccion;
    ParamByName('CALLE').AsString := Calle;
    ParamByName('NUMERO').AsString := Numero;
    ParamByName('CODIGOPOSTAL').AsString := CodigoPostal;
    ParamByName('POBLACION').AsString := Poblacion;
    ParamByName('PROVINCIA').AsString := Provincia;
    ParamByName('TELEFONO').AsString := Telefono;
    ParamByName('FAX').AsString := Fax;

    try
      Prepare;
      ExecSQL;
    finally
      Close;
      Transaction := NIL;
      Free;
    end;
  end;
end;

{ TListaDireccionesEmpresa }

constructor TListaDireccionesEmpresa.Create(CodigoEmpresa: Integer);
begin
  inherited Create;
  FCodigoEmpresa := CodigoEmpresa;
  ObtenerLista;
end;

destructor TListaDireccionesEmpresa.Destroy;
begin
  inherited;
end;

function TListaDireccionesEmpresa.GetDireccion(
  Index: Integer): TDatosDireccionEmpresa;
begin
  Result := TDatosDireccionEmpresa(FLista.Items[Index]);
end;

procedure TListaDireccionesEmpresa.ObtenerLista;
var
  oSQL : TIBQuery;
  FDireccion : TDatosDireccionEmpresa;
begin
  if EsCadenaVacia(FCodigoEmpresa) then
     raise Exception.CreateFmt(msgEmpFaltaAlgo, ['el código']);

  oSQL := TIBQuery.Create(nil);
  with oSQL do
  begin
    Database := dmBaseDatos.BD;
    Transaction := dmBaseDatos.Transaccion;
    SQL.Add('select CODIGO, CALLE, NUMERO, CODIGOPOSTAL, POBLACION, ');
    SQL.Add('PROVINCIA, TELEFONO, FAX ');
    SQL.Add('from SUCURSALESEMPRESA ');
    SQL.Add('where CODIGOEMPRESA = :CODIGOEMPRESA ');
    SQL.Add('order by CODIGO');
    ParamByName('CODIGOEMPRESA').AsInteger := FCodigoEmpresa;

    try
      Prepare;
      Open;

      // Compruebo si se han recuperado datos
      while not EOF do
      begin
        FDireccion := TDatosDireccionEmpresa.Create;
        with FDireccion do
        begin
          CodigoEmpresa := FCodigoEmpresa;
          CodigoDireccion := FieldByName('CODIGO').AsInteger;
          Calle := FieldByName('CALLE').AsString;
          Numero := FieldByName('NUMERO').AsString;
          CodigoPostal := FieldByName('CODIGOPOSTAL').AsString;
          Poblacion := FieldByName('POBLACION').AsString;
          Provincia := FieldByName('PROVINCIA').AsString;
          Telefono := FieldByName('TELEFONO').AsString;
          Fax := FieldByName('FAX').AsString;
        end;
        Add(FDireccion);
        Next;
      end;
    finally
      Close;
      Free;
    end;
  end;
end;

end.
