DependenciaController.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace app\commands;
  3. use app\components\FirebaseHelper;
  4. use v1\models\Dependencia;
  5. use v1\models\DependenciaLider;
  6. use v1\models\Usuario;
  7. use yii\console\Controller;
  8. use yii\helpers\Json;
  9. class DependenciaController extends Controller {
  10. public function stdoutln($cadena) {
  11. return $this->stdout($cadena . "\n");
  12. }
  13. public function cambiarFecha($string) {
  14. $formato = "D M d Y H:i:s P";
  15. $fecha = \DateTime::createFromFormat($formato, $string);
  16. return $fecha;
  17. }
  18. public function actionSincronizar() {
  19. $firebase = new FirebaseHelper();
  20. $firestore = $firebase->firestore();
  21. $refUsuarios = $firestore->collection("usuarios");
  22. $usuarios = [];
  23. foreach ($refUsuarios->documents() as $usuario) {
  24. $usuarios[$usuario->id()] = $usuario->data();
  25. }
  26. $ultimaFecha = null;
  27. $limite = 100; // 1000;
  28. $continuar = true;
  29. do {
  30. $this->stdout("Sincronizando ...");
  31. $ref = $firestore->collection("dependencias")
  32. ->where("sincronizado", "==", null)
  33. ->orderBy("timestamp", "ASC")
  34. ->limit($limite);
  35. if ($ultimaFecha !== null) {
  36. $ref = $ref->startAt([$ultimaFecha]);
  37. }
  38. $c = 0; # Contador de registros procesados
  39. foreach ($ref->documents() as $doc) {
  40. $this->stdoutln($doc->id());
  41. $c++;
  42. $data = $doc->data();
  43. $ultimaFecha = $data["timestamp"];
  44. $modelo = Dependencia::findOne(["firebaseId" => $doc->id()]);
  45. if ($modelo === null) {
  46. $modelo = new Dependencia();
  47. }
  48. try {
  49. $modelo->nombre = $data["nombre"];
  50. $modelo->descripcion = $data["descripcion"];
  51. $modelo->estatus = $data["estatus"];
  52. $modelo->firebaseId = $doc->id();
  53. $creado = \DateTime::createFromFormat('Y-m-d\TH:i:s.u\Z', $data["timestamp"]);
  54. if ($creado !== false) {
  55. $modelo->creado = $creado->format(\DateTime::RFC3339_EXTENDED);
  56. }
  57. if (!$modelo->save()) {
  58. $this->stdoutln('Ocurrió un error al guardar una dependencia. ' . Json::encode($modelo->getFirstErrors()));
  59. }
  60. if (isset($data["usuarios"])) {
  61. foreach ($data["usuarios"] as $usuarioDependencia) {
  62. $usuarioModelo = Usuario::findOne(["uid" => $usuarioDependencia["uid"]]);
  63. $usuarioRef = isset($usuarios[$usuarioDependencia["uid"]])
  64. ? $usuarios[$usuarioDependencia["uid"]] : null;
  65. if ($usuarioModelo !== null && $usuarioRef !== null) {
  66. $usuarioDependencia = DependenciaLider::find()
  67. ->andWhere([
  68. "idUsuario" => $usuarioModelo->id,
  69. "idDependencia" => $modelo->id
  70. ])
  71. ->one();
  72. if ($usuarioDependencia === null) {
  73. $usuarioDependencia = new DependenciaLider();
  74. $usuarioDependencia->idUsuario = $usuarioModelo->id;
  75. $usuarioDependencia->idDependencia = $modelo->id;
  76. if (!$usuarioDependencia->save()) {
  77. $this->stdoutln('Ocurrió un error al guardar un lider de dependencia. ' . Json::encode($usuarioDependencia->getFirstErrors()));
  78. }
  79. }
  80. }
  81. }
  82. }
  83. $hoy = new \DateTime();
  84. $doc->reference()
  85. ->update([
  86. ["path" => "sincronizado", "value" => "OK"],
  87. ["path" => "sincronizadoFecha", "value" => $hoy->format("Y-m-d H:i:s")],
  88. ]);
  89. $this->stdoutln("Sincronizado correcto");
  90. } catch (\Exception $e) {
  91. $this->stdoutln("Exception: {$e->getMessage()}\n");
  92. $doc->reference()
  93. ->update([
  94. ["path" => "sincronizado", "value" => "ERROR"],
  95. ["path" => "sincronizadoError", "value" => $e->getMessage()],
  96. ["path" => "sincronizadoErrorLine", "value" => $e->getLine()],
  97. ]);
  98. }
  99. }
  100. # Si los registros procesados son menores al límite, terminar
  101. if ($c < $limite) {
  102. $continuar = false;
  103. }
  104. } while ($continuar);
  105. }
  106. }