UsuarioController.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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 (!$modelo->save()) {
  68. $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($modelo->getFirstErrors()));
  69. }
  70. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]);
  71. if ($creado !== false) {
  72. $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  73. }
  74. if (!$modelo->save()) {
  75. $this->stdoutln('Ocurrió un error al guardar un usuario. ' . Json::encode($modelo->getFirstErrors()));
  76. }
  77. if (isset($data["grupos"])) {
  78. for($i = 0; $i < count($data["grupos"]); $i++){
  79. $modeloGrupo = Grupo::findOne(["firebaseId" => $data["grupos"][$i]]);
  80. if (isset($modeloGrupo)) {
  81. $usuarioGrupo = UsuarioGrupo::find()
  82. ->andWhere([
  83. "idUsuario" => $modelo->id,
  84. "idGrupo" => $modeloGrupo->id
  85. ])
  86. ->one();
  87. if ($usuarioGrupo === null) {
  88. $usuarioGrupo = new UsuarioGrupo();
  89. $usuarioGrupo->idUsuario = $modelo->id;
  90. $usuarioGrupo->idGrupo = $modeloGrupo->id;
  91. if (!$usuarioGrupo->save()) {
  92. $this->stdoutln('Ocurrió un error al guardar un usuario-grupo. ' . Json::encode($usuarioGrupo->getFirstErrors()));
  93. }
  94. }
  95. }
  96. }
  97. }
  98. if (isset($data["dependencias"])) {
  99. if (is_array($data["dependencias"])) {
  100. for($i = 0; $i < count($data["dependencias"]); $i++){
  101. $modeloDependencia = Grupo::findOne(["firebaseId" => $data["dependencias"][$i]]);
  102. if (isset($modeloDependencia)) {
  103. $usuarioDependencia = UsuarioDependencia::find()
  104. ->andWhere([
  105. "idUsuario" => $modelo->id,
  106. "idDependencia" => $modeloDependencia->id
  107. ])
  108. ->one();
  109. if ($usuarioDependencia === null) {
  110. $usuarioDependencia = new UsuarioDependencia();
  111. $usuarioDependencia->idUsuario = $modelo->id;
  112. $usuarioDependencia->idDependencia = $modeloDependencia->id;
  113. if (!$usuarioDependencia->save()) {
  114. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  115. }
  116. }
  117. }
  118. }
  119. } else {
  120. $modeloDependencia = Grupo::findOne(["firebaseId" => $data["dependencias"]]);
  121. if (isset($modeloDependencia)) {
  122. $usuarioDependencia = UsuarioDependencia::find()
  123. ->andWhere([
  124. "idUsuario" => $modelo->id,
  125. "idDependencia" => $modeloDependencia->id
  126. ])
  127. ->one();
  128. if ($usuarioDependencia === null) {
  129. $usuarioDependencia = new UsuarioDependencia();
  130. $usuarioDependencia->idUsuario = $modelo->id;
  131. $usuarioDependencia->idDependencia = $modeloDependencia->id;
  132. if (!$usuarioDependencia->save()) {
  133. $this->stdoutln('Ocurrió un error al guardar un usuario-dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  134. }
  135. }
  136. }
  137. }
  138. }
  139. $hoy = new \DateTime();
  140. $doc->reference()
  141. ->update([
  142. ["path" => "sincronizado", "value" => "OK"],
  143. ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")],
  144. ]);
  145. $this->stdoutln("Sincronizado correcto");
  146. } catch (\Exception $e) {
  147. $this->stdoutln("Exception: {$e->getMessage()}\n");
  148. $doc->reference()
  149. ->update([
  150. ["path" => "sincronizado", "value" => "ERROR"],
  151. ["path" => "sincronizadoError", "value" => $e->getMessage()],
  152. ["path" => "sincronizadoErrorLine", "value" => $e->getLine()],
  153. ]);
  154. }
  155. }
  156. # Si los registros procesados son menores al límite, terminar
  157. if ($c < $limite) {
  158. $continuar = false;
  159. }
  160. } while ($continuar);
  161. }
  162. }