ComparativaDependenciaController.php 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. ->orderBy(["t.[[cantidadResultados]]" => SORT_DESC]);
  51. $data = [];
  52. $eventosAtendidos = 0;
  53. $eventosPendientes = 0;
  54. $csv = "nombre,participaciones,pendientes,cantidad de usuarios, porcentaje de participación\n";
  55. foreach($query2->each() as $resultado) {
  56. $eventosAtendidos += $resultado["cantidadResultados"];
  57. $eventosPendientes += $resultado["cantidadPendientes"];
  58. $usuariosDependencia = UsuarioDependencia::find()
  59. ->andWhere(['idDependencia' => $resultado["dependenciaId"]])
  60. ->count();
  61. $total = intval($resultado["cantidadResultados"]) + intval($resultado["cantidadPendientes"]);
  62. $porcentaje = 0;
  63. if ($total > 0) {
  64. $porcentaje = ($resultado["cantidadPendientes"] * 100) / $total;
  65. }
  66. $data[] = [
  67. "id" => $resultado["dependenciaId"],
  68. "nombre" => $resultado["dependenciaNombre"],
  69. "participaciones" => $resultado["cantidadResultados"],
  70. "pendientes" => $resultado["cantidadPendientes"],
  71. "porcentajeParticipacion" => $porcentaje,
  72. "cantidadUsuarios" => $usuariosDependencia
  73. ];
  74. $csv .= "{$resultado["dependenciaNombre"]},{$resultado["cantidadResultados"]},{$resultado["cantidadPendientes"]},{$usuariosDependencia},{$porcentaje}%\n";
  75. }
  76. \Yii::$app->getResponse()->sendContentAsFile($csv, "comparativa_dep_{$fechaInicio}_{$fechaFinal}.csv");
  77. \Yii::$app->end();
  78. }
  79. }