EventoController.php 51 KB

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