unit uDataModuleUsuarios; interface uses SysUtils, Classes, DB, DBClient, uDADataTable, FactuGES_Intf, uIntegerListUtils, uBizEmpresas, UCBase, UCDataConnector, uUCROConn, uDARemoteDataAdapter, uDARemoteCommand, uROClient, uRORemoteService, uDADataStreamer, uDABin2DataStreamer, uDAScriptingProvider, uIDataModuleUsuarios; const PERFIL_ADMINISTRADORES = 'Administradores'; type TDataModuleUsuarios = class(TDataModule, IDataModuleUsuarios) ROLoginService: TRORemoteService; srvUsuarios: TRORemoteService; Bin2DataStreamer: TDABin2DataStreamer; procedure DAClientDataModuleCreate(Sender: TObject); procedure DAClientDataModuleDestroy(Sender: TObject); private FDataConnector : TUCROConn; FUsuario : String; FPassword : String; // Lo guardo para poder hacer una reconexión FLoginInfo: TRdxLoginInfo; FEmpresaActual: IBizEmpresa; function CambiarPassword (const APassword : String) : boolean; overload; function GetEsAdministrador: Boolean; function GetEmpresas: TIntegerList; procedure SetEmpresaActual(const Value: IBizEmpresa); function GetIDEmpresaActual: Integer; procedure SetIDEmpresaActual(const Value: Integer); function GetDataConnector : TUCDataConnector; public procedure InicializarCamposUserControl (AUserControl : TUserControl); function Login: Boolean; overload; function Login(Usuario: String; Password: String): Boolean; overload; procedure Logout; procedure CambiarPassword; overload; property EsAdministrador : Boolean read GetEsAdministrador; property IDEmpresaActual : Integer read GetIDEmpresaActual write SetIDEmpresaActual; property EmpresaActual : IBizEmpresa read FEmpresaActual write SetEmpresaActual; property Empresas : TIntegerList read GetEmpresas; property LoginInfo: TRdxLoginInfo read FLoginInfo; property DataConnector : TUCDataConnector read GetDataConnector; end; implementation {$R *.DFM} uses Forms, Controls, uDataTableUtils, uDataModuleConexion, uLoginForm, uCambiarPassword, Dialogs, Windows, uEmpresasController, schUsuariosClient_Intf; { TDAClientDataModule1 } procedure TDataModuleUsuarios.DAClientDataModuleCreate(Sender: TObject); begin ROLoginService.Channel := dmConexion.Channel; ROLoginService.Message := dmConexion.Message; FDataConnector := TUCROConn.Create(nil); FDataConnector.RemoteService := srvUsuarios; FUsuario := ''; FPassword := ''; FLoginInfo := NIL; end; function TDataModuleUsuarios.Login: Boolean; begin // Intento hacer login si el usuario ya lo había hecho antes if (Length(FUsuario) > 0) then if Login(FUsuario, FPassword) then begin Result := True; Exit; end; // Si no funcionar el login anterior o es la primera vez, // saco la pantalla de login with TfLoginForm.Create(NIL) do try if Assigned(FLoginInfo) then edtUser.Text := FLoginInfo.Usuario; Result := (ShowModal = mrOK) finally Free; end; end; function TDataModuleUsuarios.Login(Usuario: String; Password: String): Boolean; begin // Libero la información del login anterior (sesión, etc) if Assigned(FLoginInfo) then FreeANDNil(FLoginInfo); Result := (ROLoginService as IsrvLogin).Login(Usuario, Password, FLoginInfo); if Result then begin // Lo guardo para poder reconectarme FUsuario := Usuario; FPassword := Password; end; end; procedure TDataModuleUsuarios.Logout; begin (ROLoginService as IsrvLogin).Logout; if Assigned(FLoginInfo) then FreeANDNil(FLoginInfo); FUsuario := ''; FPassword := ''; end; procedure TDataModuleUsuarios.SetEmpresaActual(const Value: IBizEmpresa); begin FEmpresaActual := Value; FEmpresaActual.DataTable.Active := True; end; procedure TDataModuleUsuarios.SetIDEmpresaActual(const Value: Integer); var AEmpresasController : IEmpresasController; AEmpresa : IBizEmpresa; begin AEmpresasController := TEmpresasController.Create; AEmpresa := AEmpresasController.Buscar(Value); AEmpresa.DataTable.Active := True; if not AEmpresa.IsEmpty then begin FEmpresaActual := AEmpresa; FEmpresaActual.DataTable.Active := True; end else FEmpresaActual := NIL; end; procedure TDataModuleUsuarios.DAClientDataModuleDestroy(Sender: TObject); begin if Assigned(FDataConnector) then FreeANDNIL(FDataConnector); if Assigned(FLoginInfo) then FreeANDNIL(FLoginInfo); end; function TDataModuleUsuarios.GetDataConnector: TUCDataConnector; begin Result := FDataConnector; end; function TDataModuleUsuarios.GetEmpresas: TIntegerList; var i : integer; begin Result := TIntegerList.Create; if not Assigned(FLoginInfo) then raise Exception.Create('Usuario no validado en el sistema (login)'); for i := 0 to FLoginInfo.Empresas.Count - 1 do Result.Add(FLoginInfo.Empresas.Items[i]); end; function TDataModuleUsuarios.GetEsAdministrador: Boolean; var I: Integer; begin Result := False; if not Assigned(FLoginInfo) then raise Exception.Create('Usuario no validado en el sistema (login)'); for I := 0 to FLoginInfo.Perfiles.Count - 1 do if FLoginInfo.Perfiles.Items[I] = PERFIL_ADMINISTRADORES then begin Result := True; Break; end; end; function TDataModuleUsuarios.GetIDEmpresaActual: Integer; begin if not Assigned(FEmpresaActual) then Result := ID_NULO else Result := FEmpresaActual.ID; end; procedure TDataModuleUsuarios.InicializarCamposUserControl( AUserControl: TUserControl); begin if not Assigned(AUserControl) then raise Exception.Create('UserControl no asignado (InicializarUserControl)'); with AUserControl do begin DataConnector := FDataConnector; with TableUsers do begin TableName := nme_USUARIOS; FieldUserID := fld_USUARIOSID; FieldUserName := fld_USUARIOSUSERNAME; FieldLogin := fld_USUARIOSLOGIN; FieldPassword := fld_USUARIOSPASS; FieldEmail := fld_USUARIOSEMAIL; FieldPrivileged := fld_USUARIOSPRIVILEGED; FieldTypeRec := fld_USUARIOSTIPO; FieldProfile := fld_USUARIOSID_PERFIL; FieldUserExpired := fld_USUARIOSBLOQUEADO; FieldDateExpired := fld_USUARIOSPASSEXPIRED; FieldUserDaysSun := fld_USUARIOSUSERDAYSSUN; FieldKey := fld_USUARIOSCHECKSUM; end; with TableRights do begin TableName := nme_PERMISOS; FieldUserID := fld_PERMISOSID_USUARIO; FieldModule := fld_PERMISOSMODULO; FieldComponentName := fld_PERMISOSNOMBRECOMP; FieldFormName := fld_PERMISOSEXNOMBREFORM; FieldKey := fld_PERMISOSCHECKSUM; end; with TableUsersLogged do begin TableName := nme_USUARIOS_LOGON; FieldLogonID := fld_USUARIOS_LOGONLOGONID; FieldUserID := fld_USUARIOS_LOGONID_USUARIO; FieldApplicationID := fld_USUARIOS_LOGONAPLICACION; FieldMachineName := fld_USUARIOS_LOGONEQUIPO; FieldData := fld_USUARIOS_LOGONDATA; end; with TableHistory do begin TableName := nme_USUARIOS_EVENTOS; FieldApplicationID := fld_USUARIOS_EVENTOSAPLICACION; FieldUserID := fld_USUARIOS_EVENTOSID_USUARIO; FieldEventDate := fld_USUARIOS_EVENTOSFECHA; FieldEventTime := fld_USUARIOS_EVENTOSHORA; FieldForm := fld_USUARIOS_EVENTOSFORM; FieldCaptionForm := fld_USUARIOS_EVENTOSTITULO_FORM; FieldEvent := fld_USUARIOS_EVENTOSEVENTO; FieldObs := fld_USUARIOS_EVENTOSNOTAS; FieldTableName := fld_USUARIOS_EVENTOSTNAME; end; with TableEmpresa do begin Active := False; end; end; end; procedure TDataModuleUsuarios.CambiarPassword; begin with TfCambiarPassword.Create(NIL) do try if ShowModal = mrOk then if CambiarPassword(edtPassword.Text) then Application.MessageBox('La contraseña ha sido cambiada correctamente.', 'Información', MB_OK); finally Free; end; end; function TDataModuleUsuarios.CambiarPassword(const APassword: String): boolean; begin { if not (ROLoginService as IsrvLogin).SetUserPassword(LoginInfo.UserID, APassword) then raise Exception.Create('Error en el servidor. No se ha podido cambiar la contraseña');} Result := True; end; end.