EventoController.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <?php
  2. namespace v1\controllers;
  3. use common\data\Respuesta;
  4. use common\rest\AuthController;
  5. use yii\db\Expression;
  6. use yii\db\Query;
  7. class EventoController extends AuthController {
  8. public $modelClass = "v1\models\Evento";
  9. public $modelName = "Evento";
  10. public function actionIndex() {
  11. $id = intval($this->req->get("id", ""));
  12. $q = trim($this->req->get("q", ""));
  13. $query = $this->queryInicial;
  14. if($id > 0) {
  15. $query->andWhere(["id" => $id]);
  16. }
  17. if($q !== "") {
  18. # Ejemplo de buscador
  19. $query->andWhere([
  20. "OR",
  21. ["ilike", "nombre", $q],
  22. // ["ilike", "direccion", $q],
  23. ]);
  24. //
  25. }
  26. return new Respuesta($query, $this->limite, $this->pagina, $this->ordenar);
  27. }
  28. public function actionGuardar() {
  29. $id = intval($this->req->getBodyParam("id", null));
  30. $modelo = null;
  31. if($id > 0) {
  32. $modelo = $this->modelClass::findOne($id);
  33. }
  34. if($modelo === null) {
  35. $modelo = new $this->modelClass();
  36. $modelo->creado = new Expression('now()');
  37. $modelo->idUsuarioCreador = $this->usuario->id;
  38. } else {
  39. $modelo->modificado = new Expression('now()');
  40. }
  41. $modelo->load($this->req->getBodyParams(), '');
  42. if (!$modelo->save()) {
  43. return (new Respuesta($modelo))
  44. ->mensaje("Hubo un problema al guardar el {$this->modelName}");
  45. }
  46. $modelo->refresh();
  47. return (new Respuesta($modelo))
  48. ->mensaje("{$this->modelName} guardado correctamente");
  49. }
  50. public function actionEliminar() {
  51. $id = intval($this->req->getBodyParam("id", null));
  52. $modelo = null;
  53. if($id > 0) {
  54. $modelo = $this->modelClass::findOne(["id" => $id]);
  55. }
  56. if($modelo === null) {
  57. return (new Respuesta())
  58. ->esError()
  59. ->mensaje("{$this->modelName} no encontrado");
  60. }
  61. $modelo->eliminado = null;
  62. if(!$modelo->save()) {
  63. return (new Respuesta($modelo))
  64. ->mensaje("No se pudo eliminar el {$this->modelName}");
  65. }
  66. return (new Respuesta())
  67. ->mensaje("{$this->modelName} eliminado");
  68. }
  69. public function actionResultadosIndividuales() {
  70. $idUsuario = intval($this->req->getBodyParam("idUsuario", null));
  71. $fechaInicio = trim($this->req->getBodyParam("fechaInicio", ""));
  72. $fechaFinal = trim($this->req->getBodyParam("fechaFinal", ""));
  73. $query = (new Query())
  74. ->select([
  75. "{{Evento}}.id as eventoId",
  76. "{{Resultado}}.accion as accionRes",
  77. ])
  78. ->from("Evento")
  79. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  80. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  81. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  82. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  83. ->andWhere([
  84. "AND",
  85. [">=", "fechaInicio", $fechaInicio],
  86. ["<=", "fechaFinal", $fechaFinal],
  87. ])
  88. ->andWhere(["{{UsuarioGrupo}}.[[idUsuario]]" => $idUsuario])
  89. ->orderBy(["eventoId" => SORT_ASC]);
  90. $total = 0;
  91. $participo = 0;
  92. foreach($query->each() as $resultado) {
  93. $total++;
  94. if ($resultado["accionRes"] !== null) {
  95. $participo ++;
  96. }
  97. }
  98. return (new Respuesta())
  99. ->detalle([
  100. "total" => $total,
  101. "participo" => $participo,
  102. "pendientes" => ($total - $participo)
  103. ]);
  104. }
  105. public function actionResultadosDependencia() {
  106. $idDependencia = intval($this->req->getBodyParam("idDependencia", null));
  107. $fechaInicio = trim($this->req->getBodyParam("fechaInicio", ""));
  108. $fechaFinal = trim($this->req->getBodyParam("fechaFinal", ""));
  109. $query = (new Query())
  110. ->select([
  111. "{{Evento}}.id as eventoId",
  112. "{{Resultado}}.accion as accionRes",
  113. ])
  114. ->from("Evento")
  115. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  116. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  117. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  118. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  119. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioDependencia}}.[[idUsuario]]")
  120. ->andWhere([
  121. "AND",
  122. [">=", "fechaInicio", $fechaInicio],
  123. ["<=", "fechaFinal", $fechaFinal],
  124. ])
  125. ->andWhere(["{{UsuarioDependencia}}.[[idDependencia]]" => $idDependencia])
  126. ->orderBy(["eventoId" => SORT_ASC]);
  127. $total = 0;
  128. $participo = 0;
  129. foreach($query->each() as $resultado) {
  130. $total++;
  131. if ($resultado["accionRes"] !== null) {
  132. $participo ++;
  133. }
  134. }
  135. return (new Respuesta())
  136. ->detalle([
  137. "total" => $total,
  138. "participo" => $participo,
  139. "pendientes" => ($total - $participo)
  140. ]);
  141. }
  142. public function actionComparativaDependencia() {
  143. $fechaInicio = trim($this->req->getBodyParam("fechaInicio", ""));
  144. $fechaFinal = trim($this->req->getBodyParam("fechaFinal", ""));
  145. $query = (new Query())
  146. ->select([
  147. "{{Dependencia}}.id as dependenciaId",
  148. "{{Dependencia}}.nombre as dependenciaNombre",
  149. "COUNT({{Resultado}}.[[idUsuario]]) filter ( where {{Resultado}}.[[idUsuario]] is not null ) as conteoNotNull",
  150. "COUNT({{UsuarioGrupo}}.[[idUsuario]]) as totalDependencia"
  151. ])
  152. ->from("Evento")
  153. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  154. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  155. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  156. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  157. ->innerJoin("Dependencia", "{{Dependencia}}.id = {{UsuarioDependencia}}.[[idDependencia]]")
  158. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioDependencia}}.[[idUsuario]]")
  159. ->andWhere([
  160. "AND",
  161. [">=", "fechaInicio", $fechaInicio],
  162. ["<=", "fechaFinal", $fechaFinal],
  163. ])
  164. ->groupBy([
  165. "dependenciaId",
  166. "dependenciaNombre"
  167. ])
  168. ->orderBy(["dependenciaNombre" => SORT_ASC]);
  169. $data = [];
  170. foreach($query->each() as $resultado) {
  171. $data[] = [
  172. "id" => $resultado["dependenciaId"],
  173. "nombre" => $resultado["dependenciaNombre"],
  174. "participaciones" => $resultado["conteoNotNull"],
  175. "pendientes" => $resultado["totalDependencia"] - $resultado["conteoNotNull"]
  176. ];
  177. }
  178. return (new Respuesta())
  179. ->detalle($data);
  180. }
  181. public function actionPorEvento() {
  182. $idEvento = intval($this->req->getBodyParam("idEvento", null));
  183. $fechaInicio = trim($this->req->getBodyParam("fechaInicio", ""));
  184. $fechaFinal = trim($this->req->getBodyParam("fechaFinal", ""));
  185. $queryUsuario = (new Query())
  186. ->select([
  187. "{{Evento}}.id as eventoId",
  188. "{{Resultado}}.accion as accionRes",
  189. ])
  190. ->from("Evento")
  191. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  192. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  193. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  194. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  195. ->andWhere([
  196. "AND",
  197. [">=", "fechaInicio", $fechaInicio],
  198. ["<=", "fechaFinal", $fechaFinal],
  199. ])
  200. ->andWhere(["{{Evento}}.id" => $idEvento])
  201. ->orderBy(["eventoId" => SORT_ASC]);
  202. $totalUsuario = 0;
  203. $participoUsuario = 0;
  204. foreach($queryUsuario->each() as $resultado) {
  205. $totalUsuario++;
  206. if ($resultado["accionRes"] !== null) {
  207. $participoUsuario ++;
  208. }
  209. }
  210. $queryDependencia = (new Query())
  211. ->select([
  212. "{{Evento}}.id as eventoId",
  213. "{{Resultado}}.accion as accionRes",
  214. ])
  215. ->from("Evento")
  216. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  217. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  218. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  219. ->innerJoin("UsuarioDependencia", '{{UsuarioDependencia}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]')
  220. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  221. ->andWhere([
  222. "AND",
  223. [">=", "fechaInicio", $fechaInicio],
  224. ["<=", "fechaFinal", $fechaFinal],
  225. ])
  226. ->andWhere(["{{Evento}}.id" => $idEvento])
  227. ->orderBy(["eventoId" => SORT_ASC]);
  228. $totalDependencia = 0;
  229. $participoDependencia = 0;
  230. foreach($queryDependencia->each() as $resultado) {
  231. $totalDependencia++;
  232. if ($resultado["accionRes"] !== null) {
  233. $participoDependencia ++;
  234. }
  235. }
  236. return (new Respuesta())
  237. ->detalle([
  238. "totalResultadosDependencias" => $totalDependencia,
  239. "participoResultadosDependencias" => $participoDependencia,
  240. "pendientesResultadosDependencias" => ($totalDependencia - $participoDependencia),
  241. "totalResultadosUsuarios" => $totalUsuario,
  242. "participoResultadosUsuarios" => $participoUsuario,
  243. "pendientesResultadosUsuarios" => ($totalUsuario - $participoUsuario)
  244. ]);
  245. }
  246. }