UsuarioController.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <?php
  2. namespace app\commands;
  3. use app\components\FirebaseHelper;
  4. use v1\models\Dependencia;
  5. use v1\models\Grupo;
  6. use v1\models\Usuario;
  7. use v1\models\UsuarioDependencia;
  8. use v1\models\UsuarioGrupo;
  9. use yii\console\Controller;
  10. use yii\db\Expression;
  11. use yii\helpers\Json;
  12. class UsuarioController extends Controller {
  13. public function stdoutln($cadena) {
  14. return $this->stdout($cadena . "\n");
  15. }
  16. public function cambiarFecha($string) {
  17. $formato = "D M d Y H:i:s P";
  18. $fecha = \DateTime::createFromFormat($formato, $string);
  19. return $fecha;
  20. }
  21. public function actionSincronizar() {
  22. $firebase = new FirebaseHelper();
  23. $firestore = $firebase->firestore();
  24. $ultimaFecha = null;
  25. $limite = 100; // 1000;
  26. $continuar = true;
  27. do {
  28. $this->stdout("Sincronizando ...");
  29. $ref = $firestore->collection("usuarios")
  30. ->where("sincronizado", "==", null)
  31. ->orderBy("timestamp", "ASC")
  32. ->limit($limite);
  33. if ($ultimaFecha !== null) {
  34. $ref = $ref->startAt([$ultimaFecha]);
  35. }
  36. $c = 0; # Contador de registros procesados
  37. foreach ($ref->documents() as $doc) {
  38. $this->stdoutln($doc->id());
  39. $c++;
  40. $data = $doc->data();
  41. $ultimaFecha = $data["timestamp"];
  42. $modelo = Usuario::findOne(["uid" => $doc->id()]);
  43. if ($modelo === null) {
  44. $modelo = new Usuario();
  45. }
  46. try {
  47. $modelo->uid = $data["uid"];
  48. $modelo->nombre = $data["nombre"];
  49. if (isset($data["email"])) {
  50. $modelo->email = $data["email"];
  51. }
  52. $modelo->telefono = $data["telefono"];
  53. $modelo->facebook = $data["facebook"];
  54. if (isset($data["facebookVerificado"])) {
  55. $modelo->facebookVerificado = $data["facebookVerificado"];
  56. }
  57. $modelo->instagram = $data["instagram"];
  58. if (isset($data["instagramVerificado"])) {
  59. $modelo->instagramVerificado = $data["instagramVerificado"];
  60. }
  61. $modelo->twitter = $data["twitter"];
  62. if (isset($data["twitterVerificado"])) {
  63. $modelo->twitterVerificado = $data["twitterVerificado"];
  64. }
  65. $modelo->genero = $data["genero"];
  66. $modelo->verificado = $data["verificado"];
  67. if (isset($data["liderGlobal"])) {
  68. $modelo->liderGlobal = $data["liderGlobal"];
  69. }
  70. if (!$modelo->save()) {
  71. $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($modelo->getFirstErrors()));
  72. }
  73. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]);
  74. if ($creado !== false) {
  75. $modelo->creado = new Expression("now()");
  76. }
  77. if ($data["estatus"] === false) {
  78. $modelo->eliminado = $creado->format(\DateTime::RFC3339_EXTENDED);
  79. }
  80. if (!$modelo->save()) {
  81. $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($modelo->getFirstErrors()));
  82. }
  83. if (isset($data["grupos"])) {
  84. for($i = 0; $i < count($data["grupos"]); $i++){
  85. $modeloGrupo = Grupo::findOne(["firebaseId" => $data["grupos"][$i]]);
  86. if (isset($modeloGrupo)) {
  87. $usuarioGrupo = UsuarioGrupo::find()
  88. ->andWhere([
  89. "idUsuario" => $modelo->id,
  90. "idGrupo" => $modeloGrupo->id
  91. ])
  92. ->one();
  93. if ($usuarioGrupo === null) {
  94. $usuarioGrupo = new UsuarioGrupo();
  95. $usuarioGrupo->idUsuario = $modelo->id;
  96. $usuarioGrupo->idGrupo = $modeloGrupo->id;
  97. if (!$usuarioGrupo->save()) {
  98. $this->stdoutln('Ocurrió un error al guardar un usuario-grupo. ' . Json::encode($usuarioGrupo->getFirstErrors()));
  99. }
  100. }
  101. }
  102. }
  103. }
  104. if (isset($data["dependencias"])) {
  105. if (is_array($data["dependencias"])) {
  106. for($i = 0; $i < count($data["dependencias"]); $i++){
  107. $modeloDependencia = Grupo::findOne(["firebaseId" => $data["dependencias"][$i]]);
  108. if (isset($modeloDependencia)) {
  109. $usuarioDependencia = UsuarioDependencia::find()
  110. ->andWhere([
  111. "idUsuario" => $modelo->id,
  112. "idDependencia" => $modeloDependencia->id
  113. ])
  114. ->one();
  115. if ($usuarioDependencia === null) {
  116. $usuarioDependencia = new UsuarioDependencia();
  117. $usuarioDependencia->idUsuario = $modelo->id;
  118. $usuarioDependencia->idDependencia = $modeloDependencia->id;
  119. if (!$usuarioDependencia->save()) {
  120. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  121. }
  122. }
  123. }
  124. }
  125. } else {
  126. $modeloDependencia = Dependencia::findOne(["firebaseId" => $data["dependencias"]]);
  127. if (isset($modeloDependencia)) {
  128. $usuarioDependencia = UsuarioDependencia::find()
  129. ->andWhere([
  130. "idUsuario" => $modelo->id,
  131. "idDependencia" => $modeloDependencia->id
  132. ])
  133. ->one();
  134. if ($usuarioDependencia === null) {
  135. $usuarioDependencia = new UsuarioDependencia();
  136. $usuarioDependencia->idUsuario = $modelo->id;
  137. $usuarioDependencia->idDependencia = $modeloDependencia->id;
  138. if (!$usuarioDependencia->save()) {
  139. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  140. }
  141. }
  142. }
  143. }
  144. }
  145. $hoy = new \DateTime();
  146. $doc->reference()
  147. ->update([
  148. ["path" => "sincronizado", "value" => "OK"],
  149. ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")],
  150. ]);
  151. $this->stdoutln("Sincronizado correcto");
  152. } catch (\Exception $e) {
  153. $this->stdoutln("Exception: {$e->getMessage()}\n");
  154. $doc->reference()
  155. ->update([
  156. ["path" => "sincronizado", "value" => "ERROR"],
  157. ["path" => "sincronizadoError", "value" => $e->getMessage()],
  158. ["path" => "sincronizadoErrorLine", "value" => $e->getLine()],
  159. ]);
  160. }
  161. }
  162. # Si los registros procesados son menores al límite, terminar
  163. if ($c < $limite) {
  164. $continuar = false;
  165. }
  166. } while ($continuar);
  167. }
  168. }