Procházet zdrojové kódy

Consulta para reporte individual excel

ElPoteito před 2 roky
rodič
revize
0b530d39ad

+ 2 - 1
config/web.php

@@ -57,7 +57,8 @@ $config = [
             'v1/evento',
             'v1/grupo',
             'v1/resultado',
-            'v1/usuario'
+            'v1/usuario',
+            'v1/reporte-individual'
           ],
         ]
       ],

+ 73 - 0
migrations/m230213_234921_views.php

@@ -0,0 +1,73 @@
+<?php
+
+use yii\db\Migration;
+
+/**
+ * Class m230213_234921_views
+ */
+class m230213_234921_views extends Migration {
+  /**
+   * {@inheritdoc}
+   */
+  public function safeUp() {
+
+    $this->execute('
+      create view public."ReporteIndividual" as
+      select
+            U.nombre,
+            U.facebook,
+            U."facebookVerificado",
+            U.twitter,
+            U."twitterVerificado",
+            U.instagram,
+            U."instagramVerificado",
+            U.id "idUsuario",
+            count(E."redSocial") filter ( where E."redSocial" = Facebook and U."facebookVerificado") as "cantidadFacebook",
+            count(E."redSocial") filter ( where E."redSocial" = Twitter and U."twitterVerificado") as "cantidadTwitter",
+            count(E."redSocial") filter ( where E."redSocial" = Instagram and U."instagramVerificado") as "cantidadInstagram",
+            --count(E.id) as "cantidadEventos",
+            count(R.accion) as "cantidadResultados"
+            --(count(E.id) - count(R.accion)) as "cantidadPendientes"
+          from "Evento" E
+          inner join "EventoGrupo" EG on E.id = EG."idEvento"
+          inner join "Grupo" G on G.id = EG."idGrupo"
+          inner join "UsuarioGrupo" UG on G.id = UG."idGrupo"
+          inner join "Usuario" U on U.id = UG."idUsuario"
+          left join "Resultado" R on E.id = R."idEvento" and R."idUsuario" = U.id
+          group by
+                  U.nombre,
+                  U.facebook,
+                  U."facebookVerificado",
+                  U.twitter,
+                  U."twitterVerificado",
+                  U.instagram,
+                  U."instagramVerificado",
+                  U.id
+      --    order by E.id
+      ;
+      ');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function safeDown() {
+    
+    $this->execute('drop view "ReporteIndividual";');
+  }
+
+  /*
+    // Use up()/down() to run migration code without a transaction.
+    public function up()
+    {
+
+    }
+
+    public function down()
+    {
+        echo "m230213_234921_views cannot be reverted.\n";
+
+        return false;
+    }
+    */
+}

+ 76 - 21
modules/v1/controllers/EventoController.php

@@ -92,35 +92,84 @@ class EventoController extends AuthController {
       ->select([
         "{{Evento}}.id as eventoId",
         "{{Resultado}}.accion as accionRes",
+        "{{Evento}}.redSocial as redSocial",
+        "{{Usuario}}.[[facebookVerificado]] as facebookVerificado",
+        "{{Usuario}}.[[twitterVerificado]] as twitterVerificado",
+        "{{Usuario}}.[[instagramVerificado]] as instagramVerificado",
       ])
       ->from("Evento")
       ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
       ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
       ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
+      ->innerJoin("Usuario", "{{UsuarioGrupo}}.[[idUsuario]] = {{Usuario}}.id")
       ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
-      ->andWhere([
+      ->orderBy(["eventoId" => SORT_ASC]);
+    
+    /* $query = (new Query())
+      ->select([
+        "{{Usuario}}.nombre as nombre",
+        "{{Usuario}}.facebook as facebook",
+        "{{Usuario}}.facebookVerificado as facebookVerificado",
+        "{{Usuario}}.twitter as twitter",
+        "{{Usuario}}.twitterVerificado as twitterVerificado",
+        "{{Usuario}}.instagram as instagram",
+        "{{Usuario}}.instagramVerificado as instagramVerificado",
+        "{{Usuario}}.id as uId",
+        // "{{Evento}}.id as eventoId",
+        // "{{Evento}}.redSocial",
+        "count({{Evento}}.id) as cantidadEventos",
+        "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = Facebook) as eventosFacebook",
+        "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = Twitter) as eventosTwitter",
+        "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = Instagram) as eventosInstagram",
+        "count({{Resultado}}.accion) as cantidadResultados",
+        "(count({{Evento}}.id) - count({{Resultado}}.accion)) as cantidadPendientes",
+      ])
+      ->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]]")
+      ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
+      ->groupBy(["{{Usuario}}.nombre", "facebook", "facebookVerificado", "twitter", "twitterVerificado", "instagram", "instagramVerificado", "uId"]); */
+      // ->orderBy(["eventoId" => SORT_ASC]);
+    
+    if ($idUsuario > 0) {
+      $query->andWhere(["{{UsuarioGrupo}}.[[idUsuario]]" => $idUsuario]);
+    }
+
+    if ($fechaInicio != "" && $fechaFinal != ""){
+      $query->andWhere([
         "AND",
         [">=", "fechaInicio", $fechaInicio],
         ["<=", "fechaFinal", $fechaFinal],
-      ])
-      ->andWhere(["{{UsuarioGrupo}}.[[idUsuario]]" => $idUsuario])
-      ->orderBy(["eventoId" => SORT_ASC]);
+      ]);
+    }
+
+    
     
     $total = 0;
     $participo = 0;
     foreach($query->each() as $resultado) {
       $total++;
+      if ($resultado["redSocial"] === "Facebook" && !isset($resultado["facebookVerificado"])){
+        $total--;
+      } else if ($resultado["redSocial"] === "Twitter" && !isset($resultado["twitterVerificado"])){
+        $total--;
+      } else if ($resultado["redSocial"] === "Instagram" && !isset($resultado["instagramVerificado"])){
+        $total--;
+      }
+      
       if ($resultado["accionRes"] !== null) {
         $participo ++;
       }
-    }
-
+    };
     return (new Respuesta())
       ->detalle([
         "total" => $total,
         "participo" => $participo,
         "pendientes" => ($total - $participo)
       ]);
+    // return new Respuesta($query);
   }
 
   public function actionResultadosDependencia() {
@@ -241,40 +290,46 @@ class EventoController extends AuthController {
 
     $queryDependencia = (new Query())
       ->select([
-        "{{Evento}}.id as eventoId",
-        "{{Resultado}}.accion as accionRes",
+        "{{Dependencia}}.id as dependenciaId",
+        "{{Dependencia}}.nombre as dependenciaNombre",
+        "COUNT({{Resultado}}.[[idUsuario]]) filter ( where {{Resultado}}.[[idUsuario]] is not null ) as conteoNotNull",
+        "COUNT({{UsuarioGrupo}}.[[idUsuario]]) as totalDependencia"
       ])
       ->from("Evento")
       ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
       ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
       ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
-      ->innerJoin("UsuarioDependencia", '{{UsuarioDependencia}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]')
-      ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
+      ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{UsuarioGrupo}}.[[idUsuario]]")
+      ->innerJoin("Dependencia", "{{Dependencia}}.id = {{UsuarioDependencia}}.[[idDependencia]]")
+      ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{UsuarioDependencia}}.[[idUsuario]]")
       ->andWhere([
         "AND",
         [">=", "fechaInicio", $fechaInicio],
         ["<=", "fechaFinal", $fechaFinal],
       ])
       ->andWhere(["{{Evento}}.id" => $idEvento])
-      ->orderBy(["eventoId" => SORT_ASC]);
+      ->groupBy([
+        "dependenciaId",
+        "dependenciaNombre"
+      ])
+      ->orderBy(["dependenciaNombre" => SORT_ASC]);
 
-    $totalDependencia = 0;
-    $participoDependencia = 0;
+    $dataDependencias = [];
     foreach($queryDependencia->each() as $resultado) {
-      $totalDependencia++;
-      if ($resultado["accionRes"] !== null) {
-        $participoDependencia ++;
-      }
+      $dataDependencias[] = [
+        "id" => $resultado["dependenciaId"],
+        "nombre" => $resultado["dependenciaNombre"],
+        "participaciones" => $resultado["conteoNotNull"],
+        "pendientes" => $resultado["totalDependencia"] - $resultado["conteoNotNull"]
+      ];
     }
 
     return (new Respuesta())
       ->detalle([
-        "totalResultadosDependencias" => $totalDependencia,
-        "participoResultadosDependencias" => $participoDependencia,
-        "pendientesResultadosDependencias" => ($totalDependencia - $participoDependencia),
         "totalResultadosUsuarios" => $totalUsuario,
         "participoResultadosUsuarios" => $participoUsuario,
-        "pendientesResultadosUsuarios" => ($totalUsuario - $participoUsuario)
+        "pendientesResultadosUsuarios" => ($totalUsuario - $participoUsuario),
+        "datosDependencias" => $dataDependencias
       ]);
   }
 }

+ 142 - 0
modules/v1/controllers/ReporteIndividualController.php

@@ -0,0 +1,142 @@
+<?php
+
+namespace v1\controllers;
+
+use common\data\Respuesta;
+use common\rest\AuthController;
+use yii\db\Expression;
+use yii\db\Query;
+
+class ReporteIndividualController extends AuthController {
+
+  /* public $modelClass = "v1\models\ReporteIndividual";
+  public $modelName = "ReporteIndividual"; */
+
+  public function actionGuardar() {
+    $idUsuario = intval($this->req->getBodyParam("idUsuario", ""));
+    $fechaInicio = trim($this->req->getBodyParam("fechaInicio", ""));
+    $fechaFinal = trim($this->req->getBodyParam("fechaFinal", ""));
+    $limite = intval($this->req->getBodyParam("limite", ""));
+    $pagina = intval($this->req->getBodyParam("pagina", 1));
+    // $q = trim($this->req->get("q", ""));
+
+    $query = (new QuerY())
+      ->select([
+        "{{ReporteIndividual}}.nombre",
+        "{{ReporteIndividual}}.facebook",
+        "{{ReporteIndividual}}.[[facebookVerificado]]",
+        "{{ReporteIndividual}}.twitter",
+        "{{ReporteIndividual}}.[[twitterVerificado]]",
+        "{{ReporteIndividual}}.instagram",
+        "{{ReporteIndividual}}.[[instagramVerificado]]",
+        "{{ReporteIndividual}}.[[idUsuario]]",
+        "{{ReporteIndividual}}.[[cantidadFacebook]]",
+        "{{ReporteIndividual}}.[[cantidadTwitter]]",
+        "{{ReporteIndividual}}.[[cantidadInstagram]]",
+        "{{ReporteIndividual}}.[[cantidadInstagram]]",
+        "{{ReporteIndividual}}.[[cantidadResultados]]",
+        "({{ReporteIndividual}}.[[cantidadFacebook]] + {{ReporteIndividual}}.[[cantidadTwitter]] + {{ReporteIndividual}}.[[cantidadInstagram]]) as cantidadEventos",
+        "({{ReporteIndividual}}.[[cantidadFacebook]] + {{ReporteIndividual}}.[[cantidadTwitter]] + {{ReporteIndividual}}.[[cantidadInstagram]]) - {{ReporteIndividual}}.[[cantidadResultados]] as cantidadPendientes"
+      ])
+      ->from("ReporteIndividual")
+      ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idUsuario]] = {{ReporteIndividual}}.[[idUsuario]]")
+      ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idGrupo]] = {{UsuarioGrupo}}.[[idGrupo]]")
+      ->innerJoin("Evento", "{{Evento}}.id = {{EventoGrupo}}.[[idEvento]]")
+      ->groupBy([
+        "{{ReporteIndividual}}.nombre",
+        "{{ReporteIndividual}}.facebook",
+        "{{ReporteIndividual}}.facebookVerificado",
+        "{{ReporteIndividual}}.twitter",
+        "{{ReporteIndividual}}.twitterVerificado",
+        "{{ReporteIndividual}}.instagram",
+        "{{ReporteIndividual}}.instagramVerificado",
+        "{{ReporteIndividual}}.idUsuario",
+        "{{ReporteIndividual}}.cantidadFacebook",
+        "{{ReporteIndividual}}.cantidadTwitter",
+        "{{ReporteIndividual}}.cantidadInstagram",
+        "{{ReporteIndividual}}.cantidadResultados",
+        "({{ReporteIndividual}}.[[cantidadFacebook]] + {{ReporteIndividual}}.[[cantidadTwitter]] + {{ReporteIndividual}}.[[cantidadInstagram]])",
+        "({{ReporteIndividual}}.[[cantidadFacebook]] + {{ReporteIndividual}}.[[cantidadTwitter]] + {{ReporteIndividual}}.[[cantidadInstagram]]) - {{ReporteIndividual}}.[[cantidadResultados]]"
+      ]);
+
+    if($idUsuario > 0) {
+      $query->andWhere(["{{ReporteIndividual}}.[[idUsuario]]" => $idUsuario]);
+      $limite = 1;
+      $pagina = 1;
+    }
+
+    if ($fechaInicio != "" && $fechaFinal != ""){
+      $query->andWhere([
+        "AND",
+        [">=", "fechaInicio", $fechaInicio],
+        ["<=", "fechaFinal", $fechaFinal],
+      ]);
+    }
+
+    /*if($q !== "") {
+      # Ejemplo de buscador
+      $query->andWhere([
+        "OR",
+        ["ilike", "nombre", $q],
+        ["ilike", "direccion", $q],
+      ]);
+      //
+    } */
+
+    /* if ($limite > 0) {
+      return new Respuesta($query, $limite);
+    }
+    return new Respuesta($query); */
+
+    return new Respuesta($query, $limite, $pagina, $this->ordenar);
+  }
+
+  /* public function actionGuardar() {
+    $id = intval($this->req->getBodyParam("id", null));
+    $modelo = null;
+
+    if($id > 0) {
+      $modelo = $this->modelClass::findOne($id);
+    }
+    if($modelo === null) {
+      $modelo = new $this->modelClass();
+      $modelo->creado = new Expression('now()');
+      $modelo->idUsuarioCreador = $this->usuario->id;
+    } else {
+      $modelo->modificado = new Expression('now()');
+    }
+
+    $modelo->load($this->req->getBodyParams(), '');
+    if (!$modelo->save()) {
+      return (new Respuesta($modelo))
+        ->mensaje("Hubo un problema al guardar el {$this->modelName}");
+    }
+
+    $modelo->refresh();
+    return (new Respuesta($modelo))
+      ->mensaje("{$this->modelName} guardado correctamente");
+  } */
+
+  public function actionEliminar() {
+    $id = intval($this->req->getBodyParam("id", null));
+    $modelo = null;
+
+    if($id > 0) {
+      $modelo = $this->modelClass::findOne(["id" => $id]);
+    }
+    if($modelo === null) {
+      return (new Respuesta())
+        ->esError()
+        ->mensaje("{$this->modelName} no encontrado");
+    }
+    $modelo->eliminado = null;
+    if(!$modelo->save()) {
+      return (new Respuesta($modelo))
+        ->mensaje("No se pudo eliminar el {$this->modelName}");
+    }
+
+    return (new Respuesta())
+      ->mensaje("{$this->modelName} eliminado");
+  }
+
+}