Skip to content

Prueba: Registro de Ingresos

Objetivo

Validar que el sistema permita registrar correctamente ingresos bajo distintos escenarios y condiciones, garantizando que cada tipo de venta o ingreso funcione de forma independiente y sin errores.


Precondiciones

  • Usuario autenticado mediante el comando cy.login().
  • Acceso al dashboard del sistema (/dashboard).
  • Tercero de prueba: Ana Rodriguez.
  • Producto de prueba: SH229 creado en la plataforma.
  • El sistema debe tener habilitados los diferentes medios de pago y tasas de IVA.

Escenarios Cubiertos

Venta de contado

  • Efectivo sin descuento, IVA no aplica
  • Efectivo con descuento 10%, IVA 19%
  • Transferencia Nequi, IVA 0%
  • Transferencia Bancolombia, IVA 5%, con descuento
  • Transferencia Daviplata, IVA 19%, descuento 15%
  • Tarjeta Débito, IVA 19%

Venta a crédito

  • Efectivo sin abono, plazo 15 días, IVA 0%
  • Transferencia Nequi, abono 25 000, plazo 30, IVA 19%
  • Transferencia Daviplata, abono 50 000, plazo 30, IVA 0%
  • Transferencia Bancolombia, abono 10 000, plazo 15, IVA no aplica
  • Efectivo con abono grande, plazo 30, IVA 19%
  • Tarjeta Débito, sin abono, plazo 15

Otros ingresos

  • Servicio técnico, IVA 0%
  • Venta de activo, IVA no aplica
  • Consultoría empresarial (Bancolombia), IVA 19%, descuento 5%
  • Arriendo (Nequi), IVA 5%
  • Honorarios (Daviplata), IVA 0%
  • Donación (Bancolombia), IVA 0%

Pasos Generales

  1. Ingresar al módulo Ingresos desde el menú principal.
  2. Abrir el modal Generar Ingreso.
  3. Seleccionar tipo de ingreso (contado, crédito u otros).
  4. Escoger el tercero registrado.
  5. Configurar medio de pago y, si aplica, transferencia.
  6. Si el ingreso es a crédito: ingresar abono y plazo de vencimiento.
  7. Si el ingreso es "otros ingresos": diligenciar concepto y precio unitario.
  8. Completar campos comunes: descripción, cantidad, descuento, IVA.
  9. Guardar el ingreso.
  10. Validar que el modal se cierre automáticamente sin errores.

Resultado Esperado

  • El sistema debe permitir registrar correctamente cada tipo de ingreso con sus condiciones específicas.
  • El modal debe cerrarse al guardar.
  • No deben presentarse errores en consola ni interrupciones en el flujo.

Explicación Detallada del Código

Definición de Escenarios

const ingresos = {
  contado: [
    {
      tipoIngreso: "Venta de contado",
      tercero: "Ana Rodriguez",
      medioPago: "Efectivo",
      tipoTransferencia: "",
      codigoProducto: "SH229",
      descripcion: "Contado - sin descuento - IVA no aplica",
      cantidad: "1",
      descuento: "0",
      iva: "no_aplica",
    },
    {
      tipoIngreso: "Venta de contado",
      tercero: "Ana Rodriguez",
      medioPago: "Efectivo",
      tipoTransferencia: "",
      codigoProducto: "SH229",
      descripcion: "Contado - descuento 10% - IVA 19%",
      cantidad: "3",
      descuento: "10",
      iva: "19",
    },
    {
      tipoIngreso: "Venta de contado",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Nequi",
      codigoProducto: "SH229",
      descripcion: "Contado - transferencia Nequi - IVA 0%",
      cantidad: "2",
      descuento: "0",
      iva: "0",
    },
    {
      tipoIngreso: "Venta de contado",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Bancolombia",
      codigoProducto: "SH229",
      descripcion:
        "Contado - transferencia Bancolombia - IVA 5% - con descuento",
      cantidad: "4",
      descuento: "5",
      iva: "5",
    },
    {
      tipoIngreso: "Venta de contado",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Daviplata",
      codigoProducto: "SH229",
      descripcion:
        "Contado - transferencia Daviplata - IVA 19% - descuento 15%",
      cantidad: "1",
      descuento: "15",
      iva: "19",
    },
    {
      tipoIngreso: "Venta de contado",
      tercero: "Ana Rodriguez",
      medioPago: "Tarjeta Debito",
      tipoTransferencia: "",
      codigoProducto: "SH229",
      descripcion: "Contado - pago con tarjeta - IVA 19%",
      cantidad: "2",
      descuento: "0",
      iva: "19",
    },
  ],

  otros: [
    {
      tipoIngreso: "Otros ingresos",
      tercero: "Ana Rodriguez",
      medioPago: "Efectivo",
      tipoTransferencia: "",
      concepto: "Servicio técnico",
      descripcion: "Otros - IVA 0%",
      precioUnitario: "90000",
      cantidad: "1",
      descuento: "0",
      iva: "0",
    },
    {
      tipoIngreso: "Otros ingresos",
      tercero: "Ana Rodriguez",
      medioPago: "Efectivo",
      tipoTransferencia: "",
      concepto: "Venta de activo",
      descripcion: "Otros - IVA 19%",
      precioUnitario: "150000",
      cantidad: "1",
      descuento: "0",
      iva: "no_aplica",
    },
    {
      tipoIngreso: "Otros ingresos",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Bancolombia",
      concepto: "Consultoría empresarial",
      descripcion: "Otros - transferencia Bancolombia - IVA 19% - descuento 5%",
      precioUnitario: "120000",
      cantidad: "1",
      descuento: "5",
      iva: "19",
    },
    {
      tipoIngreso: "Otros ingresos",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Nequi",
      concepto: "Arriendo",
      descripcion: "Otros - transferencia Nequi - IVA 5%",
      precioUnitario: "50000",
      cantidad: "1",
      descuento: "0",
      iva: "5",
    },
    {
      tipoIngreso: "Otros ingresos",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Daviplata",
      concepto: "Honorarios",
      descripcion: "Otros - transferencia Daviplata - IVA 0%",
      precioUnitario: "80000",
      cantidad: "1",
      descuento: "0",
      iva: "0",
    },
    {
      tipoIngreso: "Otros ingresos",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Bancolombia",
      concepto: "Donación",
      descripcion: "Otros - transferencia Bancolombia - IVA 0%",
      precioUnitario: "10000",
      cantidad: "1",
      descuento: "0",
      iva: "0",
    },
  ],

  credito: [
    {
      tipoIngreso: "Venta a credito",
      tercero: "Ana Rodriguez",
      medioPago: "Efectivo",
      tipoTransferencia: "",
      codigoProducto: "SH229",
      descripcion: "Crédito - sin abono - plazo 15 - IVA 0%",
      cantidad: "2",
      descuento: "0",
      iva: "0",
      abono: "0",
      vencimiento: "15",
    },
    {
      tipoIngreso: "Venta a credito",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Nequi",
      codigoProducto: "SH229",
      descripcion: "Crédito - abono parcial 25k - plazo 30 - IVA 19%",
      cantidad: "1",
      descuento: "5",
      iva: "19",
      abono: "2500",
      vencimiento: "30",
    },
    {
      tipoIngreso: "Venta a credito",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Daviplata",
      codigoProducto: "SH229",
      descripcion: "Crédito - abono 50k - plazo 30 - IVA 0%",
      cantidad: "9",
      descuento: "0",
      iva: "0",
      abono: "5000",
      vencimiento: "30",
    },
    {
      tipoIngreso: "Venta a credito",
      tercero: "Ana Rodriguez",
      medioPago: "Transferencia",
      tipoTransferencia: "Bancolombia",
      codigoProducto: "SH229",
      descripcion: "Crédito - abono 10k - plazo 15 - IVA 19% - descuento 10%",
      cantidad: "3",
      descuento: "10",
      iva: "no_aplica",
      abono: "1000",
      vencimiento: "15",
    },
    {
      tipoIngreso: "Venta a credito",
      tercero: "Ana Rodriguez",
      medioPago: "Efectivo",
      tipoTransferencia: "",
      codigoProducto: "SH229",
      descripcion: "Crédito - abono grande - plazo 30 - IVA 19%",
      cantidad: "5",
      descuento: "0",
      iva: "19",
      abono: "1200",
      vencimiento: "30",
    },
    {
      tipoIngreso: "Venta a credito",
      tercero: "Ana Rodriguez",
      medioPago: "Tarjeta Debito",
      tipoTransferencia: "",
      codigoProducto: "SH229",
      descripcion: "Crédito - pago con tarjeta - sin abono - plazo 15",
      cantidad: "20",
      descuento: "0",
      iva: "0",
      abono: "0",
      vencimiento: "15",
    },
  ],
};

Explicacion:

| Se define un objeto ingresos con tres categorías principales:

  • contado: ingresos pagados inmediatamente (efectivo, transferencia, tarjeta).
  • otros: ingresos manuales sin productos predefinidos (servicios, donaciones, honorarios, etc.).
  • credito: ingresos con abonos y vencimientos.

  • Cada arreglo contiene objetos con todos los datos requeridos: tercero, medio de pago, producto, IVA, descuento, abono o concepto.


Generación de pruebas

// --- Contextos por tipo de ingreso ---
context("Venta de contado", () => {
  Cypress._.each(ingresos.contado, (ingreso) => {
    it(`Debe registrar: ${ingreso.descripcion}`, () => {
      registrarIngreso(ingreso);
    });
  });
});

context("Venta a crédito", () => {
  Cypress._.each(ingresos.credito, (ingreso) => {
    it(`Debe registrar: ${ingreso.descripcion}`, () => {
      registrarIngreso(ingreso);
    });
  });
});

context("Otros ingresos", () => {
  Cypress._.each(ingresos.otros, (ingreso) => {
    it(`Debe registrar: ${ingreso.descripcion}`, () => {
      registrarIngreso(ingreso);
    });
  });
});

Explicacion:

  • context(...): agrupa los casos bajo un nombre descriptivo (por tipo de ingreso).
  • Cypress._.each(...): recorre cada escenario dentro de la categoría y crea dinámicamente un test (it(...)).
  • La función registrarIngreso(ingreso) recibe los datos específicos del escenario actual y ejecuta el flujo completo.

Función registrarIngreso()


Apertura del modal

const registrarIngreso = (ingreso) => {
  // --- Paso 0: Ir al módulo de ingresos ---
  cy.visit("/ingresos");
  cy.url().should("include", "/ingresos");

  // --- Paso 1: Abrir modal "Generar Ingreso" ---
  cy.get('[data-target="#generarReporteIngresoss"]').click();
  cy.get("#generarReporteIngresoss").should("be.visible");
};

Explicacion:

  • Esta función centraliza todo el flujo del registro de ingresos.
  • Se ingresa al módulo de ingresos directamente.
  • Se valida que la URL sea correcta.
  • Se hace clic en el botón para abrir el modal “Generar Ingreso”.
  • Se verifica que el modal esté visible antes de interactuar con él, asegurando que el sistema haya cargado correctamente la interfaz.

Selección del tipo de ingreso

cy.get("#tipoIngreso").select(ingreso.tipoIngreso);

Explicacion:

  • Selecciona automáticamente el tipo de ingreso en el formulario (contado, crédito u otros).

Selección del tercero

cy.get("#generarReporteIngresoss").within(() => {
  cy.wait(500);
  cy.get(".custom-select-container").first().click();
  cy.get(".custom-select-container.open .custom-select-options", {
    timeout: 8000,
  })
    .should("be.visible")
    .contains("li.custom-select-option", ingreso.tercero)
    .click();
});

Explicacion:

  • Se trabaja dentro del contexto del modal para evitar conflictos con otros elementos similares.
  • Se espera brevemente (cy.wait(500)) para garantizar que las opciones se carguen.
  • Se selecciona el tercero correspondiente (en este caso, “Ana Rodriguez”).
  • Se valida visualmente que la opción seleccionada aparezca en el campo.

Selección del medio de pago y transferencia

cy.get("#medioPago").select(ingreso.medioPago);
if (ingreso.medioPago === "Transferencia") {
  cy.get("#tipoTransferencia").select(ingreso.tipoTransferencia);
}

Explicacion:

  • Selecciona el medio de pago según el escenario.
  • Si el medio es una transferencia, se activa y selecciona el campo adicional #tipoTransferencia (por ejemplo: Nequi, Daviplata, Bancolombia).
  • Así se valida que el sistema maneje correctamente las condiciones de crédito.

Campos adicionales para crédito

if (ingreso.tipoIngreso === "Venta a credito") {
  cy.get("#abono").clear().type(ingreso.abono);
  cy.get("#vencimiento").select(ingreso.vencimiento);
}

Explicacion:

  • Solo aplica a ingresos de tipo crédito.
  • Diligencia el valor del abono inicial y el plazo de vencimiento.

Producto o concepto

if (ingreso.tipoIngreso === "Otros ingresos") {
  cy.get("input.form-control.concepto-input")
    .first()
    .clear()
    .type(ingreso.concepto);
  cy.get("input.form-control.precio-input")
    .first()
    .clear()
    .type(ingreso.precioUnitario);
} else {
  cy.get("#productosContainer .custom-select-container").first().click();
  cy.get(
    "#productosContainer .custom-select-container.open .custom-select-options",
    { timeout: 5000 }
  )
    .should("be.visible")
    .contains("li.custom-select-option", ingreso.codigoProducto)
    .click();
}

Explicacion:

| Distingue entre:

  • Otros ingresos: se ingresa manualmente un concepto y precio.
  • Ingresos con producto: se selecciona un producto preexistente del sistema.



Campos comunes

cy.get("input.form-control.descripcion-input")
  .first()
  .clear()
  .type(ingreso.descripcion);
cy.get("input.form-control.cantidad-input")
  .first()
  .clear()
  .type(ingreso.cantidad);
cy.get("input.form-control.descuento-input")
  .first()
  .clear()
  .type(ingreso.descuento || "0");
cy.get("#productosContainer select.tasa-iva").select(ingreso.iva);

Explicacion:

| Completa los campos básicos comunes a todos los ingresos:

  • Descripción del producto o servicio.
  • Cantidad
  • Descuento (si no hay, usa “0” por defecto).
  • Tasa de IVA.

Guardado y validaciones finales

cy.get('div.d-flex button[type="submit"].btn.btn-primary').first().click();
cy.get("#generarReporteIngresoss", { timeout: 10000 }).should("not.be.visible");
cy.get(".modal-backdrop", { timeout: 10000 }).should("not.exist");
cy.wait(1000);

Explicacion:

  • Se hace clic en el botón de Guardar.
  • Se espera a que el modal se cierre automáticamente, lo que indica que el ingreso fue registrado exitosamente.
  • El cy.wait(1000) asegura que el siguiente test no interfiera con el cierre del modal anterior.

Resultados de la ejecución de la prueba

Tipo de Ingreso Escenario Medio de Pago IVA Descuento Resultado
Contado Efectivo sin descuento Efectivo No aplica 0% PASS
Contado Transferencia Nequi Nequi 0% 0% PASS
Crédito Abono parcial Nequi 19% 5% PASS
Crédito Sin abono Efectivo 0% 0% PASS
Otros Consultoría empresarial Bancolombia 19% 5% PASS
Otros Donación Bancolombia 0% 0% PASS