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
- Ingresar al módulo Ingresos desde el menú principal.
- Abrir el modal Generar Ingreso.
- Seleccionar tipo de ingreso (contado, crédito u otros).
- Escoger el tercero registrado.
- Configurar medio de pago y, si aplica, transferencia.
- Si el ingreso es a crédito: ingresar abono y plazo de vencimiento.
- Si el ingreso es "otros ingresos": diligenciar concepto y precio unitario.
- Completar campos comunes: descripción, cantidad, descuento, IVA.
- Guardar el ingreso.
- 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,abonooconcepto.
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
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 |