Skip to content

Prueba: Reportes – Cartera (Beta)

Objetivo

Validar que el sistema permita generar los reportes asociados al módulo de Cartera, aplicando correctamente los filtros (por fecha, por tercero y selección de tipo de abono), y que los archivos en PDF y XLS se generen correctamente

Precondiciones

  • Usuario autenticado mediante el comando cy.login().
  • Acceso al dashboard del sistema (/dashboard)..
  • Acceso al módulo de Reportes mediante la ruta /reports
  • El tab Cartera debe estar visible y activable (#cartera-tab).
  • Existencia de datos y terceros (por ejemplo: "Ana Rodriguez") para poder filtrar por tercero.
  • Los botones/modales deben existir en el DOM

Pasos Generales

  1. Iniciar sesión y acceder al dashboard.
  2. Entrar al módulo Reportes.
  3. Seleccionar el tab Cartera.
  4. Para cada reporte: abrir modal correspondiente.
  5. Activar el filtro específico (función mostrarFiltro...) cuando aplique.
  6. Completar los campos del escenario (fechas, selección de tercero).
  7. Generar en PDF y luego en XLS.
  8. Cerrar el modal y verificar que haya desaparecido del DOM.

Resultado Esperado

  • El tab Cartera aparece activo y su contenido cargado.
  • Los modales de cada reporte se abren y permiten interacción con filtros y campos.
  • Los botones de generación (PDF/XLS) están visibles y ejecutan la descarga/proceso sin errores visibles.
  • El modal se cierra correctamente después de generar los reportes.
  • No quedan modales con la clase .modal.show en el DOM al finalizar cada flujo.

Explicación Detallada del Código

Visitar Modulo de reportes y Validación del tab activo

cy.visit("/reports");
cy.get("#cartera-tab").click();
cy.get("#cartera-tab").should("have.class", "active");

Explicación

  • Se ingresa automáticamente al módulo Reportes antes de cada caso.
  • Se localiza el tab con el identificador #cartera-tab
  • La condición have.class('active') asegura que el sistema esté mostrando el contenido del módulo Ventas.

Definición de los reportes y escenarios de prueba

const reportes = [
  // --- Cuentas por Cobrar ---
  {
    nombre: "Cuentas por Cobrar",
    dataTarget: "#generarReporteCuentasPorCobrar",
    escenarios: [
      {
        tipo: "fecha",
        tieneFiltro: true,
        filtroFuncion: "mostrarFiltroCuentasPorCobrar",
        filtros: [
          {
            id: "#fecha-inicial-cuentas-cxc",
            valor: "2025-09-01",
          },
          { id: "#fecha-final-cuentas-cxc", valor: "2025-12-31" },
        ],
      },
      {
        tipo: "tercero",
        tieneFiltro: true,
        filtroFuncion: "mostrarFiltroCuentasPorCobrar",
        filtros: [
          { id: "#tercero_dropdown_cxc", accion: "click" },
          {
            class: ".tercero-option[data-value='Ana Rodriguez']",
            accion: "click",
          },
        ],
      },
    ],
  },

  // --- Reportes de Abonos ---
  {
    nombre: "Reportes de Abonos - Cuentas por Cobrar",
    dataTarget: "#generarReporteAbonos",
    tipoAbono: "cuentas_por_cobrar",
    escenarios: [
      {
        tipo: "fecha",
        tieneFiltro: true,
        filtroFuncion: "mostrarFiltroAbonos",
        filtros: [
          { id: "#fecha-inicial-abonos", valor: "2025-09-01" },
          { id: "#fecha-final-abonos", valor: "2025-12-31" },
        ],
      },
      {
        tipo: "tercero",
        tieneFiltro: true,
        filtroFuncion: "mostrarFiltroAbonos",
        filtros: [
          { id: "#tercero_dropdown_abonos", accion: "click" },
          {
            class: ".tercero-option[data-value='Ana Rodriguez']",
            accion: "click",
          },
        ],
      },
    ],
  },

  {
    nombre: "Reportes de Abonos - Cuentas por Pagar",
    dataTarget: "#generarReporteAbonos",
    tipoAbono: "cuentas_por_pagar",
    escenarios: [
      {
        tipo: "fecha",
        tieneFiltro: true,
        filtroFuncion: "mostrarFiltroAbonos",
        filtros: [
          { id: "#fecha-inicial-abonos", valor: "2025-09-01" },
          { id: "#fecha-final-abonos", valor: "2025-12-31" },
        ],
      },
      {
        tipo: "tercero",
        tieneFiltro: true,
        filtroFuncion: "mostrarFiltroAbonos",
        filtros: [
          { id: "#tercero_dropdown_abonos", accion: "click" },
          {
            class: ".tercero-option[data-value='Ana Rodriguez']",
            accion: "click",
          },
        ],
      },
    ],
  },

  // --- Cuentas por Pagar ---
  {
    nombre: "Cuentas por Pagar",
    dataTarget: "#generarReporteCuentasPagar",
    escenarios: [
      {
        tipo: "fecha",
        tieneFiltro: true,
        filtroFuncion: "mostrarFiltroCuentasPorPagar",
        filtros: [
          { id: "#fecha-inicial-cuentas", valor: "2025-09-01" },
          { id: "#fecha-final-cuentas", valor: "2025-12-31" },
        ],
      },
      {
        tipo: "tercero",
        tieneFiltro: true,
        filtroFuncion: "mostrarFiltroCuentasPorPagar",
        filtros: [
          { id: "#tercero_dropdown", accion: "click" },
          {
            class: ".tercero-option[data-value='Ana Rodriguez']",
            accion: "click",
          },
        ],
      },
    ],
  },
];

Explicación

  • reportes agrupa cada caso (nombre, dataTarget, escenarios).
  • tipoAbono se usa únicamente para los reportes que comparten modal (#generarReporteAbonos) pero cambian comportamiento según el tipo (cobrar vs pagar).

Apertura del modal y selección de tipo de abono (si aplica)

// Abrir modal
cy.get(`[data-target='${reporte.dataTarget}']`).click();
cy.wait(500);

// Si aplica tipoAbono (solo para modal de abonos)
if (reporte.tipoAbono) {
  cy.get(`[onclick="seleccionarTipoAbono('${reporte.tipoAbono}')"]`)
    .should("be.visible")
    .click();
  cy.wait(300);
}

Explicación

  • Abrimos el modal correspondiente usando el data-target del botón.
  • cy.wait(500) permite que la animación del modal termine; luego, si el reporte define tipoAbono, se invoca la función seleccionarTipoAbono(tipo) que cambia el contexto interno del modal (p. ej. cambia etiquetas o filtros dependientes del tipo).

Habilitar filtro y llenar campos / acciones dentro del modal

cy.get(".modal.show")
  .should("be.visible")
  .within(() => {
    if (escenario.tieneFiltro && escenario.filtroFuncion) {
      cy.get(`[onclick="${escenario.filtroFuncion}('${escenario.tipo}')"]`, {
        timeout: 3000,
      }).click();
    }

    escenario.filtros.forEach((filtro) => {
      if (filtro.accion === "click") {
        if (filtro.id) cy.get(filtro.id).click();
        if (filtro.class) cy.get(filtro.class).click();
      } else {
        cy.get(filtro.id).should("be.visible").clear().type(filtro.valor);
      }
    });
  });

Explicación

  • within() limita la búsqueda al DOM del modal abierto, evitando colisiones con otros elementos.
  • Si tieneFiltro y existe filtroFuncion, se pulsa el control que habilita los inputs específicos según escenario.tipo (por ejemplo mostrarFiltroCuentasPorCobrar('tercero')).

| Para cada elemento en filtros:

  • Si accion === "click" se hace clic; utilizable para abrir dropdowns y seleccionar opciones.
  • Si no, se asume campo de entrada: .clear().type(valor) para introducir fechas u otros valores.

  • El uso de filtro.class permite seleccionar opciones dentro del dropdown por selector de clase/data-attribute (por ejemplo .tercero-option[data-value='Ana Rodriguez']).



Generación de los reportes (PDF y XLS)

cy.get("button[value='pdf']").should("be.visible").click();
cy.wait(800);

cy.get("button[value='xls']").should("be.visible").click();
cy.wait(800);

Explicación

  • Se localizan los botones de descarga por el atributo value y se asegura que estén visibles antes de hacer clic.
  • Primero se genera el reporte en PDF, luego en XLS, respetando un pequeño intervalo entre descargas (cy.wait(800))`` para evitar solapamiento de solicitudes.

Reversión del tipo de abono (solo abonos) y cierre del modal

// Si se inició con tipoAbono, regresar al tipo principal
if (reporte.tipoAbono) {
  cy.get(`[onclick="regresarTipoAbono()"]`).click();
  cy.wait(300);
}

// Cerrar modal
cy.get("button[aria-label='Close']").click();
cy.get(".modal.show").should("not.exist");

Explicación

  • Si el flujo cambió el tipoAbono, se llama a regresarTipoAbono() para restaurar el estado inicial del modal y evitar efectos colaterales en pruebas posteriores.
  • Se cierra el modal con el botón accesible (aria-label='Close') para simular la acción real del usuario.
  • Se verifica que no existan modales con la clase .show, lo cual confirma que el componente se cerró correctamente y que el flujo terminó sin errores visuales o bloqueos.

Resultados de la ejecución de la prueba

Escenario Reporte Tipo de Filtro Valores Ingresados / Acción Formatos Generados Estado
1 Reporte Egresos Fecha 2025-09-01 → 2025-12-31 PDF, XLS PASS
2 Reporte Egresos Registro 010 → 100 PDF, XLS PASS
3 Reporte Costos Fecha 2025-09-01 → 2025-12-28 PDF, XLS PASS
4 Reporte Gastos Fecha 2025-09-01 → 2025-12-31 PDF, XLS PASS
5 Reporte Nómina Fecha 2025-09-01 → 2025-11-30 PDF, XLS PASS
6 Reporte Nómina Tercero click (selección de tercero) PDF, XLS PASS