{
===============================================================================
  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.2
  Fecha versión actual: 05-08-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    30-07-2004    p284. Se han añadido los datos de inscripción del Registro
                  Mercantil a la tabla de empresas.

    05-08-2004    P279. Añadido el campo 'MODELOINFORME' para determinar por
                  empresa qué formato usarán los informes (no internos).
===============================================================================
}

unit Empresa;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RdxBotones, StdCtrls, RdxMemo, RdxComboBox, RdxCampos, ExtCtrls,
  RdxTitulos, ComCtrls, RdxCheckBox, Grids, DBGrids, RdxPaneles,
  RdxBarras, Db, RdxFrame, RdxDBFrame, RdxFrameEmpresas, RXDBCtrl,
  RdxPageControl, IB, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
  cxEdit, cxDBData, cxGridLevel, cxClasses, cxControls, cxGridCustomView,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid,
  dxLayout, dxCntner, dxEditor, dxExEdtr, dxExGrEd, dxExELib,
  cxGridCardView, cxGridDBCardView, RxMemDS, Configuracion, cxMemo,
  cxDBEdit, cxContainer, cxTextEdit, cxMaskEdit, cxButtonEdit, Tipos, 
  cxImage, cxDropDownEdit, cxLookupEdit, cxDBLookupEdit, cxDBLookupComboBox,
  IBCustomDataSet, cxCalendar, cxSpinEdit, RdxEmpresaActiva, cxListBox;

type
  TfrEmpresa = class(TRdxFrameEmpresas)
    pnlCuerpo: TPanel;
    brDoble: TRdxBarraInferior;
    bGuardar: TRdxBoton;
    bCancelar: TRdxBoton;
    brSimple: TRdxBarraInferior;
    bSalir: TRdxBoton;
    pnlTitulo: TRdxPanelTituloOperacion;
    dsEmpresas: TDataSource;
    pnlDatos: TPanel;
    eNIFCIF: TLabel;
    eNombre: TLabel;
    eDireccion: TLabel;
    eNumero: TLabel;
    eProvincia: TLabel;
    ePoblacion: TLabel;
    eCodigoPostal: TLabel;
    eTelefono: TLabel;
    eFax: TLabel;
    eCorreo: TLabel;
    Label1: TLabel;
    NIF: TcxDBTextEdit;
    Nombre: TcxDBTextEdit;
    Calle: TcxDBTextEdit;
    Numero: TcxDBTextEdit;
    CodigoPostal: TcxDBTextEdit;
    Telefono: TcxDBTextEdit;
    Fax: TcxDBTextEdit;
    Correo: TcxDBTextEdit;
    Web: TcxDBTextEdit;
    Provincia: TcxDBButtonEdit;
    Poblacion: TcxDBButtonEdit;
    dsLibros: TDataSource;
    dsTrimestres: TDataSource;
    cDatos: TRdxCabecera;
    Label2: TLabel;
    RegistroMercantil: TcxDBMemo;
    Paginas: TRdxPagesControl;
    pagLogotipo: TTabSheet;
    pagInformes: TTabSheet;
    bExaminar: TRdxBoton;
    Logotipo: TcxDBImage;
    Label3: TLabel;
    cxDBTextEdit1: TcxDBTextEdit;
    procedure bAceptarClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
    procedure bSalirClick(Sender: TObject);

    procedure bExaminarClick(Sender: TObject);
    procedure GridBotonPoblacionClick(Sender: TObject; AButtonIndex: Integer);
    procedure GridBotonProvinciaClick(Sender: TObject; AButtonIndex: Integer);

  private
    FCodigoProvincia : Variant;
    FCodigoPoblacion : Variant;
    procedure ProvinciaSetText(Sender: TField; const Text: String);
  protected
    procedure ActivarModoAnadir; override;
    procedure ActivarModoModificar; override;
    procedure ActivarModoConsultar; override;
    procedure ActivarModoEliminar; override;
    function AnadirDatos : Boolean; override;
    function ModificarDatos : Boolean; override;
    function EliminarDatos : Boolean; override;
    function CancelarAnadir : Boolean; override;
    function CancelarModificar : Boolean; override;
    function CancelarEliminar : Boolean; override;
    function ComprobarDatos : Boolean; override;
    procedure VerModal; override;
    procedure SetCodigoProvincia (Value : Variant); virtual;
    procedure SetCodigoPoblacion (Value : Variant); virtual;
    procedure FreeContenido; override;
    procedure BuscarEmpresa; override;
    procedure CambiarModo(ModoAnterior, Modo : TRdxModo); override;
  public
    property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia;
    property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaEmpresas;
    property CodigoEmpresa;
  end;

var
  frEmpresa: TfrEmpresa;

implementation
{$R *.DFM}

uses
  TablaEmpresas, Mensajes, Provincias, Entidades,
  Poblaciones, BaseDatos, RdxFrameProvincias, 
  RdxFramePoblaciones, TablaProvincias, StrFunc,
  TablaPoblaciones, Excepciones, IBErrorCodes, dxDBTLCL,
  Literales, Constantes;

constructor TfrEmpresa.Create (AOwner : TComponent);
var
  i : integer;
begin
  inherited Create(AOwner);
  Entidad := entEmpresa;
  ConfigurarFrame(Self, Self.Entidad);

  FCodigoProvincia := NULL;
  FCodigoPoblacion := NULL;

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;

  TablaEmpresas := TIBDataSet.Create(Self);
  dsEmpresas.DataSet := TablaEmpresas;
  with TablaEmpresas do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaEmpresas.sqlConsultar);
    InsertSQL.Assign(dmTablaEmpresas.sqlInsertar);
    ModifySQL.Assign(dmTablaEmpresas.sqlModificar);
    DeleteSQL.Assign(dmTablaEmpresas.sqlEliminar);
    RefreshSQL.Assign(dmTablaEmpresas.sqlConsultar);
  end;

  bCancelar.Cancel := True;
  bSalir.Cancel := True;
  Paginas.ActivePageIndex := 0;
  pagInformes.Visible := (dmBaseDatos.Usuario = USER_SYSDBA);
end;

procedure TfrEmpresa.bSalirClick(Sender: TObject);
begin
  try
    Rollback;
    CloseFrame;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrEmpresa.bAceptarClick(Sender: TObject);
begin
  if (RealizarOperacion) then
    CloseFrame;
end;

function TfrEmpresa.AnadirDatos : boolean;
begin
  Result := False;
  try
    TablaEmpresas.Post;
    //Creamos los trimestres y libros para la nueva empresa
    CodigoEmpresa := TablaEmpresas.FieldByName('CODIGO').AsString;
    Commit;
    TablaEmpresas.Close;
    Result := True;
  except
    on E : EIBError do begin
      if E.IBErrorCode = isc_unique_key_violation then
      begin
        VerMensajeFmt(msgEmpCodEmpRepetido, [CodigoEmpresa]);
        TablaEmpresas.Edit;
      end
      else
        TratarExcepcion(E);
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrEmpresa.ModificarDatos : boolean;
begin
  Result := False;
  try
    TablaEmpresas.Post;
    Commit;
    TablaEmpresas.Close;

    //Refrescamos la empresa activa en el caso de se la empresa modificada
    if (EmpresaActiva.Codigo = CodigoEmpresa) then
      EmpresaActiva.Refrescar;

    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrEmpresa.EliminarDatos : boolean;
begin
  Result := False;
  if (VerMensajePregunta(msgEmpBorrarEmp) <> IDYES) then
    Exit;
  try
    TablaEmpresas.Delete;
    Commit;
    TablaEmpresas.Close;
    Result := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : VerMensajeFmt(msgEmpEmpBloqueado, [Nombre.Text]);
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrEmpresa.ActivarModoAnadir;
var
  CodNuevo : Variant;

begin
  dsEmpresas.AutoEdit := True;
  Provincia.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;

  try
    CodNuevo := dmTablaEmpresas.DarNuevoCodigo;

    with TablaEmpresas do
    begin
      Close;
      Prepare;
      Open;
      FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
      Insert;
      FieldByName('CODIGO').AsString := CodNuevo;
      FieldByName('MODELOINFORME').AsInteger := 0;
    end;

    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrEmpresa.ActivarModoModificar;
begin
  dsEmpresas.AutoEdit := True;
  Provincia.Properties.Buttons[0].Visible := True;
  Poblacion.Properties.Buttons[0].Visible := True;

  try
    with TablaEmpresas do
    begin
      Prepare;
      Open;
      FieldByName('PROVINCIA').OnSetText := ProvinciaSetText;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgEmpNoExisteEmp, [CodigoEmpresa]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
      // Bloquear el Empresa
      Edit;
      Post;
      Edit;
    end;
    Visible := True;
  except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              VerMensajeFmt(msgEmpEmpBloqueado, [Nombre.Text]);
                              CancelarModificar;
                              CloseFrame;
                              Exit;
                            end
        else
          TratarExcepcion(E);
      end;
    end;
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrEmpresa.ActivarModoConsultar;
begin
  dsEmpresas.AutoEdit := False;
  Provincia.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;

  try
    with TablaEmpresas do
    begin
      Prepare;
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgEmpNoExisteEmp, [CodigoEmpresa]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
    end;

    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrEmpresa.ActivarModoEliminar;
begin
  dsEmpresas.AutoEdit := False;
  Provincia.Properties.Buttons[0].Visible := False;
  Poblacion.Properties.Buttons[0].Visible := False;

  try
    with TablaEmpresas do
    begin
      Prepare;
      Open;
      if RecordCount = 0 then
      begin
        VerMensajeFmt(msgEmpNoExisteEmp, [CodigoEmpresa]);
        CancelarModificar;
        CloseFrame;
        Exit;
      end;
    end;

    Visible := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrEmpresa.BuscarEmpresa;
begin
  if Transaccion = NIL then
    exit;
  try
    TablaEmpresas.Close;

    // Buscar la fila a tratar si es necesario
    if not esCadenaVacia(CodigoEmpresa) then
    begin
        TablaEmpresas.Params.ByName('CODIGO').AsString := CodigoEmpresa;
    end;
    TablaEmpresas.Prepare;
    TablaEmpresas.Open;

  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrEmpresa.CancelarAnadir: Boolean;
begin
  Result := False;
  try
    RollBack;

    TablaEmpresas.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrEmpresa.CancelarEliminar: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaEmpresas.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

function TfrEmpresa.CancelarModificar: Boolean;
begin
  Result := False;
  try
    RollBack;
    TablaEmpresas.Close;
    Result := True;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

destructor TfrEmpresa.Destroy;
begin
  TablaEmpresas.Close;
  TablaEmpresas.UnPrepare;
  TablaEmpresas.Free;

  inherited;
end;

procedure TfrEmpresa.FreeContenido;
begin
  if (ContenidoModal is TRdxFrameEmpresas) then begin
    CodigoEmpresa := (ContenidoModal as TRdxFrameEmpresas).CodigoEmpresa;
    ActivarModo;
  end;
  if (ContenidoModal is TRdxFrameProvincias) then
    CodigoProvincia := (ContenidoModal as TRdxFrameProvincias).CodigoProvincia;
  if (ContenidoModal is TRdxFramePoblaciones) then begin
    CodigoProvincia := (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia;
    CodigoPoblacion := (ContenidoModal as TRdxFramePoblaciones).CodigoPoblacion;
  end;
  inherited FreeContenido;
end;

procedure TfrEmpresa.SetCodigoPoblacion(Value: Variant);
begin
  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoPoblacion := Value;
    Poblacion.DataBinding.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion);
  end;
end;

procedure TfrEmpresa.SetCodigoProvincia(Value: Variant);
begin
  if (not EsCadenaVacia(Value)) then
  begin
    FCodigoProvincia := Value;
    Provincia.DataBinding.Field.AsString := dmTablaProvincias.DarNombreProvincia(FCodigoProvincia);
  end;
end;

procedure TfrEmpresa.VerModal;
begin
  if (ContenidoModal is TRdxFramePoblaciones) then
    (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := CodigoProvincia;
  inherited;
end;

procedure TfrEmpresa.bCancelarClick(Sender: TObject);
begin
  if (TratarCambios = IDOK) then
    CloseFrame;
end;

procedure TfrEmpresa.GridBotonPoblacionClick(Sender: TObject; AButtonIndex: Integer);
begin
  if (esCadenaVacia(CodigoProvincia)) then begin
    VerMensaje(msgSinProvincia);
    Provincia.setFocus;
    Exit;
  end;
  CodigoProvincia := CodigoProvincia;
  CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.darNombreProvincia(CodigoProvincia)]);
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrPoblaciones.Create(Self);
end;

function TfrEmpresa.ComprobarDatos: Boolean;
begin
  Result := False;

  if Length(Trim(Nombre.Text)) = 0 then
  begin
    VerMensajeFmt(msgEmpFaltaAlgo,[msgEmpNombre]);
    Nombre.SetFocus;
    exit;
  end;
  Result := True;
end;

procedure TfrEmpresa.GridBotonProvinciaClick(Sender: TObject; AButtonIndex: Integer);
begin
  CaptionModal := msgListaProvincias;
  WidthModal := 280;
  HeightModal := 460;
  ContenidoModal := TfrProvincias.Create(Self);
end;

procedure TfrEmpresa.bExaminarClick(Sender: TObject);
begin
  Logotipo.LoadFromFile;
end;

procedure TfrEmpresa.ProvinciaSetText(Sender: TField;
  const Text: String);
begin
  FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Text);
  Sender.AsString := Text;
end;

procedure TfrEmpresa.CambiarModo(ModoAnterior, Modo: TRdxModo);
begin
  inherited;

end;

end.
