Skip to content

Prueba: Edición de Ingresos

Objetivo

Validar que el sistema permita editar correctamente distintos tipos de ingresos (contado, crédito y otros), asegurando que las modificaciones se guarden exitosamente y que el flujo funcione sin errores.


Precondiciones

  • Usuario autenticado mediante cy.login().
  • Acceso al dashboard del sistema (/dashboard).
  • Existencia de ingresos previamente registrados de tipo:
  • Venta de contado
  • Venta a crédito
  • Otros ingresos
  • Tercero de prueba: Ana Rodriguez.
  • Producto de prueba: SH229 creado en la plataforma.

Escenarios Cubiertos

Venta de contado

  • Contado - Efectivo, IVA 19%.
  • Contado - Efectivo, IVA 5%.
  • Contado - Transferencia Nequi, con descuento e IVA 0%.
  • Contado - Tarjeta Débito, IVA no aplica.

Venta a crédito

  • Crédito - Efectivo, plazo 15 días, IVA 19%.
  • Crédito - Nequi, IVA 5%, descuento 5%, plazo 30 días.
  • Crédito - Efectivo, IVA 0%, plazo 30 días.
  • Crédito - Bancolombia, IVA no aplica, plazo 15 días.

Otros ingresos

  • Servicio técnico, IVA 19%.
  • Consultoría, IVA 5%.
  • Venta de activo, IVA 0%.
  • Servicio interno, IVA no aplica.

Pasos Generales

  1. Acceder al módulo Ingresos.
  2. Abrir el modal de edición en el primer ingreso disponible.
  3. Determinar automáticamente el tipo de ingreso actual (contado, crédito u otros).
  4. Editar los campos según el tipo de ingreso:
  5. ampos comunes (tercero, medio de pago, descripción, cantidad, descuento, IVA).
  6. Campos específicos (producto o concepto, vencimiento, tipo de transferencia, precio).
  7. Guardar los cambios.
  8. Validar que el modal se cierre sin errores.

Resultado Esperado

  • El sistema debe permitir editar y guardar cambios en ingresos ya registrados.
  • El modal debe cerrarse automáticamente tras guardar.
  • No deben presentarse errores en consola ni bloqueos en el flujo.

Explicación del Código por Bloques

Definición de Escenarios

const escenarios = {
  contado: [
    {
      tipoEsperado: "Venta de contado",
      medioPago: "Efectivo",
      descripcion: "Contado - Efectivo, sin descuento, IVA 19%",
      cantidad: "1",
      descuento: "0",
      iva: "19%",
      codigoProducto: "SH229",
    },
    {
      tipoEsperado: "Venta de contado",
      medioPago: "Efectivo",
      descripcion: "Contado - Efectivo, sin descuento, IVA 5%",
      cantidad: "2",
      descuento: "0",
      iva: "5%",
      codigoProducto: "SH229",
    },
    {
      tipoEsperado: "Venta de contado",
      medioPago: "Transferencia",
      tipoTransferencia: "Nequi",
      descripcion: "Contado - Transferencia Nequi, con descuento, IVA 0%",
      cantidad: "3",
      descuento: "5",
      iva: "0",
      codigoProducto: "SH229",
    },
    {
      tipoEsperado: "Venta de contado",
      medioPago: "Tarjeta Debito",
      descripcion: "Contado - Tarjeta Debito, IVA no aplica",
      cantidad: "1",
      descuento: "0",
      iva: "no_aplica",
      codigoProducto: "SH229",
    },
  ],

  credito: [
    {
      tipoEsperado: "Venta a credito",
      medioPago: "Efectivo",
      descripcion: "Crédito - Efectivo, plazo 15, IVA 19%",
      cantidad: "2",
      descuento: "0",
      iva: "19",
      vencimiento: "15",
      codigoProducto: "SH229",
    },
    {
      tipoEsperado: "Venta a credito",
      medioPago: "Transferencia",
      tipoTransferencia: "Nequi",
      descripcion: "Crédito - Nequi, IVA 5%, descuento 5%",
      cantidad: "1",
      descuento: "5",
      iva: "5",
      vencimiento: "30",
      codigoProducto: "SH229",
    },
    {
      tipoEsperado: "Venta a credito",
      medioPago: "Efectivo",
      descripcion: "Crédito - Efectivo, plazo 30, IVA 0%",
      cantidad: "3",
      descuento: "0",
      iva: "0",
      vencimiento: "30",
      codigoProducto: "SH229",
    },
    {
      tipoEsperado: "Venta a credito",
      medioPago: "Transferencia",
      tipoTransferencia: "Bancolombia",
      descripcion: "Crédito - Transferencia, IVA no aplica, descuento 0%",
      cantidad: "1",
      descuento: "0",
      iva: "no_aplica",
      vencimiento: "15",
      codigoProducto: "SH229",
    },
  ],

  otros: [
    {
      tipoEsperado: "Otros ingresos",
      medioPago: "Efectivo",
      concepto: "Servicio técnico",
      descripcion: "Otros - Servicio técnico, IVA 19%",
      precio: "1000",
      cantidad: "1",
      descuento: "0",
      iva: "19%",
    },
    {
      tipoEsperado: "Otros ingresos",
      medioPago: "Efectivo",
      concepto: "Consultoría",
      descripcion: "Otros - Consultoría, IVA 5%",
      precio: "1200",
      cantidad: "1",
      descuento: "0",
      iva: "5%",
    },
    {
      tipoEsperado: "Otros ingresos",
      medioPago: "Transferencia",
      tipoTransferencia: "Bancolombia",
      concepto: "Venta de activo",
      descripcion: "Otros - Venta de activo, IVA 0%",
      precio: "1500",
      cantidad: "1",
      descuento: "0",
      iva: "0",
    },
    {
      tipoEsperado: "Otros ingresos",
      medioPago: "Transferencia",
      tipoTransferencia: "Daviplata",
      concepto: "Servicio interno",
      descripcion: "Otros - Servicio interno, IVA no aplica",
      precio: "800",
      cantidad: "1",
      descuento: "0",
      iva: "no_aplica",
    },
  ],
};

Explicacion:

  • Se agrupan los escenarios por tipo de ingreso (contado, credito, otros).

| Cada escenario define los campos necesarios:

  • tipoEsperado: tipo actual del ingreso a editar
  • medioPago, tipoTransferencia, vencimiento: condiciones específicas del flujo.
  • descripcion, cantidad, iva, descuento: datos que se modifican durante la prueba.
  • codigoProducto o concepto: identificadores del producto o concepto del ingreso.



Función completarCampos(escenario, tipoActual)

const completarCampos = (escenario, tipoActual) => {
  // Campos comunes
  cy.get(".custom-select-container").first().click();
  cy.get(".custom-select-options")
    .contains("li.custom-select-option", tercero)
    .click({ force: true });
  cy.get(".custom-select-input").first().should("contain.text", tercero);

  cy.get("select#medio_pago_edit").first().select(escenario.medioPago);

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

  cy.get("input.descripcion-input-edit")
    .first()
    .clear()
    .type(escenario.descripcion);
  cy.get("input.cantidad-input-edit").first().clear().type(escenario.cantidad);
  cy.get("input.descuento-input-edit")
    .first()
    .clear()
    .type(escenario.descuento);
  cy.get("select.iva-select").first().select(escenario.iva);

  // Campos específicos
  if (tipoActual === "Venta de contado" || tipoActual === "Venta a credito") {
    cy.get(".custom-select-container").eq(1).click();
    cy.get(".custom-select-options")
      .contains("li.custom-select-option", escenario.codigoProducto)
      .click();

    if (tipoActual === "Venta a credito") {
      cy.get("select#vencimiento_edit")
        .first()
        .select(escenario.vencimiento || "0");
    }
  } else if (tipoActual === "Otros ingresos") {
    cy.get("input.concepto-input").first().clear().type(escenario.concepto);
    cy.get("input.precio-input-edit").first().clear().type(escenario.precio);
  }
};

Explicacion:

  • Permite rellenar todos los campos del modal en función del tipo de ingreso detectado.

| Campos comunes:

  • Tercero, medio de pago, descripción, cantidad, descuento, IVA.

| Campos específicos:

  • Para contado o crédito → selecciona producto (codigoProducto).
  • Si es crédito → selecciona vencimiento.
  • Para “otros ingresos” → rellena concepto y precio.
  • Implementa condicionales que garantizan que solo se editen los campos válidos para cada tipo de ingreso.

Función editarIngreso(escenario)

const editarIngreso = (escenario) => {
  cy.visit("/ingresos");
  cy.get('button[title="Editar ingreso"]').first().click();

  cy.get("div.modal-dialog:visible", { timeout: 10000 })
    .first()
    .should("exist")
    .within(() => {
      cy.get("select#tipo_venta_edit")
        .first()
        .invoke("val")
        .then((tipoActual) => {
          if (tipoActual !== escenario.tipoEsperado) {
            cy.get('button[type="button"].close').click();
            return;
          }

          cy.get("select#tipo_venta_edit").first().select(tipoActual);

          completarCampos(escenario, tipoActual);

          cy.get('button[type="submit"].btn.btn-primary').first().click();
          cy.get("div.modal-dialog:visible", {
            timeout: 10000,
          }).should("not.exist");
        });
    });
};

Explicacion:

  • Abre el primer ingreso disponible para edición.
  • Detecta automáticamente el tipo actual de ingreso (tipoActual).
  • Si el ingreso no coincide con el tipo esperado del escenario, se omite la edición (se cierra el modal).
  • Llama a completarCampos(...) para llenar la información según el tipo.
  • Finalmente guarda los cambios y valida el cierre correcto del modal.

Generación dinámica de pruebas

const generarTests = (tipo, lista) => {
  context(tipo, () => {
    lista.forEach((escenario) => {
      it(`Editar ingreso: ${escenario.descripcion}`, () => {
        editarIngreso(escenario);
      });
    });
  });
};

generarTests("Venta de contado", escenarios.contado);
generarTests("Venta a crédito", escenarios.credito);
generarTests("Otros ingresos", escenarios.otros);

Explicacion:

  • La función generarTests() permite crear automáticamente un bloque de pruebas (context) para cada tipo de ingreso
  • Dentro de cada bloque, se genera un it(...) independiente para cada escenario.

Resultados de la ejecución de la prueba

Tipo de Ingreso Escenario Medio de Pago Transferencia Vencimiento IVA Descuento Estado
Contado Efectivo IVA 19% Efectivo - - 19% 0% PASS
Contado Nequi IVA 0% Transferencia Nequi - 0% 5% PASS
Crédito Efectivo 15 días Efectivo - 15 19% 0% PASS
Crédito Bancolombia 15 días Transferencia Bancolombia 15 No aplica 0% PASS
Otros Consultoría Efectivo - - 5% 0% PASS
Otros Servicio interno Transferencia Daviplata - No aplica 0% PASS