Usuario.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. <?php
  2. namespace app\models;
  3. use common\data\Respuesta;
  4. use Yii;
  5. use yii\db\Expression;
  6. use yii\db\Query;
  7. /**
  8. * This is the model class for table "Usuario".
  9. *
  10. * @property string $id
  11. * @property string $correo
  12. * @property string $clave
  13. * @property string $nombre
  14. * @property int|null $estatus 0:inactivo, 1:activo
  15. * @property string $telefono
  16. * @property string|null $alias
  17. * @property string|null $foto
  18. * @property string $rol
  19. * @property string|null $creado
  20. * @property string|null $modificado
  21. * @property string|null $eliminado
  22. *
  23. */
  24. class Usuario extends ModeloBase {
  25. public const ACTIVO = 1;
  26. public const INACTIVO = 0;
  27. const ROL_ADMIN = "admin";
  28. const ROL_USUARIO = "usuario";
  29. const ROL_UNIDAD_ADMINISTRATIVA = "unidadAdministrativa";
  30. private $_permisos = [];
  31. /**
  32. * {@inheritdoc}
  33. */
  34. public static function tableName() {
  35. return 'Usuario';
  36. }
  37. /**
  38. * {@inheritdoc}
  39. */
  40. public function rules() {
  41. return [
  42. [['id', 'correo', 'clave', 'rol'], 'required'],
  43. [['estatus', 'nombre', 'telefono'], 'default', 'value' => null],
  44. [['estatus'], 'integer'],
  45. [['creado', 'modificado', 'eliminado'], 'safe'],
  46. [['id'], 'string', 'max' => 36],
  47. [['correo', 'clave', 'nombre', 'telefono', 'alias', 'rol'], 'string', 'max' => 100],
  48. [['foto'], 'string', 'max' => 300],
  49. [['id'], 'unique'],
  50. ];
  51. }
  52. /**
  53. * {@inheritdoc}
  54. */
  55. public function attributeLabels() {
  56. return [
  57. 'id' => 'ID',
  58. 'correo' => 'Correo',
  59. 'clave' => 'Clave',
  60. 'nombre' => 'Nombre',
  61. 'estatus' => 'Estatus',
  62. 'telefono' => 'Telefono',
  63. 'alias' => 'Alias',
  64. 'foto' => 'Foto',
  65. 'rol' => 'Rol',
  66. 'creado' => 'Creado',
  67. 'modificado' => 'Modificado',
  68. 'eliminado' => 'Eliminado',
  69. 'idSujetoObligado' => 'Id Sujeto Obligado',
  70. 'idPonencia' => 'Id Ponencia',
  71. 'verificarCorreo' => 'Verificar Correo',
  72. ];
  73. }
  74. /**
  75. * Gets query for [[media]].
  76. *
  77. * @return \yii\db\ActiveQuery
  78. */
  79. public function getMedia() {
  80. return $this->hasMany(Media::class, ['idUsuario' => 'id']);
  81. }
  82. public function getPermisos() {
  83. return $this->hasMany(PermisoUsuario::class, ['idUsuario' => 'id'])
  84. ->select("idPermiso")
  85. ->column();
  86. }
  87. /**
  88. * Gets query for [[recursosRevision]].
  89. *
  90. * @return \yii\db\ActiveQuery
  91. */
  92. public function getRecursosRevision() {
  93. return $this->hasMany(RecursoRevision::class, ['idPonencia' => 'id']);
  94. }
  95. public function getEstatusPermiso() {
  96. return $this->hasMany(EstatusPermisoUsuario::class, ['idUsuario' => 'id']);
  97. }
  98. /**
  99. * Gets query for [[IdPonencia0]].
  100. *
  101. * @return \yii\db\ActiveQuery
  102. */
  103. public function getPonencia() {
  104. return $this->hasOne(Ponencia::class, ['id' => 'idPonencia']);
  105. }
  106. /**
  107. * Gets query for [[sujetoObligado]].
  108. *
  109. * @return \yii\db\ActiveQuery
  110. */
  111. public function getSujetoObligado() {
  112. return $this->hasOne(SujetoObligado::class, ['id' => 'idSujetoObligado']);
  113. }
  114. public function agregarClave($pwd) {
  115. $this->clave = Yii::$app->getSecurity()->generatePasswordHash($pwd);
  116. }
  117. public function validarClave($pwd) {
  118. return Yii::$app->getSecurity()->validatePassword($pwd, $this->clave);
  119. }
  120. /**
  121. * Consulta si el usuario cuenta con el permiso proporcionado.
  122. * @param string $permiso Valor del permiso a evaluar.
  123. * @return bool Regresa cierto si cuenta con permiso, de lo contrario, regresa falso.
  124. */
  125. public function tienePermiso($permiso = null) {
  126. if ($permiso === null) {
  127. return false;
  128. }
  129. $permisos = $this->cargarPermisos($permiso);
  130. return isset($permisos[$permiso]) && $permisos[$permiso];
  131. }
  132. /**
  133. * Consulta en la base de datos si el usuario cuenta con los permisos proporcionados.
  134. * @param string|array $permiso Valor del permiso a evaluar | lista de permisos a evaluar.
  135. * @return array Regresa un arreglo donde especifica, por permiso, si el usuario cuenta con algún permiso.
  136. *
  137. * [
  138. * 'clave_permiso_encontrado' => true,
  139. * 'clave_permiso_no_encontrado' => false
  140. * ]
  141. */
  142. public function cargarPermisos($permiso = null) {
  143. $noEstan = [];
  144. $permisosVacios = empty($this->_permisos);
  145. if (!$permisosVacios) {
  146. if (is_array($permiso)) {
  147. foreach ($permiso as $p) {
  148. if (!isset($this->_permisos[$p])) {
  149. $noEstan[] = $p;
  150. }
  151. }
  152. } else if (!isset($this->_permisos[$permiso])) {
  153. $noEstan[] = $permiso;
  154. }
  155. }
  156. if ($permisosVacios || !empty($noEstan)) {
  157. $permisosQuery = (new Query())
  158. ->select([
  159. 'case when ({{PermisoUsuario}}.[[idUsuario]] is not null) then true else false end as [[idUsuario]]',
  160. '{{Permiso}}.id',
  161. ])
  162. ->from('Permiso')
  163. ->leftJoin(
  164. 'PermisoUsuario',
  165. '{{PermisoUsuario}}.[[idPermiso]] = {{Permiso}}.id and {{PermisoUsuario}}.[[idUsuario]] = :idUsuario',
  166. [':idUsuario' => $this->id]
  167. )
  168. ->andWhere([
  169. // 'idPermiso' => $permiso,
  170. '{{PermisoUsuario}}.eliminado' => null
  171. ]);
  172. if ($permisosVacios) {
  173. $permisosQuery->andWhere(['{{Permiso}}.id' => $permiso]);
  174. } else {
  175. $permisosQuery->andWhere(['{{Permiso}}.id' => $noEstan]);
  176. }
  177. $aux = $permisosQuery->indexBy('id')
  178. ->column();
  179. if ($permisosVacios) {
  180. $this->_permisos = $aux;
  181. } else {
  182. foreach ($aux as $indice => $valor) {
  183. $this->_permisos[$indice] = $valor;
  184. }
  185. }
  186. }
  187. return $this->_permisos;
  188. }
  189. public function validarPerfilPermisos() {
  190. $permisos = $this->cargarPermisos();
  191. $flag = false;
  192. foreach ($permisos as $permiso) {
  193. if ($permiso) {
  194. $flag = true;
  195. break;
  196. }
  197. }
  198. return $flag;
  199. }
  200. public static function crearSolicitante($rol = null, $idUsuario = "") {
  201. $permisoSolicitante = (new Query())
  202. ->select('{{ColeccionPermisoPermiso}}.[[idPermiso]]')
  203. ->from('ColeccionPermisoPermiso')
  204. ->innerJoin('ColeccionPermiso', '{{ColeccionPermisoPermiso}}.[[idColeccion]] = {{ColeccionPermiso}}.id')
  205. ->andWhere(['{{ColeccionPermiso}}.clave' => "SOLICITANTE"])
  206. ->column();
  207. if ($rol === Usuario::ROL_USUARIO && $permisoSolicitante !== null) {
  208. foreach ($permisoSolicitante as $permiso) {
  209. $permisos = new PermisoUsuario();
  210. $permisos->idUsuario = $idUsuario;
  211. $permisos->idPermiso = $permiso;
  212. $permisos->asignado = new Expression('now()');
  213. $permisos->uuid();
  214. if (!$permisos->save()) {
  215. return (new Respuesta($permiso))
  216. ->mensaje("Ocurrió un problema al asignar permisos");
  217. }
  218. }
  219. }
  220. }
  221. }