EventoController.php 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. <?php
  2. namespace app\commands;
  3. use app\components\FirebaseHelper;
  4. use app\models\DependenciaLider;
  5. use app\models\Notificacion;
  6. use app\models\NotificacionUsuario;
  7. use common\data\Respuesta;
  8. use DateTime;
  9. use Google\Cloud\Core\Timestamp;
  10. use Kreait\Firebase\Firestore;
  11. use v1\models\Dependencia;
  12. use v1\models\Evento;
  13. use v1\models\EventoAccion;
  14. use v1\models\EventoGrupo;
  15. use v1\models\Grupo;
  16. use v1\models\Red;
  17. use v1\models\Resultado;
  18. use v1\models\Usuario;
  19. use v1\models\UsuarioDependencia;
  20. use v1\models\UsuarioGrupo;
  21. use yii\console\Controller;
  22. use yii\db\Expression;
  23. use yii\db\Query;
  24. use yii\helpers\Json;
  25. class EventoController extends Controller {
  26. public function stdoutln($cadena) {
  27. return $this->stdout($cadena . "\n");
  28. }
  29. public function cambiarFecha($string) {
  30. $formato = "D M d Y H:i:s P";
  31. $fecha = \DateTime::createFromFormat($formato, $string);
  32. return $fecha;
  33. }
  34. public function actionSincronizar() {
  35. $firebase = new FirebaseHelper();
  36. $firestore = $firebase->firestore();
  37. $refGrupos = $firestore->collection("grupos");
  38. $refUsuarios = $firestore->collection("usuarios");
  39. $refDependencias = $firestore->collection("dependencias");
  40. $grupos = [];
  41. $usuarios = [];
  42. $dependencias = [];
  43. foreach ($refGrupos->documents() as $grupo) {
  44. $grupos[$grupo->id()] = $grupo->data();
  45. }
  46. foreach ($refUsuarios->documents() as $usuario) {
  47. $usuarios[$usuario->id()] = $usuario->data();
  48. }
  49. foreach ($refDependencias->documents() as $dependencia) {
  50. $dependencias[$dependencia->id()] = $dependencia->data();
  51. }
  52. $ultimaFecha = null;
  53. $limite = 100; // 1000;
  54. $continuar = true;
  55. do {
  56. $this->stdout("Sincronizando ...");
  57. $ref = $firestore->collection("eventos")
  58. ->where("sincronizado", "==", null)
  59. ->orderBy("timestamp", "ASC")
  60. ->limit($limite);
  61. if ($ultimaFecha !== null) {
  62. $ref = $ref->startAt([$ultimaFecha]);
  63. }
  64. $c = 0; # Contador de registros procesados
  65. foreach ($ref->documents() as $doc) {
  66. $this->stdoutln($doc->id());
  67. $c++;
  68. $data = $doc->data();
  69. $ultimaFecha = $data["timestamp"];
  70. $modelo = Evento::findOne(["firebaseId" => $doc->id()]);
  71. if ($modelo === null) {
  72. $modelo = new Evento();
  73. }
  74. try {
  75. $modelo->nombre = $data["nombre"];
  76. $modelo->descripcion = $data["descripcion"];
  77. $modelo->ciudad = $data["ciudad"];
  78. $modelo->redSocial = $data["redSocial"];
  79. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]);
  80. if ($creado !== false) {
  81. $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  82. }
  83. $fechaInicio = $this->cambiarFecha($data["fechaInicio"]);
  84. if ($fechaInicio !== false) {
  85. $modelo->fechaInicio = $fechaInicio->format(\DateTime::RFC3339_EXTENDED);
  86. }
  87. $fechaFinal = $this->cambiarFecha($data["fechaFinal"]);
  88. if ($fechaFinal !== false) {
  89. $modelo->fechaFinal = $fechaFinal->format(\DateTime::RFC3339_EXTENDED);
  90. }
  91. $modelo->fotoEvento = $data["fotoEvento"];
  92. $modelo->url = $data["pathFirebase"];
  93. if (isset($data["tag"])) {
  94. $modelo->tag = $data["tag"];
  95. }
  96. $modelo->firebaseId = $doc->id();
  97. if (!$modelo->save()) {
  98. $this->stdoutln('Ocurrió un error al guardar un evento. ' . Json::encode($modelo->getFirstErrors()));
  99. continue;
  100. }
  101. if (isset($data["redes"])) {
  102. foreach ($data["redes"] as $red) {
  103. $eventoRed = Red::find()
  104. ->andWhere([
  105. "idEvento" => $modelo->id,
  106. "url" => $red["url"]
  107. ])
  108. ->one();
  109. if ($eventoRed === null) {
  110. $eventoRed = new Red();
  111. $eventoRed->idEvento = $modelo->id;
  112. $eventoRed->key = $red["key"];
  113. $eventoRed->url = $red["url"];
  114. $eventoRed->redSocial = $red["redSocial"];
  115. if (!$eventoRed->save()) {
  116. $this->stdoutln('Ocurrió un error al guardar una red. ' . Json::encode($eventoRed->getFirstErrors()));
  117. continue;
  118. }
  119. }
  120. }
  121. }
  122. foreach ($data["accion"] as $accion) {
  123. $eventoAccion = EventoAccion::find()
  124. ->andWhere([
  125. "idEvento" => $modelo->id,
  126. "accion" => $accion
  127. ])
  128. ->one();
  129. if ($eventoAccion === null) {
  130. $eventoAccion = new EventoAccion();
  131. $eventoAccion->idEvento = $modelo->id;
  132. $eventoAccion->accion = $accion;
  133. if (!$eventoAccion->save()) {
  134. $this->stdoutln('Ocurrió un error al guardar un evento-accion. ' . Json::encode($eventoAccion->getFirstErrors()));
  135. continue;
  136. }
  137. }
  138. }
  139. //Grupos dentro de los eventos
  140. foreach ($data["grupos"] as $grupoEvento) {
  141. $grupoModelo = Grupo::findOne(["firebaseId" => $grupoEvento]);
  142. if ($grupoModelo === null && isset($grupos[$grupoEvento])) {
  143. $grupoModelo = new Grupo();
  144. $grupoModelo->creado = new Expression('now()');
  145. $grupoModelo->nombre = $grupos[$grupoEvento]["nombre"];
  146. $grupoModelo->descripcion = $grupos[$grupoEvento]["descripcion"];
  147. $grupoModelo->firebaseId = $grupoEvento;
  148. if (!$grupoModelo->save()) {
  149. $this->stdoutln('Ocurrió un error al guardar un grupo. ' . Json::encode($grupoModelo->getFirstErrors()));
  150. }
  151. }
  152. if ($grupoModelo !== null) {
  153. $eventoGrupo = EventoGrupo::find()
  154. ->andWhere([
  155. "idEvento" => $modelo->id,
  156. "idGrupo" => $grupoModelo->id
  157. ])
  158. ->one();
  159. if ($eventoGrupo === null) {
  160. $eventoGrupo = new EventoGrupo();
  161. $eventoGrupo->idEvento = $modelo->id;
  162. $eventoGrupo->idGrupo = $grupoModelo->id;
  163. if (!$eventoGrupo->save()) {
  164. $this->stdoutln('Ocurrió un error al guardar un evento-grupo. ' . Json::encode($eventoGrupo->getFirstErrors()));
  165. }
  166. }
  167. }
  168. }
  169. foreach ($data["usuarios"] as $usuarioEvento) {
  170. $usuarioModelo = Usuario::findOne(["uid" => $usuarioEvento["uid"]]);
  171. $usuarioRef = isset($usuarios[$usuarioEvento["uid"]])
  172. ? $usuarios[$usuarioEvento["uid"]] : null;
  173. // Usuarios
  174. if ($usuarioModelo === null && $usuarioRef !== null) {
  175. $usuarioModelo = new Usuario();
  176. $usuarioModelo->uid = $usuarioRef["uid"];
  177. $usuarioModelo->nombre = $usuarioRef["nombre"];
  178. if (isset($usuarioRef["email"])) {
  179. $usuarioModelo->email = $usuarioRef["email"];
  180. }
  181. $usuarioModelo->telefono = $usuarioRef["telefono"];
  182. $usuarioModelo->facebook = $usuarioRef["facebook"];
  183. if (isset($usuarioRef["facebookVerificado"])) {
  184. $usuarioModelo->facebookVerificado = $usuarioRef["facebookVerificado"];
  185. }
  186. $usuarioModelo->instagram = $usuarioRef["instagram"];
  187. if (isset($usuarioRef["instagramVerificado"])) {
  188. $usuarioModelo->instagramVerificado = $usuarioRef["instagramVerificado"];
  189. }
  190. $usuarioModelo->twitter = $usuarioRef["twitter"];
  191. if (isset($usuarioRef["twitterVerificado"])) {
  192. $usuarioModelo->twitterVerificado = $usuarioRef["twitterVerificado"];
  193. }
  194. $usuarioModelo->genero = $usuarioRef["genero"];
  195. $usuarioModelo->verificado = $usuarioRef["verificado"];
  196. $usuarioModelo->liderGobal = $usuarioRef["liderGlobal"];
  197. $usuarioModelo->creado = new Expression('now()');
  198. if ($usuarioRef["estatus"] === false) {
  199. $usuarioModelo->eliminado = new Expression('now()');
  200. }
  201. if (!$usuarioModelo->save()) {
  202. $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($usuarioModelo->getFirstErrors()));
  203. }
  204. }
  205. // UsuarioGrupo
  206. if ($usuarioModelo !== null && isset($usuarioRef["grupos"]) && isset($usuarioRef["grupos"][0])) {
  207. for ($i = 0; $i < count($usuarioRef["grupos"]); $i++) {
  208. $modelGrupo = Grupo::findOne(['firebaseId' => $usuarioRef["grupos"][$i]]);
  209. if (isset($modelGrupo)) {
  210. $usuarioGrupo = UsuarioGrupo::find()
  211. ->andWhere([
  212. "idUsuario" => $usuarioModelo->id,
  213. "idGrupo" => $modelGrupo->id
  214. ])
  215. ->one();
  216. if ($usuarioGrupo === null) {
  217. $usuarioGrupo = new UsuarioGrupo();
  218. $usuarioGrupo->idUsuario = $usuarioModelo->id;
  219. $usuarioGrupo->idGrupo = $modelGrupo->id;
  220. if (!$usuarioGrupo->save()) {
  221. $this->stdoutln('Ocurrió un error al guardar un usuario-grupo. ' . Json::encode($usuarioGrupo->getFirstErrors()));
  222. }
  223. }
  224. }
  225. }
  226. }
  227. // Resultados
  228. if ($usuarioModelo !== null && isset($data["resultado"])) {
  229. $resultados = $data["resultado"];
  230. if (isset($resultados[$usuarioModelo->uid])) {
  231. foreach ($resultados[$usuarioModelo->uid] as $_accion) {
  232. $resultadoModelo = Resultado::find()
  233. ->andWhere([
  234. "idUsuario" => $usuarioModelo->id,
  235. "idEvento" => $modelo->id,
  236. "accion" => $_accion
  237. ])
  238. ->exists();
  239. if (!$resultadoModelo) {
  240. $resultadoModelo = new Resultado();
  241. $resultadoModelo->idUsuario = $usuarioModelo->id;
  242. $resultadoModelo->idEvento = $modelo->id;
  243. $resultadoModelo->accion = $_accion;
  244. if (!$resultadoModelo->save()) {
  245. $this->stdoutln('Ocurrió un error al guardar un resultado. ' . Json::encode($resultadoModelo->getFirstErrors()));
  246. }
  247. }
  248. }
  249. }
  250. }
  251. // Dependencias
  252. if ($usuarioModelo !== null && isset($usuarioRef["dependencias"]) && isset($usuarioRef["dependencias"][0])) {
  253. if (!empty($usuarioRef["dependencias"])) {
  254. if (is_array($usuarioRef["dependencias"])) {
  255. for ($i = 0; $i < count($usuarioRef["dependencias"]); $i++) {
  256. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"][$i]]);
  257. if ($dependenciaModel === null) {
  258. $dependenciaRef = $dependencias[$usuarioRef["dependencias"][$i]];
  259. $dependenciaModel = new Dependencia();
  260. $dependenciaModel->firebaseId = $usuarioRef["dependencias"][$i];
  261. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  262. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  263. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  264. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  265. if ($creado !== false) {
  266. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  267. }
  268. if (!$dependenciaModel->save()) {
  269. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  270. }
  271. }
  272. //UsuarioDependencia
  273. $usuarioDependencia = UsuarioDependencia::find()
  274. ->andWhere([
  275. "idUsuario" => $usuarioModelo->id,
  276. "idDependencia" => $dependenciaModel->id
  277. ])
  278. ->one();
  279. if ($usuarioDependencia === null) {
  280. $usuarioDependencia = new UsuarioDependencia();
  281. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  282. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  283. if (!$usuarioDependencia->save()) {
  284. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  285. }
  286. }
  287. }
  288. } else {
  289. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"]]);
  290. if ($dependenciaModel === null) {
  291. $dependenciaRef = $dependencias[$usuarioRef["dependencias"]];
  292. $dependenciaModel = new Dependencia();
  293. $dependenciaModel->firebaseId = $usuarioRef["dependencias"];
  294. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  295. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  296. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  297. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  298. if ($creado !== false) {
  299. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  300. }
  301. if (!$dependenciaModel->save()) {
  302. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  303. }
  304. }
  305. //UsuarioDependencia
  306. $usuarioDependencia = UsuarioDependencia::find()
  307. ->andWhere([
  308. "idUsuario" => $usuarioModelo->id,
  309. "idDependencia" => $dependenciaModel->id
  310. ])
  311. ->one();
  312. if ($usuarioDependencia === null) {
  313. $usuarioDependencia = new UsuarioDependencia();
  314. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  315. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  316. if (!$usuarioDependencia->save()) {
  317. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  318. }
  319. }
  320. }
  321. }
  322. }
  323. }
  324. $hoy = new \DateTime();
  325. $doc->reference()
  326. ->update([
  327. ["path" => "sincronizado", "value" => "OK"],
  328. ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")],
  329. ]);
  330. $this->stdoutln("Sincronizado correcto");
  331. } catch (\Exception $e) {
  332. $this->stdoutln("Exception: {$e->getMessage()}\n");
  333. $doc->reference()
  334. ->update([
  335. ["path" => "sincronizado", "value" => "ERROR"],
  336. ["path" => "sincronizadoError", "value" => $e->getMessage()],
  337. ["path" => "sincronizadoErrorLine", "value" => $e->getLine()],
  338. ]);
  339. }
  340. }
  341. # Si los registros procesados son menores al límite, terminar
  342. if ($c < $limite) {
  343. $continuar = false;
  344. }
  345. } while ($continuar);
  346. }
  347. public function actionSincronizarAcumulado() {
  348. $firebase = new FirebaseHelper();
  349. $firestore = $firebase->firestore();
  350. $refGrupos = $firestore->collection("grupos");
  351. $refUsuarios = $firestore->collection("usuarios");
  352. $refDependencias = $firestore->collection("dependencias");
  353. $grupos = [];
  354. $usuarios = [];
  355. $dependencias = [];
  356. foreach ($refGrupos->documents() as $grupo) {
  357. $grupos[$grupo->id()] = $grupo->data();
  358. }
  359. foreach ($refUsuarios->documents() as $usuario) {
  360. $usuarios[$usuario->id()] = $usuario->data();
  361. }
  362. foreach ($refDependencias->documents() as $dependencia) {
  363. $dependencias[$dependencia->id()] = $dependencia->data();
  364. }
  365. $ultimaFecha = null;
  366. $limite = 100; // 1000;
  367. $continuar = true;
  368. $fechaActual = new DateTime();
  369. $finFirebase = new Timestamp($fechaActual);
  370. $this->stdout("fechaFin: {$finFirebase} \n");
  371. $semanaPasada = new DateTime('-1 week');
  372. $inicioFirebase = new Timestamp($semanaPasada);
  373. $this->stdout("fechaFin: {$finFirebase} \n");
  374. do {
  375. $this->stdout("Sincronizando ...");
  376. $ref = $firestore->collection("eventos")
  377. ->where("timestamp", ">=", $inicioFirebase)
  378. ->where("timestamp", "<=", $finFirebase)
  379. ->orderBy("timestamp", "DESC")
  380. ->limit($limite);
  381. $documentos = $ref->documents()->size();
  382. $this->stdout("Total documentos: {$documentos} \n");
  383. if ($ultimaFecha !== null) {
  384. $ref = $ref->startAt([$ultimaFecha]);
  385. }
  386. $c = 0; # Contador de registros procesados
  387. foreach ($ref->documents() as $doc) {
  388. $this->stdoutln($doc->id());
  389. $c++;
  390. $data = $doc->data();
  391. $ultimaFecha = $data["timestamp"];
  392. $modelo = Evento::findOne(["firebaseId" => $doc->id()]);
  393. if ($modelo === null) {
  394. $modelo = new Evento();
  395. }
  396. try {
  397. $modelo->nombre = $data["nombre"];
  398. $modelo->descripcion = $data["descripcion"];
  399. $modelo->ciudad = $data["ciudad"];
  400. $modelo->redSocial = $data["redSocial"];
  401. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]);
  402. if ($creado !== false) {
  403. $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  404. }
  405. $fechaInicio = $this->cambiarFecha($data["fechaInicio"]);
  406. if ($fechaInicio !== false) {
  407. $modelo->fechaInicio = $fechaInicio->format(\DateTime::RFC3339_EXTENDED);
  408. }
  409. $fechaFinal = $this->cambiarFecha($data["fechaFinal"]);
  410. if ($fechaFinal !== false) {
  411. $modelo->fechaFinal = $fechaFinal->format(\DateTime::RFC3339_EXTENDED);
  412. }
  413. $modelo->fotoEvento = $data["fotoEvento"];
  414. $modelo->url = $data["pathFirebase"];
  415. if (isset($data["tag"])) {
  416. $modelo->tag = $data["tag"];
  417. }
  418. $modelo->firebaseId = $doc->id();
  419. if (!$modelo->save()) {
  420. $this->stdoutln('Ocurrió un error al guardar un evento. ' . Json::encode($modelo->getFirstErrors()));
  421. continue;
  422. }
  423. if (isset($data["redes"])) {
  424. foreach ($data["redes"] as $red) {
  425. $eventoRed = Red::find()
  426. ->andWhere([
  427. "idEvento" => $modelo->id,
  428. "url" => $red["url"]
  429. ])
  430. ->one();
  431. if ($eventoRed === null) {
  432. $eventoRed = new Red();
  433. $eventoRed->idEvento = $modelo->id;
  434. $eventoRed->key = $red["key"];
  435. $eventoRed->url = $red["url"];
  436. $eventoRed->redSocial = $red["redSocial"];
  437. if (!$eventoRed->save()) {
  438. $this->stdoutln('Ocurrió un error al guardar una red. ' . Json::encode($eventoRed->getFirstErrors()));
  439. continue;
  440. }
  441. }
  442. }
  443. }
  444. foreach ($data["accion"] as $accion) {
  445. $eventoAccion = EventoAccion::find()
  446. ->andWhere([
  447. "idEvento" => $modelo->id,
  448. "accion" => $accion
  449. ])
  450. ->one();
  451. if ($eventoAccion === null) {
  452. $eventoAccion = new EventoAccion();
  453. $eventoAccion->idEvento = $modelo->id;
  454. $eventoAccion->accion = $accion;
  455. if (!$eventoAccion->save()) {
  456. $this->stdoutln('Ocurrió un error al guardar un evento-accion. ' . Json::encode($eventoAccion->getFirstErrors()));
  457. continue;
  458. }
  459. }
  460. }
  461. //Grupos dentro de los eventos
  462. foreach ($data["grupos"] as $grupoEvento) {
  463. $grupoModelo = Grupo::findOne(["firebaseId" => $grupoEvento]);
  464. if ($grupoModelo === null && isset($grupos[$grupoEvento])) {
  465. $grupoModelo = new Grupo();
  466. $grupoModelo->creado = new Expression('now()');
  467. $grupoModelo->nombre = $grupos[$grupoEvento]["nombre"];
  468. $grupoModelo->descripcion = $grupos[$grupoEvento]["descripcion"];
  469. $grupoModelo->firebaseId = $grupoEvento;
  470. if (!$grupoModelo->save()) {
  471. $this->stdoutln('Ocurrió un error al guardar un grupo. ' . Json::encode($grupoModelo->getFirstErrors()));
  472. }
  473. }
  474. if ($grupoModelo !== null) {
  475. $eventoGrupo = EventoGrupo::find()
  476. ->andWhere([
  477. "idEvento" => $modelo->id,
  478. "idGrupo" => $grupoModelo->id
  479. ])
  480. ->one();
  481. if ($eventoGrupo === null) {
  482. $eventoGrupo = new EventoGrupo();
  483. $eventoGrupo->idEvento = $modelo->id;
  484. $eventoGrupo->idGrupo = $grupoModelo->id;
  485. if (!$eventoGrupo->save()) {
  486. $this->stdoutln('Ocurrió un error al guardar un evento-grupo. ' . Json::encode($eventoGrupo->getFirstErrors()));
  487. }
  488. }
  489. }
  490. }
  491. foreach ($data["usuarios"] as $usuarioEvento) {
  492. $usuarioModelo = Usuario::findOne(["uid" => $usuarioEvento["uid"]]);
  493. $usuarioRef = isset($usuarios[$usuarioEvento["uid"]])
  494. ? $usuarios[$usuarioEvento["uid"]] : null;
  495. // Usuarios
  496. if ($usuarioModelo === null && $usuarioRef !== null) {
  497. $usuarioModelo = new Usuario();
  498. $usuarioModelo->uid = $usuarioRef["uid"];
  499. $usuarioModelo->nombre = $usuarioRef["nombre"];
  500. if (isset($usuarioRef["email"])) {
  501. $usuarioModelo->email = $usuarioRef["email"];
  502. }
  503. $usuarioModelo->telefono = $usuarioRef["telefono"];
  504. $usuarioModelo->facebook = $usuarioRef["facebook"];
  505. if (isset($usuarioRef["facebookVerificado"])) {
  506. $usuarioModelo->facebookVerificado = $usuarioRef["facebookVerificado"];
  507. }
  508. $usuarioModelo->instagram = $usuarioRef["instagram"];
  509. if (isset($usuarioRef["instagramVerificado"])) {
  510. $usuarioModelo->instagramVerificado = $usuarioRef["instagramVerificado"];
  511. }
  512. $usuarioModelo->twitter = $usuarioRef["twitter"];
  513. if (isset($usuarioRef["twitterVerificado"])) {
  514. $usuarioModelo->twitterVerificado = $usuarioRef["twitterVerificado"];
  515. }
  516. $usuarioModelo->genero = $usuarioRef["genero"];
  517. $usuarioModelo->verificado = $usuarioRef["verificado"];
  518. $usuarioModelo->creado = new Expression('now()');
  519. if ($usuarioRef["estatus"] === false) {
  520. $usuarioModelo->eliminado = new Expression('now()');
  521. }
  522. if (!$usuarioModelo->save()) {
  523. $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($usuarioModelo->getFirstErrors()));
  524. }
  525. }
  526. // UsuarioGrupo
  527. if ($usuarioModelo !== null && isset($usuarioRef["grupos"]) && isset($usuarioRef["grupos"][0])) {
  528. for ($i = 0; $i < count($usuarioRef["grupos"]); $i++) {
  529. $modelGrupo = Grupo::findOne(['firebaseId' => $usuarioRef["grupos"][$i]]);
  530. if (isset($modelGrupo)) {
  531. $usuarioGrupo = UsuarioGrupo::find()
  532. ->andWhere([
  533. "idUsuario" => $usuarioModelo->id,
  534. "idGrupo" => $modelGrupo->id
  535. ])
  536. ->one();
  537. if ($usuarioGrupo === null) {
  538. $usuarioGrupo = new UsuarioGrupo();
  539. $usuarioGrupo->idUsuario = $usuarioModelo->id;
  540. $usuarioGrupo->idGrupo = $modelGrupo->id;
  541. if (!$usuarioGrupo->save()) {
  542. $this->stdoutln('Ocurrió un error al guardar un usuario-grupo. ' . Json::encode($usuarioGrupo->getFirstErrors()));
  543. }
  544. }
  545. }
  546. }
  547. }
  548. // Resultados
  549. if ($usuarioModelo !== null && isset($data["resultado"])) {
  550. $resultados = $data["resultado"];
  551. if (isset($resultados[$usuarioModelo->uid])) {
  552. foreach ($resultados[$usuarioModelo->uid] as $_accion) {
  553. $resultadoModelo = Resultado::find()
  554. ->andWhere([
  555. "idUsuario" => $usuarioModelo->id,
  556. "idEvento" => $modelo->id,
  557. "accion" => $_accion
  558. ])
  559. ->exists();
  560. if (!$resultadoModelo) {
  561. $resultadoModelo = new Resultado();
  562. $resultadoModelo->idUsuario = $usuarioModelo->id;
  563. $resultadoModelo->idEvento = $modelo->id;
  564. $resultadoModelo->accion = $_accion;
  565. if (!$resultadoModelo->save()) {
  566. $this->stdoutln('Ocurrió un error al guardar un resultado. ' . Json::encode($resultadoModelo->getFirstErrors()));
  567. }
  568. }
  569. }
  570. }
  571. }
  572. // Dependencias
  573. if ($usuarioModelo !== null && isset($usuarioRef["dependencias"]) && isset($usuarioRef["dependencias"][0])) {
  574. if (!empty($usuarioRef["dependencias"])) {
  575. if (is_array($usuarioRef["dependencias"])) {
  576. for ($i = 0; $i < count($usuarioRef["dependencias"]); $i++) {
  577. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"][$i]]);
  578. if ($dependenciaModel === null) {
  579. $dependenciaRef = $dependencias[$usuarioRef["dependencias"][$i]];
  580. $dependenciaModel = new Dependencia();
  581. $dependenciaModel->firebaseId = $usuarioRef["dependencias"][$i];
  582. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  583. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  584. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  585. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  586. if ($creado !== false) {
  587. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  588. }
  589. if (!$dependenciaModel->save()) {
  590. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  591. }
  592. }
  593. //UsuarioDependencia
  594. $usuarioDependencia = UsuarioDependencia::find()
  595. ->andWhere([
  596. "idUsuario" => $usuarioModelo->id,
  597. "idDependencia" => $dependenciaModel->id
  598. ])
  599. ->one();
  600. if ($usuarioDependencia === null) {
  601. $usuarioDependencia = new UsuarioDependencia();
  602. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  603. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  604. if (!$usuarioDependencia->save()) {
  605. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  606. }
  607. }
  608. }
  609. } else {
  610. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"]]);
  611. if ($dependenciaModel === null) {
  612. $dependenciaRef = $dependencias[$usuarioRef["dependencias"]];
  613. $dependenciaModel = new Dependencia();
  614. $dependenciaModel->firebaseId = $usuarioRef["dependencias"];
  615. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  616. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  617. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  618. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  619. if ($creado !== false) {
  620. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  621. }
  622. if (!$dependenciaModel->save()) {
  623. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  624. }
  625. }
  626. //UsuarioDependencia
  627. $usuarioDependencia = UsuarioDependencia::find()
  628. ->andWhere([
  629. "idUsuario" => $usuarioModelo->id,
  630. "idDependencia" => $dependenciaModel->id
  631. ])
  632. ->one();
  633. if ($usuarioDependencia === null) {
  634. $usuarioDependencia = new UsuarioDependencia();
  635. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  636. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  637. if (!$usuarioDependencia->save()) {
  638. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  639. }
  640. }
  641. }
  642. }
  643. }
  644. }
  645. $hoy = new \DateTime();
  646. $doc->reference()
  647. ->update([
  648. ["path" => "sincronizado", "value" => "OK"],
  649. ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")],
  650. ]);
  651. $this->stdoutln("Sincronizado correcto");
  652. } catch (\Exception $e) {
  653. $this->stdoutln("Exception: {$e->getMessage()}\n");
  654. $doc->reference()
  655. ->update([
  656. ["path" => "sincronizado", "value" => "ERROR"],
  657. ["path" => "sincronizadoError", "value" => $e->getMessage()],
  658. ["path" => "sincronizadoErrorLine", "value" => $e->getLine()],
  659. ]);
  660. }
  661. }
  662. # Si los registros procesados son menores al límite, terminar
  663. if ($c < $limite) {
  664. $continuar = false;
  665. }
  666. } while ($continuar);
  667. }
  668. public function actionParticipacion() {
  669. try {
  670. \Yii::$app->db->createCommand("SET TIMEZONE TO 'America/Hermosillo'")
  671. ->execute();
  672. } catch (\Exception $e) {
  673. }
  674. $eventos = (new Query())
  675. ->select([
  676. "nombre",
  677. "tag"
  678. ])
  679. ->from("Evento")
  680. ->andWhere([">=", "fechaFinal", new Expression("now() - interval '7 days'")])
  681. ->groupBy(["tag", "nombre"])
  682. ->indexBy("tag")
  683. ->column();
  684. $dependencias = Dependencia::find()
  685. ->select("nombre")
  686. ->indexBy("id")
  687. ->column();
  688. $totalEventos = count($eventos);
  689. if ($totalEventos === 0) {
  690. # ¿Si no hubo eventos en el período de tiempo también hay que avisar?
  691. return;
  692. }
  693. $query2 = (new Query())
  694. ->select([
  695. "tag",
  696. "{{Usuario}}.id",
  697. "{{Usuario}}.nombre",
  698. "{{Usuario}}.telefono",
  699. "case when count({{Resultado}}.accion) > 0 then true else false end as [[Participo]]",
  700. "{{UsuarioDependencia}}.[[idDependencia]]"
  701. ])
  702. ->from("Evento")
  703. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  704. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  705. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  706. ->innerJoin("Usuario", "{{Usuario}}.[[id]] = {{UsuarioGrupo}}.[[idUsuario]]")
  707. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id")
  708. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
  709. ->andWhere(["{{Usuario}}.eliminado" => null])
  710. ->andWhere([">=", "fechaFinal", new Expression("now()-interval '7 days'")])
  711. ->groupBy([
  712. "{{Usuario}}.nombre",
  713. "{{Usuario}}.telefono",
  714. "{{Usuario}}.id",
  715. "tag",
  716. "{{UsuarioDependencia}}.[[idDependencia]]"
  717. ])
  718. ->orderBy([
  719. "{{Usuario}}.id" => SORT_ASC,
  720. "[[Participo]]" => SORT_DESC,
  721. ]);
  722. $aux = [];
  723. $auxDependencia = [];
  724. foreach ($query2->each() as $consulta) {
  725. if (!isset($aux[$consulta['id']])) {
  726. $aux[$consulta['id']] = [
  727. "nombreUsuario" => $consulta['nombre'],
  728. "telefono" => $consulta['telefono'],
  729. "id" => $consulta['id'],
  730. "idDependencia" => $consulta['idDependencia'],
  731. "eventosFaltantes" => [],
  732. "eventosParticipo" => []
  733. ];
  734. }
  735. $nombreEvento = $eventos[$consulta['tag']];
  736. if ($consulta['Participo']) {
  737. $aux[$consulta['id']]['eventosParticipo'][] = $nombreEvento;
  738. } else {
  739. $aux[$consulta['id']]['eventosFaltantes'][] = $nombreEvento;
  740. }
  741. }
  742. foreach ($aux as $consulta) {
  743. if (!isset($auxDependencia[$consulta['idDependencia']])) {
  744. $auxDependencia[$consulta['idDependencia']] = [
  745. "id" => $consulta['idDependencia'],
  746. "eventosFaltantes" => 0,
  747. "eventosParticipo" => 0
  748. ];
  749. }
  750. $eventosFaltantes = count($consulta['eventosFaltantes']);
  751. $auxDependencia[$consulta['idDependencia']]['eventosFaltantes'] += $eventosFaltantes;
  752. $eventosParticipo = count($consulta['eventosParticipo']);
  753. $auxDependencia[$consulta['idDependencia']]['eventosParticipo'] += $eventosParticipo;
  754. }
  755. $notificacion = new Notificacion();
  756. $notificacion->creado = new Expression("now()");
  757. if (!$notificacion->save()) {
  758. return (new Respuesta($notificacion))
  759. ->mensaje("Hubo un problema al generar la notificación");
  760. } // */
  761. # TODO: Revisar si es necesario consultar la información del modelo
  762. # $notificacion->refresh();
  763. //POR USUARIO
  764. foreach ($aux as $usuario) {
  765. $notificacionUsuario = new NotificacionUsuario();
  766. $notificacionUsuario->idNotificacion = $notificacion->id;
  767. $notificacionUsuario->idUsuario = $usuario['id'];
  768. $notificacionUsuario->nombre = $usuario['nombreUsuario'];
  769. $notificacionUsuario->telefono = $usuario['telefono'];
  770. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_EVENTO;
  771. # Es mejor guardar el valor del count en lugar de evaluarlo multiples veces
  772. $totalParticipaciones = count($usuario["eventosParticipo"]);
  773. $parametros = [
  774. [
  775. "type" => "text",
  776. "text" => "{$totalParticipaciones}/{$totalEventos} eventos"
  777. ],
  778. ];
  779. if ($totalParticipaciones === $totalEventos) {
  780. $parametros[] = [
  781. "type" => "text",
  782. "text" => "Gracias por tu"
  783. ];
  784. } else if ($totalParticipaciones > 0) {
  785. $parametros[] = [
  786. "type" => "text",
  787. "text" => ", gracias por tu participación. Vamos por el 100% de"
  788. ];
  789. } else {
  790. $parametros[] = [
  791. "type" => "text",
  792. "text" => "Vamos por el 100% de"
  793. ];
  794. }
  795. $notificacionUsuario->parametros = $parametros;
  796. if (!$notificacionUsuario->save()) {
  797. return (new Respuesta($notificacionUsuario))
  798. ->mensaje("Hubo un problema al generar la notificación");
  799. }
  800. }
  801. //POR LIDER DEPENDENCIA
  802. foreach ($auxDependencia as $id => $dependencia) {
  803. $dependenciaLider = DependenciaLider::find()
  804. ->andWhere(["idDependencia" => $id]);
  805. $nombreDependencia = "";
  806. if (isset($dependencias[$id])) {
  807. $nombreDependencia = $dependencias[$id];
  808. }
  809. foreach ($dependenciaLider->each() as $lider) {
  810. $usuario = Usuario::findOne($lider["idUsuario"]);
  811. $notificacionUsuario = new NotificacionUsuario();
  812. $notificacionUsuario->idNotificacion = $notificacion->id;
  813. $notificacionUsuario->idUsuario = $usuario->id;
  814. $notificacionUsuario->nombre = $usuario->nombre;
  815. $notificacionUsuario->telefono = $usuario->telefono;
  816. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_EVENTO;
  817. $totalParticipaciones = $dependencia["eventosParticipo"];
  818. $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"];
  819. $parametros = [
  820. [
  821. "type" => "text",
  822. "text" => "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos"
  823. ],
  824. ];
  825. if ($totalParticipaciones === $totalEventosDependencia) {
  826. $parametros[] = [
  827. "type" => "text",
  828. "text" => "Gracias por tu"
  829. ];
  830. } else if ($totalParticipaciones > 0) {
  831. $parametros[] = [
  832. "type" => "text",
  833. "text" => " gracias por tu participación. Vamos por el 100% de"
  834. ];
  835. } else {
  836. $parametros[] = [
  837. "type" => "text",
  838. "text" => "Vamos por el 100% de"
  839. ];
  840. }
  841. $notificacionUsuario->parametros = $parametros;
  842. if (!$notificacionUsuario->save()) {
  843. return (new Respuesta($notificacionUsuario))
  844. ->mensaje("Hubo un problema al generar la notificación");
  845. }
  846. }
  847. }
  848. //LIDER GLOBAL
  849. $liderGlobal = Usuario::find()
  850. ->andWhere(["liderGlobal" => true]);
  851. foreach ($liderGlobal->each() as $lider) {
  852. $mensaje = "";
  853. $participaciones = 0;
  854. foreach ($auxDependencia as $id => $dependencia) {
  855. $nombreDependencia = "";
  856. if (isset($dependencias[$id])) {
  857. $nombreDependencia = $dependencias[$id];
  858. $totalParticipaciones = $dependencia["eventosParticipo"];
  859. $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"];
  860. $mensaje .= "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos || ";
  861. $participaciones += $totalParticipaciones;
  862. }
  863. }
  864. $notificacionUsuario = new NotificacionUsuario();
  865. $notificacionUsuario->idNotificacion = $notificacion->id;
  866. $notificacionUsuario->idUsuario = $lider->id;
  867. $notificacionUsuario->nombre = $lider->nombre;
  868. $notificacionUsuario->telefono = $lider->telefono;
  869. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_GLOBAL;
  870. // $totalParticipaciones = $dependencia["eventosParticipo"];
  871. // $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"];
  872. $parametros = [
  873. [
  874. "type" => "text",
  875. "text" => $mensaje
  876. ],
  877. ];
  878. if ($participaciones === $totalEventosDependencia) {
  879. $parametros[] = [
  880. "type" => "text",
  881. "text" => "Gracias por tu"
  882. ];
  883. } else if ($participaciones > 0) {
  884. $parametros[] = [
  885. "type" => "text",
  886. "text" => "Gracias por tu participación. Vamos por el 100% de"
  887. ];
  888. } else {
  889. $parametros[] = [
  890. "type" => "text",
  891. "text" => "Vamos por el 100% de"
  892. ];
  893. }
  894. $notificacionUsuario->parametros = $parametros;
  895. if (!$notificacionUsuario->save()) {
  896. return (new Respuesta($notificacionUsuario))
  897. ->mensaje("Hubo un problema al generar la notificación");
  898. }
  899. }
  900. $notificacion->estatus = Notificacion::ESTATUS_NUEVO;
  901. $domingo = 0;
  902. $d = new \DateTime('now', new \DateTimeZone('America/Hermosillo'));
  903. $fecha = strtotime('now');
  904. $dia = intval($d->format("w"));
  905. if ($dia !== $domingo) {
  906. $d = new \DateTime('next Sunday', new \DateTimeZone('America/Hermosillo'));
  907. }
  908. $d->setTime(18, 0, 0, 0);
  909. $siguienteDomingo = $d->format(\DateTime::ISO8601);
  910. $notificacion->envio = $siguienteDomingo;
  911. $notificacion->save();
  912. $this->stdout("Terminó");
  913. // file_put_contents("archivo.json", json_encode($aux));
  914. }
  915. }