"use strict";

import CustomDataTable from "../../../../assets/js/app/CustomDataTable.js";
import {
  mostrarMensajes,
  mostrarToastify,
  obtenerHTMLBotonesDropdown,
  obtenerNombreUsuario,
} from "../../../../assets/js/app/funcionesGenerales.js";
import metodosFormularios from "../../../../assets/js/app/metodosFormularios.js";
import Proyecto from "../../../../assets/js/models/proyectoModel.js";
import Sucursal from "../../../../assets/js/models/sucursalModel.js";
import Empleado from "../models/empleadoModel.js";
import MovimientoEmpleado from "../models/movimientoEmpleadoModel.js";
import TipoMovimiento from "../models/tipoMovimientoEmpleadoModel.js";
import TipoPlanilla from "../models/tipoPlanillaModel.js";

!(function () {
  document
    .getElementById("busqueda-form")
    .addEventListener("submit", function (e) {
      e.preventDefault();

      configMovimiento.buscar();
    });

  document.getElementById("cbo-tipoPlanilla").addEventListener("change", () => {
    configMovimiento.evaluarTipoPlanilla();
  });

  document.getElementById("cbo-departamento").addEventListener("change", () => {
    configMovimiento.evaluarDepartamento();
  });

  document.getElementById("cbo-puesto").addEventListener("change", () => {
    configMovimiento.evaluarPuesto();
  });

  document.getElementById("cbo-empleado").addEventListener("change", () => {
    configMovimiento.evaluarEmpleado();
  });

  document.getElementById("cbo-sucursal").addEventListener("change", () => {
    configMovimiento.evaluarSucursal();
  });

  document.getElementById("cbo-proyecto").addEventListener("change", () => {
    configMovimiento.evaluarProyecto();
  });

  document
    .getElementById("movimiento-form")
    .addEventListener("submit", function (e) {
      e.preventDefault();
      configMovimiento.guardar();
    });

  document
    .getElementById("btn-agregarMovimiento")
    .addEventListener("click", () => {
      configMovimiento.editar();
    });

  document
    .getElementById("btn-cancelar-edicion")
    .addEventListener("click", () => {
      configMovimiento.cancelar();
    });

  document.addEventListener("click", (e) => {
    const target = e.target;

    if (target.classList.contains("editar-movimiento"))
      configMovimiento.editar(target.dataset.id);

    if (target.classList.contains("finalizar-movimiento"))
      configMovimiento.finalizar(target.dataset.id);

    if (target.classList.contains("eliminar-movimiento"))
      configMovimiento.eliminar(target.dataset.id);
  });
})();

const loader = document.querySelector(".loader");

window.onload = async () => {
  try {
    await inicializarTablas();
    await configMovimiento.inicializar();
    loader && loader.classList.add("d-none");
  } catch (err) {
    mostrarMensajes.error(err);
  }
};

function inicializarTablas() {
  return new Promise((resolve, reject) => {
    try {
      configMovimiento.tabla = new CustomDataTable({
        id: "tbl-movimientos",
        alineadoIzquierda: [3, 4],
        noOrdenable: [12],
      });
      resolve();
    } catch (err) {
      reject(err);
    }
  });
}

const configMovimiento = {
  id: 0,
  data: {},
  tabla: null,
  cnt: 0,
  form: "movimiento-form",
  campos: {
    foto: document.getElementById("img-foto-empleado"),
    tipoPlanilla: document.getElementById("cbo-tipoPlanilla"),
    departamento: document.getElementById("cbo-departamento"),
    puesto: document.getElementById("cbo-puesto"),
    empleado: document.getElementById("cbo-empleado"),
    sucursalAsignada: document.getElementById("cbo-sucursalAsignada"),
    proyectoAsignado: document.getElementById("cbo-proyectoAsignado"),
    sucursal: document.getElementById("cbo-sucursal"),
    proyecto: document.getElementById("cbo-proyecto"),
    oficina: document.getElementById("cbo-oficina"),
    tipoMovimiento: document.getElementById("cbo-tipoMovimiento"),
    fechaMovimiento: document.getElementById("txt-fechaMovimiento"),
    fechaRetorno: document.getElementById("txt-fechaRetorno"),
    comentarios: document.getElementById("txt-comentarios"),
  },
  catalogos: {
    departamentos: [],
    empleados: [],
  },
  tabs: {
    movimientos: document.querySelector("#movimientos-tab"),
    edicion: document.querySelector("#editar-movimiento-tab"),
  },
  botones: {
    nuevo: document.getElementById("btns-nuevo-movimiento"),
    guardar: document.getElementById("btns-guardar-movimiento"),
  },
  inicializar: function () {
    return new Promise(async (resolve, reject) => {
      try {
        const { data: tiposPlanilla } = await TipoPlanilla.obtenerPorUsuario();

        let opciones = tiposPlanilla.map((tipoPlanilla) => {
          return `<option value="${tipoPlanilla.codtipoplanilla}">${tipoPlanilla.tipoPlanilla}</option>`;
        });

        opciones.length > 0 &&
          opciones.unshift(
            `<option selected disabled value="">Seleccione</option>`
          );

        this.campos.tipoPlanilla.innerHTML = opciones.join("");

        const { data: sucursales } = await Sucursal.obtenerTodosPorEmpresa({});

        opciones = sucursales.map((sucursal) => {
          return `<option value="${sucursal.codsucursal}">${sucursal.nombreSucursal}</option>`;
        });

        opciones.length > 0 &&
          opciones.unshift(
            `<option selected disabled value="">Seleccione</option>`
          );

        this.campos.sucursal.innerHTML = opciones.join("");
        $(`#${this.campos.sucursal.id}`).selectpicker("destroy").selectpicker();

        const { data: tiposMovimiento } = await TipoMovimiento.obtenerTodos();

        opciones = tiposMovimiento.map(
          (tipoMovimiento) =>
            `<option value="${tipoMovimiento.id}">${tipoMovimiento.tipoMovimiento}</option>`
        );

        opciones.length > 0
          ? opciones.unshift(
              `<option selected disabled value="">Seleccione</option>`
            )
          : opciones.unshift(
              `<option selected disabled value="">No se encontraron tipos de movimiento</option>`
            );

        this.campos.tipoMovimiento.innerHTML = opciones.join("");

        $(`#${this.campos.tipoMovimiento.id}`)
          .selectpicker("destroy")
          .selectpicker();

        resolve();
      } catch (err) {
        reject(err);
      }
    });
  },
  evaluarTipoPlanilla: function () {
    const codtipoplanilla = this.campos.tipoPlanilla.value;

    document.getElementById("btn-agregarMovimiento").disabled =
      !codtipoplanilla;
  },
  evaluarDepartamento: function () {
    let opciones = [
      `<option selected disabled value="">Seleccione un departamento</option>`,
    ];

    const coddepartamento = this.campos.departamento.value;

    if (coddepartamento) {
      let puestos = this.catalogos.empleados
        .map((empleado) => ({
          codpuesto: empleado.codpuesto,
          nombrePuesto: empleado.nombrePuesto.trim(),
          coddepartamento: empleado.coddepartamento,
        }))
        .filter(
          (puesto, index, self) =>
            index ===
            self.findIndex(
              (t) =>
                t.codpuesto === puesto.codpuesto &&
                t.nombrePuesto === puesto.nombrePuesto &&
                t.coddepartamento === puesto.coddepartamento
            )
        );

      if (coddepartamento > 0) {
        puestos = puestos.filter(
          (puesto) => puesto.coddepartamento === coddepartamento
        );
      }

      opciones = puestos.map(
        (puesto) =>
          `<option value="${puesto.codpuesto}">${puesto.nombrePuesto}</option>`
      );

      opciones.length > 0
        ? opciones.unshift(
            `<option selected disabled value="">Seleccione</option><option value="0">Todos los puestos</option>`
          )
        : opciones.unshift(
            `<option selected disabled value="">No se encontraron puestos</option>`
          );
    }

    this.campos.puesto.innerHTML = opciones.join("");
    $(`#${this.campos.puesto.id}`).selectpicker("destroy").selectpicker();
    this.evaluarPuesto();
  },
  evaluarPuesto: function () {
    const coddepartamento = this.campos.departamento.value,
      codpuesto = this.campos.puesto.value;

    let opciones = [
      `<option selected disabled value="">Seleccione un puesto</option>`,
    ];

    let empleados = [];
    if (coddepartamento && codpuesto) {
      empleados = this.catalogos.empleados;
      if (coddepartamento > 0) {
        empleados = empleados.filter(
          (empleado) => empleado.coddepartamento === coddepartamento
        );
      }

      if (codpuesto > 0) {
        empleados = empleados.filter(
          (empleado) => empleado.codpuesto === codpuesto
        );
      }

      opciones = empleados.map(
        (empleado) =>
          `<option value="${empleado.codempleado}">${empleado.nombreCompleto}</option>`
      );

      opciones.length > 0
        ? opciones.unshift(
            `<option selected disabled value="">Seleccione</option>`
          )
        : opciones.unshift(
            `<option selected disabled value="">No se encontraron empleados</option>`
          );
    }

    this.campos.empleado.innerHTML = opciones.join("");
    $(`#${this.campos.empleado.id}`).selectpicker("destroy").selectpicker();
    this.evaluarEmpleado();
  },
  evaluarEmpleado: function () {
    let opcionSucursal = [
        `<option selected disabled value="">Seleccione un empleado</option>`,
      ],
      opcionProyecto = [
        `<option selected disabled value="">Seleccione un empleado</option>`,
      ];

    const codempleado = this.campos.empleado.value;

    if (codempleado) {
      let empleado = this.catalogos.empleados.find(
        (empleado) => parseInt(empleado.codempleado) === parseInt(codempleado)
      );

      opcionSucursal = [
        `<option value="${empleado.codsucursal}">${empleado.nombreSucursal}</option>`,
      ];
      opcionProyecto = [
        `<option value="${empleado.codproyecto}">${empleado.nombreProyecto}</option>`,
      ];

      this.campos.foto.src = `main/RRHH/assets/images/empleados/${
        empleado.nombreArchivoFoto
      }?${Date.now()}`;
    }

    this.campos.sucursalAsignada.innerHTML = opcionSucursal.join("");
    this.campos.proyectoAsignado.innerHTML = opcionProyecto.join("");
  },
  evaluarSucursal: async function () {
    try {
      let opciones = [
        `<option selected disabled value="">Seleccione una sucursal</option>`,
      ];

      const codsucursal = this.campos.sucursal.value;

      if (codsucursal) {
        const { data: proyectos } =
          await Proyecto.obtenerTodosPorEmpresaSucursal({ codsucursal });

        opciones = proyectos.map(
          (proyecto) =>
            `<option value="${proyecto.codproyecto}">${proyecto.nombreProyecto}</option>`
        );

        opciones.length > 0
          ? opciones.unshift(
              `<option selected disabled value="">Seleccione</option>`
            )
          : opciones.unshift(
              `<option selected disabled value="">No se encontraron proyectos</option>`
            );
      }

      this.campos.proyecto.innerHTML = opciones.join("");
      $(`#${this.campos.proyecto.id}`).selectpicker("destroy").selectpicker();

      this.evaluarProyecto();
    } catch (err) {
      mostrarMensajes.error(err);
      throw err;
    }
  },
  evaluarProyecto: async function () {
    try {
      let opciones = [
        `<option selected disabled value="">Seleccione un proyecto</option>`,
      ];

      const codproyecto = this.campos.proyecto.value;

      if (codproyecto) {
        opciones = [`<option value="0">Sin definir</option>`];

        opciones.length > 0
          ? opciones.unshift(
              `<option selected disabled value="">Seleccione</option>`
            )
          : opciones.unshift(
              `<option selected disabled value="">No se encontraron oficinas</option>`
            );
      }

      this.campos.oficina.innerHTML = opciones.join("");
      $(`#${this.campos.oficina.id}`).selectpicker("destroy").selectpicker();
    } catch (err) {
      mostrarMensajes.error(err);
      throw err;
    }
  },
  buscar: async function () {
    try {
      if (!metodosFormularios.validar({ id: "busqueda-form" })) return;

      await this.limpiar();

      const { data: movimientos } =
        await MovimientoEmpleado.obtenerPorTipoPlanilla({
          codtipoplanilla: this.campos.tipoPlanilla.value,
        });

      movimientos.forEach((movimiento) => {
        this.cnt++;
        this.data[this.cnt] = movimiento;

        const fila = this.prepararParaFila({
          datos: movimiento,
          id: this.cnt,
        });

        this.tabla.agregarFila({
          datos: fila,
          idFila: `trMovimiento${this.cnt}`,
        });
      });

      this.tabla.redibujar();
    } catch (err) {
      mostrarMensajes.error(err);
    }
  },
  editar: async function (id = 0) {
    try {
      await metodosFormularios.limpiar({ id: this.form });

      this.id = id;

      this.bloquearDesbloquearBuscador(true);

      loader && loader.classList.remove("d-none");

      const { data: empleados } = await Empleado.obtenerPorTipoPlanilla({
        codtipoplanilla: this.campos.tipoPlanilla.value,
      });

      this.campos.foto.src = "main/RRHH/assets/images/empleados/default.png";

      let departamentos = empleados
        .map((empleado) => ({
          coddepartamento: empleado.coddepartamento,
          nombreDepartamento: empleado.nombreDepartamento.trim(),
        }))
        .filter(
          (departamento, index, self) =>
            index ===
            self.findIndex(
              (t) =>
                t.coddepartamento === departamento.coddepartamento &&
                t.nombreDepartamento === departamento.nombreDepartamento
            )
        );

      this.catalogos.empleados = empleados;

      let opciones = departamentos.map(
        (departamento) =>
          `<option value="${departamento.coddepartamento}">${departamento.nombreDepartamento}</option>`
      );

      opciones.length > 0
        ? opciones.unshift(
            `<option selected disabled value="">Seleccione</option><option value="0">Todos los departamentos</option>`
          )
        : opciones.unshift(
            `<option selected disabled value="">No se encontraron departamentos</option>`
          );

      this.campos.departamento.disabled = false;
      this.campos.puesto.disabled = false;
      this.campos.empleado.disabled = false;

      this.campos.departamento.innerHTML = opciones.join("");
      $(`#${this.campos.departamento.id}`)
        .selectpicker("destroy")
        .selectpicker();

      this.evaluarDepartamento();
      this.evaluarSucursal();

      if (this.id > 0) {
        const movimiento = new MovimientoEmpleado(this.data[this.id]);
        const empleado = this.catalogos.empleados.find(
          (empleado) =>
            parseInt(empleado.codempleado) === parseInt(movimiento.codempleado)
        );

        this.campos.departamento.value = movimiento.coddepartamento;
        this.evaluarDepartamento();
        this.campos.puesto.value = movimiento.codpuesto;
        this.evaluarPuesto();
        this.campos.empleado.value = movimiento.codempleado;
        this.evaluarEmpleado();
        this.campos.sucursal.value = movimiento.codsucursalMovimiento;
        await this.evaluarSucursal();
        this.campos.proyecto.value = movimiento.codproyectoMovimiento;
        await this.evaluarProyecto();
        this.campos.oficina.value = movimiento.idOficina;
        this.campos.tipoMovimiento.value = movimiento.idTipoMovimiento;
        this.campos.fechaMovimiento._flatpickr.setDate(
          moment(movimiento.fechaEfectiva, "DD-MM-YYYY").toDate()
        );

        if (!!movimiento.fechaRetorno) {
          this.campos.fechaRetorno._flatpickr.setDate(
            moment(movimiento.fechaRetorno, "DD-MM-YYYY").toDate()
          );
        }

        this.campos.comentarios.value = movimiento.comentarios;

        if (empleado.nombreArchivoFoto) {
          this.campos.foto.src = `main/RRHH/assets/images/empleados/${
            empleado.nombreArchivoFoto
          }?v=${Date.now()}`;
        }

        this.campos.departamento.disabled = true;
        this.campos.puesto.disabled = true;
        this.campos.empleado.disabled = true;

        $(`#${this.campos.departamento.id}`)
          .selectpicker("destroy")
          .selectpicker();
        $(`#${this.campos.puesto.id}`).selectpicker("destroy").selectpicker();
        $(`#${this.campos.empleado.id}`).selectpicker("destroy").selectpicker();
        $(`#${this.campos.sucursal.id}`).selectpicker("destroy").selectpicker();
        $(`#${this.campos.proyecto.id}`).selectpicker("destroy").selectpicker();
        $(`#${this.campos.oficina.id}`).selectpicker("destroy").selectpicker();
        $(`#${this.campos.tipoMovimiento.id}`)
          .selectpicker("destroy")
          .selectpicker();
      }

      Object.values(this.tabs).forEach((tab) => {
        tab.classList.toggle("disabled");
      });
      Object.values(this.botones).forEach((botones) => {
        botones.classList.toggle("d-none");
      });

      loader && loader.classList.add("d-none");

      this.tabs.edicion.click();
    } catch (err) {
      mostrarMensajes.error(err);
    }
  },
  guardar: async function () {
    try {
      if (!metodosFormularios.validar({ id: this.form })) return;

      const empleado = this.catalogos.empleados.find(
        (empleado) =>
          parseInt(empleado.codempleado) ===
          parseInt(this.campos.empleado.value)
      );

      const movimiento = new MovimientoEmpleado({
        id: this.data[this.id]?.id || 0,
        codtipoplanilla: this.campos.tipoPlanilla.value,
        tipoPlanilla:
          this.campos.tipoPlanilla.options[
            this.campos.tipoPlanilla.selectedIndex
          ].text,
        codempleado: this.campos.empleado.value,
        nombreArchivoFoto: empleado.nombreArchivoFoto,
        nombreCompleto:
          this.campos.empleado.options[this.campos.empleado.selectedIndex].text,
        codsucursal: empleado.codsucursal,
        codproyecto: empleado.codproyecto,
        coddepartamento: empleado.coddepartamento,
        codpuesto: empleado.codpuesto,
        codsucursalMovimiento: this.campos.sucursal.value,
        codproyectoMovimiento: this.campos.proyecto.value,
        idOficina: this.campos.oficina.value,
        idTipoMovimiento: this.campos.tipoMovimiento.value,
        tipoMovimiento:
          this.campos.tipoMovimiento.options[
            this.campos.tipoMovimiento.selectedIndex
          ].text,
        fechaEfectiva: this.campos.fechaMovimiento.value,
        fechaRetorno: this.campos.fechaRetorno.value,
        fechaRegistro:
          this.data[this.id]?.fechaRegistro ||
          moment().format("DD-MM-YYYY hh:mm A"),
        comentarios: this.campos.comentarios.value,
        usuario: this.data[this.id]?.usuario || obtenerNombreUsuario(),
        nombreSucursal:
          this.campos.sucursalAsignada.options[
            this.campos.sucursalAsignada.selectedIndex
          ].text,
        nombreProyecto:
          this.campos.proyectoAsignado.options[
            this.campos.proyectoAsignado.selectedIndex
          ].text,
        nombreSucursalMovimiento:
          this.campos.sucursal.options[this.campos.sucursal.selectedIndex].text,
        nombreProyectoMovimiento:
          this.campos.proyecto.options[this.campos.proyecto.selectedIndex].text,
        nombreOficina:
          this.campos.oficina.options[this.campos.oficina.selectedIndex].text,
      });

      const respuesta = await movimiento.guardar();

      switch (respuesta.message) {
        case "success":
          mostrarToastify({
            type: "success",
            message: `Movimiento guardado con éxito`,
          });

          const fila = this.prepararParaFila({
            datos: movimiento,
            id: this.id > 0 ? this.id : this.cnt + 1,
          });

          if (this.id == 0) {
            this.tabla.tabla
              .rows()
              .every(function (rowIdx, tableLoop, rowLoop) {
                const data = this.data();
                if (data[2] == movimiento.codempleado) {
                  this.remove();
                }
              })
              .draw();

            this.cnt++;
            this.id = this.cnt;

            this.tabla
              .agregarFila({ datos: fila, idFila: `trMovimiento${this.id}` })
              .redibujar();
          } else {
            this.tabla
              .actualizarFila({ datos: fila, idFila: `trMovimiento${this.id}` })
              .redibujar();
          }

          this.data[this.id] = movimiento;

          this.cancelar();
          break;
        case "mismaUbicacion":
          mostrarMensajes.warning({
            message: `No es posible registrar un movimiento a la misma ubicación en la que se encuentra el empleado, verifique la ubicación oficial o el último movimiento registrado`,
          });
          break;
        case "ubicacionAsignada":
          mostrarMensajes.warning({
            message: `No es posible registrar un movimiento a la asignación oficial del empleado, si el objetivo es regresar al empleado a su ubicación oficial, debe "finalizar" el último movimiento.`,
          });
          break;
        default:
          mostrarMensajes.error(respuesta);
          break;
      }
    } catch (err) {
      mostrarMensajes.error(err);
    }
  },
  eliminar: async function (id = 0) {
    try {
      const movimiento = new MovimientoEmpleado(this.data[id]);

      const confirmacion = await mostrarMensajes.confirm({
        message: `Se eliminará el movimiento para el empleado <strong>${movimiento.nombreCompleto}</strong>. Esta acción no se puede deshacer. ¿Desea continuar?`,
      });

      if (!confirmacion) return;

      const respuesta = await movimiento.eliminar();

      switch (respuesta.message) {
        case "success":
          mostrarToastify({
            type: "success",
            message: `Movimiento eliminado con éxito`,
          });

          this.tabla.eliminarFila({ idFila: `trMovimiento${id}` }).redibujar();
          delete this.data[id];
          break;
        default:
          mostrarMensajes.error(respuesta);
          break;
      }
    } catch (err) {
      if (!!err) mostrarMensajes.error(err);
    }
  },
  finalizar: async function (id = 0) {
    try {
      const movimiento = new MovimientoEmpleado(this.data[id]);

      const confirmacion = await mostrarMensajes.confirm({
        message: `Se finalizará el movimiento para el empleado <strong>${movimiento.nombreCompleto}</strong>. Con esta acción el empleado regresará a su ubicación oficial. ¿Desea continuar?`,
      });

      if (!confirmacion) return;

      const respuesta = await movimiento.finalizar();

      switch (respuesta.message) {
        case "success":
          mostrarToastify({
            type: "success",
            message: `Movimiento finalizado con éxito`,
          });

          this.tabla.eliminarFila({ idFila: `trMovimiento${id}` }).redibujar();
          delete this.data[id];
          break;
        default:
          mostrarMensajes.error(respuesta);
          break;
      }
    } catch (err) {
      if (!!err) mostrarMensajes.error(err);
    }
  },
  prepararParaFila: function ({ datos, id }) {
    let fechaRetorno = datos.fechaRetorno,
      estado = `<span class="badge bg-warning">En espera</span>`,
      fechaEfectiva = moment(datos.fechaEfectiva, "DD-MM-YYYY"),
      fechaActual = moment(),
      ubicacionAsignada = `<strong>Sucursal: </strong>${datos.nombreSucursal}<br><strong>Proyecto: </strong>${datos.nombreProyecto}`,
      ubicacionMovimiento = `<strong>Sucursal: </strong>${datos.nombreSucursalMovimiento}<br><strong>Proyecto: </strong>${datos.nombreProyectoMovimiento}`;

    if (datos.idOficina > 0) {
      ubicacionAsignada += `<br><strong>Oficina: </strong>${datos.nombreOficina}`;
    }

    if (!fechaRetorno) {
      fechaRetorno = "Sin definir";
    }

    if (fechaEfectiva.isBefore(fechaActual)) {
      estado = `<span class="badge bg-success">Activo</span>`;
    }

    return {
      0: id,
      1: `<div class="tbl-img-container">
        <div class="tbl-img border border-2 border-light" style="background-image:url('main/RRHH/assets/images/empleados/${datos.nombreArchivoFoto}')"></div>
      </div>`,
      2: datos.codempleado,
      3: datos.nombreCompleto,
      4: datos.tipoMovimiento,
      5: ubicacionAsignada,
      6: ubicacionMovimiento,
      7: datos.fechaEfectiva,
      8: fechaRetorno,
      9: estado,
      10: datos.fechaRegistro,
      11: datos.usuario,
      12: obtenerHTMLBotonesDropdown([
        {
          tipo: "edit",
          texto: "Editar",
          selectorClase: "editar-movimiento",
          selectorId: id,
        },
        {
          tipo: "custom",
          icono: "fas fa-check-double",
          texto: "Finalizar",
          selectorClase: "finalizar-movimiento",
          selectorId: id,
        },
        {
          tipo: "delete",
          texto: "Eliminar",
          selectorClase: "eliminar-movimiento",
          selectorId: id,
        },
      ]),
    };
  },
  cancelar: function () {
    Object.values(this.tabs).forEach((tab) => {
      tab.classList.toggle("disabled");
    });
    Object.values(this.botones).forEach((botones) => {
      botones.classList.toggle("d-none");
    });
    this.bloquearDesbloquearBuscador(false);
    this.tabs.movimientos.click();
  },
  bloquearDesbloquearBuscador: function (estado = false) {
    this.campos.tipoPlanilla.disabled = estado;
    document.getElementById("btn-buscar").disabled = estado;
  },
  limpiar: function () {
    return new Promise((resolve) => {
      this.cnt = 0;
      this.id = 0;
      this.data = {};
      this.tabla.limpiar().redibujar();
      resolve();
    });
  },
};
