EventoController.php 38 KB

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