EventoController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  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. "{{Evento}}.redSocial as redSocial",
  78. "{{Usuario}}.[[facebookVerificado]] as facebookVerificado",
  79. "{{Usuario}}.[[twitterVerificado]] as twitterVerificado",
  80. "{{Usuario}}.[[instagramVerificado]] as instagramVerificado",
  81. ])
  82. ->from("Evento")
  83. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  84. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  85. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  86. ->innerJoin("Usuario", "{{UsuarioGrupo}}.[[idUsuario]] = {{Usuario}}.id")
  87. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  88. ->orderBy(["eventoId" => SORT_ASC]);
  89. /* $query = (new Query())
  90. ->select([
  91. "{{Usuario}}.nombre as nombre",
  92. "{{Usuario}}.facebook as facebook",
  93. "{{Usuario}}.facebookVerificado as facebookVerificado",
  94. "{{Usuario}}.twitter as twitter",
  95. "{{Usuario}}.twitterVerificado as twitterVerificado",
  96. "{{Usuario}}.instagram as instagram",
  97. "{{Usuario}}.instagramVerificado as instagramVerificado",
  98. "{{Usuario}}.id as uId",
  99. // "{{Evento}}.id as eventoId",
  100. // "{{Evento}}.redSocial",
  101. "count({{Evento}}.id) as cantidadEventos",
  102. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = Facebook) as eventosFacebook",
  103. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = Twitter) as eventosTwitter",
  104. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = Instagram) as eventosInstagram",
  105. "count({{Resultado}}.accion) as cantidadResultados",
  106. "(count({{Evento}}.id) - count({{Resultado}}.accion)) as cantidadPendientes",
  107. ])
  108. ->from("Evento")
  109. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  110. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  111. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  112. ->innerJoin("Usuario", "{{Usuario}}.id = {{UsuarioGrupo}}.[[idUsuario]]")
  113. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
  114. ->groupBy(["{{Usuario}}.nombre", "facebook", "facebookVerificado", "twitter", "twitterVerificado", "instagram", "instagramVerificado", "uId"]); */
  115. // ->orderBy(["eventoId" => SORT_ASC]);
  116. if ($idUsuario > 0) {
  117. $query->andWhere(["{{UsuarioGrupo}}.[[idUsuario]]" => $idUsuario]);
  118. }
  119. if ($fechaInicio != "" && $fechaFinal != ""){
  120. $query->andWhere([
  121. "AND",
  122. [">=", "fechaInicio", $fechaInicio],
  123. ["<=", "fechaFinal", $fechaFinal],
  124. ]);
  125. }
  126. $total = 0;
  127. $participo = 0;
  128. foreach($query->each() as $resultado) {
  129. $total++;
  130. if ($resultado["redSocial"] === "Facebook" && !isset($resultado["facebookVerificado"])){
  131. $total--;
  132. } else if ($resultado["redSocial"] === "Twitter" && !isset($resultado["twitterVerificado"])){
  133. $total--;
  134. } else if ($resultado["redSocial"] === "Instagram" && !isset($resultado["instagramVerificado"])){
  135. $total--;
  136. }
  137. if ($resultado["accionRes"] !== null) {
  138. $participo ++;
  139. }
  140. };
  141. return (new Respuesta())
  142. ->detalle([
  143. "total" => $total,
  144. "participo" => $participo,
  145. "pendientes" => ($total - $participo)
  146. ]);
  147. // return new Respuesta($query);
  148. }
  149. public function actionResultadosDependencia() {
  150. $idDependencia = intval($this->req->getBodyParam("idDependencia", null));
  151. $fechaInicio = trim($this->req->getBodyParam("fechaInicio", ""));
  152. $fechaFinal = trim($this->req->getBodyParam("fechaFinal", ""));
  153. /* $query = (new Query())
  154. ->select([
  155. "{{Evento}}.id as eventoId",
  156. "{{Resultado}}.accion as accionRes",
  157. ])
  158. ->from("Evento")
  159. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  160. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  161. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  162. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  163. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioDependencia}}.[[idUsuario]]")
  164. ->andWhere([
  165. "AND",
  166. [">=", "fechaInicio", $fechaInicio],
  167. ["<=", "fechaFinal", $fechaFinal],
  168. ])
  169. ->andWhere(["{{UsuarioDependencia}}.[[idDependencia]]" => $idDependencia])
  170. ->orderBy(["eventoId" => SORT_ASC]); */
  171. $query = (new Query())
  172. ->select([
  173. "{{Usuario}}.nombre as nombre",
  174. "{{UsuarioDependencia}}.[[idDependencia]]",
  175. "{{Usuario}}.facebook as facebook",
  176. "{{Usuario}}.facebookVerificado as facebookVerificado",
  177. "{{Usuario}}.twitter as twitter",
  178. "{{Usuario}}.twitterVerificado as twitterVerificado",
  179. "{{Usuario}}.instagram as instagram",
  180. "{{Usuario}}.instagramVerificado as instagramVerificado",
  181. "{{Usuario}}.id as uId",
  182. "count({{Evento}}.id) as cantidadEventos",
  183. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Facebook' and {{Usuario}}.[[facebookVerificado]]) as eventosFacebook",
  184. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Twitter' and {{Usuario}}.[[twitterVerificado]]) as eventosTwitter",
  185. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Instagram' and {{Usuario}}.[[instagramVerificado]]) as eventosInstagram",
  186. "count({{Resultado}}.accion) as cantidadResultados",
  187. "(count({{Evento}}.id) - count({{Resultado}}.accion)) as cantidadPendientes",
  188. ])
  189. ->from("Evento")
  190. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  191. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  192. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  193. ->innerJoin("Usuario", "{{Usuario}}.[[id]] = {{UsuarioGrupo}}.[[idUsuario]]")
  194. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id")
  195. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
  196. ->groupBy([
  197. "{{Usuario}}.nombre",
  198. "{{UsuarioDependencia}}.[[idDependencia]]",
  199. "facebook",
  200. "[[facebookVerificado]]",
  201. "twitter",
  202. "[[twitterVerificado]]",
  203. "instagram",
  204. "[[instagramVerificado]]",
  205. "uId"
  206. ]);
  207. if ($idDependencia > 0) {
  208. $query->andWhere(["{{UsuarioDependencia}}.[[idDependencia]]" => $idDependencia]);
  209. }
  210. if ($fechaInicio != "" && $fechaFinal != ""){
  211. $query->andWhere([
  212. "AND",
  213. [">=", "fechaInicio", $fechaInicio],
  214. ["<=", "fechaFinal", $fechaFinal],
  215. ]);
  216. }
  217. $query2 = (new Query())
  218. ->select([
  219. "*",
  220. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) as [[cantidadEventos]]",
  221. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) - [[cantidadResultados]] as [[cantidadPendientes]]"
  222. ])
  223. ->from(["t" => $query]);
  224. // return new Respuesta($query2);
  225. $info = [];
  226. $totalEventos = 0;
  227. $eventosAtendidos = 0;
  228. $eventosPendientes = 0;
  229. foreach($query2->each() as $resultado) {
  230. $info[] = $resultado;
  231. $totalEventos += $resultado["cantidadEventos"];
  232. $eventosAtendidos += $resultado["cantidadResultados"];
  233. $eventosPendientes += $resultado["cantidadPendientes"];
  234. }
  235. return (new Respuesta())->detalle([
  236. "total" => $totalEventos,
  237. "participo" => $eventosAtendidos,
  238. "pendientes" => $eventosPendientes,
  239. "usuarios" => $info
  240. ]);
  241. /* $total = 0;
  242. $participo = 0;
  243. foreach($query->each() as $resultado) {
  244. $total++;
  245. if ($resultado["accionRes"] !== null) {
  246. $participo ++;
  247. }
  248. }
  249. return (new Respuesta())
  250. ->detalle([
  251. "total" => $total,
  252. "participo" => $participo,
  253. "pendientes" => ($total - $participo)
  254. ]); */
  255. }
  256. public function actionComparativaDependencia() {
  257. $fechaInicio = trim($this->req->getBodyParam("fechaInicio", ""));
  258. $fechaFinal = trim($this->req->getBodyParam("fechaFinal", ""));
  259. $query = (new Query())
  260. ->select([
  261. "{{Dependencia}}.id as dependenciaId",
  262. "{{Dependencia}}.nombre as dependenciaNombre",
  263. "COUNT({{Resultado}}.[[idUsuario]]) filter ( where {{Resultado}}.[[idUsuario]] is not null ) as conteoNotNull",
  264. "COUNT({{UsuarioGrupo}}.[[idUsuario]]) as totalDependencia"
  265. ])
  266. ->from("Evento")
  267. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  268. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  269. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  270. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  271. ->innerJoin("Dependencia", "{{Dependencia}}.id = {{UsuarioDependencia}}.[[idDependencia]]")
  272. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioDependencia}}.[[idUsuario]]")
  273. ->andWhere([
  274. "AND",
  275. [">=", "fechaInicio", $fechaInicio],
  276. ["<=", "fechaFinal", $fechaFinal],
  277. ])
  278. ->groupBy([
  279. "dependenciaId",
  280. "dependenciaNombre"
  281. ])
  282. ->orderBy(["dependenciaNombre" => SORT_ASC]);
  283. $data = [];
  284. foreach($query->each() as $resultado) {
  285. $data[] = [
  286. "id" => $resultado["dependenciaId"],
  287. "nombre" => $resultado["dependenciaNombre"],
  288. "participaciones" => $resultado["conteoNotNull"],
  289. "pendientes" => $resultado["totalDependencia"] - $resultado["conteoNotNull"]
  290. ];
  291. }
  292. return (new Respuesta())
  293. ->detalle($data);
  294. }
  295. public function actionPorEvento() {
  296. $idEvento = intval($this->req->getBodyParam("idEvento", null));
  297. $fechaInicio = trim($this->req->getBodyParam("fechaInicio", ""));
  298. $fechaFinal = trim($this->req->getBodyParam("fechaFinal", ""));
  299. $queryUsuario = (new Query())
  300. ->select([
  301. "{{Evento}}.id as eventoId",
  302. "{{Resultado}}.accion as accionRes",
  303. ])
  304. ->from("Evento")
  305. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  306. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  307. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  308. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  309. ->andWhere([
  310. "AND",
  311. [">=", "fechaInicio", $fechaInicio],
  312. ["<=", "fechaFinal", $fechaFinal],
  313. ])
  314. ->andWhere(["{{Evento}}.id" => $idEvento])
  315. ->orderBy(["eventoId" => SORT_ASC]);
  316. $totalUsuario = 0;
  317. $participoUsuario = 0;
  318. foreach($queryUsuario->each() as $resultado) {
  319. $totalUsuario++;
  320. if ($resultado["accionRes"] !== null) {
  321. $participoUsuario ++;
  322. }
  323. }
  324. $queryDependencia = (new Query())
  325. ->select([
  326. "{{Dependencia}}.id as dependenciaId",
  327. "{{Dependencia}}.nombre as dependenciaNombre",
  328. "COUNT({{Resultado}}.[[idUsuario]]) filter ( where {{Resultado}}.[[idUsuario]] is not null ) as conteoNotNull",
  329. "COUNT({{UsuarioGrupo}}.[[idUsuario]]) as totalDependencia"
  330. ])
  331. ->from("Evento")
  332. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  333. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  334. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  335. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
  336. ->innerJoin("Dependencia", "{{Dependencia}}.id = {{UsuarioDependencia}}.[[idDependencia]]")
  337. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioDependencia}}.[[idUsuario]]")
  338. ->andWhere([
  339. "AND",
  340. [">=", "fechaInicio", $fechaInicio],
  341. ["<=", "fechaFinal", $fechaFinal],
  342. ])
  343. ->andWhere(["{{Evento}}.id" => $idEvento])
  344. ->groupBy([
  345. "dependenciaId",
  346. "dependenciaNombre"
  347. ])
  348. ->orderBy(["dependenciaNombre" => SORT_ASC]);
  349. $dataDependencias = [];
  350. foreach($queryDependencia->each() as $resultado) {
  351. $dataDependencias[] = [
  352. "id" => $resultado["dependenciaId"],
  353. "nombre" => $resultado["dependenciaNombre"],
  354. "participaciones" => $resultado["conteoNotNull"],
  355. "pendientes" => $resultado["totalDependencia"] - $resultado["conteoNotNull"]
  356. ];
  357. }
  358. return (new Respuesta())
  359. ->detalle([
  360. "totalResultadosUsuarios" => $totalUsuario,
  361. "participoResultadosUsuarios" => $participoUsuario,
  362. "pendientesResultadosUsuarios" => ($totalUsuario - $participoUsuario),
  363. "datosDependencias" => $dataDependencias
  364. ]);
  365. }
  366. }