DependenciaController.php 2.7 KB

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