EventoController.php 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329
  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 Ramsey\Uuid\Uuid;
  12. use v1\models\Dependencia;
  13. use v1\models\Evento;
  14. use v1\models\EventoAccion;
  15. use v1\models\EventoGrupo;
  16. use v1\models\EventoResumen;
  17. use v1\models\EventoResumenDependencia;
  18. use v1\models\EventoResumenParticipante;
  19. use v1\models\Grupo;
  20. use v1\models\Red;
  21. use v1\models\Resultado;
  22. use v1\models\Usuario;
  23. use v1\models\UsuarioDependencia;
  24. use v1\models\UsuarioGrupo;
  25. use yii\console\Controller;
  26. use yii\db\Expression;
  27. use yii\db\Query;
  28. use yii\helpers\Json;
  29. class EventoController extends Controller {
  30. public function stdoutln($cadena) {
  31. return $this->stdout($cadena . "\n");
  32. }
  33. public function cambiarFecha($string) {
  34. $formato = "D M d Y H:i:s P";
  35. $fecha = \DateTime::createFromFormat($formato, $string);
  36. return $fecha;
  37. }
  38. public function actionSincronizar() {
  39. $firebase = new FirebaseHelper();
  40. $firestore = $firebase->firestore();
  41. $refGrupos = $firestore->collection("grupos");
  42. $refUsuarios = $firestore->collection("usuarios");
  43. $refDependencias = $firestore->collection("dependencias");
  44. $grupos = [];
  45. $usuarios = [];
  46. $dependencias = [];
  47. foreach ($refGrupos->documents() as $grupo) {
  48. $grupos[$grupo->id()] = $grupo->data();
  49. }
  50. foreach ($refUsuarios->documents() as $usuario) {
  51. $usuarios[$usuario->id()] = $usuario->data();
  52. }
  53. foreach ($refDependencias->documents() as $dependencia) {
  54. $dependencias[$dependencia->id()] = $dependencia->data();
  55. }
  56. $ultimaFecha = null;
  57. $limite = 100; // 1000;
  58. $continuar = true;
  59. do {
  60. $this->stdout("Sincronizando ...");
  61. $ref = $firestore->collection("eventos")
  62. ->where("sincronizado", "==", null)
  63. // ->where("sincronizado", "==", 'ERROR')
  64. ->orderBy("timestamp", "ASC")
  65. ->limit($limite);
  66. if ($ultimaFecha !== null) {
  67. $ref = $ref->startAt([$ultimaFecha]);
  68. }
  69. $c = 0; # Contador de registros procesados
  70. foreach ($ref->documents() as $doc) {
  71. $this->stdoutln($doc->id());
  72. $c++;
  73. $data = $doc->data();
  74. $ultimaFecha = $data["timestamp"];
  75. $modelo = Evento::findOne(["firebaseId" => $doc->id()]);
  76. if ($modelo === null) {
  77. $modelo = new Evento();
  78. }
  79. try {
  80. $modelo->nombre = $data["nombre"];
  81. $modelo->descripcion = $data["descripcion"];
  82. $modelo->ciudad = $data["ciudad"];
  83. $modelo->redSocial = $data["redSocial"];
  84. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]);
  85. if ($creado !== false) {
  86. $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  87. }
  88. $fechaInicio = $this->cambiarFecha($data["fechaInicio"]);
  89. if ($fechaInicio !== false) {
  90. $modelo->fechaInicio = $fechaInicio->format(\DateTime::RFC3339_EXTENDED);
  91. }
  92. $fechaFinal = $this->cambiarFecha($data["fechaFinal"]);
  93. if ($fechaFinal !== false) {
  94. $modelo->fechaFinal = $fechaFinal->format(\DateTime::RFC3339_EXTENDED);
  95. }
  96. $modelo->fotoEvento = $data["fotoEvento"];
  97. $modelo->url = $data["pathFirebase"];
  98. if (isset($data["tag"])) {
  99. $modelo->tag = $data["tag"];
  100. }
  101. $modelo->firebaseId = $doc->id();
  102. if (!$modelo->save()) {
  103. $this->stdoutln('Ocurrió un error al guardar un evento. ' . Json::encode($modelo->getFirstErrors()));
  104. continue;
  105. }
  106. if (isset($data["redes"])) {
  107. foreach ($data["redes"] as $red) {
  108. $eventoRed = Red::find()
  109. ->andWhere([
  110. "idEvento" => $modelo->id,
  111. "url" => $red["url"]
  112. ])
  113. ->one();
  114. if ($eventoRed === null) {
  115. $eventoRed = new Red();
  116. $eventoRed->idEvento = $modelo->id;
  117. $eventoRed->key = $red["key"];
  118. $eventoRed->url = $red["url"];
  119. $eventoRed->redSocial = $red["redSocial"];
  120. if (!$eventoRed->save()) {
  121. $this->stdoutln('Ocurrió un error al guardar una red. ' . Json::encode($eventoRed->getFirstErrors()));
  122. continue;
  123. }
  124. }
  125. }
  126. }
  127. foreach ($data["accion"] as $accion) {
  128. $eventoAccion = EventoAccion::find()
  129. ->andWhere([
  130. "idEvento" => $modelo->id,
  131. "accion" => $accion
  132. ])
  133. ->one();
  134. if ($eventoAccion === null) {
  135. $eventoAccion = new EventoAccion();
  136. $eventoAccion->idEvento = $modelo->id;
  137. $eventoAccion->accion = $accion;
  138. if (!$eventoAccion->save()) {
  139. $this->stdoutln('Ocurrió un error al guardar un evento-accion. ' . Json::encode($eventoAccion->getFirstErrors()));
  140. continue;
  141. }
  142. }
  143. }
  144. //Grupos dentro de los eventos
  145. foreach ($data["grupos"] as $grupoEvento) {
  146. $grupoModelo = Grupo::findOne(["firebaseId" => $grupoEvento]);
  147. if ($grupoModelo === null && isset($grupos[$grupoEvento])) {
  148. $grupoModelo = new Grupo();
  149. $grupoModelo->creado = new Expression('now()');
  150. $grupoModelo->nombre = $grupos[$grupoEvento]["nombre"];
  151. $grupoModelo->descripcion = $grupos[$grupoEvento]["descripcion"];
  152. $grupoModelo->firebaseId = $grupoEvento;
  153. if (!$grupoModelo->save()) {
  154. $this->stdoutln('Ocurrió un error al guardar un grupo. ' . Json::encode($grupoModelo->getFirstErrors()));
  155. }
  156. }
  157. if ($grupoModelo !== null) {
  158. $eventoGrupo = EventoGrupo::find()
  159. ->andWhere([
  160. "idEvento" => $modelo->id,
  161. "idGrupo" => $grupoModelo->id
  162. ])
  163. ->one();
  164. if ($eventoGrupo === null) {
  165. $eventoGrupo = new EventoGrupo();
  166. $eventoGrupo->idEvento = $modelo->id;
  167. $eventoGrupo->idGrupo = $grupoModelo->id;
  168. if (!$eventoGrupo->save()) {
  169. $this->stdoutln('Ocurrió un error al guardar un evento-grupo. ' . Json::encode($eventoGrupo->getFirstErrors()));
  170. }
  171. }
  172. }
  173. }
  174. foreach ($data["usuarios"] as $usuarioEvento) {
  175. $usuarioModelo = Usuario::findOne(["uid" => $usuarioEvento["uid"]]);
  176. $usuarioRef = isset($usuarios[$usuarioEvento["uid"]])
  177. ? $usuarios[$usuarioEvento["uid"]] : null;
  178. // Usuarios
  179. if ($usuarioModelo === null && $usuarioRef !== null) {
  180. $usuarioModelo = new Usuario();
  181. $usuarioModelo->uid = $usuarioRef["uid"];
  182. $usuarioModelo->nombre = $usuarioRef["nombre"];
  183. if (isset($usuarioRef["email"])) {
  184. $usuarioModelo->email = $usuarioRef["email"];
  185. }
  186. $usuarioModelo->telefono = $usuarioRef["telefono"];
  187. $usuarioModelo->facebook = $usuarioRef["facebook"];
  188. if (isset($usuarioRef["facebookVerificado"])) {
  189. $usuarioModelo->facebookVerificado = $usuarioRef["facebookVerificado"];
  190. }
  191. $usuarioModelo->instagram = $usuarioRef["instagram"];
  192. if (isset($usuarioRef["instagramVerificado"])) {
  193. $usuarioModelo->instagramVerificado = $usuarioRef["instagramVerificado"];
  194. }
  195. $usuarioModelo->twitter = $usuarioRef["twitter"];
  196. if (isset($usuarioRef["twitterVerificado"])) {
  197. $usuarioModelo->twitterVerificado = $usuarioRef["twitterVerificado"];
  198. }
  199. $usuarioModelo->genero = $usuarioRef["genero"];
  200. if (isset($usuarioRef["verificado"])) {
  201. $usuarioModelo->verificado = $usuarioRef["verificado"];
  202. }
  203. if (isset($usuarioRef["liderGlobal"])) {
  204. $usuarioModelo->liderGlobal = $usuarioRef["liderGlobal"];
  205. }
  206. $usuarioModelo->creado = new Expression('now()');
  207. if ($usuarioRef["estatus"] === false) {
  208. $usuarioModelo->eliminado = new Expression('now()');
  209. }
  210. if (!$usuarioModelo->save()) {
  211. $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($usuarioModelo->getFirstErrors()));
  212. }
  213. }
  214. // UsuarioGrupo
  215. if ($usuarioModelo !== null && isset($usuarioRef["grupos"]) && isset($usuarioRef["grupos"][0])) {
  216. if ($usuarioRef["estatus"] === false) {
  217. $usuarioModelo->eliminado = new Expression('now()');
  218. $usuarioModelo->save();
  219. }
  220. for ($i = 0; $i < count($usuarioRef["grupos"]); $i++) {
  221. $modelGrupo = Grupo::findOne(['firebaseId' => $usuarioRef["grupos"][$i]]);
  222. if (isset($modelGrupo)) {
  223. $usuarioGrupo = UsuarioGrupo::find()
  224. ->andWhere([
  225. "idUsuario" => $usuarioModelo->id,
  226. "idGrupo" => $modelGrupo->id
  227. ])
  228. ->one();
  229. if ($usuarioGrupo === null) {
  230. $usuarioGrupo = new UsuarioGrupo();
  231. $usuarioGrupo->idUsuario = $usuarioModelo->id;
  232. $usuarioGrupo->idGrupo = $modelGrupo->id;
  233. if (!$usuarioGrupo->save()) {
  234. $this->stdoutln('Ocurrió un error al guardar un usuario-grupo. ' . Json::encode($usuarioGrupo->getFirstErrors()));
  235. }
  236. }
  237. }
  238. }
  239. }
  240. // Resultados
  241. if ($usuarioModelo !== null && isset($data["resultado"])) {
  242. $resultados = $data["resultado"];
  243. if (isset($resultados[$usuarioModelo->uid])) {
  244. foreach ($resultados[$usuarioModelo->uid] as $_accion) {
  245. $resultadoModelo = Resultado::find()
  246. ->andWhere([
  247. "idUsuario" => $usuarioModelo->id,
  248. "idEvento" => $modelo->id,
  249. "accion" => $_accion
  250. ])
  251. ->exists();
  252. if (!$resultadoModelo) {
  253. $resultadoModelo = new Resultado();
  254. $resultadoModelo->idUsuario = $usuarioModelo->id;
  255. $resultadoModelo->idEvento = $modelo->id;
  256. $resultadoModelo->accion = $_accion;
  257. if (!$resultadoModelo->save()) {
  258. $this->stdoutln('Ocurrió un error al guardar un resultado. ' . Json::encode($resultadoModelo->getFirstErrors()));
  259. }
  260. }
  261. }
  262. }
  263. }
  264. // Dependencias
  265. if ($usuarioModelo !== null && isset($usuarioRef["dependencias"]) && isset($usuarioRef["dependencias"][0])) {
  266. if (!empty($usuarioRef["dependencias"])) {
  267. if (is_array($usuarioRef["dependencias"])) {
  268. for ($i = 0; $i < count($usuarioRef["dependencias"]); $i++) {
  269. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"][$i]]);
  270. if ($dependenciaModel === null) {
  271. $dependenciaRef = $dependencias[$usuarioRef["dependencias"][$i]];
  272. $dependenciaModel = new Dependencia();
  273. $dependenciaModel->firebaseId = $usuarioRef["dependencias"][$i];
  274. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  275. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  276. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  277. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  278. if ($creado !== false) {
  279. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  280. }
  281. if (!$dependenciaModel->save()) {
  282. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  283. }
  284. }
  285. //UsuarioDependencia
  286. $usuarioDependencia = UsuarioDependencia::find()
  287. ->andWhere([
  288. "idUsuario" => $usuarioModelo->id,
  289. "idDependencia" => $dependenciaModel->id
  290. ])
  291. ->one();
  292. if ($usuarioDependencia === null) {
  293. $usuarioDependencia = new UsuarioDependencia();
  294. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  295. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  296. if (!$usuarioDependencia->save()) {
  297. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  298. }
  299. }
  300. }
  301. } else {
  302. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"]]);
  303. if ($dependenciaModel === null) {
  304. $dependenciaRef = $dependencias[$usuarioRef["dependencias"]];
  305. $dependenciaModel = new Dependencia();
  306. $dependenciaModel->firebaseId = $usuarioRef["dependencias"];
  307. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  308. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  309. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  310. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  311. if ($creado !== false) {
  312. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  313. }
  314. if (!$dependenciaModel->save()) {
  315. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  316. }
  317. }
  318. //UsuarioDependencia
  319. $usuarioDependencia = UsuarioDependencia::find()
  320. ->andWhere([
  321. "idUsuario" => $usuarioModelo->id,
  322. "idDependencia" => $dependenciaModel->id
  323. ])
  324. ->one();
  325. if ($usuarioDependencia === null) {
  326. $usuarioDependencia = new UsuarioDependencia();
  327. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  328. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  329. if (!$usuarioDependencia->save()) {
  330. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  331. }
  332. }
  333. }
  334. }
  335. }
  336. }
  337. $hoy = new \DateTime();
  338. $doc->reference()
  339. ->update([
  340. ["path" => "sincronizado", "value" => "OK"],
  341. ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")],
  342. ]);
  343. $this->stdoutln("Sincronizado correcto");
  344. } catch (\Exception $e) {
  345. $this->stdoutln("Exception: {$e->getMessage()}\n");
  346. $doc->reference()
  347. ->update([
  348. ["path" => "sincronizado", "value" => "ERROR"],
  349. ["path" => "sincronizadoError", "value" => $e->getMessage()],
  350. ["path" => "sincronizadoErrorLine", "value" => $e->getLine()],
  351. ]);
  352. }
  353. }
  354. # Si los registros procesados son menores al límite, terminar
  355. if ($c < $limite) {
  356. $continuar = false;
  357. }
  358. } while ($continuar);
  359. }
  360. public function actionSincronizarAcumulado() {
  361. $firebase = new FirebaseHelper();
  362. $firestore = $firebase->firestore();
  363. $refGrupos = $firestore->collection("grupos");
  364. $refUsuarios = $firestore->collection("usuarios");
  365. $refDependencias = $firestore->collection("dependencias");
  366. $grupos = [];
  367. $usuarios = [];
  368. $dependencias = [];
  369. foreach ($refGrupos->documents() as $grupo) {
  370. $grupos[$grupo->id()] = $grupo->data();
  371. }
  372. foreach ($refUsuarios->documents() as $usuario) {
  373. $usuarios[$usuario->id()] = $usuario->data();
  374. }
  375. foreach ($refDependencias->documents() as $dependencia) {
  376. $dependencias[$dependencia->id()] = $dependencia->data();
  377. }
  378. $ultimaFecha = null;
  379. $limite = 100; // 1000;
  380. $continuar = true;
  381. $fechaActual = new DateTime();
  382. $finFirebase = new Timestamp($fechaActual);
  383. $this->stdout("fechaFin: {$finFirebase} \n");
  384. $semanaPasada = new DateTime('-1 week');
  385. $inicioFirebase = new Timestamp($semanaPasada);
  386. $this->stdout("fechaFin: {$finFirebase} \n");
  387. do {
  388. $this->stdout("Sincronizando ...");
  389. $ref = $firestore->collection("eventos")
  390. ->where("timestamp", ">=", $inicioFirebase)
  391. ->where("timestamp", "<=", $finFirebase)
  392. ->orderBy("timestamp", "DESC")
  393. ->limit($limite);
  394. $documentos = $ref->documents()->size();
  395. $this->stdout("Total documentos: {$documentos} \n");
  396. if ($ultimaFecha !== null) {
  397. $ref = $ref->startAt([$ultimaFecha]);
  398. }
  399. $c = 0; # Contador de registros procesados
  400. foreach ($ref->documents() as $doc) {
  401. $this->stdoutln($doc->id());
  402. $c++;
  403. $data = $doc->data();
  404. $ultimaFecha = $data["timestamp"];
  405. $modelo = Evento::findOne(["firebaseId" => $doc->id()]);
  406. if ($modelo === null) {
  407. $modelo = new Evento();
  408. }
  409. try {
  410. $modelo->nombre = $data["nombre"];
  411. $modelo->descripcion = $data["descripcion"];
  412. $modelo->ciudad = $data["ciudad"];
  413. $modelo->redSocial = $data["redSocial"];
  414. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]);
  415. if ($creado !== false) {
  416. $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  417. }
  418. $fechaInicio = $this->cambiarFecha($data["fechaInicio"]);
  419. if ($fechaInicio !== false) {
  420. $modelo->fechaInicio = $fechaInicio->format(\DateTime::RFC3339_EXTENDED);
  421. }
  422. $fechaFinal = $this->cambiarFecha($data["fechaFinal"]);
  423. if ($fechaFinal !== false) {
  424. $modelo->fechaFinal = $fechaFinal->format(\DateTime::RFC3339_EXTENDED);
  425. }
  426. $modelo->fotoEvento = $data["fotoEvento"];
  427. $modelo->url = $data["pathFirebase"];
  428. if (isset($data["tag"])) {
  429. $modelo->tag = $data["tag"];
  430. }
  431. $modelo->firebaseId = $doc->id();
  432. if (!$modelo->save()) {
  433. $this->stdoutln('Ocurrió un error al guardar un evento. ' . Json::encode($modelo->getFirstErrors()));
  434. continue;
  435. }
  436. if (isset($data["redes"])) {
  437. foreach ($data["redes"] as $red) {
  438. $eventoRed = Red::find()
  439. ->andWhere([
  440. "idEvento" => $modelo->id,
  441. "url" => $red["url"]
  442. ])
  443. ->one();
  444. if ($eventoRed === null) {
  445. $eventoRed = new Red();
  446. $eventoRed->idEvento = $modelo->id;
  447. $eventoRed->key = $red["key"];
  448. $eventoRed->url = $red["url"];
  449. $eventoRed->redSocial = $red["redSocial"];
  450. if (!$eventoRed->save()) {
  451. $this->stdoutln('Ocurrió un error al guardar una red. ' . Json::encode($eventoRed->getFirstErrors()));
  452. continue;
  453. }
  454. }
  455. }
  456. }
  457. foreach ($data["accion"] as $accion) {
  458. $eventoAccion = EventoAccion::find()
  459. ->andWhere([
  460. "idEvento" => $modelo->id,
  461. "accion" => $accion
  462. ])
  463. ->one();
  464. if ($eventoAccion === null) {
  465. $eventoAccion = new EventoAccion();
  466. $eventoAccion->idEvento = $modelo->id;
  467. $eventoAccion->accion = $accion;
  468. if (!$eventoAccion->save()) {
  469. $this->stdoutln('Ocurrió un error al guardar un evento-accion. ' . Json::encode($eventoAccion->getFirstErrors()));
  470. continue;
  471. }
  472. }
  473. }
  474. //Grupos dentro de los eventos
  475. foreach ($data["grupos"] as $grupoEvento) {
  476. $grupoModelo = Grupo::findOne(["firebaseId" => $grupoEvento]);
  477. if ($grupoModelo === null && isset($grupos[$grupoEvento])) {
  478. $grupoModelo = new Grupo();
  479. $grupoModelo->creado = new Expression('now()');
  480. $grupoModelo->nombre = $grupos[$grupoEvento]["nombre"];
  481. $grupoModelo->descripcion = $grupos[$grupoEvento]["descripcion"];
  482. $grupoModelo->firebaseId = $grupoEvento;
  483. if (!$grupoModelo->save()) {
  484. $this->stdoutln('Ocurrió un error al guardar un grupo. ' . Json::encode($grupoModelo->getFirstErrors()));
  485. }
  486. }
  487. if ($grupoModelo !== null) {
  488. $eventoGrupo = EventoGrupo::find()
  489. ->andWhere([
  490. "idEvento" => $modelo->id,
  491. "idGrupo" => $grupoModelo->id
  492. ])
  493. ->one();
  494. if ($eventoGrupo === null) {
  495. $eventoGrupo = new EventoGrupo();
  496. $eventoGrupo->idEvento = $modelo->id;
  497. $eventoGrupo->idGrupo = $grupoModelo->id;
  498. if (!$eventoGrupo->save()) {
  499. $this->stdoutln('Ocurrió un error al guardar un evento-grupo. ' . Json::encode($eventoGrupo->getFirstErrors()));
  500. }
  501. }
  502. }
  503. }
  504. foreach ($data["usuarios"] as $usuarioEvento) {
  505. $usuarioModelo = Usuario::findOne(["uid" => $usuarioEvento["uid"]]);
  506. $usuarioRef = isset($usuarios[$usuarioEvento["uid"]])
  507. ? $usuarios[$usuarioEvento["uid"]] : null;
  508. // Usuarios
  509. if ($usuarioModelo === null && $usuarioRef !== null) {
  510. $usuarioModelo = new Usuario();
  511. $usuarioModelo->uid = $usuarioRef["uid"];
  512. $usuarioModelo->nombre = $usuarioRef["nombre"];
  513. if (isset($usuarioRef["email"])) {
  514. $usuarioModelo->email = $usuarioRef["email"];
  515. }
  516. $usuarioModelo->telefono = $usuarioRef["telefono"];
  517. $usuarioModelo->facebook = $usuarioRef["facebook"];
  518. if (isset($usuarioRef["facebookVerificado"])) {
  519. $usuarioModelo->facebookVerificado = $usuarioRef["facebookVerificado"];
  520. }
  521. $usuarioModelo->instagram = $usuarioRef["instagram"];
  522. if (isset($usuarioRef["instagramVerificado"])) {
  523. $usuarioModelo->instagramVerificado = $usuarioRef["instagramVerificado"];
  524. }
  525. $usuarioModelo->twitter = $usuarioRef["twitter"];
  526. if (isset($usuarioRef["twitterVerificado"])) {
  527. $usuarioModelo->twitterVerificado = $usuarioRef["twitterVerificado"];
  528. }
  529. $usuarioModelo->genero = $usuarioRef["genero"];
  530. if (isset($usuarioRef["verificado"])) {
  531. $usuarioModelo->verificado = $usuarioRef["verificado"];
  532. }
  533. $usuarioModelo->creado = new Expression('now()');
  534. if ($usuarioRef["estatus"] === false) {
  535. $usuarioModelo->eliminado = new Expression('now()');
  536. }
  537. if (!$usuarioModelo->save()) {
  538. $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($usuarioModelo->getFirstErrors()));
  539. }
  540. }
  541. // UsuarioGrupo
  542. if ($usuarioModelo !== null && isset($usuarioRef["grupos"]) && isset($usuarioRef["grupos"][0])) {
  543. if ($usuarioRef["estatus"] === false) {
  544. $usuarioModelo->eliminado = new Expression('now()');
  545. $usuarioModelo->save();
  546. }
  547. for ($i = 0; $i < count($usuarioRef["grupos"]); $i++) {
  548. $modelGrupo = Grupo::findOne(['firebaseId' => $usuarioRef["grupos"][$i]]);
  549. if (isset($modelGrupo)) {
  550. $usuarioGrupo = UsuarioGrupo::find()
  551. ->andWhere([
  552. "idUsuario" => $usuarioModelo->id,
  553. "idGrupo" => $modelGrupo->id
  554. ])
  555. ->one();
  556. if ($usuarioGrupo === null) {
  557. $usuarioGrupo = new UsuarioGrupo();
  558. $usuarioGrupo->idUsuario = $usuarioModelo->id;
  559. $usuarioGrupo->idGrupo = $modelGrupo->id;
  560. if (!$usuarioGrupo->save()) {
  561. $this->stdoutln('Ocurrió un error al guardar un usuario-grupo. ' . Json::encode($usuarioGrupo->getFirstErrors()));
  562. }
  563. }
  564. }
  565. }
  566. }
  567. // Resultados
  568. if ($usuarioModelo !== null && isset($data["resultado"])) {
  569. $resultados = $data["resultado"];
  570. if (isset($resultados[$usuarioModelo->uid])) {
  571. foreach ($resultados[$usuarioModelo->uid] as $_accion) {
  572. $resultadoModelo = Resultado::find()
  573. ->andWhere([
  574. "idUsuario" => $usuarioModelo->id,
  575. "idEvento" => $modelo->id,
  576. "accion" => $_accion
  577. ])
  578. ->exists();
  579. if (!$resultadoModelo) {
  580. $resultadoModelo = new Resultado();
  581. $resultadoModelo->idUsuario = $usuarioModelo->id;
  582. $resultadoModelo->idEvento = $modelo->id;
  583. $resultadoModelo->accion = $_accion;
  584. if (!$resultadoModelo->save()) {
  585. $this->stdoutln('Ocurrió un error al guardar un resultado. ' . Json::encode($resultadoModelo->getFirstErrors()));
  586. }
  587. }
  588. }
  589. }
  590. }
  591. // Dependencias
  592. if ($usuarioModelo !== null && isset($usuarioRef["dependencias"]) && isset($usuarioRef["dependencias"][0])) {
  593. if (!empty($usuarioRef["dependencias"])) {
  594. if (is_array($usuarioRef["dependencias"])) {
  595. for ($i = 0; $i < count($usuarioRef["dependencias"]); $i++) {
  596. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"][$i]]);
  597. if ($dependenciaModel === null) {
  598. $dependenciaRef = $dependencias[$usuarioRef["dependencias"][$i]];
  599. $dependenciaModel = new Dependencia();
  600. $dependenciaModel->firebaseId = $usuarioRef["dependencias"][$i];
  601. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  602. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  603. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  604. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  605. if ($creado !== false) {
  606. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  607. }
  608. if (!$dependenciaModel->save()) {
  609. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  610. }
  611. }
  612. //UsuarioDependencia
  613. $usuarioDependencia = UsuarioDependencia::find()
  614. ->andWhere([
  615. "idUsuario" => $usuarioModelo->id,
  616. "idDependencia" => $dependenciaModel->id
  617. ])
  618. ->one();
  619. if ($usuarioDependencia === null) {
  620. $usuarioDependencia = new UsuarioDependencia();
  621. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  622. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  623. if (!$usuarioDependencia->save()) {
  624. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  625. }
  626. }
  627. }
  628. } else {
  629. $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"]]);
  630. if ($dependenciaModel === null) {
  631. $dependenciaRef = $dependencias[$usuarioRef["dependencias"]];
  632. $dependenciaModel = new Dependencia();
  633. $dependenciaModel->firebaseId = $usuarioRef["dependencias"];
  634. $dependenciaModel->nombre = $dependenciaRef['nombre'];
  635. $dependenciaModel->descripcion = $dependenciaRef['descripcion'];
  636. $dependenciaModel->estatus = $dependenciaRef['estatus'];
  637. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]);
  638. if ($creado !== false) {
  639. $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  640. }
  641. if (!$dependenciaModel->save()) {
  642. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors()));
  643. }
  644. }
  645. //UsuarioDependencia
  646. $usuarioDependencia = UsuarioDependencia::find()
  647. ->andWhere([
  648. "idUsuario" => $usuarioModelo->id,
  649. "idDependencia" => $dependenciaModel->id
  650. ])
  651. ->one();
  652. if ($usuarioDependencia === null) {
  653. $usuarioDependencia = new UsuarioDependencia();
  654. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  655. $usuarioDependencia->idDependencia = $dependenciaModel->id;
  656. if (!$usuarioDependencia->save()) {
  657. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  658. }
  659. }
  660. }
  661. }
  662. }
  663. }
  664. $hoy = new \DateTime();
  665. $doc->reference()
  666. ->update([
  667. ["path" => "sincronizado", "value" => "OK"],
  668. ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")],
  669. ]);
  670. $this->stdoutln("Sincronizado correcto");
  671. } catch (\Exception $e) {
  672. $this->stdoutln("Exception: {$e->getMessage()}\n");
  673. $doc->reference()
  674. ->update([
  675. ["path" => "sincronizado", "value" => "ERROR"],
  676. ["path" => "sincronizadoError", "value" => $e->getMessage()],
  677. ["path" => "sincronizadoErrorLine", "value" => $e->getLine()],
  678. ]);
  679. }
  680. }
  681. # Si los registros procesados son menores al límite, terminar
  682. if ($c < $limite) {
  683. $continuar = false;
  684. }
  685. } while ($continuar);
  686. }
  687. public function actionParticipacion() {
  688. try {
  689. \Yii::$app->db->createCommand("SET TIMEZONE TO 'America/Hermosillo'")
  690. ->execute();
  691. } catch (\Exception $e) {
  692. }
  693. $eventos = (new Query())
  694. ->select([
  695. "nombre",
  696. "tag"
  697. ])
  698. ->from("Evento")
  699. ->andWhere([">=", "fechaFinal", new Expression("now() - interval '7 days'")])
  700. // ->andWhere([">=", "fechaFinal", '2023-10-02 00:00:00'])
  701. // ->andWhere(["<=", "fechaFinal", '2023-10-08 00:00:00'])
  702. ->groupBy(["tag", "nombre"])
  703. ->indexBy("tag")
  704. ->column();
  705. $dependencias = Dependencia::find()
  706. ->select("nombre")
  707. ->indexBy("id")
  708. ->column();
  709. $grupos = Grupo::find()
  710. ->select("nombre")
  711. ->indexBy("id")
  712. ->column();
  713. $totalEventos = count($eventos);
  714. $this->stdout("{$totalEventos}");
  715. if ($totalEventos === 0) {
  716. # ¿Si no hubo eventos en el período de tiempo también hay que avisar?
  717. return;
  718. }
  719. $query2 = (new Query())
  720. ->select([
  721. "tag",
  722. "{{Usuario}}.id",
  723. "{{Usuario}}.nombre",
  724. "{{Usuario}}.telefono",
  725. "case when count({{Resultado}}.accion) > 0 then true else false end as [[Participo]]",
  726. "{{UsuarioDependencia}}.[[idDependencia]]",
  727. "{{UsuarioGrupo}}.[[idGrupo]]"
  728. ])
  729. ->from("Evento")
  730. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  731. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  732. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  733. ->innerJoin("Usuario", "{{Usuario}}.[[id]] = {{UsuarioGrupo}}.[[idUsuario]]")
  734. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id")
  735. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
  736. ->andWhere(["{{Usuario}}.eliminado" => null])
  737. ->andWhere([">=", "fechaFinal", new Expression("now()-interval '7 days'")])
  738. // ->andWhere(["{{Usuario}}.id" => 70])
  739. // ->andWhere([">=", "fechaFinal", '2023-07-10 00:00:00'])
  740. // ->andWhere(["<=", "fechaFinal", '2023-07-16 23:59:59'])
  741. ->groupBy([
  742. "{{Usuario}}.nombre",
  743. "{{Usuario}}.telefono",
  744. "{{Usuario}}.id",
  745. "tag",
  746. "{{UsuarioDependencia}}.[[idDependencia]]",
  747. "{{UsuarioGrupo}}.[[idGrupo]]"
  748. ])
  749. ->orderBy([
  750. "{{Usuario}}.id" => SORT_ASC,
  751. "[[Participo]]" => SORT_DESC,
  752. ]);
  753. $eventoResumen = new EventoResumen();
  754. $eventoResumen->creado = new Expression("now()");
  755. $uuidEventoResumen = '';
  756. do {
  757. $uuidEventoResumen = (Uuid::uuid4())
  758. ->toString();
  759. $er = EventoResumen::find()
  760. ->andWhere(["uuid" => $uuidEventoResumen]);
  761. } while ($er->exists());
  762. $eventoResumen->uuid = $uuidEventoResumen;
  763. $eventoResumen->inicio = new Expression("now()-interval '7 days'");
  764. $eventoResumen->fin = new Expression("now()");
  765. if (!$eventoResumen->save()) {
  766. $errores = json_encode($eventoResumen->getFirstErrors());
  767. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  768. return;
  769. }
  770. $eventoResumen->refresh();
  771. $aux = [];
  772. $auxDependencia = [];
  773. foreach ($query2->each() as $consulta) {
  774. if (!isset($aux[$consulta['id']])) {
  775. $aux[$consulta['id']] = [
  776. "nombreUsuario" => $consulta['nombre'],
  777. "telefono" => $consulta['telefono'],
  778. "id" => $consulta['id'],
  779. "idDependencia" => $consulta['idDependencia'],
  780. "idGrupo" => $consulta['idGrupo'],
  781. "eventosFaltantes" => [],
  782. "eventosParticipo" => []
  783. ];
  784. }
  785. $nombreEvento = $eventos[$consulta['tag']];
  786. if ($consulta['Participo']) {
  787. if (!\in_array($nombreEvento, $aux[$consulta['id']]['eventosParticipo'])) {
  788. $aux[$consulta['id']]['eventosParticipo'][] = $nombreEvento;
  789. }
  790. } else {
  791. $aux[$consulta['id']]['eventosFaltantes'][] = $nombreEvento;
  792. }
  793. }
  794. foreach ($aux as $consulta) {
  795. if (!isset($auxDependencia[$consulta['idDependencia']])) {
  796. $auxDependencia[$consulta['idDependencia']] = [
  797. "id" => $consulta['idDependencia'],
  798. "eventosFaltantes" => 0,
  799. "eventosParticipo" => 0
  800. ];
  801. }
  802. $eventosFaltantes = count($consulta['eventosFaltantes']);
  803. $auxDependencia[$consulta['idDependencia']]['eventosFaltantes'] += $eventosFaltantes;
  804. $eventosParticipo = count($consulta['eventosParticipo']);
  805. $auxDependencia[$consulta['idDependencia']]['eventosParticipo'] += $eventosParticipo;
  806. }
  807. $notificacion = new Notificacion();
  808. $notificacion->creado = new Expression("now()");
  809. if (!$notificacion->save()) {
  810. $errores = json_encode($notificacion->getFirstErrors());
  811. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  812. return;
  813. } // */
  814. # TODO: Revisar si es necesario consultar la información del modelo
  815. # $notificacion->refresh();
  816. //POR USUARIO
  817. foreach ($aux as $usuario) {
  818. $notificacionUsuario = new NotificacionUsuario();
  819. $notificacionUsuario->idNotificacion = $notificacion->id;
  820. $notificacionUsuario->idUsuario = $usuario['id'];
  821. $notificacionUsuario->nombre = $usuario['nombreUsuario'];
  822. $notificacionUsuario->telefono = $usuario['telefono'];
  823. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_EVENTO;
  824. # Es mejor guardar el valor del count en lugar de evaluarlo multiples veces
  825. $totalParticipaciones = count($usuario["eventosParticipo"]);
  826. $parametros = [
  827. [
  828. "type" => "text",
  829. "text" => "{$totalParticipaciones}/{$totalEventos} eventos"
  830. ],
  831. ];
  832. if ($totalParticipaciones === $totalEventos) {
  833. $parametros[] = [
  834. "type" => "text",
  835. "text" => "Gracias por tu"
  836. ];
  837. } else if ($totalParticipaciones > 0) {
  838. $parametros[] = [
  839. "type" => "text",
  840. "text" => ", gracias por tu participación. Vamos por el 100% de"
  841. ];
  842. } else {
  843. $parametros[] = [
  844. "type" => "text",
  845. "text" => "Vamos por el 100% de"
  846. ];
  847. }
  848. $notificacionUsuario->parametros = $parametros;
  849. if (!$notificacionUsuario->save()) {
  850. $errores = json_encode($notificacionUsuario->getFirstErrors());
  851. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  852. return;
  853. }
  854. }
  855. //POR LIDER DEPENDENCIA
  856. foreach ($auxDependencia as $id => $dependencia) {
  857. $evResDependencia = new EventoResumenDependencia();
  858. $uuidEventoResumenDependencia = '';
  859. $consultaERD = EventoResumenDependencia::find()
  860. ->andWhere([
  861. "AND",
  862. ["=", "idEventoResumen", $eventoResumen->id],
  863. ["=", "idDependencia", $id],
  864. ])
  865. ->exists();
  866. if ($consultaERD) {
  867. continue;
  868. }
  869. do {
  870. $uuidEventoResumenDependencia = (Uuid::uuid4())
  871. ->toString();
  872. $erd = EventoResumenDependencia::find()
  873. ->andWhere(["clave" => $uuidEventoResumenDependencia]);
  874. } while ($erd->exists());
  875. $evResDependencia->clave = $uuidEventoResumenDependencia;
  876. $evResDependencia->idEventoResumen = $eventoResumen->id;
  877. $evResDependencia->idDependencia = $id;
  878. if (!$evResDependencia->save()) {
  879. $errores = json_encode($evResDependencia->getFirstErrors());
  880. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  881. return;
  882. }
  883. $dependenciaLider = DependenciaLider::find()
  884. ->andWhere(["idDependencia" => $id]);
  885. $nombreDependencia = "";
  886. if (isset($dependencias[$id])) {
  887. $nombreDependencia = trim($dependencias[$id]);
  888. }
  889. foreach ($dependenciaLider->each() as $lider) {
  890. $usuario = Usuario::findOne($lider["idUsuario"]);
  891. $notificacionUsuario = new NotificacionUsuario();
  892. $notificacionUsuario->idNotificacion = $notificacion->id;
  893. $notificacionUsuario->idUsuario = $usuario->id;
  894. $notificacionUsuario->nombre = $usuario->nombre;
  895. $notificacionUsuario->telefono = $usuario->telefono;
  896. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_EVENTO_URL;
  897. $totalParticipaciones = $dependencia["eventosParticipo"];
  898. $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"];
  899. $usuariosDependencia = Usuario::find()
  900. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id")
  901. ->andWhere(["{{UsuarioDependencia}}.[[idDependencia]]" => $id])
  902. ->andWhere(["{{Usuario}}.eliminado" => null]);
  903. // $mensajeUsuariosDependencia = "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos. Puede consultar los resultados en https://laud-red.web.app/resumen-lider-dependencia?id={$evResDependencia->clave}";
  904. $mensajeUsuariosDependencia = "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos. ";
  905. $contador = 0;
  906. foreach ($usuariosDependencia->each() as $ud) {
  907. if (!isset($aux[$ud["id"]])) {
  908. continue;
  909. }
  910. $contador++;
  911. $nomrbeUsuario = trim($aux[$ud["id"]]["nombreUsuario"]);
  912. $totalEventosUsuarioParticipa = count($aux[$ud["id"]]["eventosParticipo"]);
  913. $mensajeUsuariosDependencia .= "*{$nomrbeUsuario}*: {$totalEventosUsuarioParticipa}/{$totalEventos}";
  914. if ($contador < count($usuariosDependencia->all())) {
  915. $mensajeUsuariosDependencia .= ", ";
  916. }
  917. }
  918. $mensajeUsuariosDependencia .= ". Puede consultar los resultados en https://laud-red.web.app/resumen-lider-dependencia?id={$evResDependencia->clave}";
  919. $parametros = [
  920. [
  921. "type" => "text",
  922. "text" => $mensajeUsuariosDependencia
  923. ],
  924. ];
  925. if ($totalParticipaciones === $totalEventosDependencia) {
  926. $parametros[] = [
  927. "type" => "text",
  928. "text" => "Gracias por tu"
  929. ];
  930. } else if ($totalParticipaciones > 0) {
  931. $parametros[] = [
  932. "type" => "text",
  933. "text" => "Gracias por tu participación. Vamos por el 100% de"
  934. ];
  935. } else {
  936. $parametros[] = [
  937. "type" => "text",
  938. "text" => "Vamos por el 100% de"
  939. ];
  940. }
  941. $notificacionUsuario->parametros = $parametros;
  942. if (!$notificacionUsuario->save()) {
  943. $this->stdout("Error");
  944. $errores = json_encode($notificacionUsuario->getFirstErrors());
  945. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  946. return;
  947. }
  948. }
  949. }
  950. //LIDER GLOBAL
  951. $liderGlobal = Usuario::find()
  952. ->andWhere(["liderGlobal" => true]);
  953. foreach ($liderGlobal->each() as $lider) {
  954. $mensaje = "";
  955. $participaciones = 0;
  956. $totalParticipaciones = 0;
  957. $totalEventosDependencia = 0;
  958. $contadorDependencias = 0;
  959. foreach ($auxDependencia as $id => $dependencia) {
  960. $contadorDependencias++;
  961. $usuariosDependencia = Usuario::find()
  962. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id")
  963. ->andWhere(["{{UsuarioDependencia}}.[[idDependencia]]" => $id])
  964. ->andWhere(["{{Usuario}}.eliminado" => null]);
  965. $nombreDependencia = "";
  966. if (isset($dependencias[$id])) {
  967. $nombreDependencia = trim($dependencias[$id]);
  968. $totalParticipaciones = $dependencia["eventosParticipo"];
  969. $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"];
  970. $mensaje .= "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos";
  971. // $contadorUsuarios = 0;
  972. foreach ($usuariosDependencia->each() as $ud) {
  973. if (!isset($aux[$ud["id"]])) {
  974. continue;
  975. }
  976. $nomrbeUsuario = trim($aux[$ud["id"]]["nombreUsuario"]);
  977. $totalEventosUsuarioParticipa = count($aux[$ud["id"]]["eventosParticipo"]);
  978. $checkEventoParticipante = EventoResumenParticipante::find()
  979. ->andWhere([
  980. "idEventoResumen" => $eventoResumen->id,
  981. "idDependencia" => $id,
  982. "idUsuario" => $ud->id
  983. ])
  984. ->exists();
  985. if ($checkEventoParticipante) {
  986. continue;
  987. }
  988. $eventoParticipante = new EventoResumenParticipante();
  989. $eventoParticipante->idEventoResumen = $eventoResumen->id;
  990. $eventoParticipante->idDependencia = $id;
  991. $eventoParticipante->nombreDependencia = $nombreDependencia;
  992. $eventoParticipante->idGrupo = $aux[$ud["id"]]["idGrupo"];
  993. $eventoParticipante->nombreGrupo = trim($grupos[$aux[$ud["id"]]["idGrupo"]]);
  994. $eventoParticipante->idUsuario = $ud->id;
  995. $eventoParticipante->nombre = $nomrbeUsuario;
  996. $eventoParticipante->totalEventos = $totalEventos;
  997. $eventoParticipante->participacion = trim($totalEventosUsuarioParticipa);
  998. if (!$eventoParticipante->save()) {
  999. $errores = json_encode($eventoParticipante->getFirstErrors());
  1000. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  1001. return;
  1002. }
  1003. /* $contadorUsuarios++;
  1004. $mensaje .= "*{$nomrbeUsuario}*: {$totalEventosUsuarioParticipa}/{$totalEventos}";
  1005. if ($contadorUsuarios < count($usuariosDependencia->all())){
  1006. $mensaje .= " || ";
  1007. } */
  1008. }
  1009. // $mensaje .= ")";
  1010. if ($contadorDependencias < count($auxDependencia)) {
  1011. $mensaje .= ", ";
  1012. }
  1013. $participaciones += $totalParticipaciones;
  1014. }
  1015. }
  1016. $notificacionUsuario = new NotificacionUsuario();
  1017. $notificacionUsuario->idNotificacion = $notificacion->id;
  1018. $notificacionUsuario->idUsuario = $lider->id;
  1019. $notificacionUsuario->nombre = $lider->nombre;
  1020. $notificacionUsuario->telefono = $lider->telefono;
  1021. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_GLOBAL;
  1022. // $totalParticipaciones = $dependencia["eventosParticipo"];
  1023. // $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"];
  1024. $mensaje .= ". Aquí puede mirar el resumen de actividades https://laud-red.web.app/resumen-evento?id={$eventoResumen->uuid}";
  1025. $parametros = [
  1026. [
  1027. "type" => "text",
  1028. "text" => $mensaje
  1029. ],
  1030. ];
  1031. if ($participaciones === $totalEventosDependencia) {
  1032. $parametros[] = [
  1033. "type" => "text",
  1034. "text" => "Gracias por tu"
  1035. ];
  1036. } else if ($participaciones > 0) {
  1037. $parametros[] = [
  1038. "type" => "text",
  1039. "text" => "Gracias por tu participación. Vamos por el 100% de"
  1040. ];
  1041. } else {
  1042. $parametros[] = [
  1043. "type" => "text",
  1044. "text" => "Vamos por el 100% de"
  1045. ];
  1046. }
  1047. $notificacionUsuario->parametros = $parametros;
  1048. if (!$notificacionUsuario->save()) {
  1049. $errores = json_encode($notificacionUsuario->getFirstErrors());
  1050. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  1051. return;
  1052. }
  1053. }
  1054. $notificacion->estatus = Notificacion::ESTATUS_NUEVO;
  1055. $domingo = 0;
  1056. $d = new \DateTime('now', new \DateTimeZone('America/Hermosillo'));
  1057. $fecha = strtotime('now');
  1058. $dia = intval($d->format("w"));
  1059. if ($dia !== $domingo) {
  1060. $d = new \DateTime('next Sunday', new \DateTimeZone('America/Hermosillo'));
  1061. }
  1062. $d->setTime(18, 0, 0, 0);
  1063. $siguienteDomingo = $d->format(\DateTime::ISO8601);
  1064. $notificacion->envio = $siguienteDomingo;
  1065. $notificacion->save();
  1066. $this->stdout("Terminó");
  1067. // file_put_contents("archivo.json", json_encode($aux));
  1068. }
  1069. public function actionParticipacionError() {
  1070. $query = (new Query())
  1071. ->select([
  1072. "{{Usuario}}.id as [[id]]",
  1073. "{{Usuario}}.nombre as [[nombre]]",
  1074. "{{Usuario}}.telefono as [[telefono]]",
  1075. ])
  1076. ->distinct()
  1077. ->from("Evento")
  1078. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  1079. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  1080. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  1081. ->innerJoin("Usuario", "{{Usuario}}.[[id]] = {{UsuarioGrupo}}.[[idUsuario]]")
  1082. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
  1083. ->andWhere(["{{Usuario}}.eliminado" => null])
  1084. ->andWhere([">=", "fechaFinal", new Expression("now()-interval '7 days'")])
  1085. ->groupBy([
  1086. "{{Usuario}}.[[nombre]]",
  1087. "{{Usuario}}.[[telefono]]",
  1088. "{{Usuario}}.[[id]]",
  1089. ])
  1090. ->orderBy([
  1091. "{{Usuario}}.[[id]]" => SORT_ASC,
  1092. ]);
  1093. $transaccion = \Yii::$app->db->beginTransaction();
  1094. try {
  1095. $notificacion = new Notificacion();
  1096. $notificacion->creado = new Expression("now()");
  1097. if (!$notificacion->save()) {
  1098. $transaccion->rollBack();
  1099. $errores = json_encode($notificacion->getFirstErrors());
  1100. $this->stdoutln('Hubo un problema al generar la notificación: ' . $errores);
  1101. return;
  1102. }
  1103. foreach ($query->each() as $usuario) {
  1104. $notificacionUsuario = new NotificacionUsuario();
  1105. $this->stdoutln("idUsuario: {$usuario['id']}");
  1106. $this->stdoutln("nombre: {$usuario['nombre']}");
  1107. $this->stdoutln("teléfono: {$usuario['telefono']}");
  1108. $notificacionUsuario->idNotificacion = $notificacion->id;
  1109. $notificacionUsuario->idUsuario = intval($usuario['id']);
  1110. $notificacionUsuario->nombre = $usuario['nombre'];
  1111. $notificacionUsuario->telefono = $usuario['telefono'];
  1112. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_GLOBAL_URL;
  1113. $parametros = [
  1114. [
  1115. "type" => "text",
  1116. "text" => "El día de ayer hubo una falla en el sistema al enviar los reportes de la semana, se esta solucionando. "
  1117. ],
  1118. [
  1119. "type" => "text",
  1120. "text" => "Gracias por su compresión."
  1121. ],
  1122. ];
  1123. $notificacionUsuario->parametros = $parametros;
  1124. if (!$notificacionUsuario->save()) {
  1125. $transaccion->rollBack();
  1126. $errores = json_encode($notificacionUsuario->getFirstErrors());
  1127. $this->stdoutln('Hubo un problema al generar la notificación: ' . $errores);
  1128. return;
  1129. }
  1130. }
  1131. $notificacion->envio = new Expression('now()');
  1132. $notificacion->estatus = 'Nuevo';
  1133. $notificacion->save();
  1134. $transaccion->commit();
  1135. } catch (\Exception $e) {
  1136. $transaccion->rollBack();
  1137. $this->stdoutln("Exception: {$e->getMessage()}\n");
  1138. }
  1139. }
  1140. }