unit uDataModuleUsuarios; interface uses {vcl:} SysUtils, Classes, DB, DBClient, {RemObjects:} uDAClientDataModule, uDADataTable, uDABINAdapter, uROServiceComponent, uRORemoteService, uROClient, uROBinMessage, uROWinInetHttpChannel, uDAScriptingProvider, uDACDSDataTable, FactuGES_Intf, uIntegerListUtils, uBizEmpresas, uDADataStreamer; const PERFIL_ADMINISTRADORES = 'Administradores'; type TdmUsuarios = class(TDAClientDataModule) ROLoginService: TRORemoteService; DABINAdapter: TDABINAdapter; procedure DAClientDataModuleCreate(Sender: TObject); procedure DAClientDataModuleDestroy(Sender: TObject); private 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); public 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; end; var dmUsuarios: TdmUsuarios; implementation {$R *.DFM} uses Forms, Controls, uDataTableUtils, uDataModuleConexion, uLoginForm, uCambiarPassword, Dialogs, Windows, uEmpresasController; { TDAClientDataModule1 } procedure TdmUsuarios.DAClientDataModuleCreate(Sender: TObject); begin ROLoginService.Channel := dmConexion.Channel; ROLoginService.Message := dmConexion.Message; FEmpresaActual := nil; FUsuario := ''; FPassword := ''; FLoginInfo := NIL; end; function TdmUsuarios.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 TdmUsuarios.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 TdmUsuarios.Logout; begin (ROLoginService as IsrvLogin).Logout; if Assigned(FLoginInfo) then FreeANDNil(FLoginInfo); FUsuario := ''; FPassword := ''; end; procedure TdmUsuarios.SetEmpresaActual(const Value: IBizEmpresa); begin FEmpresaActual := Value; FEmpresaActual.DataTable.Active := True; end; procedure TdmUsuarios.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 TdmUsuarios.DAClientDataModuleDestroy(Sender: TObject); begin if Assigned(FLoginInfo) then FreeANDNil(FLoginInfo); end; function TdmUsuarios.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 TdmUsuarios.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 TdmUsuarios.GetIDEmpresaActual: Integer; begin if not Assigned(FEmpresaActual) then Result := ID_NULO else Result := FEmpresaActual.ID; end; procedure TdmUsuarios.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 TdmUsuarios.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; initialization dmUsuarios := TdmUsuarios.Create(nil); finalization FreeAndNil(dmUsuarios); end.