ReporteGlobalController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <?php
  2. namespace v1\controllers;
  3. use common\rest\AuthController;
  4. use common\rest\JsonController;
  5. use DateTime;
  6. use yii\db\Query;
  7. class ReporteGlobalController extends JsonController {
  8. public function actionIndex() {
  9. $fechas = [
  10. ["2022-08-01 00:00:00", "2022-08-01 00:00:00","2022-08-31 23:59:59"],
  11. ["2022-08-01 00:00:00", "2022-09-01 00:00:00","2022-09-30 23:59:59"],
  12. ["2022-08-01 00:00:00", "2022-10-01 00:00:00","2022-10-31 23:59:59"],
  13. ["2022-08-01 00:00:00", "2022-11-01 00:00:00","2022-11-30 23:59:59"],
  14. ["2022-08-01 00:00:00", "2022-12-01 00:00:00","2022-12-31 23:59:59"],
  15. ["2022-08-01 00:00:00", "2023-01-01 00:00:00","2023-01-31 23:59:59"],
  16. ];
  17. $query = (new Query())
  18. ->select([
  19. "{{Usuario}}.nombre as nombre",
  20. "{{Usuario}}.verificado as verificado",
  21. "{{Usuario}}.facebook as facebook",
  22. "{{Usuario}}.facebookVerificado as facebookVerificado",
  23. "{{Usuario}}.twitter as twitter",
  24. "{{Usuario}}.twitterVerificado as twitterVerificado",
  25. "{{Usuario}}.instagram as instagram",
  26. "{{Usuario}}.instagramVerificado as instagramVerificado",
  27. "{{Usuario}}.id as uId",
  28. "count({{Evento}}.id) as cantidadEventos",
  29. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Facebook') as eventosFacebook",
  30. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Twitter') as eventosTwitter",
  31. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Instagram') as eventosInstagram",
  32. "count({{Resultado}}.accion) as cantidadResultados",
  33. "count({{Resultado}}.accion) filter (where {{Evento}}.[[redSocial]] = 'Facebook') as participacionesFacebook",
  34. "count({{Resultado}}.accion) filter (where {{Evento}}.[[redSocial]] = 'Twitter') as participacionesTwitter",
  35. "count({{Resultado}}.accion) filter (where {{Evento}}.[[redSocial]] = 'Instagram') as participacionesInstagram",
  36. "(count({{Evento}}.id) - count({{Resultado}}.accion)) as cantidadPendientes",
  37. ])
  38. ->from("Usuario")
  39. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idUsuario]] = {{Usuario}}.id")
  40. ->innerJoin("Grupo", "{{Grupo}}.id = {{UsuarioGrupo}}.[[idGrupo]]")
  41. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  42. ->innerJoin("Evento", "{{Evento}}.id = {{EventoGrupo}}.[[idEvento]]")
  43. ->leftJoin("Resultado", "{{Resultado}}.[[idUsuario]] = {{Usuario}}.id and {{Resultado}}.[[idEvento]] = {{Evento}}.id")
  44. ->andWhere(["{{Usuario}}.eliminado" => null])
  45. ->groupBy(["{{Usuario}}.verificado", "facebook", "facebookVerificado", "twitter", "twitterVerificado", "instagram", "instagramVerificado", "uId"]);
  46. $query2 = (new Query())
  47. ->select([
  48. // "verificado",
  49. "[[eventosFacebook]]",
  50. "[[participacionesFacebook]]",
  51. "[[eventosTwitter]]",
  52. "[[participacionesTwitter]]",
  53. "[[eventosInstagram]]",
  54. "[[participacionesInstagram]]",
  55. "[[cantidadResultados]]",
  56. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) as [[cantidadEventos]]",
  57. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) - [[cantidadResultados]] as [[cantidadPendientes]]"
  58. ]);
  59. // ->from(["t" => $query]);
  60. $meses = [];
  61. foreach($fechas as $_fechas) {
  62. $queryClon = (clone $query)->andWhere([
  63. "AND",
  64. [">=", "{{Evento}}.[[fechaInicio]]", $_fechas[1]],
  65. ["<=", "{{Evento}}.[[fechaInicio]]", $_fechas[2]],
  66. [">=", "{{Usuario}}.verificado", $_fechas[0]],
  67. ["<=", "{{Usuario}}.verificado", $_fechas[2]],
  68. ]);
  69. $mes = (clone $query2)->from(["t" => $queryClon]);
  70. $contadorPorcentajesFacebook = 0;
  71. $porcentajesFacebook = 0;
  72. $contadorPorcentajesTwitter = 0;
  73. $porcentajesTwitter = 0;
  74. $contadorPorcentajesInstagram = 0;
  75. $porcentajesInstagram = 0;
  76. foreach($mes->each() as $_mes){
  77. $eventosFacebook = $_mes["eventosFacebook"];
  78. $participacionesFacebook = $_mes["participacionesFacebook"];
  79. $eventosTwitter = $_mes["eventosTwitter"];
  80. $participacionesTwitter = $_mes["participacionesTwitter"];
  81. $eventosInstagram = $_mes["eventosInstagram"];
  82. $participacionesInstagram = $_mes["participacionesInstagram"];
  83. $porcentajeParticipacionFacebook = 0;
  84. if ($eventosFacebook > 0) {
  85. $contadorPorcentajesFacebook += 1;
  86. $porcentajeParticipacionFacebook = ($participacionesFacebook/$eventosFacebook)*100;
  87. $porcentajesFacebook += $porcentajeParticipacionFacebook;
  88. }
  89. $porcentajeParticipacionTwitter = 0;
  90. if ($eventosTwitter > 0) {
  91. $contadorPorcentajesTwitter += 1;
  92. $porcentajeParticipacionTwitter = ($participacionesTwitter/$eventosTwitter)*100;
  93. $porcentajesTwitter += $porcentajeParticipacionTwitter;
  94. }
  95. $porcentajeParticipacionInstagram = 0;
  96. if ($eventosInstagram > 0) {
  97. $contadorPorcentajesInstagram += 1;
  98. $porcentajeParticipacionInstagram = ($participacionesInstagram/$eventosInstagram)*100;
  99. $porcentajesInstagram += $porcentajeParticipacionInstagram;
  100. }
  101. }
  102. $totalPorcentajesFacebook = 0;
  103. $totalPorcentajesTwitter = 0;
  104. $totalPorcentajesInstagram = 0;
  105. if ($contadorPorcentajesFacebook > 0) {
  106. $totalPorcentajesFacebook = $porcentajesFacebook/$contadorPorcentajesFacebook;
  107. }
  108. if ($contadorPorcentajesTwitter > 0) {
  109. $totalPorcentajesTwitter = $porcentajesTwitter/$contadorPorcentajesTwitter;
  110. }
  111. if ($contadorPorcentajesInstagram > 0) {
  112. $totalPorcentajesInstagram = $porcentajesInstagram/$contadorPorcentajesInstagram;
  113. }
  114. $porcentajeMaximo = 0;
  115. if($totalPorcentajesFacebook > $totalPorcentajesTwitter) {
  116. if ($totalPorcentajesFacebook > $totalPorcentajesInstagram) {
  117. $porcentajeMaximo = $totalPorcentajesFacebook;
  118. } else {
  119. $porcentajeMaximo = $totalPorcentajesInstagram;
  120. }
  121. } else {
  122. if ($totalPorcentajesTwitter > $totalPorcentajesInstagram) {
  123. $porcentajeMaximo = $totalPorcentajesTwitter;
  124. } else {
  125. $porcentajeMaximo = $totalPorcentajesInstagram;
  126. }
  127. }
  128. $meses[] = [
  129. "fechaInicio" => $_fechas[0],
  130. "fechaFinal" => $_fechas[1],
  131. "totalParticipantesFacebook" => $contadorPorcentajesFacebook,
  132. "porcentajesParticipacionFacebook" => $totalPorcentajesFacebook,
  133. "totalParticipantesTwitter" => $contadorPorcentajesTwitter,
  134. "porcentajesParticipacionTwitter" => $totalPorcentajesTwitter,
  135. "totalParticipantesInstagram" => $contadorPorcentajesInstagram,
  136. "porcentajesParticipacionInstagram" => $totalPorcentajesInstagram,
  137. "porcentajeParticipacionGlobal" => $totalPorcentajesFacebook+$totalPorcentajesTwitter+$totalPorcentajesInstagram,
  138. "porcentajeMaximoGlobal" => $porcentajeMaximo
  139. ];
  140. }
  141. return $meses;
  142. }
  143. public function actionCsv() {
  144. $fechas = [
  145. ["2022-08-01 00:00:00", "2022-08-01 00:00:00","2022-08-31 23:59:59"],
  146. ["2022-08-01 00:00:00", "2022-09-01 00:00:00","2022-09-30 23:59:59"],
  147. ["2022-08-01 00:00:00", "2022-10-01 00:00:00","2022-10-31 23:59:59"],
  148. ["2022-08-01 00:00:00", "2022-11-01 00:00:00","2022-11-30 23:59:59"],
  149. ["2022-08-01 00:00:00", "2022-12-01 00:00:00","2022-12-31 23:59:59"],
  150. ["2022-08-01 00:00:00", "2023-01-01 00:00:00","2023-01-31 23:59:59"],
  151. ];
  152. $query = (new Query())
  153. ->select([
  154. "{{Usuario}}.nombre as nombre",
  155. "{{Usuario}}.verificado as verificado",
  156. "{{Usuario}}.facebook as facebook",
  157. "{{Usuario}}.facebookVerificado as facebookVerificado",
  158. "{{Usuario}}.twitter as twitter",
  159. "{{Usuario}}.twitterVerificado as twitterVerificado",
  160. "{{Usuario}}.instagram as instagram",
  161. "{{Usuario}}.instagramVerificado as instagramVerificado",
  162. "{{Usuario}}.id as uId",
  163. "count({{Evento}}.id) as cantidadEventos",
  164. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Facebook') as eventosFacebook",
  165. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Twitter') as eventosTwitter",
  166. "count({{Evento}}.[[redSocial]]) filter (where {{Evento}}.[[redSocial]] = 'Instagram') as eventosInstagram",
  167. "count({{Resultado}}.accion) as cantidadResultados",
  168. "count({{Resultado}}.accion) filter (where {{Evento}}.[[redSocial]] = 'Facebook') as participacionesFacebook",
  169. "count({{Resultado}}.accion) filter (where {{Evento}}.[[redSocial]] = 'Twitter') as participacionesTwitter",
  170. "count({{Resultado}}.accion) filter (where {{Evento}}.[[redSocial]] = 'Instagram') as participacionesInstagram",
  171. "(count({{Evento}}.id) - count({{Resultado}}.accion)) as cantidadPendientes",
  172. ])
  173. ->from("Usuario")
  174. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idUsuario]] = {{Usuario}}.id")
  175. ->innerJoin("Grupo", "{{Grupo}}.id = {{UsuarioGrupo}}.[[idGrupo]]")
  176. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  177. ->innerJoin("Evento", "{{Evento}}.id = {{EventoGrupo}}.[[idEvento]]")
  178. ->leftJoin("Resultado", "{{Resultado}}.[[idUsuario]] = {{Usuario}}.id and {{Resultado}}.[[idEvento]] = {{Evento}}.id")
  179. ->andWhere(["{{Usuario}}.eliminado" => null])
  180. ->groupBy(["{{Usuario}}.verificado", "facebook", "facebookVerificado", "twitter", "twitterVerificado", "instagram", "instagramVerificado", "uId"]);
  181. $query2 = (new Query())
  182. ->select([
  183. // "verificado",
  184. "[[eventosFacebook]]",
  185. "[[participacionesFacebook]]",
  186. "[[eventosTwitter]]",
  187. "[[participacionesTwitter]]",
  188. "[[eventosInstagram]]",
  189. "[[participacionesInstagram]]",
  190. "[[cantidadResultados]]",
  191. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) as [[cantidadEventos]]",
  192. "([[eventosFacebook]] + [[eventosTwitter]] + [[eventosInstagram]]) - [[cantidadResultados]] as [[cantidadPendientes]]"
  193. ]);
  194. // ->from(["t" => $query]);
  195. $meses = [];
  196. foreach($fechas as $_fechas) {
  197. $queryClon = (clone $query)->andWhere([
  198. "AND",
  199. [">=", "{{Evento}}.[[fechaInicio]]", $_fechas[1]],
  200. ["<=", "{{Evento}}.[[fechaInicio]]", $_fechas[2]],
  201. [">=", "{{Usuario}}.verificado", $_fechas[0]],
  202. ["<=", "{{Usuario}}.verificado", $_fechas[2]],
  203. ]);
  204. $mes = (clone $query2)->from(["t" => $queryClon]);
  205. $contadorPorcentajesFacebook = 0;
  206. $porcentajesFacebook = 0;
  207. $contadorPorcentajesTwitter = 0;
  208. $porcentajesTwitter = 0;
  209. $contadorPorcentajesInstagram = 0;
  210. $porcentajesInstagram = 0;
  211. foreach($mes->each() as $_mes){
  212. $eventosFacebook = $_mes["eventosFacebook"];
  213. $participacionesFacebook = $_mes["participacionesFacebook"];
  214. $eventosTwitter = $_mes["eventosTwitter"];
  215. $participacionesTwitter = $_mes["participacionesTwitter"];
  216. $eventosInstagram = $_mes["eventosInstagram"];
  217. $participacionesInstagram = $_mes["participacionesInstagram"];
  218. $porcentajeParticipacionFacebook = 0;
  219. if ($eventosFacebook > 0) {
  220. $contadorPorcentajesFacebook += 1;
  221. $porcentajeParticipacionFacebook = ($participacionesFacebook/$eventosFacebook)*100;
  222. $porcentajesFacebook += $porcentajeParticipacionFacebook;
  223. }
  224. $porcentajeParticipacionTwitter = 0;
  225. if ($eventosTwitter > 0) {
  226. $contadorPorcentajesTwitter += 1;
  227. $porcentajeParticipacionTwitter = ($participacionesTwitter/$eventosTwitter)*100;
  228. $porcentajesTwitter += $porcentajeParticipacionTwitter;
  229. }
  230. $porcentajeParticipacionInstagram = 0;
  231. if ($eventosInstagram > 0) {
  232. $contadorPorcentajesInstagram += 1;
  233. $porcentajeParticipacionInstagram = ($participacionesInstagram/$eventosInstagram)*100;
  234. $porcentajesInstagram += $porcentajeParticipacionInstagram;
  235. }
  236. }
  237. $totalPorcentajesFacebook = 0;
  238. $totalPorcentajesTwitter = 0;
  239. $totalPorcentajesInstagram = 0;
  240. if ($contadorPorcentajesFacebook > 0) {
  241. $totalPorcentajesFacebook = $porcentajesFacebook/$contadorPorcentajesFacebook;
  242. }
  243. if ($contadorPorcentajesTwitter > 0) {
  244. $totalPorcentajesTwitter = $porcentajesTwitter/$contadorPorcentajesTwitter;
  245. }
  246. if ($contadorPorcentajesInstagram > 0) {
  247. $totalPorcentajesInstagram = $porcentajesInstagram/$contadorPorcentajesInstagram;
  248. }
  249. $porcentajeMaximo = 0;
  250. if($totalPorcentajesFacebook > $totalPorcentajesTwitter) {
  251. if ($totalPorcentajesFacebook > $totalPorcentajesInstagram) {
  252. $porcentajeMaximo = $totalPorcentajesFacebook;
  253. } else {
  254. $porcentajeMaximo = $totalPorcentajesInstagram;
  255. }
  256. } else {
  257. if ($totalPorcentajesTwitter > $totalPorcentajesInstagram) {
  258. $porcentajeMaximo = $totalPorcentajesTwitter;
  259. } else {
  260. $porcentajeMaximo = $totalPorcentajesInstagram;
  261. }
  262. }
  263. $meses[] = [
  264. "fechaInicio" => $_fechas[1],
  265. "fechaFinal" => $_fechas[2],
  266. "totalParticipantesFacebook" => $contadorPorcentajesFacebook,
  267. "porcentajesParticipacionFacebook" => $totalPorcentajesFacebook,
  268. "totalParticipantesTwitter" => $contadorPorcentajesTwitter,
  269. "porcentajesParticipacionTwitter" => $totalPorcentajesTwitter,
  270. "totalParticipantesInstagram" => $contadorPorcentajesInstagram,
  271. "porcentajesParticipacionInstagram" => $totalPorcentajesInstagram,
  272. "porcentajeParticipacionGlobal" => $totalPorcentajesFacebook+$totalPorcentajesTwitter+$totalPorcentajesInstagram,
  273. "porcentajeMaximoGlobal" => $porcentajeMaximo
  274. ];
  275. }
  276. $texto = ",VERIFICADOS FACEBOOK,VERIFICADOS INSTAGRAM,VERIFICADOS TWITTER,PORCENTAJE DE PARTICIPACIÓN GLOBAL,PORCENTAJE DE PARTICIPACIÓN - FACEBOOK,PORCENTAJE DE PARTICIPACIÓN - INSTAGRAM,PORCENTAJE DE PARTICIPACIÓN - TWITTER,PORCENTAJE MÁXIMO DE PARTICIPACIÓN GLOBAL\n";
  277. foreach($meses as $mes) {
  278. $fechaInicio = (DateTime::createFromFormat("Y-m-d H:i:s", $mes["fechaInicio"]))->format('d-m-Y');
  279. $fechaFinal = (DateTime::createFromFormat("Y-m-d H:i:s", $mes["fechaFinal"]))->format('d-m-Y');
  280. $texto .= "".
  281. $fechaInicio." - ".$fechaFinal.
  282. ",".$mes["totalParticipantesFacebook"].
  283. ",".$mes["totalParticipantesInstagram"].
  284. ",".$mes["totalParticipantesTwitter"].
  285. ",".$mes["porcentajeParticipacionGlobal"].
  286. ",".$mes["porcentajesParticipacionFacebook"].
  287. ",".$mes["porcentajesParticipacionInstagram"].
  288. ",".$mes["porcentajesParticipacionTwitter"].
  289. ",".$mes["porcentajeMaximoGlobal"]."\n";
  290. }
  291. return \Yii::$app->getResponse()->sendContentAsFile($texto, "reporte_global.csv");
  292. }
  293. public function actionGuardar() {
  294. $metodo = "";
  295. if(\Yii::$app->request->isPost) {
  296. $metodo = "POST";
  297. }
  298. if(\Yii::$app->request->isPut) {
  299. $metodo = "PUT";
  300. }
  301. return "Ejemplo de un método {$metodo}";
  302. }
  303. public function actionEliminar() {
  304. return "Ejemplo de un delete";
  305. }
  306. }