stdout($cadena . "\n"); } public function cambiarFecha($string) { $formato = "D M d Y H:i:s P"; $fecha = \DateTime::createFromFormat($formato, $string); return $fecha; } public function actionSincronizar() { $firebase = new FirebaseHelper(); $firestore = $firebase->firestore(); $refGrupos = $firestore->collection("grupos"); $refUsuarios = $firestore->collection("usuarios"); $refDependencias = $firestore->collection("dependencias"); $grupos = []; $usuarios = []; $dependencias = []; foreach ($refGrupos->documents() as $grupo) { $grupos[$grupo->id()] = $grupo->data(); } foreach ($refUsuarios->documents() as $usuario) { $usuarios[$usuario->id()] = $usuario->data(); } foreach ($refDependencias->documents() as $dependencia) { $dependencias[$dependencia->id()] = $dependencia->data(); } $ultimaFecha = null; $limite = 100; // 1000; $continuar = true; do { $this->stdout("Sincronizando ..."); $ref = $firestore->collection("eventos") ->where("sincronizado", "==", null) // ->where("sincronizado", "==", 'ERROR') ->orderBy("timestamp", "ASC") ->limit($limite); if ($ultimaFecha !== null) { $ref = $ref->startAt([$ultimaFecha]); } $c = 0; # Contador de registros procesados foreach ($ref->documents() as $doc) { $this->stdoutln($doc->id()); $c++; $data = $doc->data(); $ultimaFecha = $data["timestamp"]; $modelo = Evento::findOne(["firebaseId" => $doc->id()]); if ($modelo === null) { $modelo = new Evento(); } try { $modelo->nombre = $data["nombre"]; $modelo->descripcion = $data["descripcion"]; $modelo->ciudad = $data["ciudad"]; $modelo->redSocial = $data["redSocial"]; $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]); if ($creado !== false) { $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED); } if ($data["estatus"] === false) { $modelo->eliminado = new Expression('now()'); } $fechaInicio = $this->cambiarFecha($data["fechaInicio"]); if ($fechaInicio !== false) { $modelo->fechaInicio = $fechaInicio->format(\DateTime::RFC3339_EXTENDED); } $fechaFinal = $this->cambiarFecha($data["fechaFinal"]); if ($fechaFinal !== false) { $modelo->fechaFinal = $fechaFinal->format(\DateTime::RFC3339_EXTENDED); } $modelo->fotoEvento = $data["fotoEvento"]; $modelo->url = $data["pathFirebase"]; if (isset($data["tag"])) { $modelo->tag = $data["tag"]; } $modelo->firebaseId = $doc->id(); if (!$modelo->save()) { $this->stdoutln('Ocurrió un error al guardar un evento. ' . Json::encode($modelo->getFirstErrors())); continue; } if (isset($data["redes"])) { foreach ($data["redes"] as $red) { $eventoRed = Red::find() ->andWhere([ "idEvento" => $modelo->id, "url" => $red["url"] ]) ->one(); if ($eventoRed === null) { $eventoRed = new Red(); $eventoRed->idEvento = $modelo->id; $eventoRed->key = $red["key"]; $eventoRed->url = $red["url"]; $eventoRed->redSocial = $red["redSocial"]; if (!$eventoRed->save()) { $this->stdoutln('Ocurrió un error al guardar una red. ' . Json::encode($eventoRed->getFirstErrors())); continue; } } } } foreach ($data["accion"] as $accion) { $eventoAccion = EventoAccion::find() ->andWhere([ "idEvento" => $modelo->id, "accion" => $accion ]) ->one(); if ($eventoAccion === null) { $eventoAccion = new EventoAccion(); $eventoAccion->idEvento = $modelo->id; $eventoAccion->accion = $accion; if (!$eventoAccion->save()) { $this->stdoutln('Ocurrió un error al guardar un evento-accion. ' . Json::encode($eventoAccion->getFirstErrors())); continue; } } } //Grupos dentro de los eventos foreach ($data["grupos"] as $grupoEvento) { $grupoModelo = Grupo::findOne(["firebaseId" => $grupoEvento]); if ($grupoModelo === null && isset($grupos[$grupoEvento])) { $grupoModelo = new Grupo(); $grupoModelo->creado = new Expression('now()'); $grupoModelo->nombre = $grupos[$grupoEvento]["nombre"]; $grupoModelo->descripcion = $grupos[$grupoEvento]["descripcion"]; $grupoModelo->firebaseId = $grupoEvento; if (!$grupoModelo->save()) { $this->stdoutln('Ocurrió un error al guardar un grupo. ' . Json::encode($grupoModelo->getFirstErrors())); } } if ($grupoModelo !== null) { $eventoGrupo = EventoGrupo::find() ->andWhere([ "idEvento" => $modelo->id, "idGrupo" => $grupoModelo->id ]) ->one(); if ($eventoGrupo === null) { $eventoGrupo = new EventoGrupo(); $eventoGrupo->idEvento = $modelo->id; $eventoGrupo->idGrupo = $grupoModelo->id; if (!$eventoGrupo->save()) { $this->stdoutln('Ocurrió un error al guardar un evento-grupo. ' . Json::encode($eventoGrupo->getFirstErrors())); } } } } foreach ($data["usuarios"] as $usuarioEvento) { $usuarioModelo = Usuario::findOne(["uid" => $usuarioEvento["uid"]]); $usuarioRef = isset($usuarios[$usuarioEvento["uid"]]) ? $usuarios[$usuarioEvento["uid"]] : null; // Usuarios if ($usuarioModelo === null && $usuarioRef !== null) { $usuarioModelo = new Usuario(); $usuarioModelo->uid = $usuarioRef["uid"]; $usuarioModelo->nombre = $usuarioRef["nombre"]; if (isset($usuarioRef["email"])) { $usuarioModelo->email = $usuarioRef["email"]; } $usuarioModelo->telefono = $usuarioRef["telefono"]; $usuarioModelo->facebook = $usuarioRef["facebook"]; if (isset($usuarioRef["facebookVerificado"])) { $usuarioModelo->facebookVerificado = $usuarioRef["facebookVerificado"]; } $usuarioModelo->instagram = $usuarioRef["instagram"]; if (isset($usuarioRef["instagramVerificado"])) { $usuarioModelo->instagramVerificado = $usuarioRef["instagramVerificado"]; } $usuarioModelo->twitter = $usuarioRef["twitter"]; if (isset($usuarioRef["twitterVerificado"])) { $usuarioModelo->twitterVerificado = $usuarioRef["twitterVerificado"]; } $usuarioModelo->genero = $usuarioRef["genero"]; if (isset($usuarioRef["verificado"])) { $usuarioModelo->verificado = $usuarioRef["verificado"]; } if (isset($usuarioRef["liderGlobal"])) { $usuarioModelo->liderGlobal = $usuarioRef["liderGlobal"]; } $usuarioModelo->creado = new Expression('now()'); if ($usuarioRef["estatus"] === false) { $usuarioModelo->eliminado = new Expression('now()'); } if (!$usuarioModelo->save()) { $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($usuarioModelo->getFirstErrors())); } } // UsuarioGrupo if ($usuarioModelo !== null && isset($usuarioRef["grupos"]) && isset($usuarioRef["grupos"][0])) { if ($usuarioRef["estatus"] === false) { $usuarioModelo->eliminado = new Expression('now()'); $usuarioModelo->save(); } for ($i = 0; $i < count($usuarioRef["grupos"]); $i++) { $modelGrupo = Grupo::findOne(['firebaseId' => $usuarioRef["grupos"][$i]]); if (isset($modelGrupo)) { $usuarioGrupo = UsuarioGrupo::find() ->andWhere([ "idUsuario" => $usuarioModelo->id, "idGrupo" => $modelGrupo->id ]) ->one(); if ($usuarioGrupo === null) { $usuarioGrupo = new UsuarioGrupo(); $usuarioGrupo->idUsuario = $usuarioModelo->id; $usuarioGrupo->idGrupo = $modelGrupo->id; if (!$usuarioGrupo->save()) { $this->stdoutln('Ocurrió un error al guardar un usuario-grupo. ' . Json::encode($usuarioGrupo->getFirstErrors())); } } } } } // Resultados if ($usuarioModelo !== null && isset($data["resultado"])) { $resultados = $data["resultado"]; if (isset($resultados[$usuarioModelo->uid])) { foreach ($resultados[$usuarioModelo->uid] as $_accion) { $resultadoModelo = Resultado::find() ->andWhere([ "idUsuario" => $usuarioModelo->id, "idEvento" => $modelo->id, "accion" => $_accion ]) ->exists(); if (!$resultadoModelo) { $resultadoModelo = new Resultado(); $resultadoModelo->idUsuario = $usuarioModelo->id; $resultadoModelo->idEvento = $modelo->id; $resultadoModelo->accion = $_accion; if (!$resultadoModelo->save()) { $this->stdoutln('Ocurrió un error al guardar un resultado. ' . Json::encode($resultadoModelo->getFirstErrors())); } } } } } // Dependencias if ($usuarioModelo !== null && isset($usuarioRef["dependencias"]) && isset($usuarioRef["dependencias"][0])) { if (!empty($usuarioRef["dependencias"])) { if (is_array($usuarioRef["dependencias"])) { for ($i = 0; $i < count($usuarioRef["dependencias"]); $i++) { $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"][$i]]); if ($dependenciaModel === null) { $dependenciaRef = $dependencias[$usuarioRef["dependencias"][$i]]; $dependenciaModel = new Dependencia(); $dependenciaModel->firebaseId = $usuarioRef["dependencias"][$i]; $dependenciaModel->nombre = $dependenciaRef['nombre']; $dependenciaModel->descripcion = $dependenciaRef['descripcion']; $dependenciaModel->estatus = $dependenciaRef['estatus']; $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]); if ($creado !== false) { $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED); } if (!$dependenciaModel->save()) { $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors())); } } //UsuarioDependencia $usuarioDependencia = UsuarioDependencia::find() ->andWhere([ "idUsuario" => $usuarioModelo->id, "idDependencia" => $dependenciaModel->id ]) ->one(); if ($usuarioDependencia === null) { $usuarioDependencia = new UsuarioDependencia(); $usuarioDependencia->idUsuario = $usuarioModelo->id; $usuarioDependencia->idDependencia = $dependenciaModel->id; if (!$usuarioDependencia->save()) { $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors())); } } } } else { $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"]]); if ($dependenciaModel === null) { $dependenciaRef = $dependencias[$usuarioRef["dependencias"]]; $dependenciaModel = new Dependencia(); $dependenciaModel->firebaseId = $usuarioRef["dependencias"]; $dependenciaModel->nombre = $dependenciaRef['nombre']; $dependenciaModel->descripcion = $dependenciaRef['descripcion']; $dependenciaModel->estatus = $dependenciaRef['estatus']; $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]); if ($creado !== false) { $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED); } if (!$dependenciaModel->save()) { $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors())); } } //UsuarioDependencia $usuarioDependencia = UsuarioDependencia::find() ->andWhere([ "idUsuario" => $usuarioModelo->id, "idDependencia" => $dependenciaModel->id ]) ->one(); if ($usuarioDependencia === null) { $usuarioDependencia = new UsuarioDependencia(); $usuarioDependencia->idUsuario = $usuarioModelo->id; $usuarioDependencia->idDependencia = $dependenciaModel->id; if (!$usuarioDependencia->save()) { $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors())); } } } } } } $hoy = new \DateTime(); $doc->reference() ->update([ ["path" => "sincronizado", "value" => "OK"], ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")], ]); $this->stdoutln("Sincronizado correcto"); } catch (\Exception $e) { $this->stdoutln("Exception: {$e->getMessage()}\n"); $doc->reference() ->update([ ["path" => "sincronizado", "value" => "ERROR"], ["path" => "sincronizadoError", "value" => $e->getMessage()], ["path" => "sincronizadoErrorLine", "value" => $e->getLine()], ]); } } # Si los registros procesados son menores al límite, terminar if ($c < $limite) { $continuar = false; } } while ($continuar); } public function actionSincronizarAcumulado() { $firebase = new FirebaseHelper(); $firestore = $firebase->firestore(); $refGrupos = $firestore->collection("grupos"); $refUsuarios = $firestore->collection("usuarios"); $refDependencias = $firestore->collection("dependencias"); $grupos = []; $usuarios = []; $dependencias = []; foreach ($refGrupos->documents() as $grupo) { $grupos[$grupo->id()] = $grupo->data(); } foreach ($refUsuarios->documents() as $usuario) { $usuarios[$usuario->id()] = $usuario->data(); } foreach ($refDependencias->documents() as $dependencia) { $dependencias[$dependencia->id()] = $dependencia->data(); } $ultimaFecha = null; $limite = 100; // 1000; $continuar = true; $fechaActual = new DateTime(); $finFirebase = new Timestamp($fechaActual); $this->stdout("fechaFin: {$finFirebase} \n"); $semanaPasada = new DateTime('-1 week'); $inicioFirebase = new Timestamp($semanaPasada); $this->stdout("fechaFin: {$finFirebase} \n"); do { $this->stdout("Sincronizando ..."); $ref = $firestore->collection("eventos") ->where("timestamp", ">=", $inicioFirebase) ->where("timestamp", "<=", $finFirebase) ->orderBy("timestamp", "DESC") ->limit($limite); $documentos = $ref->documents()->size(); $this->stdout("Total documentos: {$documentos} \n"); if ($ultimaFecha !== null) { $ref = $ref->startAt([$ultimaFecha]); } $c = 0; # Contador de registros procesados foreach ($ref->documents() as $doc) { $this->stdoutln($doc->id()); $c++; $data = $doc->data(); $ultimaFecha = $data["timestamp"]; $modelo = Evento::findOne(["firebaseId" => $doc->id()]); if ($modelo === null) { $modelo = new Evento(); } try { $modelo->nombre = $data["nombre"]; $modelo->descripcion = $data["descripcion"]; $modelo->ciudad = $data["ciudad"]; $modelo->redSocial = $data["redSocial"]; $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]); if ($creado !== false) { $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED); } $fechaInicio = $this->cambiarFecha($data["fechaInicio"]); if ($fechaInicio !== false) { $modelo->fechaInicio = $fechaInicio->format(\DateTime::RFC3339_EXTENDED); } $fechaFinal = $this->cambiarFecha($data["fechaFinal"]); if ($fechaFinal !== false) { $modelo->fechaFinal = $fechaFinal->format(\DateTime::RFC3339_EXTENDED); } $modelo->fotoEvento = $data["fotoEvento"]; $modelo->url = $data["pathFirebase"]; if (isset($data["tag"])) { $modelo->tag = $data["tag"]; } $modelo->firebaseId = $doc->id(); if (!$modelo->save()) { $this->stdoutln('Ocurrió un error al guardar un evento. ' . Json::encode($modelo->getFirstErrors())); continue; } if (isset($data["redes"])) { foreach ($data["redes"] as $red) { $eventoRed = Red::find() ->andWhere([ "idEvento" => $modelo->id, "url" => $red["url"] ]) ->one(); if ($eventoRed === null) { $eventoRed = new Red(); $eventoRed->idEvento = $modelo->id; $eventoRed->key = $red["key"]; $eventoRed->url = $red["url"]; $eventoRed->redSocial = $red["redSocial"]; if (!$eventoRed->save()) { $this->stdoutln('Ocurrió un error al guardar una red. ' . Json::encode($eventoRed->getFirstErrors())); continue; } } } } foreach ($data["accion"] as $accion) { $eventoAccion = EventoAccion::find() ->andWhere([ "idEvento" => $modelo->id, "accion" => $accion ]) ->one(); if ($eventoAccion === null) { $eventoAccion = new EventoAccion(); $eventoAccion->idEvento = $modelo->id; $eventoAccion->accion = $accion; if (!$eventoAccion->save()) { $this->stdoutln('Ocurrió un error al guardar un evento-accion. ' . Json::encode($eventoAccion->getFirstErrors())); continue; } } } //Grupos dentro de los eventos foreach ($data["grupos"] as $grupoEvento) { $grupoModelo = Grupo::findOne(["firebaseId" => $grupoEvento]); if ($grupoModelo === null && isset($grupos[$grupoEvento])) { $grupoModelo = new Grupo(); $grupoModelo->creado = new Expression('now()'); $grupoModelo->nombre = $grupos[$grupoEvento]["nombre"]; $grupoModelo->descripcion = $grupos[$grupoEvento]["descripcion"]; $grupoModelo->firebaseId = $grupoEvento; if (!$grupoModelo->save()) { $this->stdoutln('Ocurrió un error al guardar un grupo. ' . Json::encode($grupoModelo->getFirstErrors())); } } if ($grupoModelo !== null) { $eventoGrupo = EventoGrupo::find() ->andWhere([ "idEvento" => $modelo->id, "idGrupo" => $grupoModelo->id ]) ->one(); if ($eventoGrupo === null) { $eventoGrupo = new EventoGrupo(); $eventoGrupo->idEvento = $modelo->id; $eventoGrupo->idGrupo = $grupoModelo->id; if (!$eventoGrupo->save()) { $this->stdoutln('Ocurrió un error al guardar un evento-grupo. ' . Json::encode($eventoGrupo->getFirstErrors())); } } } } foreach ($data["usuarios"] as $usuarioEvento) { $usuarioModelo = Usuario::findOne(["uid" => $usuarioEvento["uid"]]); $usuarioRef = isset($usuarios[$usuarioEvento["uid"]]) ? $usuarios[$usuarioEvento["uid"]] : null; // Usuarios if ($usuarioModelo === null && $usuarioRef !== null) { $usuarioModelo = new Usuario(); $usuarioModelo->uid = $usuarioRef["uid"]; $usuarioModelo->nombre = $usuarioRef["nombre"]; if (isset($usuarioRef["email"])) { $usuarioModelo->email = $usuarioRef["email"]; } $usuarioModelo->telefono = $usuarioRef["telefono"]; $usuarioModelo->facebook = $usuarioRef["facebook"]; if (isset($usuarioRef["facebookVerificado"])) { $usuarioModelo->facebookVerificado = $usuarioRef["facebookVerificado"]; } $usuarioModelo->instagram = $usuarioRef["instagram"]; if (isset($usuarioRef["instagramVerificado"])) { $usuarioModelo->instagramVerificado = $usuarioRef["instagramVerificado"]; } $usuarioModelo->twitter = $usuarioRef["twitter"]; if (isset($usuarioRef["twitterVerificado"])) { $usuarioModelo->twitterVerificado = $usuarioRef["twitterVerificado"]; } $usuarioModelo->genero = $usuarioRef["genero"]; if (isset($usuarioRef["verificado"])) { $usuarioModelo->verificado = $usuarioRef["verificado"]; } $usuarioModelo->creado = new Expression('now()'); if ($usuarioRef["estatus"] === false) { $usuarioModelo->eliminado = new Expression('now()'); } if (!$usuarioModelo->save()) { $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($usuarioModelo->getFirstErrors())); } } // UsuarioGrupo if ($usuarioModelo !== null && isset($usuarioRef["grupos"]) && isset($usuarioRef["grupos"][0])) { if ($usuarioRef["estatus"] === false) { $usuarioModelo->eliminado = new Expression('now()'); $usuarioModelo->save(); } for ($i = 0; $i < count($usuarioRef["grupos"]); $i++) { $modelGrupo = Grupo::findOne(['firebaseId' => $usuarioRef["grupos"][$i]]); if (isset($modelGrupo)) { $usuarioGrupo = UsuarioGrupo::find() ->andWhere([ "idUsuario" => $usuarioModelo->id, "idGrupo" => $modelGrupo->id ]) ->one(); if ($usuarioGrupo === null) { $usuarioGrupo = new UsuarioGrupo(); $usuarioGrupo->idUsuario = $usuarioModelo->id; $usuarioGrupo->idGrupo = $modelGrupo->id; if (!$usuarioGrupo->save()) { $this->stdoutln('Ocurrió un error al guardar un usuario-grupo. ' . Json::encode($usuarioGrupo->getFirstErrors())); } } } } } // Resultados if ($usuarioModelo !== null && isset($data["resultado"])) { $resultados = $data["resultado"]; if (isset($resultados[$usuarioModelo->uid])) { foreach ($resultados[$usuarioModelo->uid] as $_accion) { $resultadoModelo = Resultado::find() ->andWhere([ "idUsuario" => $usuarioModelo->id, "idEvento" => $modelo->id, "accion" => $_accion ]) ->exists(); if (!$resultadoModelo) { $resultadoModelo = new Resultado(); $resultadoModelo->idUsuario = $usuarioModelo->id; $resultadoModelo->idEvento = $modelo->id; $resultadoModelo->accion = $_accion; if (!$resultadoModelo->save()) { $this->stdoutln('Ocurrió un error al guardar un resultado. ' . Json::encode($resultadoModelo->getFirstErrors())); } } } } } // Dependencias if ($usuarioModelo !== null && isset($usuarioRef["dependencias"]) && isset($usuarioRef["dependencias"][0])) { if (!empty($usuarioRef["dependencias"])) { if (is_array($usuarioRef["dependencias"])) { for ($i = 0; $i < count($usuarioRef["dependencias"]); $i++) { $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"][$i]]); if ($dependenciaModel === null) { $dependenciaRef = $dependencias[$usuarioRef["dependencias"][$i]]; $dependenciaModel = new Dependencia(); $dependenciaModel->firebaseId = $usuarioRef["dependencias"][$i]; $dependenciaModel->nombre = $dependenciaRef['nombre']; $dependenciaModel->descripcion = $dependenciaRef['descripcion']; $dependenciaModel->estatus = $dependenciaRef['estatus']; $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]); if ($creado !== false) { $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED); } if (!$dependenciaModel->save()) { $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors())); } } //UsuarioDependencia $usuarioDependencia = UsuarioDependencia::find() ->andWhere([ "idUsuario" => $usuarioModelo->id, "idDependencia" => $dependenciaModel->id ]) ->one(); if ($usuarioDependencia === null) { $usuarioDependencia = new UsuarioDependencia(); $usuarioDependencia->idUsuario = $usuarioModelo->id; $usuarioDependencia->idDependencia = $dependenciaModel->id; if (!$usuarioDependencia->save()) { $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors())); } } } } else { $dependenciaModel = Dependencia::findOne(["firebaseId" => $usuarioRef["dependencias"]]); if ($dependenciaModel === null) { $dependenciaRef = $dependencias[$usuarioRef["dependencias"]]; $dependenciaModel = new Dependencia(); $dependenciaModel->firebaseId = $usuarioRef["dependencias"]; $dependenciaModel->nombre = $dependenciaRef['nombre']; $dependenciaModel->descripcion = $dependenciaRef['descripcion']; $dependenciaModel->estatus = $dependenciaRef['estatus']; $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $dependenciaRef["timestamp"]); if ($creado !== false) { $dependenciaModel->creado = $creado->format(\DateTime::RFC3339_EXTENDED); } if (!$dependenciaModel->save()) { $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($dependenciaModel->getFirstErrors())); } } //UsuarioDependencia $usuarioDependencia = UsuarioDependencia::find() ->andWhere([ "idUsuario" => $usuarioModelo->id, "idDependencia" => $dependenciaModel->id ]) ->one(); if ($usuarioDependencia === null) { $usuarioDependencia = new UsuarioDependencia(); $usuarioDependencia->idUsuario = $usuarioModelo->id; $usuarioDependencia->idDependencia = $dependenciaModel->id; if (!$usuarioDependencia->save()) { $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors())); } } } } } } $hoy = new \DateTime(); $doc->reference() ->update([ ["path" => "sincronizado", "value" => "OK"], ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")], ]); $this->stdoutln("Sincronizado correcto"); } catch (\Exception $e) { $this->stdoutln("Exception: {$e->getMessage()}\n"); $doc->reference() ->update([ ["path" => "sincronizado", "value" => "ERROR"], ["path" => "sincronizadoError", "value" => $e->getMessage()], ["path" => "sincronizadoErrorLine", "value" => $e->getLine()], ]); } } # Si los registros procesados son menores al límite, terminar if ($c < $limite) { $continuar = false; } } while ($continuar); } public function actionParticipacion() { try { \Yii::$app->db->createCommand("SET TIMEZONE TO 'America/Hermosillo'") ->execute(); } catch (\Exception $e) { } $eventos = (new Query()) ->select([ "nombre", "tag", "{{EventoGrupo}}.[[idGrupo]]" ]) ->from("Evento") ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id") ->andWhere([">=", "fechaFinal", new Expression("now() - interval '7 days'")]) // ->andWhere([">=", "fechaFinal", '2024-02-05 00:00:00']) // ->andWhere(["<=", "fechaFinal", '2024-02-10 23:59:59']) ->andWhere(["eliminado" => null]) ->groupBy(["tag", "nombre", "[[idGrupo]]"]) ->indexBy("tag") ->column(); $dependencias = Dependencia::find() ->select("nombre") ->indexBy("id") ->column(); $grupos = Grupo::find() ->select("nombre") ->indexBy("id") ->column(); $dependenciasSecretaria = [34, 35, 36, 37, 38]; $query2 = (new Query()) ->select([ "tag", "{{Usuario}}.id", "{{Usuario}}.nombre", "{{Usuario}}.telefono", "case when count({{Resultado}}.accion) > 0 then true else false end as [[Participo]]", "{{UsuarioDependencia}}.[[idDependencia]]", "{{UsuarioGrupo}}.[[idGrupo]]" ]) ->from("Evento") ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id") ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]") ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id") ->innerJoin("Usuario", "{{Usuario}}.[[id]] = {{UsuarioGrupo}}.[[idUsuario]]") ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id") ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id") ->andWhere(["{{Evento}}.eliminado" => null]) ->andWhere(["{{Usuario}}.eliminado" => null]) ->andWhere([">=", "fechaFinal", new Expression("now()-interval '7 days'")]) ->andWhere(["not in", "{{UsuarioDependencia}}.[[idDependencia]]", $dependenciasSecretaria]) // ->andWhere(["{{Usuario}}.id" => 70]) // ->andWhere([">=", "fechaFinal", '2024-02-05 00:00:00']) // ->andWhere(["<=", "fechaFinal", '2024-02-10 23:59:59']) ->groupBy([ "{{Usuario}}.nombre", "{{Usuario}}.telefono", "{{Usuario}}.id", "tag", "{{UsuarioDependencia}}.[[idDependencia]]", "{{UsuarioGrupo}}.[[idGrupo]]" ]) ->orderBy([ "{{Usuario}}.id" => SORT_ASC, "[[Participo]]" => SORT_DESC, ]); $eventoResumen = new EventoResumen(); $eventoResumen->creado = new Expression("now()"); $uuidEventoResumen = ''; do { $uuidEventoResumen = (Uuid::uuid4()) ->toString(); $er = EventoResumen::find() ->andWhere(["uuid" => $uuidEventoResumen]); } while ($er->exists()); $eventoResumen->uuid = $uuidEventoResumen; $eventoResumen->inicio = new Expression("now()-interval '7 days'"); $eventoResumen->fin = new Expression("now()"); if (!$eventoResumen->save()) { $errores = json_encode($eventoResumen->getFirstErrors()); $this->stdout('Hubo un problema al generar la notificación: ' . $errores); return; } $eventoResumen->refresh(); $aux = []; $auxDependencia = []; foreach ($query2->each() as $consulta) { if (!isset($aux[$consulta['id']])) { $aux[$consulta['id']] = [ "nombreUsuario" => $consulta['nombre'], "telefono" => $consulta['telefono'], "id" => $consulta['id'], "idDependencia" => $consulta['idDependencia'], "idGrupo" => $consulta['idGrupo'], "eventosFaltantes" => [], "eventosParticipo" => [] ]; } $nombreEvento = $eventos[$consulta['tag']]; if ($consulta['Participo']) { if (!\in_array($nombreEvento, $aux[$consulta['id']]['eventosParticipo'])) { $aux[$consulta['id']]['eventosParticipo'][] = $nombreEvento; } } else { $aux[$consulta['id']]['eventosFaltantes'][] = $nombreEvento; } } foreach ($aux as $consulta) { if (!isset($auxDependencia[$consulta['idDependencia']])) { $auxDependencia[$consulta['idDependencia']] = [ "id" => $consulta['idDependencia'], "eventosFaltantes" => 0, "eventosParticipo" => 0 ]; } $eventosFaltantes = count($consulta['eventosFaltantes']); $auxDependencia[$consulta['idDependencia']]['eventosFaltantes'] += $eventosFaltantes; $eventosParticipo = count($consulta['eventosParticipo']); $auxDependencia[$consulta['idDependencia']]['eventosParticipo'] += $eventosParticipo; } $notificacion = new Notificacion(); $notificacion->creado = new Expression("now()"); if (!$notificacion->save()) { $errores = json_encode($notificacion->getFirstErrors()); $this->stdout('Hubo un problema al generar la notificación: ' . $errores); return; } // */ # TODO: Revisar si es necesario consultar la información del modelo # $notificacion->refresh(); //POR USUARIO foreach ($aux as $usuario) { $notificacionUsuario = new NotificacionUsuario(); $notificacionUsuario->idNotificacion = $notificacion->id; $notificacionUsuario->idUsuario = $usuario['id']; $notificacionUsuario->nombre = $usuario['nombreUsuario']; $notificacionUsuario->telefono = $usuario['telefono']; $notificacionUsuario->plantilla = Notificacion::PLANTILLA_EVENTO; # Es mejor guardar el valor del count en lugar de evaluarlo multiples veces $totalParticipaciones = count($usuario["eventosParticipo"]); $totalEventos = 0; $totalEventos = count($usuario["eventosParticipo"]) + count($usuario["eventosFaltantes"]); $this->stdout("{$totalEventos}\n"); if ($totalEventos === 0) { # ¿Si no hubo eventos en el período de tiempo también hay que avisar? return; } $parametros = [ [ "type" => "text", "text" => "{$totalParticipaciones}/{$totalEventos} eventos" ], ]; if ($totalParticipaciones === $totalEventos) { $parametros[] = [ "type" => "text", "text" => "Gracias por tu" ]; } else if ($totalParticipaciones > 0) { $parametros[] = [ "type" => "text", "text" => ", gracias por tu participación. Vamos por el 100% de" ]; } else { $parametros[] = [ "type" => "text", "text" => "Vamos por el 100% de" ]; } $notificacionUsuario->parametros = $parametros; if (!$notificacionUsuario->save()) { $errores = json_encode($notificacionUsuario->getFirstErrors()); $this->stdout('Hubo un problema al generar la notificación: ' . $errores); return; } } //POR LIDER DEPENDENCIA foreach ($auxDependencia as $id => $dependencia) { $evResDependencia = new EventoResumenDependencia(); $uuidEventoResumenDependencia = ''; $consultaERD = EventoResumenDependencia::find() ->andWhere([ "AND", ["=", "idEventoResumen", $eventoResumen->id], ["=", "idDependencia", $id], ]) ->exists(); if ($consultaERD) { continue; } do { $uuidEventoResumenDependencia = (Uuid::uuid4()) ->toString(); $erd = EventoResumenDependencia::find() ->andWhere(["clave" => $uuidEventoResumenDependencia]); } while ($erd->exists()); $evResDependencia->clave = $uuidEventoResumenDependencia; $evResDependencia->idEventoResumen = $eventoResumen->id; $evResDependencia->idDependencia = $id; if (!$evResDependencia->save()) { $errores = json_encode($evResDependencia->getFirstErrors()); $this->stdout('Hubo un problema al generar la notificación: ' . $errores); return; } $dependenciaLider = DependenciaLider::find() ->innerJoin('Usuario', '{{Usuario}}.id = {{DependenciaLider}}.[[idUsuario]]') ->andWhere(["idDependencia" => $id]) ->andWhere(["{{Usuario}}.eliminado" => null]); $nombreDependencia = ""; if (isset($dependencias[$id])) { $nombreDependencia = trim($dependencias[$id]); } foreach ($dependenciaLider->each() as $lider) { $usuario = Usuario::find() ->andWhere(["id" => $lider["idUsuario"]]) ->andWhere(["eliminado" => null]) ->one(); $notificacionUsuario = new NotificacionUsuario(); $notificacionUsuario->idNotificacion = $notificacion->id; $notificacionUsuario->idUsuario = $usuario->id; $notificacionUsuario->nombre = $usuario->nombre; $notificacionUsuario->telefono = $usuario->telefono; $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_EVENTO_URL; $totalParticipaciones = $dependencia["eventosParticipo"]; $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"]; $usuariosDependencia = Usuario::find() ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id") ->andWhere(["{{UsuarioDependencia}}.[[idDependencia]]" => $id]) ->andWhere(["{{Usuario}}.eliminado" => null]); // $mensajeUsuariosDependencia = "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos. Puede consultar los resultados en https://laud-red.web.app/resumen-lider-dependencia?id={$evResDependencia->clave}"; $mensajeUsuariosDependencia = "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos. "; $contador = 0; foreach ($usuariosDependencia->each() as $ud) { if (!isset($aux[$ud["id"]])) { continue; } $contador++; $nomrbeUsuario = trim($aux[$ud["id"]]["nombreUsuario"]); $totalEventosUsuarioParticipa = count($aux[$ud["id"]]["eventosParticipo"]); $mensajeUsuariosDependencia .= "*{$nomrbeUsuario}*: {$totalEventosUsuarioParticipa}/{$totalEventosDependencia}"; if ($contador < count($usuariosDependencia->all())) { $mensajeUsuariosDependencia .= ", "; } } $mensajeUsuariosDependencia .= ". Puede consultar los resultados en https://laud-red.web.app/resumen-lider-dependencia?id={$evResDependencia->clave}"; $parametros = [ [ "type" => "text", "text" => $mensajeUsuariosDependencia ], ]; if ($totalParticipaciones === $totalEventosDependencia) { $parametros[] = [ "type" => "text", "text" => "Gracias por tu" ]; } else if ($totalParticipaciones > 0) { $parametros[] = [ "type" => "text", "text" => "Gracias por tu participación. Vamos por el 100% de" ]; } else { $parametros[] = [ "type" => "text", "text" => "Vamos por el 100% de" ]; } $notificacionUsuario->parametros = $parametros; if (!$notificacionUsuario->save()) { $this->stdout("Error"); $errores = json_encode($notificacionUsuario->getFirstErrors()); $this->stdout('Hubo un problema al generar la notificación: ' . $errores); return; } } } //LIDER GLOBAL $liderGlobal = Usuario::find() ->andWhere(["eliminado" => null]) ->andWhere(["liderGlobal" => true]); foreach ($liderGlobal->each() as $lider) { $mensaje = ""; $participaciones = 0; $totalParticipaciones = 0; $totalEventosDependencia = 0; $contadorDependencias = 0; foreach ($auxDependencia as $id => $dependencia) { $contadorDependencias++; $usuariosDependencia = Usuario::find() ->innerJoin("UsuarioDependencia", "{{UsuarioDependencia}}.[[idUsuario]] = {{Usuario}}.id") ->andWhere(["{{UsuarioDependencia}}.[[idDependencia]]" => $id]) ->andWhere(["{{Usuario}}.eliminado" => null]); $nombreDependencia = ""; if (isset($dependencias[$id])) { $nombreDependencia = trim($dependencias[$id]); $totalParticipaciones = $dependencia["eventosParticipo"]; $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"]; $mensaje .= "*{$nombreDependencia}* fue {$totalParticipaciones}/{$totalEventosDependencia} eventos"; // $contadorUsuarios = 0; foreach ($usuariosDependencia->each() as $ud) { if (!isset($aux[$ud["id"]])) { continue; } $nomrbeUsuario = trim($aux[$ud["id"]]["nombreUsuario"]); $totalEventosUsuarioParticipa = count($aux[$ud["id"]]["eventosParticipo"]); $checkEventoParticipante = EventoResumenParticipante::find() ->andWhere([ "idEventoResumen" => $eventoResumen->id, "idDependencia" => $id, "idUsuario" => $ud->id ]) ->exists(); if ($checkEventoParticipante) { continue; } $eventoParticipante = new EventoResumenParticipante(); $eventoParticipante->idEventoResumen = $eventoResumen->id; $eventoParticipante->idDependencia = $id; $eventoParticipante->nombreDependencia = $nombreDependencia; $eventoParticipante->idGrupo = $aux[$ud["id"]]["idGrupo"]; $eventoParticipante->nombreGrupo = trim($grupos[$aux[$ud["id"]]["idGrupo"]]); $eventoParticipante->idUsuario = $ud->id; $eventoParticipante->nombre = $nomrbeUsuario; $eventoParticipante->totalEventos = $totalEventos; $eventoParticipante->participacion = trim($totalEventosUsuarioParticipa); if (!$eventoParticipante->save()) { $errores = json_encode($eventoParticipante->getFirstErrors()); $this->stdout('Hubo un problema al generar la notificación: ' . $errores); return; } /* $contadorUsuarios++; $mensaje .= "*{$nomrbeUsuario}*: {$totalEventosUsuarioParticipa}/{$totalEventos}"; if ($contadorUsuarios < count($usuariosDependencia->all())){ $mensaje .= " || "; } */ } // $mensaje .= ")"; if ($contadorDependencias < count($auxDependencia)) { $mensaje .= ", "; } $participaciones += $totalParticipaciones; } } $notificacionUsuario = new NotificacionUsuario(); $notificacionUsuario->idNotificacion = $notificacion->id; $notificacionUsuario->idUsuario = $lider->id; $notificacionUsuario->nombre = $lider->nombre; $notificacionUsuario->telefono = $lider->telefono; $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_GLOBAL; // $totalParticipaciones = $dependencia["eventosParticipo"]; // $totalEventosDependencia = $dependencia["eventosParticipo"] + $dependencia["eventosFaltantes"]; $mensaje .= ". Aquí puede mirar el resumen de actividades https://laud-red.web.app/resumen-evento?id={$eventoResumen->uuid}"; $parametros = [ [ "type" => "text", "text" => $mensaje ], ]; if ($participaciones === $totalEventosDependencia) { $parametros[] = [ "type" => "text", "text" => "Gracias por tu" ]; } else if ($participaciones > 0) { $parametros[] = [ "type" => "text", "text" => "Gracias por tu participación. Vamos por el 100% de" ]; } else { $parametros[] = [ "type" => "text", "text" => "Vamos por el 100% de" ]; } $notificacionUsuario->parametros = $parametros; if (!$notificacionUsuario->save()) { $errores = json_encode($notificacionUsuario->getFirstErrors()); $this->stdout('Hubo un problema al generar la notificación: ' . $errores); return; } } $notificacion->estatus = Notificacion::ESTATUS_NUEVO; $domingo = 0; $d = new \DateTime('now', new \DateTimeZone('America/Hermosillo')); $fecha = strtotime('now'); $dia = intval($d->format("w")); if ($dia !== $domingo) { $d = new \DateTime('next Sunday', new \DateTimeZone('America/Hermosillo')); } $d->setTime(18, 0, 0, 0); $siguienteDomingo = $d->format(\DateTime::ISO8601); $notificacion->envio = $siguienteDomingo; $notificacion->save(); $this->stdout("Terminó"); // file_put_contents("archivo.json", json_encode($aux)); } public function actionParticipacionError() { $query = (new Query()) ->select([ "{{Usuario}}.id as [[id]]", "{{Usuario}}.nombre as [[nombre]]", "{{Usuario}}.telefono as [[telefono]]", ]) ->distinct() ->from("Evento") ->innerJoin("EventoGrupo", "{{EventoGrupo}}.[[idEvento]] = {{Evento}}.id") ->innerJoin("Grupo", "{{Grupo}}.id = {{EventoGrupo}}.[[idGrupo]]") ->innerJoin("UsuarioGrupo", "{{UsuarioGrupo}}.[[idGrupo]] = {{Grupo}}.id") ->innerJoin("Usuario", "{{Usuario}}.[[id]] = {{UsuarioGrupo}}.[[idUsuario]]") ->leftJoin("Resultado", "{{Resultado}}.[[idEvento]] = {{Evento}}.id and {{Resultado}}.[[idUsuario]] = {{Usuario}}.id") ->andWhere(["{{Usuario}}.eliminado" => null]) ->andWhere([">=", "fechaFinal", new Expression("now()-interval '7 days'")]) ->groupBy([ "{{Usuario}}.[[nombre]]", "{{Usuario}}.[[telefono]]", "{{Usuario}}.[[id]]", ]) ->orderBy([ "{{Usuario}}.[[id]]" => SORT_ASC, ]); $transaccion = \Yii::$app->db->beginTransaction(); try { $notificacion = new Notificacion(); $notificacion->creado = new Expression("now()"); if (!$notificacion->save()) { $transaccion->rollBack(); $errores = json_encode($notificacion->getFirstErrors()); $this->stdoutln('Hubo un problema al generar la notificación: ' . $errores); return; } foreach ($query->each() as $usuario) { $notificacionUsuario = new NotificacionUsuario(); $this->stdoutln("idUsuario: {$usuario['id']}"); $this->stdoutln("nombre: {$usuario['nombre']}"); $this->stdoutln("teléfono: {$usuario['telefono']}"); $notificacionUsuario->idNotificacion = $notificacion->id; $notificacionUsuario->idUsuario = intval($usuario['id']); $notificacionUsuario->nombre = $usuario['nombre']; $notificacionUsuario->telefono = $usuario['telefono']; $notificacionUsuario->plantilla = Notificacion::PLANTILLA_LIDER_GLOBAL_URL; $parametros = [ [ "type" => "text", "text" => "El día de ayer hubo una falla en el sistema al enviar los reportes de la semana, se esta solucionando. " ], [ "type" => "text", "text" => "Gracias por su compresión." ], ]; $notificacionUsuario->parametros = $parametros; if (!$notificacionUsuario->save()) { $transaccion->rollBack(); $errores = json_encode($notificacionUsuario->getFirstErrors()); $this->stdoutln('Hubo un problema al generar la notificación: ' . $errores); return; } } $notificacion->envio = new Expression('now()'); $notificacion->estatus = 'Nuevo'; $notificacion->save(); $transaccion->commit(); } catch (\Exception $e) { $transaccion->rollBack(); $this->stdoutln("Exception: {$e->getMessage()}\n"); } } }