EventoController.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. <?php
  2. namespace app\commands;
  3. use app\components\FirebaseHelper;
  4. use app\models\Notificacion;
  5. use app\models\NotificacionUsuario;
  6. use common\data\Respuesta;
  7. use v1\models\Dependencia;
  8. use v1\models\Evento;
  9. use v1\models\EventoAccion;
  10. use v1\models\EventoGrupo;
  11. use v1\models\Grupo;
  12. use v1\models\Red;
  13. use v1\models\Resultado;
  14. use v1\models\Usuario;
  15. use v1\models\UsuarioDependencia;
  16. use v1\models\UsuarioGrupo;
  17. use yii\console\Controller;
  18. use yii\db\Expression;
  19. use yii\db\Query;
  20. use yii\helpers\Json;
  21. class EventoController extends Controller {
  22. public function stdoutln($cadena) {
  23. return $this->stdout($cadena . "\n");
  24. }
  25. public function cambiarFecha($string) {
  26. $formato = "D M d Y H:i:s P";
  27. $fecha = \DateTime::createFromFormat($formato, $string);
  28. return $fecha;
  29. }
  30. public function actionSincronizar() {
  31. $firebase = new FirebaseHelper();
  32. $firestore = $firebase->firestore();
  33. $refGrupos = $firestore->collection("grupos");
  34. $refUsuarios = $firestore->collection("usuarios");
  35. $refDependencias = $firestore->collection("dependencias");
  36. $grupos = [];
  37. $usuarios = [];
  38. $dependencias = [];
  39. foreach ($refGrupos->documents() as $grupo) {
  40. $grupos[$grupo->id()] = $grupo->data();
  41. }
  42. foreach ($refUsuarios->documents() as $usuario) {
  43. $usuarios[$usuario->id()] = $usuario->data();
  44. }
  45. foreach ($refDependencias->documents() as $dependencia) {
  46. $dependencias[$dependencia->id()] = $dependencia->data();
  47. }
  48. $ultimaFecha = null;
  49. $limite = 100; // 1000;
  50. $continuar = true;
  51. do {
  52. $this->stdout("Sincronizando ...");
  53. $ref = $firestore->collection("eventos")
  54. ->where("sincronizado", "==", null)
  55. ->orderBy("timestamp", "ASC")
  56. ->limit($limite);
  57. if ($ultimaFecha !== null) {
  58. $ref = $ref->startAt([$ultimaFecha]);
  59. }
  60. $c = 0; # Contador de registros procesados
  61. foreach ($ref->documents() as $doc) {
  62. $this->stdoutln($doc->id());
  63. $c++;
  64. $data = $doc->data();
  65. $ultimaFecha = $data["timestamp"];
  66. $modelo = Evento::findOne(["firebaseId" => $doc->id()]);
  67. if ($modelo === null) {
  68. $modelo = new Evento();
  69. }
  70. try {
  71. $modelo->nombre = $data["nombre"];
  72. $modelo->descripcion = $data["descripcion"];
  73. $modelo->ciudad = $data["ciudad"];
  74. $modelo->redSocial = $data["redSocial"];
  75. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]);
  76. if ($creado !== false) {
  77. $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  78. }
  79. $fechaInicio = $this->cambiarFecha($data["fechaInicio"]);
  80. if ($fechaInicio !== false) {
  81. $modelo->fechaInicio = $fechaInicio->format(\DateTime::RFC3339_EXTENDED);
  82. }
  83. $fechaFinal = $this->cambiarFecha($data["fechaFinal"]);
  84. if ($fechaFinal !== false) {
  85. $modelo->fechaFinal = $fechaFinal->format(\DateTime::RFC3339_EXTENDED);
  86. }
  87. $modelo->fotoEvento = $data["fotoEvento"];
  88. $modelo->url = $data["pathFirebase"];
  89. if (isset($data["tag"])) {
  90. $modelo->tag = $data["tag"];
  91. }
  92. $modelo->firebaseId = $doc->id();
  93. if (!$modelo->save()) {
  94. $this->stdoutln('Ocurrió un error al guardar un evento. ' . Json::encode($modelo->getFirstErrors()));
  95. continue;
  96. }
  97. if (isset($data["redes"])) {
  98. foreach ($data["redes"] as $red) {
  99. $eventoRed = Red::find()
  100. ->andWhere([
  101. "idEvento" => $modelo->id,
  102. "url" => $red["url"]
  103. ])
  104. ->one();
  105. if ($eventoRed === null) {
  106. $eventoRed = new Red();
  107. $eventoRed->idEvento = $modelo->id;
  108. $eventoRed->key = $red["key"];
  109. $eventoRed->url = $red["url"];
  110. $eventoRed->redSocial = $red["redSocial"];
  111. if (!$eventoRed->save()) {
  112. $this->stdoutln('Ocurrió un error al guardar una red. ' . Json::encode($eventoRed->getFirstErrors()));
  113. continue;
  114. }
  115. }
  116. }
  117. }
  118. foreach ($data["accion"] as $accion) {
  119. $eventoAccion = EventoAccion::find()
  120. ->andWhere([
  121. "idEvento" => $modelo->id,
  122. "accion" => $accion
  123. ])
  124. ->one();
  125. if ($eventoAccion === null) {
  126. $eventoAccion = new EventoAccion();
  127. $eventoAccion->idEvento = $modelo->id;
  128. $eventoAccion->accion = $accion;
  129. if (!$eventoAccion->save()) {
  130. $this->stdoutln('Ocurrió un error al guardar un evento-accion. ' . Json::encode($eventoAccion->getFirstErrors()));
  131. continue;
  132. }
  133. }
  134. }
  135. //Grupos dentro de los eventos
  136. foreach ($data["grupos"] as $grupoEvento) {
  137. $grupoModelo = Grupo::findOne(["firebaseId" => $grupoEvento]);
  138. if ($grupoModelo === null && isset($grupos[$grupoEvento])) {
  139. $grupoModelo = new Grupo();
  140. $grupoModelo->creado = new Expression('now()');
  141. $grupoModelo->nombre = $grupos[$grupoEvento]["nombre"];
  142. $grupoModelo->descripcion = $grupos[$grupoEvento]["descripcion"];
  143. $grupoModelo->firebaseId = $grupoEvento;
  144. if (!$grupoModelo->save()) {
  145. $this->stdoutln('Ocurrió un error al guardar un grupo. ' . Json::encode($grupoModelo->getFirstErrors()));
  146. }
  147. }
  148. if ($grupoModelo !== null) {
  149. $eventoGrupo = EventoGrupo::find()
  150. ->andWhere([
  151. "idEvento" => $modelo->id,
  152. "idGrupo" => $grupoModelo->id
  153. ])
  154. ->one();
  155. if ($eventoGrupo === null) {
  156. $eventoGrupo = new EventoGrupo();
  157. $eventoGrupo->idEvento = $modelo->id;
  158. $eventoGrupo->idGrupo = $grupoModelo->id;
  159. if (!$eventoGrupo->save()) {
  160. $this->stdoutln('Ocurrió un error al guardar un evento-grupo. ' . Json::encode($eventoGrupo->getFirstErrors()));
  161. }
  162. }
  163. }
  164. }
  165. foreach ($data["usuarios"] as $usuarioEvento) {
  166. $usuarioModelo = Usuario::findOne(["uid" => $usuarioEvento["uid"]]);
  167. $usuarioRef = isset($usuarios[$usuarioEvento["uid"]])
  168. ? $usuarios[$usuarioEvento["uid"]] : null;
  169. // Usuarios
  170. if ($usuarioModelo === null && $usuarioRef !== null) {
  171. $usuarioModelo = new Usuario();
  172. $usuarioModelo->uid = $usuarioRef["uid"];
  173. $usuarioModelo->nombre = $usuarioRef["nombre"];
  174. if (isset($usuarioRef["email"])) {
  175. $usuarioModelo->email = $usuarioRef["email"];
  176. }
  177. $usuarioModelo->telefono = $usuarioRef["telefono"];
  178. $usuarioModelo->facebook = $usuarioRef["facebook"];
  179. if (isset($usuarioRef["facebookVerificado"])) {
  180. $usuarioModelo->facebookVerificado = $usuarioRef["facebookVerificado"];
  181. }
  182. $usuarioModelo->instagram = $usuarioRef["instagram"];
  183. if (isset($usuarioRef["instagramVerificado"])) {
  184. $usuarioModelo->instagramVerificado = $usuarioRef["instagramVerificado"];
  185. }
  186. $usuarioModelo->twitter = $usuarioRef["twitter"];
  187. if (isset($usuarioRef["twitterVerificado"])) {
  188. $usuarioModelo->twitterVerificado = $usuarioRef["twitterVerificado"];
  189. }
  190. $usuarioModelo->genero = $usuarioRef["genero"];
  191. $usuarioModelo->verificado = $usuarioRef["verificado"];
  192. $usuarioModelo->creado = new Expression('now()');
  193. if ($usuarioRef["estatus"] === false) {
  194. $usuarioModelo->eliminado = new Expression('now()');
  195. }
  196. if (!$usuarioModelo->save()) {
  197. $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($usuarioModelo->getFirstErrors()));
  198. }
  199. }
  200. // UsuarioGrupo
  201. if ($usuarioModelo !== null && isset($usuarioRef["grupos"]) && isset($usuarioRef["grupos"][0])) {
  202. for($i = 0; $i < count($usuarioRef["grupos"]); $i++) {
  203. $modelGrupo = Grupo::findOne(['firebaseId' => $usuarioRef["grupos"][$i]]);
  204. if (isset($modelGrupo)) {
  205. $usuarioGrupo = UsuarioGrupo::find()
  206. ->andWhere([
  207. "idUsuario" => $usuarioModelo->id,
  208. "idGrupo" => $modelGrupo->id
  209. ])
  210. ->one();
  211. if ($usuarioGrupo === null) {
  212. $usuarioGrupo = new UsuarioGrupo();
  213. $usuarioGrupo->idUsuario = $usuarioModelo->id;
  214. $usuarioGrupo->idGrupo = $modelGrupo->id;
  215. if (!$usuarioGrupo->save()) {
  216. $this->stdoutln('Ocurrió un error al guardar un usuario-grupo. ' . Json::encode($usuarioGrupo->getFirstErrors()));
  217. }
  218. }
  219. }
  220. }
  221. }
  222. // Resultados
  223. if ($usuarioModelo !== null && isset($data["resultado"])) {
  224. $resultados = $data["resultado"];
  225. if (isset($resultados[$usuarioModelo->uid])) {
  226. foreach ($resultados[$usuarioModelo->uid] as $_accion) {
  227. $resultadoModelo = Resultado::find()
  228. ->andWhere([
  229. "idUsuario" => $usuarioModelo->id,
  230. "idEvento" => $modelo->id,
  231. "accion" => $_accion
  232. ])
  233. ->exists();
  234. if (!$resultadoModelo) {
  235. $resultadoModelo = new Resultado();
  236. $resultadoModelo->idUsuario = $usuarioModelo->id;
  237. $resultadoModelo->idEvento = $modelo->id;
  238. $resultadoModelo->accion = $_accion;
  239. if (!$resultadoModelo->save()) {
  240. $this->stdoutln('Ocurrió un error al guardar un resultado. ' . Json::encode($resultadoModelo->getFirstErrors()));
  241. }
  242. }
  243. }
  244. }
  245. }
  246. // Dependencias
  247. if ($usuarioModelo !== null && isset($usuarioRef["dependencias"]) && isset($usuarioRef["dependencias"][0])) {
  248. if (!empty($usuarioRef["dependencias"])){
  249. if (is_array($usuarioRef["dependencias"])) {
  250. for ($i = 0; $i < count($usuarioRef["dependencias"]); $i++){
  251. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"][$i]]);
  252. if ($dependenciaModel === null) {
  253. $dependenciaRef = $dependencias[$usuarioRef["dependencias"][$i]];
  254. $dependenciaModel = new Dependencia();
  255. $dependenciaModel->firebaseId = $usuarioRef["dependencias"][$i];
  256. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  257. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  258. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  259. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  260. if ($creado !== false) {
  261. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  262. }
  263. if (!$dependenciaModel->save()) {
  264. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  265. }
  266. }
  267. //UsuarioDependencia
  268. $usuarioDependencia = UsuarioDependencia::find()
  269. ->andWhere([
  270. "idUsuario" => $usuarioModelo->id,
  271. "idDependencia" => $dependenciaModel->id
  272. ])
  273. ->one();
  274. if ($usuarioDependencia === null) {
  275. $usuarioDependencia = new UsuarioDependencia();
  276. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  277. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  278. if (!$usuarioDependencia->save()) {
  279. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  280. }
  281. }
  282. }
  283. } else {
  284. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"]]);
  285. if ($dependenciaModel === null) {
  286. $dependenciaRef = $dependencias[$usuarioRef["dependencias"]];
  287. $dependenciaModel = new Dependencia();
  288. $dependenciaModel->firebaseId = $usuarioRef["dependencias"];
  289. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  290. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  291. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  292. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  293. if ($creado !== false) {
  294. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  295. }
  296. if (!$dependenciaModel->save()) {
  297. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  298. }
  299. }
  300. //UsuarioDependencia
  301. $usuarioDependencia = UsuarioDependencia::find()
  302. ->andWhere([
  303. "idUsuario" => $usuarioModelo->id,
  304. "idDependencia" => $dependenciaModel->id
  305. ])
  306. ->one();
  307. if ($usuarioDependencia === null) {
  308. $usuarioDependencia = new UsuarioDependencia();
  309. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  310. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  311. if (!$usuarioDependencia->save()) {
  312. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  313. }
  314. }
  315. }
  316. }
  317. }
  318. }
  319. $hoy = new \DateTime();
  320. $doc->reference()
  321. ->update([
  322. ["path" => "sincronizado", "value" => "OK"],
  323. ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")],
  324. ]);
  325. $this->stdoutln("Sincronizado correcto");
  326. } catch (\Exception $e) {
  327. $this->stdoutln("Exception: {$e->getMessage()}\n");
  328. $doc->reference()
  329. ->update([
  330. ["path" => "sincronizado", "value" => "ERROR"],
  331. ["path" => "sincronizadoError", "value" => $e->getMessage()],
  332. ["path" => "sincronizadoErrorLine", "value" => $e->getLine()],
  333. ]);
  334. }
  335. }
  336. # Si los registros procesados son menores al límite, terminar
  337. if ($c < $limite) {
  338. $continuar = false;
  339. }
  340. } while ($continuar);
  341. }
  342. public function consultarNorificacion() {
  343. $query = Notificacion::find()
  344. ->orderBy(["id" => SORT_ASC]);
  345. $enviando = (clone $query)
  346. ->andWhere(["estatus" => Notificacion::ESTATUS_ENVIANDO])
  347. ->one();
  348. if ($enviando !== null) {
  349. $this->stdout("Notificación en poceso: ". $enviando->id ."\n");
  350. return null;
  351. }
  352. return (clone $query)
  353. ->andWhere(["estatus" => Notificacion::ESTATUS_NUEVO])
  354. ->one();
  355. }
  356. public function actionParticipacion() {
  357. $eventos = (new Query())
  358. ->select([
  359. "nombre",
  360. "tag"
  361. ])
  362. ->from("Evento")
  363. ->andWhere([">=", "fechaFinal", new Expression("now()-interval '7 days'")])
  364. ->groupBy(["tag", "nombre"])
  365. ->indexBy("tag")
  366. ->column();
  367. // $sql = $eventos->createCommand()->getRawSql();
  368. $query2 = (new Query())
  369. ->select([
  370. "tag",
  371. "{{Usuario}}.id",
  372. "{{Usuario}}.nombre",
  373. "{{Usuario}}.telefono",
  374. "case when count({{Resultado}}.accion) > 0 then true else false end as [[Participo]]"
  375. ])
  376. ->from("Evento")
  377. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  378. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  379. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  380. ->innerJoin("Usuario", "{{Usuario}}.[[id]] = {{UsuarioGrupo}}.[[idUsuario]]")
  381. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id")
  382. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
  383. ->andWhere(["{{Usuario}}.eliminado" => null])
  384. ->andWhere([">=", "fechaFinal", new Expression("now()-interval '7 days'")])
  385. /* ->andWhere([
  386. "AND",
  387. [">=", "fechaFinal", $desde],
  388. ["<=", "fechaFinal", $hasta]
  389. ]) */
  390. ->groupBy([
  391. "{{Usuario}}.nombre",
  392. "{{Usuario}}.telefono",
  393. "{{Usuario}}.id",
  394. "tag"
  395. ])
  396. ->orderBy([
  397. "{{Usuario}}.id" => SORT_ASC,
  398. // "tag" => SORT_ASC,
  399. "[[Participo]]" => SORT_DESC,
  400. ]);
  401. $aux = [];
  402. foreach($query2->each() as $consulta) {
  403. if (!isset($aux[$consulta['id']])) {
  404. $aux[$consulta['id']] = [
  405. "nombreUsuario" => $consulta['nombre'],
  406. "telefono" => $consulta['telefono'],
  407. "id" => $consulta['id'],
  408. "eventosFaltantes" => [],
  409. "eventosParticipo" => []
  410. ];
  411. }
  412. $nombreEvento = $eventos[$consulta['tag']];
  413. if ($consulta['Participo']) {
  414. $aux[$consulta['id']]['eventosParticipo'][] = $nombreEvento;
  415. } else {
  416. $aux[$consulta['id']]['eventosFaltantes'][] = $nombreEvento;
  417. }
  418. }
  419. $notificacion = new Notificacion();
  420. $notificacion->creado = new Expression("now()");
  421. if (!$notificacion->save()) {
  422. return (new Respuesta($notificacion))
  423. ->mensaje("Hubo un problema al generar la notificación");
  424. }
  425. $notificacion->refresh();
  426. foreach ($aux as $usuario) {
  427. $notificacionUsuario = new NotificacionUsuario();
  428. $notificacionUsuario->idNotificacion = $notificacion->id;
  429. $notificacionUsuario->idUsuario = $usuario['id'];
  430. $notificacionUsuario->nombre = $usuario['nombreUsuario'];
  431. $notificacionUsuario->telefono = $usuario['telefono'];
  432. $notificacionUsuario->parametros = [
  433. [
  434. "type" => "text",
  435. "text" => count($usuario["eventosParticipo"])."/".count($eventos)
  436. ],
  437. [
  438. "type" => "text",
  439. "text" => "gracias por tu"
  440. ]
  441. ];
  442. if (!$notificacionUsuario->save()) {
  443. return (new Respuesta($notificacionUsuario))
  444. ->mensaje("Hubo un problema al generar la notificación");
  445. }
  446. }
  447. $notificacion->estatus = Notificacion::ESTATUS_NUEVO;
  448. $notificacion->save();
  449. $this->stdout("Terminó");
  450. // $this->stdout(json_encode($aux)."\n");
  451. // file_put_contents("archivo.json", json_encode($aux));
  452. }
  453. }