EventoController.php 38 KB

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