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(); $refUsuarios = $firestore->collection("usuarios"); $usuarios = []; foreach ($refUsuarios->documents() as $usuario) { $usuarios[$usuario->id()] = $usuario->data(); } $ultimaFecha = null; $limite = 100; // 1000; $continuar = true; do { $this->stdout("Sincronizando ..."); $ref = $firestore->collection("dependencias") ->where("sincronizado", "==", null) ->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 = Dependencia::findOne(["firebaseId" => $doc->id()]); if ($modelo === null) { $modelo = new Dependencia(); } try { $modelo->nombre = $data["nombre"]; $modelo->descripcion = $data["descripcion"]; $modelo->estatus = $data["estatus"]; $modelo->firebaseId = $doc->id(); $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]); if ($creado !== false) { $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED); } if (!$modelo->save()) { $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($modelo->getFirstErrors())); } if (isset($data["usuarios"])) { foreach ($data["usuarios"] as $usuarioDependencia) { $usuarioModelo = Usuario::findOne(["uid" => $usuarioDependencia["uid"]]); $usuarioRef = isset($usuarios[$usuarioDependencia["uid"]]) ? $usuarios[$usuarioDependencia["uid"]] : null; if ($usuarioModelo !== null && $usuarioRef !== null) { $usuarioDependencia = DependenciaLider::find() ->andWhere([ "idUsuario" => $usuarioModelo->id, "idDependencia" => $modelo->id ]) ->one(); if ($usuarioDependencia === null) { $usuarioDependencia = new DependenciaLider(); $usuarioDependencia->idUsuario = $usuarioModelo->id; $usuarioDependencia->idDependencia = $modelo->id; if (!$usuarioDependencia->save()) { $this->stdoutln('Ocurrió un error al guardar un lider de 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); } }