ComparativaDependenciaController.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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(["{{Evento}}.eliminado" => null])
  34. ->andWhere(["{{Dependencia}}.eliminado" => null])
  35. ->andWhere([
  36. "AND",
  37. [">=", "fechaInicio", $fechaInicio],
  38. ["<=", "fechaFinal", $fechaFinal],
  39. ])
  40. ->groupBy([
  41. "dependenciaId",
  42. "dependenciaNombre",
  43. ])
  44. ->orderBy(["dependenciaNombre" => SORT_ASC]);
  45. $query2 = (new Query())
  46. ->select([
  47. "*",
  48. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) as [[cantidadEventos]]",
  49. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) - [[cantidadResultados]] as [[cantidadPendientes]]"
  50. ])
  51. ->from(["t" => $query])
  52. ->orderBy(["t.[[cantidadResultados]]" => SORT_DESC]);
  53. $data = [];
  54. $eventosAtendidos = 0;
  55. $eventosPendientes = 0;
  56. $csv = "nombre,participaciones,pendientes,cantidad de usuarios, porcentaje de participación\n";
  57. foreach($query2->each() as $resultado) {
  58. $eventosAtendidos += $resultado["cantidadResultados"];
  59. $eventosPendientes += $resultado["cantidadPendientes"];
  60. $usuariosDependencia = UsuarioDependencia::find()
  61. ->innerJoin('Usuario', '{{Usuario}}.id = {{UsuarioDependencia}}.[[idUsuario]]')
  62. ->innerJoin('Dependencia', '{{Dependencia}}.id = {{UsuarioDependencia}}.[[idDependencia]]')
  63. ->andWhere(['{{UsuarioDependencia}}.[[idDependencia]]' => $resultado["dependenciaId"]])
  64. ->andWhere(['{{Dependencia}}.eliminado' => null])
  65. ->andWhere(['{{Usuario}}.eliminado' => null])
  66. ->count();
  67. $total = intval($resultado["cantidadResultados"]) + intval($resultado["cantidadPendientes"]);
  68. $porcentaje = 0;
  69. if ($total > 0) {
  70. $porcentaje = ($resultado["cantidadResultados"] * 100) / $total;
  71. $porcentaje = round($porcentaje, 2);
  72. }
  73. $data[] = [
  74. "id" => $resultado["dependenciaId"],
  75. "nombre" => $resultado["dependenciaNombre"],
  76. "participaciones" => $resultado["cantidadResultados"],
  77. "pendientes" => $resultado["cantidadPendientes"],
  78. "porcentajeParticipacion" => $porcentaje,
  79. "cantidadUsuarios" => $usuariosDependencia
  80. ];
  81. $csv .= "{$resultado["dependenciaNombre"]},{$resultado["cantidadResultados"]},{$resultado["cantidadPendientes"]},{$usuariosDependencia},{$porcentaje}%\n";
  82. }
  83. \Yii::$app->getResponse()->sendContentAsFile($csv, "comparativa_dep_{$fechaInicio}_{$fechaFinal}.csv");
  84. \Yii::$app->end();
  85. }
  86. }