Appearance
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.
| Columna | Tipo | Nulable | Default | Descripcion |
|---|---|---|---|---|
id | SERIAL | NO | — | PK |
id_comprobante | INT | NO | — | ID del comprobante (factura, credito o debito) |
tipo_comprobante | VARCHAR | NO | — | Tipo: 'FAC', 'NC', 'ND' |
id_condvta | INT | NO | — | FK → condvta.cod |
monto | NUMERIC | NO | — | Importe base asignado por el usuario, antes del recargo |
porcentaje_recargo | NUMERIC | SI | 0 | Porcentaje de recargo copiado al momento de emision |
monto_recargo | NUMERIC | SI | 0 | Importe del recargo calculado |
id_tarjeta | INT | SI | NULL | FK → 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:
- El usuario facturador carga los datos del comprobante (cliente, productos, cantidades)
- El sistema calcula el subtotal del comprobante (antes de recargos)
- El usuario asigna una o mas condiciones de venta, indicando el importe base para cada una
- Si una condicion es de tipo Tarjeta, el usuario indica la tarjeta especifica y su importe
- El sistema valida que la suma de importes base iguale el subtotal del comprobante
- El sistema calcula el recargo de cada condicion sobre su importe base asignado
- El sistema calcula los impuestos (IVA y tributos) sobre la base que incluye los recargos
- El sistema determina el total del comprobante incluyendo todos los recargos parciales sumados
- Si el comprobante es electronico, el sistema lo comunica al organismo fiscal con el total final
- 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_ventaes 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:
- El usuario carga los datos del comprobante (cliente, productos, cantidades)
- El sistema calcula el subtotal del comprobante
- El usuario agrega una primera condicion de venta e indica el importe base asignado
- El usuario agrega una segunda condicion de venta e indica el importe base asignado
- El sistema valida que la suma de los importes base iguale el subtotal del comprobante
- El sistema calcula el recargo de cada condicion sobre su importe base
- El sistema calcula los impuestos sobre la base con recargos incluidos
- El sistema determina el total final del comprobante
- El usuario confirma la emision
- El sistema registra el comprobante con todas sus condiciones en
comprobante_condiciones_venta - El sistema genera un unico movimiento de caja por la suma de condiciones no-CtaCte
- El sistema genera un movimiento de salida bancaria por cada tarjeta con su importe
- El sistema genera la deuda en cuenta corriente por el importe de la condicion Cta.Cte (si aplica)
- 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:
- El usuario carga los datos del comprobante
- El sistema calcula el subtotal del comprobante
- El usuario asigna una unica condicion de venta con el importe base completo
- El sistema valida que el importe base iguale el subtotal
- El sistema calcula recargo e impuestos
- El usuario confirma la emision
- 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:
- El usuario selecciona emitir NC o ND asociada a un comprobante original
- El sistema lee las condiciones de venta del comprobante original desde
comprobante_condiciones_venta - El sistema precarga las condiciones de venta en la NC/ND con los mismos importes del comprobante original
- El usuario puede modificar los importes antes de confirmar
- El usuario confirma la emision
- El sistema registra la NC/ND con sus condiciones en
comprobante_condiciones_venta - 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_ventaen todos los schemassuc*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_ventacomo 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_ventaconid_comprobante+tipo_comprobantecomo clave de negocio. Cubre FAC, NC y ND. La tarjeta vive dentro de cada fila de condicion.
- Decision: Tabla unica
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.
- Decision: El importe base (
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_ventaes 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: intpasa acondicionesVenta: array. Cambio breaking coordinado con todos los consumidores internos en el mismo ciclo