EventoController.php 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331
  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. ->andWhere(["eliminado" => null])
  703. ->groupBy(["tag", "nombre"])
  704. ->indexBy("tag")
  705. ->column();
  706. $dependencias = Dependencia::find()
  707. ->select("nombre")
  708. ->indexBy("id")
  709. ->column();
  710. $grupos = Grupo::find()
  711. ->select("nombre")
  712. ->indexBy("id")
  713. ->column();
  714. $totalEventos = count($eventos);
  715. $this->stdout("{$totalEventos}");
  716. if ($totalEventos === 0) {
  717. # ¿Si no hubo eventos en el período de tiempo también hay que avisar?
  718. return;
  719. }
  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(["{{Usuario}}.id" => 70])
  741. // ->andWhere([">=", "fechaFinal", '2023-07-10 00:00:00'])
  742. // ->andWhere(["<=", "fechaFinal", '2023-07-16 23:59:59'])
  743. ->groupBy([
  744. "{{Usuario}}.nombre",
  745. "{{Usuario}}.telefono",
  746. "{{Usuario}}.id",
  747. "tag",
  748. "{{UsuarioDependencia}}.[[idDependencia]]",
  749. "{{UsuarioGrupo}}.[[idGrupo]]"
  750. ])
  751. ->orderBy([
  752. "{{Usuario}}.id" => SORT_ASC,
  753. "[[Participo]]" => SORT_DESC,
  754. ]);
  755. $eventoResumen = new EventoResumen();
  756. $eventoResumen->creado = new Expression("now()");
  757. $uuidEventoResumen = '';
  758. do {
  759. $uuidEventoResumen = (Uuid::uuid4())
  760. ->toString();
  761. $er = EventoResumen::find()
  762. ->andWhere(["uuid" => $uuidEventoResumen]);
  763. } while ($er->exists());
  764. $eventoResumen->uuid = $uuidEventoResumen;
  765. $eventoResumen->inicio = new Expression("now()-interval '7 days'");
  766. $eventoResumen->fin = new Expression("now()");
  767. if (!$eventoResumen->save()) {
  768. $errores = json_encode($eventoResumen->getFirstErrors());
  769. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  770. return;
  771. }
  772. $eventoResumen->refresh();
  773. $aux = [];
  774. $auxDependencia = [];
  775. foreach ($query2->each() as $consulta) {
  776. if (!isset($aux[$consulta['id']])) {
  777. $aux[$consulta['id']] = [
  778. "nombreUsuario" => $consulta['nombre'],
  779. "telefono" => $consulta['telefono'],
  780. "id" => $consulta['id'],
  781. "idDependencia" => $consulta['idDependencia'],
  782. "idGrupo" => $consulta['idGrupo'],
  783. "eventosFaltantes" => [],
  784. "eventosParticipo" => []
  785. ];
  786. }
  787. $nombreEvento = $eventos[$consulta['tag']];
  788. if ($consulta['Participo']) {
  789. if (!\in_array($nombreEvento, $aux[$consulta['id']]['eventosParticipo'])) {
  790. $aux[$consulta['id']]['eventosParticipo'][] = $nombreEvento;
  791. }
  792. } else {
  793. $aux[$consulta['id']]['eventosFaltantes'][] = $nombreEvento;
  794. }
  795. }
  796. foreach ($aux as $consulta) {
  797. if (!isset($auxDependencia[$consulta['idDependencia']])) {
  798. $auxDependencia[$consulta['idDependencia']] = [
  799. "id" => $consulta['idDependencia'],
  800. "eventosFaltantes" => 0,
  801. "eventosParticipo" => 0
  802. ];
  803. }
  804. $eventosFaltantes = count($consulta['eventosFaltantes']);
  805. $auxDependencia[$consulta['idDependencia']]['eventosFaltantes'] += $eventosFaltantes;
  806. $eventosParticipo = count($consulta['eventosParticipo']);
  807. $auxDependencia[$consulta['idDependencia']]['eventosParticipo'] += $eventosParticipo;
  808. }
  809. $notificacion = new Notificacion();
  810. $notificacion->creado = new Expression("now()");
  811. if (!$notificacion->save()) {
  812. $errores = json_encode($notificacion->getFirstErrors());
  813. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  814. return;
  815. } // */
  816. # TODO: Revisar si es necesario consultar la información del modelo
  817. # $notificacion->refresh();
  818. //POR USUARIO
  819. foreach ($aux as $usuario) {
  820. $notificacionUsuario = new NotificacionUsuario();
  821. $notificacionUsuario->idNotificacion = $notificacion->id;
  822. $notificacionUsuario->idUsuario = $usuario['id'];
  823. $notificacionUsuario->nombre = $usuario['nombreUsuario'];
  824. $notificacionUsuario->telefono = $usuario['telefono'];
  825. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_EVENTO;
  826. # Es mejor guardar el valor del count en lugar de evaluarlo multiples veces
  827. $totalParticipaciones = count($usuario["eventosParticipo"]);
  828. $parametros = [
  829. [
  830. "type" => "text",
  831. "text" => "{$totalParticipaciones}/{$totalEventos} eventos"
  832. ],
  833. ];
  834. if ($totalParticipaciones === $totalEventos) {
  835. $parametros[] = [
  836. "type" => "text",
  837. "text" => "Gracias por tu"
  838. ];
  839. } else if ($totalParticipaciones > 0) {
  840. $parametros[] = [
  841. "type" => "text",
  842. "text" => ", gracias por tu participación. Vamos por el 100% de"
  843. ];
  844. } else {
  845. $parametros[] = [
  846. "type" => "text",
  847. "text" => "Vamos por el 100% de"
  848. ];
  849. }
  850. $notificacionUsuario->parametros = $parametros;
  851. if (!$notificacionUsuario->save()) {
  852. $errores = json_encode($notificacionUsuario->getFirstErrors());
  853. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  854. return;
  855. }
  856. }
  857. //POR LIDER DEPENDENCIA
  858. foreach ($auxDependencia as $id => $dependencia) {
  859. $evResDependencia = new EventoResumenDependencia();
  860. $uuidEventoResumenDependencia = '';
  861. $consultaERD = EventoResumenDependencia::find()
  862. ->andWhere([
  863. "AND",
  864. ["=", "idEventoResumen", $eventoResumen->id],
  865. ["=", "idDependencia", $id],
  866. ])
  867. ->exists();
  868. if ($consultaERD) {
  869. continue;
  870. }
  871. do {
  872. $uuidEventoResumenDependencia = (Uuid::uuid4())
  873. ->toString();
  874. $erd = EventoResumenDependencia::find()
  875. ->andWhere(["clave" => $uuidEventoResumenDependencia]);
  876. } while ($erd->exists());
  877. $evResDependencia->clave = $uuidEventoResumenDependencia;
  878. $evResDependencia->idEventoResumen = $eventoResumen->id;
  879. $evResDependencia->idDependencia = $id;
  880. if (!$evResDependencia->save()) {
  881. $errores = json_encode($evResDependencia->getFirstErrors());
  882. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  883. return;
  884. }
  885. $dependenciaLider = DependenciaLider::find()
  886. ->andWhere(["idDependencia" => $id]);
  887. $nombreDependencia = "";
  888. if (isset($dependencias[$id])) {
  889. $nombreDependencia = trim($dependencias[$id]);
  890. }
  891. foreach ($dependenciaLider->each() as $lider) {
  892. $usuario = Usuario::findOne($lider["idUsuario"]);
  893. $notificacionUsuario = new NotificacionUsuario();
  894. $notificacionUsuario->idNotificacion = $notificacion->id;
  895. $notificacionUsuario->idUsuario = $usuario->id;
  896. $notificacionUsuario->nombre = $usuario->nombre;
  897. $notificacionUsuario->telefono = $usuario->telefono;
  898. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_EVENTO_URL;
  899. $totalParticipaciones = $dependencia["eventosParticipo"];
  900. $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"];
  901. $usuariosDependencia = Usuario::find()
  902. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id")
  903. ->andWhere(["{{UsuarioDependencia}}.[[idDependencia]]" => $id])
  904. ->andWhere(["{{Usuario}}.eliminado" => null]);
  905. // $mensajeUsuariosDependencia = "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos. Puede consultar los resultados en https://laud-red.web.app/resumen-lider-dependencia?id={$evResDependencia->clave}";
  906. $mensajeUsuariosDependencia = "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos. ";
  907. $contador = 0;
  908. foreach ($usuariosDependencia->each() as $ud) {
  909. if (!isset($aux[$ud["id"]])) {
  910. continue;
  911. }
  912. $contador++;
  913. $nomrbeUsuario = trim($aux[$ud["id"]]["nombreUsuario"]);
  914. $totalEventosUsuarioParticipa = count($aux[$ud["id"]]["eventosParticipo"]);
  915. $mensajeUsuariosDependencia .= "*{$nomrbeUsuario}*: {$totalEventosUsuarioParticipa}/{$totalEventos}";
  916. if ($contador < count($usuariosDependencia->all())) {
  917. $mensajeUsuariosDependencia .= ", ";
  918. }
  919. }
  920. $mensajeUsuariosDependencia .= ". Puede consultar los resultados en https://laud-red.web.app/resumen-lider-dependencia?id={$evResDependencia->clave}";
  921. $parametros = [
  922. [
  923. "type" => "text",
  924. "text" => $mensajeUsuariosDependencia
  925. ],
  926. ];
  927. if ($totalParticipaciones === $totalEventosDependencia) {
  928. $parametros[] = [
  929. "type" => "text",
  930. "text" => "Gracias por tu"
  931. ];
  932. } else if ($totalParticipaciones > 0) {
  933. $parametros[] = [
  934. "type" => "text",
  935. "text" => "Gracias por tu participación. Vamos por el 100% de"
  936. ];
  937. } else {
  938. $parametros[] = [
  939. "type" => "text",
  940. "text" => "Vamos por el 100% de"
  941. ];
  942. }
  943. $notificacionUsuario->parametros = $parametros;
  944. if (!$notificacionUsuario->save()) {
  945. $this->stdout("Error");
  946. $errores = json_encode($notificacionUsuario->getFirstErrors());
  947. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  948. return;
  949. }
  950. }
  951. }
  952. //LIDER GLOBAL
  953. $liderGlobal = Usuario::find()
  954. ->andWhere(["liderGlobal" => true]);
  955. foreach ($liderGlobal->each() as $lider) {
  956. $mensaje = "";
  957. $participaciones = 0;
  958. $totalParticipaciones = 0;
  959. $totalEventosDependencia = 0;
  960. $contadorDependencias = 0;
  961. foreach ($auxDependencia as $id => $dependencia) {
  962. $contadorDependencias++;
  963. $usuariosDependencia = Usuario::find()
  964. ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id")
  965. ->andWhere(["{{UsuarioDependencia}}.[[idDependencia]]" => $id])
  966. ->andWhere(["{{Usuario}}.eliminado" => null]);
  967. $nombreDependencia = "";
  968. if (isset($dependencias[$id])) {
  969. $nombreDependencia = trim($dependencias[$id]);
  970. $totalParticipaciones = $dependencia["eventosParticipo"];
  971. $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"];
  972. $mensaje .= "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos";
  973. // $contadorUsuarios = 0;
  974. foreach ($usuariosDependencia->each() as $ud) {
  975. if (!isset($aux[$ud["id"]])) {
  976. continue;
  977. }
  978. $nomrbeUsuario = trim($aux[$ud["id"]]["nombreUsuario"]);
  979. $totalEventosUsuarioParticipa = count($aux[$ud["id"]]["eventosParticipo"]);
  980. $checkEventoParticipante = EventoResumenParticipante::find()
  981. ->andWhere([
  982. "idEventoResumen" => $eventoResumen->id,
  983. "idDependencia" => $id,
  984. "idUsuario" => $ud->id
  985. ])
  986. ->exists();
  987. if ($checkEventoParticipante) {
  988. continue;
  989. }
  990. $eventoParticipante = new EventoResumenParticipante();
  991. $eventoParticipante->idEventoResumen = $eventoResumen->id;
  992. $eventoParticipante->idDependencia = $id;
  993. $eventoParticipante->nombreDependencia = $nombreDependencia;
  994. $eventoParticipante->idGrupo = $aux[$ud["id"]]["idGrupo"];
  995. $eventoParticipante->nombreGrupo = trim($grupos[$aux[$ud["id"]]["idGrupo"]]);
  996. $eventoParticipante->idUsuario = $ud->id;
  997. $eventoParticipante->nombre = $nomrbeUsuario;
  998. $eventoParticipante->totalEventos = $totalEventos;
  999. $eventoParticipante->participacion = trim($totalEventosUsuarioParticipa);
  1000. if (!$eventoParticipante->save()) {
  1001. $errores = json_encode($eventoParticipante->getFirstErrors());
  1002. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  1003. return;
  1004. }
  1005. /* $contadorUsuarios++;
  1006. $mensaje .= "*{$nomrbeUsuario}*: {$totalEventosUsuarioParticipa}/{$totalEventos}";
  1007. if ($contadorUsuarios < count($usuariosDependencia->all())){
  1008. $mensaje .= " || ";
  1009. } */
  1010. }
  1011. // $mensaje .= ")";
  1012. if ($contadorDependencias < count($auxDependencia)) {
  1013. $mensaje .= ", ";
  1014. }
  1015. $participaciones += $totalParticipaciones;
  1016. }
  1017. }
  1018. $notificacionUsuario = new NotificacionUsuario();
  1019. $notificacionUsuario->idNotificacion = $notificacion->id;
  1020. $notificacionUsuario->idUsuario = $lider->id;
  1021. $notificacionUsuario->nombre = $lider->nombre;
  1022. $notificacionUsuario->telefono = $lider->telefono;
  1023. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_GLOBAL;
  1024. // $totalParticipaciones = $dependencia["eventosParticipo"];
  1025. // $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"];
  1026. $mensaje .= ". Aquí puede mirar el resumen de actividades https://laud-red.web.app/resumen-evento?id={$eventoResumen->uuid}";
  1027. $parametros = [
  1028. [
  1029. "type" => "text",
  1030. "text" => $mensaje
  1031. ],
  1032. ];
  1033. if ($participaciones === $totalEventosDependencia) {
  1034. $parametros[] = [
  1035. "type" => "text",
  1036. "text" => "Gracias por tu"
  1037. ];
  1038. } else if ($participaciones > 0) {
  1039. $parametros[] = [
  1040. "type" => "text",
  1041. "text" => "Gracias por tu participación. Vamos por el 100% de"
  1042. ];
  1043. } else {
  1044. $parametros[] = [
  1045. "type" => "text",
  1046. "text" => "Vamos por el 100% de"
  1047. ];
  1048. }
  1049. $notificacionUsuario->parametros = $parametros;
  1050. if (!$notificacionUsuario->save()) {
  1051. $errores = json_encode($notificacionUsuario->getFirstErrors());
  1052. $this->stdout('Hubo un problema al generar la notificación: ' . $errores);
  1053. return;
  1054. }
  1055. }
  1056. $notificacion->estatus = Notificacion::ESTATUS_NUEVO;
  1057. $domingo = 0;
  1058. $d = new \DateTime('now', new \DateTimeZone('America/Hermosillo'));
  1059. $fecha = strtotime('now');
  1060. $dia = intval($d->format("w"));
  1061. if ($dia !== $domingo) {
  1062. $d = new \DateTime('next Sunday', new \DateTimeZone('America/Hermosillo'));
  1063. }
  1064. $d->setTime(18, 0, 0, 0);
  1065. $siguienteDomingo = $d->format(\DateTime::ISO8601);
  1066. $notificacion->envio = $siguienteDomingo;
  1067. $notificacion->save();
  1068. $this->stdout("Terminó");
  1069. // file_put_contents("archivo.json", json_encode($aux));
  1070. }
  1071. public function actionParticipacionError() {
  1072. $query = (new Query())
  1073. ->select([
  1074. "{{Usuario}}.id as [[id]]",
  1075. "{{Usuario}}.nombre as [[nombre]]",
  1076. "{{Usuario}}.telefono as [[telefono]]",
  1077. ])
  1078. ->distinct()
  1079. ->from("Evento")
  1080. ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id")
  1081. ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]")
  1082. ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id")
  1083. ->innerJoin("Usuario", "{{Usuario}}.[[id]] = {{UsuarioGrupo}}.[[idUsuario]]")
  1084. ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id")
  1085. ->andWhere(["{{Usuario}}.eliminado" => null])
  1086. ->andWhere([">=", "fechaFinal", new Expression("now()-interval '7 days'")])
  1087. ->groupBy([
  1088. "{{Usuario}}.[[nombre]]",
  1089. "{{Usuario}}.[[telefono]]",
  1090. "{{Usuario}}.[[id]]",
  1091. ])
  1092. ->orderBy([
  1093. "{{Usuario}}.[[id]]" => SORT_ASC,
  1094. ]);
  1095. $transaccion = \Yii::$app->db->beginTransaction();
  1096. try {
  1097. $notificacion = new Notificacion();
  1098. $notificacion->creado = new Expression("now()");
  1099. if (!$notificacion->save()) {
  1100. $transaccion->rollBack();
  1101. $errores = json_encode($notificacion->getFirstErrors());
  1102. $this->stdoutln('Hubo un problema al generar la notificación: ' . $errores);
  1103. return;
  1104. }
  1105. foreach ($query->each() as $usuario) {
  1106. $notificacionUsuario = new NotificacionUsuario();
  1107. $this->stdoutln("idUsuario: {$usuario['id']}");
  1108. $this->stdoutln("nombre: {$usuario['nombre']}");
  1109. $this->stdoutln("teléfono: {$usuario['telefono']}");
  1110. $notificacionUsuario->idNotificacion = $notificacion->id;
  1111. $notificacionUsuario->idUsuario = intval($usuario['id']);
  1112. $notificacionUsuario->nombre = $usuario['nombre'];
  1113. $notificacionUsuario->telefono = $usuario['telefono'];
  1114. $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_GLOBAL_URL;
  1115. $parametros = [
  1116. [
  1117. "type" => "text",
  1118. "text" => "El día de ayer hubo una falla en el sistema al enviar los reportes de la semana, se esta solucionando. "
  1119. ],
  1120. [
  1121. "type" => "text",
  1122. "text" => "Gracias por su compresión."
  1123. ],
  1124. ];
  1125. $notificacionUsuario->parametros = $parametros;
  1126. if (!$notificacionUsuario->save()) {
  1127. $transaccion->rollBack();
  1128. $errores = json_encode($notificacionUsuario->getFirstErrors());
  1129. $this->stdoutln('Hubo un problema al generar la notificación: ' . $errores);
  1130. return;
  1131. }
  1132. }
  1133. $notificacion->envio = new Expression('now()');
  1134. $notificacion->estatus = 'Nuevo';
  1135. $notificacion->save();
  1136. $transaccion->commit();
  1137. } catch (\Exception $e) {
  1138. $transaccion->rollBack();
  1139. $this->stdoutln("Exception: {$e->getMessage()}\n");
  1140. }
  1141. }
  1142. }