Skip to content

Multiples Condiciones de Venta en Comprobantes

Modulo: Ventas Tipo: Process Estado: Planificado Fecha: 2026-03-04 Decisiones: multiples-condiciones-venta-decisiones.md


Descripcion

Actualmente, cada comprobante de venta (factura, nota de credito, nota de debito) admite una unica condicion de venta. Este proceso permite asociar multiples condiciones de venta a un mismo comprobante, cada una con un importe base asignado libremente por el usuario.

Valor para el negocio:

  • Refleja operaciones comerciales reales donde un cliente paga parte en contado, parte con tarjeta y parte en cuenta corriente en una misma transaccion
  • Cada condicion aplica su propio recargo solo sobre su parte asignada, permitiendo un calculo financiero preciso
  • Mantiene la trazabilidad completa de cada forma de pago a traves de tesoreria, cuenta corriente y reportes

Contexto:

  • Un comprobante puede tener N condiciones de venta con importes libres
  • La suma de los importes base por condicion debe igualar el subtotal del comprobante (antes de recargos)
  • Cada condicion aplica su recargo solo sobre su parte asignada
  • Este comportamiento aplica tanto para comprobantes electronicos como manuales, sin diferencia

Estructura de Datos

Tabla: comprobante_condiciones_venta (nueva)

Tabla unica para factura, nota de credito y nota de debito. El campo tipo_comprobante identifica a cual pertenece cada fila.

ColumnaTipoNulableDefaultDescripcion
idSERIALNOPK
id_comprobanteINTNOID del comprobante (factura, credito o debito)
tipo_comprobanteVARCHARNOTipo: 'FAC', 'NC', 'ND'
id_condvtaINTNOFK → condvta.cod
montoNUMERICNOImporte base asignado por el usuario, antes del recargo
porcentaje_recargoNUMERICSI0Porcentaje de recargo copiado al momento de emision
monto_recargoNUMERICSI0Importe del recargo calculado
id_tarjetaINTSINULLFK → tarjetas.id, solo cuando la condicion es tipo Tarjeta

Diagrama de relaciones

mermaid
erDiagram
    factura {
        int id PK
    }

    credito {
        int id PK
    }

    debito {
        int id PK
    }

    comprobante_condiciones_venta {
        serial id PK
        int id_comprobante
        varchar tipo_comprobante
        int id_condvta FK
        numeric monto
        numeric porcentaje_recargo
        numeric monto_recargo
        int id_tarjeta FK
    }

    condvta {
        int cod PK
        string descri
        boolean defecto
        boolean tarjeta
        numeric porcentaje_recargo
    }

    tarjetas {
        int id PK
        string nombre
        int cuenta
    }

    movimi {
        serial id PK
        int id_comprobante FK
        numeric valor
        string es
        string numero
    }

    factura ||--o{ comprobante_condiciones_venta : "tipo FAC"
    credito ||--o{ comprobante_condiciones_venta : "tipo NC"
    debito ||--o{ comprobante_condiciones_venta : "tipo ND"
    comprobante_condiciones_venta }o--|| condvta : "usa condicion"
    comprobante_condiciones_venta }o--o| tarjetas : "tarjeta opcional"
    factura ||--o{ movimi : "genera 1 mov de caja (suma no-CtaCte)"

Flujo del Proceso

El proceso de emision de un comprobante con multiples condiciones de venta sigue estos pasos generales:

  1. El usuario facturador carga los datos del comprobante (cliente, productos, cantidades)
  2. El sistema calcula el subtotal del comprobante (antes de recargos)
  3. El usuario asigna una o mas condiciones de venta, indicando el importe base para cada una
  4. Si una condicion es de tipo Tarjeta, el usuario indica la tarjeta especifica y su importe
  5. El sistema valida que la suma de importes base iguale el subtotal del comprobante
  6. El sistema calcula el recargo de cada condicion sobre su importe base asignado
  7. El sistema calcula los impuestos (IVA y tributos) sobre la base que incluye los recargos
  8. El sistema determina el total del comprobante incluyendo todos los recargos parciales sumados
  9. Si el comprobante es electronico, el sistema lo comunica al organismo fiscal con el total final
  10. El sistema genera los movimientos de tesoreria y/o cuenta corriente segun corresponda

Si se asigna una sola condicion de venta, el comportamiento es identico al actual.


Reglas de Negocio

RN-001: Suma de importes base igual al subtotal

  • Condicion: El usuario asigna importes base a las condiciones de venta
  • Accion: El sistema valida que la suma de todos los importes base sea exactamente igual al subtotal del comprobante (antes de recargos). Si hay desfasaje, el sistema rechaza la operacion
  • Ejemplo: Subtotal $10.000. El usuario asigna Contado $6.000 y Cta.Cte $4.000. Suma = $10.000. Valido

RN-002: Recargo parcial por condicion

  • Condicion: Una condicion de venta tiene un porcentaje de recargo mayor a cero
  • Accion: El recargo se calcula sobre el importe base asignado a esa condicion, no sobre el total del comprobante. Los impuestos (IVA y tributos) se calculan sobre la base que incluye el recargo
  • Ejemplo: Condicion Tarjeta con 10% de recargo asignada con $5.000. Recargo = $500. Base con recargo = $5.500. IVA se calcula sobre $5.500

RN-003: Recargo total del comprobante

  • Condicion: El comprobante tiene multiples condiciones con recargo
  • Accion: El recargo total del comprobante es la suma de los recargos parciales de cada condicion. El total enviado al organismo fiscal incluye todos los recargos parciales sumados

RN-004: Condiciones duplicadas no permitidas

  • Condicion: El usuario intenta asignar la misma condicion de venta mas de una vez en el mismo comprobante
  • Accion: El sistema rechaza la operacion, con excepcion de la condicion Tarjeta
  • Ejemplo: No se permite Contado + Contado. Si se permite Tarjeta (Visa $3.000) + Tarjeta (Mastercard $2.000) porque son tarjetas distintas

RN-005: Excepcion de tarjeta con multiples tarjetas

  • Condicion: La condicion de venta es Tarjeta
  • Accion: Se permite seleccionar multiples tarjetas distintas dentro de esa misma condicion, cada una con su propio importe

RN-006: Importes base positivos

  • Condicion: El usuario ingresa un importe base para una condicion
  • Accion: Todos los importes base deben ser positivos y mayores a cero. El sistema rechaza importes iguales a cero o negativos

RN-007: Validacion de cuenta corriente

  • Condicion: Una de las condiciones asignadas es Cta.Cte (total o parcial)
  • Accion: El sistema valida que el cliente tenga habilitada la cuenta corriente antes de registrar el comprobante. Esta validacion aplica aunque la condicion Cta.Cte sea parcial

RN-008: Condicion de tarjeta requiere tarjeta especifica

  • Condicion: Se selecciona la condicion de venta Tarjeta
  • Accion: El sistema exige que se indique la tarjeta especifica (por ejemplo, Visa, Mastercard). El sistema rechaza la operacion si se indica condicion Tarjeta sin especificar la tarjeta

RN-009: Al menos una condicion obligatoria

  • Condicion: El usuario intenta emitir un comprobante sin condiciones de venta
  • Accion: El sistema rechaza la operacion. Todo comprobante debe tener al menos una condicion de venta asignada

RN-010: Fuente unica de verdad

  • Condicion: Cualquier modulo del sistema necesita consultar la condicion de venta de un comprobante
  • Accion: La tabla comprobante_condiciones_venta es la unica fuente de verdad. Reportes, tesoreria, cuenta corriente y cualquier otro modulo deben leer la condicion de venta desde esta estructura

Actores Involucrados

  • Usuario facturador: Emite comprobantes y asigna las condiciones de venta con sus importes
  • Sistema: Valida importes, calcula recargos e impuestos, genera movimientos en tesoreria y cuenta corriente, comunica con el organismo fiscal

Casos de Uso

UC-001: Emitir comprobante con multiples condiciones de venta

Actor: Usuario facturador

Precondiciones:

  • El usuario tiene permiso de emision de comprobantes
  • Existen condiciones de venta cargadas en el sistema
  • Si una condicion es Cta.Cte, el cliente tiene cuenta corriente habilitada
  • Si una condicion es Tarjeta, existen tarjetas registradas en el sistema

Flujo principal:

  1. El usuario carga los datos del comprobante (cliente, productos, cantidades)
  2. El sistema calcula el subtotal del comprobante
  3. El usuario agrega una primera condicion de venta e indica el importe base asignado
  4. El usuario agrega una segunda condicion de venta e indica el importe base asignado
  5. El sistema valida que la suma de los importes base iguale el subtotal del comprobante
  6. El sistema calcula el recargo de cada condicion sobre su importe base
  7. El sistema calcula los impuestos sobre la base con recargos incluidos
  8. El sistema determina el total final del comprobante
  9. El usuario confirma la emision
  10. El sistema registra el comprobante con todas sus condiciones en comprobante_condiciones_venta
  11. El sistema genera un unico movimiento de caja por la suma de condiciones no-CtaCte
  12. El sistema genera un movimiento de salida bancaria por cada tarjeta con su importe
  13. El sistema genera la deuda en cuenta corriente por el importe de la condicion Cta.Cte (si aplica)
  14. El sistema muestra confirmacion al usuario

Flujos alternativos:

  • 5a. Importes no suman el subtotal: El sistema muestra error indicando el desfasaje y no permite continuar
  • 5b. Condicion duplicada: El sistema rechaza y muestra error indicando que la condicion ya fue asignada
  • 5c. Importe base cero o negativo: El sistema rechaza y muestra error
  • 3a. Condicion Cta.Cte y cliente sin cuenta corriente: El sistema muestra error y no permite asignar esa condicion
  • 4a. Condicion Tarjeta sin tarjeta especifica: El sistema exige seleccionar una tarjeta antes de continuar

Postcondiciones:

  • Comprobante registrado con N condiciones de venta en comprobante_condiciones_venta
  • Un unico movimiento de caja por la suma de condiciones no-CtaCte
  • Movimiento de salida bancaria por cada tarjeta con su importe (si aplica)
  • Deuda en cuenta corriente por el importe de la condicion Cta.Cte (si aplica)

UC-002: Emitir comprobante con una sola condicion de venta

Actor: Usuario facturador

Precondiciones:

  • Mismas que UC-001

Flujo principal:

  1. El usuario carga los datos del comprobante
  2. El sistema calcula el subtotal del comprobante
  3. El usuario asigna una unica condicion de venta con el importe base completo
  4. El sistema valida que el importe base iguale el subtotal
  5. El sistema calcula recargo e impuestos
  6. El usuario confirma la emision
  7. El sistema registra el comprobante

Postcondiciones:

  • Comportamiento identico al actual del sistema

UC-003: Emitir NC/ND asociada a comprobante con multiples condiciones

Actor: Usuario facturador

Precondiciones:

  • Existe un comprobante original con multiples condiciones de venta
  • El usuario tiene permiso de emision de NC/ND

Flujo principal:

  1. El usuario selecciona emitir NC o ND asociada a un comprobante original
  2. El sistema lee las condiciones de venta del comprobante original desde comprobante_condiciones_venta
  3. El sistema precarga las condiciones de venta en la NC/ND con los mismos importes del comprobante original
  4. El usuario puede modificar los importes antes de confirmar
  5. El usuario confirma la emision
  6. El sistema registra la NC/ND con sus condiciones en comprobante_condiciones_venta
  7. El sistema genera los movimientos inversos en tesoreria y cuenta corriente

Postcondiciones:

  • NC/ND registrada con sus condiciones de venta en comprobante_condiciones_venta
  • Un unico movimiento de caja inverso por la suma de condiciones no-CtaCte
  • Movimientos de salida bancaria invertidos por cada tarjeta (si aplica)
  • Saldo de cuenta corriente reducido por el importe de la condicion Cta.Cte de la NC/ND

Integracion con Tesoreria

Movimientos de caja

  • Se genera un unico movimiento de caja cuyo importe es la suma de las condiciones que no son Cta.Cte
  • Si todas las condiciones son Cta.Cte, no se genera ningun movimiento de caja
  • El movimiento de caja esta referenciado al comprobante

Movimientos de salida bancaria (tarjeta)

  • Se genera un movimiento de salida bancaria por cada tarjeta con su importe correspondiente
  • Si no hay condicion de tipo Tarjeta, no se genera ningun movimiento de salida bancaria

Integracion con Cuenta Corriente

  • Si una de las condiciones es Cta.Cte, se registra una deuda en la cuenta corriente del cliente por el importe asignado a esa condicion solamente, no por el total del comprobante
  • Si no hay ninguna condicion Cta.Cte en el comprobante, no se genera movimiento en cuenta corriente
  • El sistema maneja comprobantes con Cta.Cte parcial: parte del importe va a tesoreria y parte queda como deuda en cuenta corriente

Integracion con Facturacion Electronica (ARCA/AFIP)

  • La condicion de venta no forma parte de los datos enviados al organismo fiscal
  • El unico impacto es el total del comprobante, que debe incluir todos los recargos parciales sumados
  • Los recargos parciales no modifican la distribucion de alicuotas de IVA y tributos hacia el organismo fiscal
  • El calculo es interno: los impuestos se aplican sobre neto + recargo y el resultado final es lo que se envia a AFIP

Integracion con Reportes

  • Los reportes que filtran o agrupan por condicion de venta deben leer desde comprobante_condiciones_venta
  • Un comprobante puede aparecer en mas de un grupo (una vez por cada condicion asignada, con su importe parcial)
  • Para comprobantes historicos sin fila en comprobante_condiciones_venta, se aplica fallback a los campos legacy

Migracion de Datos

  • Migracion estructural (Phinx BASE, idempotente): crea la tabla comprobante_condiciones_venta en todos los schemas suc* activos. No migra datos historicos.
  • Comprobantes nuevos: desde el dia de salida a produccion se guardan directamente en comprobante_condiciones_venta.
  • Comprobantes historicos: se leen con fallback. Si el comprobante no tiene filas en comprobante_condiciones_venta, se lee la condicion de venta desde los campos legacy del comprobante. El usuario no percibe diferencia.
  • Este patron evita migrar miles de registros historicos en produccion y elimina el riesgo operativo asociado.

Dependencias

Modulos internos

  • Condicion de Venta (Ventas): Recurso base que define las modalidades de pago disponibles. Ver Condicion de Venta
  • Tarjetas (Ventas): Recurso que define las tarjetas aceptadas como medio de pago. Ver Tarjetas
  • Tesoreria: Generacion de movimiento de caja unico y salidas bancarias por tarjeta
  • Cuenta Corriente: Registro de deuda del cliente por el importe de la condicion Cta.Cte
  • Reportes de Ventas: Adaptacion para leer condiciones desde comprobante_condiciones_venta

Servicios externos

  • ARCA/AFIP: Facturacion electronica. El total del comprobante debe incluir todos los recargos parciales

Dependencias de datos

  • Deben existir condiciones de venta cargadas en el sistema
  • Si se usa condicion Tarjeta, deben existir tarjetas registradas
  • Si se usa condicion Cta.Cte, el cliente debe tener cuenta corriente habilitada

Consideraciones

Seguridad

  • Solo usuarios con permiso de emision de comprobantes pueden asignar condiciones de venta
  • La validacion de cuenta corriente habilitada aplica independientemente de si la condicion Cta.Cte es total o parcial

Auditoria

  • El registro de condiciones de venta por comprobante queda en comprobante_condiciones_venta como parte del comprobante emitido
  • La trazabilidad de cada condicion permite auditar como se distribuyo el cobro

Rendimiento

  • El volumen de condiciones por comprobante es bajo (tipicamente 1 a 3 condiciones)
  • La migracion de datos debe ejecutarse sobre todos los schemas activos del sistema

Decisiones

Ver detalle completo en multiples-condiciones-venta-decisiones.md.

  • DP-001: Definir si la tarjeta se especifica dentro de cada condicion o si se mantiene como un campo separado a nivel del comprobante cuando la condicion es Tarjeta

    • Decision: Tabla unica comprobante_condiciones_venta con id_comprobante + tipo_comprobante como clave de negocio. Cubre FAC, NC y ND. La tarjeta vive dentro de cada fila de condicion.
  • DP-002: Definir el criterio de los reportes cuando un comprobante tiene multiples condiciones

    • Decision: El comprobante aparece una vez por cada condicion asignada, con el importe parcial de esa condicion.
  • DP-003: Definir si el importe base representa el monto antes o despues del recargo

    • Decision: El importe base (monto) es antes del recargo. La suma de los importes base debe igualar el subtotal antes de recargos.
  • DP-004: Evaluar si los recargos parciales cambian algo en la distribucion de alicuotas hacia AFIP/ARCA

    • Decision: Los recargos parciales no modifican la distribucion hacia AFIP/ARCA. El calculo es interno y el total resultante es lo que se envia al organismo fiscal.
  • DP-005: Evaluar si se requiere trazabilidad por condicion individual dentro del movimiento de caja

    • Decision: Se genera un unico movimiento de caja con la suma de todas las condiciones que no son Cta.Cte. Se genera un movimiento de salida bancaria por cada tarjeta con su importe correspondiente.

Criterios de Aceptacion

  • [ ] AC-001: El usuario puede asignar multiples condiciones de venta a un mismo comprobante, cada una con su importe base
  • [ ] AC-002: El sistema rechaza la operacion si la suma de los importes base no iguala el subtotal del comprobante
  • [ ] AC-003: Cada condicion aplica su recargo solo sobre su importe base asignado
  • [ ] AC-004: El total del comprobante incluye todos los recargos parciales sumados
  • [ ] AC-005: No se permite ingresar la misma condicion de venta mas de una vez, excepto Tarjeta con tarjetas distintas
  • [ ] AC-006: Todos los importes base son positivos y mayores a cero
  • [ ] AC-007: Si una condicion es Cta.Cte, se valida que el cliente tenga cuenta corriente habilitada
  • [ ] AC-008: Si una condicion es Tarjeta, se exige especificar la tarjeta
  • [ ] AC-009: Se genera un unico movimiento de caja por la suma de condiciones que no son Cta.Cte
  • [ ] AC-010: Si todas las condiciones son Cta.Cte, no se genera movimiento de caja
  • [ ] AC-011: Se genera un movimiento de salida bancaria por cada tarjeta con su importe correspondiente
  • [ ] AC-012: La deuda en cuenta corriente se registra solo por el importe de la condicion Cta.Cte
  • [ ] AC-013: Al emitir una NC/ND, el sistema precarga las condiciones de la factura original
  • [ ] AC-014: Los movimientos de tesoreria y cuenta corriente de la NC/ND son inversos a los de la factura original
  • [ ] AC-015: Los reportes obtienen la condicion de venta desde comprobante_condiciones_venta
  • [ ] AC-016: Los comprobantes existentes se migran con una unica condicion por su importe completo
  • [ ] AC-017: La migracion es idempotente y se ejecuta sobre todos los schemas activos
  • [ ] AC-018: Asignar una sola condicion de venta produce comportamiento identico al actual
  • [ ] AC-019: El comportamiento aplica igualmente para comprobantes electronicos y manuales

Notas Adicionales

  • Este proceso modifica el contrato funcional del ingreso de condiciones de venta: pasa de aceptar una unica condicion a aceptar una lista de condiciones
  • La tabla comprobante_condiciones_venta es la fuente de verdad para comprobantes nuevos. Los historicos se leen con fallback a campos legacy
  • Los impuestos (IVA y tributos) se calculan sobre la base que incluye el recargo, no sobre el importe base original
  • El endpoint actual de comprobantes cambia su contrato: condicionVenta: int pasa a condicionesVenta: array. Cambio breaking coordinado con todos los consumidores internos en el mismo ciclo