ComparativaDependenciaController.php 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. namespace v1\controllers;
  3. use common\data\Respuesta;
  4. use common\rest\JsonController;
  5. use v1\models\UsuarioDependencia;
  6. use yii\db\Query;
  7. use yii\web\NotFoundHttpException;
  8. class ComparativaDependenciaController extends JsonController {
  9. public function actionIndex() {
  10. $fechaInicio = trim($this->req->get("inicio", ""));
  11. $fechaFinal = trim($this->req->get("fin", ""));
  12. if($fechaInicio === "" || $fechaFinal === "") {
  13. throw new NotFoundHttpException("Los parámetros inicio y fin son obligatorios.");
  14. }
  15. $query = (new Query())
  16. ->select([
  17. "{{Dependencia}}.id as dependenciaId",
  18. "{{Dependencia}}.nombre as dependenciaNombre",
  19. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Facebook' and {{Usuario}}.[[facebookVerificado]]) as eventosFacebook",
  20. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Twitter' and {{Usuario}}.[[twitterVerificado]]) as eventosTwitter",
  21. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Instagram' and {{Usuario}}.[[instagramVerificado]]) as eventosInstagram",
  22. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] not in('Facebook', 'Twitter', 'Instagram') and {{Usuario}}.[[instagramVerificado]]) as eventos",
  23. "count({{Resultado}}.accion) as cantidadResultados",
  24. ])
  25. ->from("Evento")
  26. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  27. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  28. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  29. ->innerJoin("Usuario", "{{Usuario}}.id = {{UsuarioGrupo}}.[[idUsuario]]")
  30. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.[[id]]")
  31. ->innerJoin("Dependencia", "{{Dependencia}}.id = {{UsuarioDependencia}}.[[idDependencia]]")
  32. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
  33. ->andWhere([
  34. "AND",
  35. [">=", "fechaInicio", $fechaInicio],
  36. ["<=", "fechaFinal", $fechaFinal],
  37. ])
  38. ->groupBy([
  39. "dependenciaId",
  40. "dependenciaNombre",
  41. ])
  42. ->orderBy(["dependenciaNombre" => SORT_ASC]);
  43. $query2 = (new Query())
  44. ->select([
  45. "*",
  46. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) as [[cantidadEventos]]",
  47. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) - [[cantidadResultados]] as [[cantidadPendientes]]"
  48. ])
  49. ->from(["t" => $query]);
  50. $data = [];
  51. $eventosAtendidos = 0;
  52. $eventosPendientes = 0;
  53. $csv = "nombre,participaciones,pendientes,cantidad de usuarios\n";
  54. foreach($query2->each() as $resultado) {
  55. $eventosAtendidos += $resultado["cantidadResultados"];
  56. $eventosPendientes += $resultado["cantidadPendientes"];
  57. $usuariosDependencia = UsuarioDependencia::find()
  58. ->andWhere(['idDependencia' => $resultado["dependenciaId"]])
  59. ->count();
  60. $data[] = [
  61. "id" => $resultado["dependenciaId"],
  62. "nombre" => $resultado["dependenciaNombre"],
  63. "participaciones" => $resultado["cantidadResultados"],
  64. "pendientes" => $resultado["cantidadPendientes"],
  65. "cantidadUsuarios" => $usuariosDependencia
  66. ];
  67. $csv .= "{$resultado["dependenciaNombre"]},{$resultado["cantidadResultados"]},{$resultado["cantidadPendientes"]},{$usuariosDependencia}\n";
  68. }
  69. \Yii::$app->getResponse()->sendContentAsFile($csv, "comparativa_dep_{$fechaInicio}_{$fechaFinal}.csv");
  70. \Yii::$app->end();
  71. }
  72. }