| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- <?php
- namespace v1\controllers;
- use common\data\Respuesta;
- use common\rest\JsonController;
- use v1\models\UsuarioDependencia;
- use yii\db\Query;
- use yii\web\NotFoundHttpException;
- class ComparativaDependenciaController extends JsonController {
- public function actionIndex() {
- $fechaInicio = trim($this->req->get("inicio", ""));
- $fechaFinal = trim($this->req->get("fin", ""));
- if($fechaInicio === "" || $fechaFinal === "") {
- throw new NotFoundHttpException("Los parámetros inicio y fin son obligatorios.");
- }
- $query = (new Query())
- ->select([
- "{{Dependencia}}.id as dependenciaId",
- "{{Dependencia}}.nombre as dependenciaNombre",
- "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Facebook' and {{Usuario}}.[[facebookVerificado]]) as eventosFacebook",
- "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Twitter' and {{Usuario}}.[[twitterVerificado]]) as eventosTwitter",
- "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Instagram' and {{Usuario}}.[[instagramVerificado]]) as eventosInstagram",
- "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] not in('Facebook', 'Twitter', 'Instagram') and {{Usuario}}.[[instagramVerificado]]) as eventos",
- "count({{Resultado}}.accion) as cantidadResultados",
- ])
- ->from("Evento")
- ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
- ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
- ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
- ->innerJoin("Usuario", "{{Usuario}}.id = {{UsuarioGrupo}}.[[idUsuario]]")
- ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.[[id]]")
- ->innerJoin("Dependencia", "{{Dependencia}}.id = {{UsuarioDependencia}}.[[idDependencia]]")
- ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
- ->andWhere(["{{Evento}}.eliminado" => null])
- ->andWhere(["{{Dependencia}}.eliminado" => null])
- ->andWhere([
- "AND",
- [">=", "fechaInicio", $fechaInicio],
- ["<=", "fechaFinal", $fechaFinal],
- ])
- ->groupBy([
- "dependenciaId",
- "dependenciaNombre",
- ])
- ->orderBy(["dependenciaNombre" => SORT_ASC]);
- $query2 = (new Query())
- ->select([
- "*",
- "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) as [[cantidadEventos]]",
- "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) - [[cantidadResultados]] as [[cantidadPendientes]]"
- ])
- ->from(["t" => $query])
- ->orderBy(["t.[[cantidadResultados]]" => SORT_DESC]);
- $data = [];
- $eventosAtendidos = 0;
- $eventosPendientes = 0;
- $csv = "nombre,participaciones,pendientes,cantidad de usuarios, porcentaje de participación\n";
- foreach($query2->each() as $resultado) {
- $eventosAtendidos += $resultado["cantidadResultados"];
- $eventosPendientes += $resultado["cantidadPendientes"];
- $usuariosDependencia = UsuarioDependencia::find()
- ->innerJoin('Usuario', '{{Usuario}}.id = {{UsuarioDependencia}}.[[idUsuario]]')
- ->innerJoin('Dependencia', '{{Dependencia}}.id = {{UsuarioDependencia}}.[[idDependencia]]')
- ->andWhere(['{{UsuarioDependencia}}.[[idDependencia]]' => $resultado["dependenciaId"]])
- ->andWhere(['{{Dependencia}}.eliminado' => null])
- ->andWhere(['{{Usuario}}.eliminado' => null])
- ->count();
- $total = intval($resultado["cantidadResultados"]) + intval($resultado["cantidadPendientes"]);
- $porcentaje = 0;
- if ($total > 0) {
- $porcentaje = ($resultado["cantidadResultados"] * 100) / $total;
- $porcentaje = round($porcentaje, 2);
- }
- $data[] = [
- "id" => $resultado["dependenciaId"],
- "nombre" => $resultado["dependenciaNombre"],
- "participaciones" => $resultado["cantidadResultados"],
- "pendientes" => $resultado["cantidadPendientes"],
- "porcentajeParticipacion" => $porcentaje,
- "cantidadUsuarios" => $usuariosDependencia
- ];
- $csv .= "{$resultado["dependenciaNombre"]},{$resultado["cantidadResultados"]},{$resultado["cantidadPendientes"]},{$usuariosDependencia},{$porcentaje}%\n";
- }
- \Yii::$app->getResponse()->sendContentAsFile($csv, "comparativa_dep_{$fechaInicio}_{$fechaFinal}.csv");
- \Yii::$app->end();
- }
- }
|