Sistema de comisiones para vendedores y afiliados. Soporta multiples esquemas de comision (porcentaje, fijo, escalonado), periodos de pago configurables, y reportes de earnings. Base para el modulo MLM.
Objetivos
Definir esquemas de comision flexibles
Calcular comisiones automaticamente por venta
Gestionar periodos de pago
Reportes de comisiones por vendedor
Integracion con Billing para pagos
Alcance
Incluido
Esquemas de comision configurables
Tipos: porcentaje, fijo, escalonado
Calculo automatico por transaccion
Periodos de pago (semanal, quincenal, mensual)
Estado de comisiones (pendiente, aprobada, pagada)
Dashboard de earnings
Reportes por vendedor/periodo
Excluido
Pago automatico (integracion bancaria)
Estructuras MLM complejas (SAAS-021)
Impuestos sobre comisiones
Modelo de Datos
Schema: commissions
-- Esquemas de comision
CREATETABLEcommissions.schemes(idUUIDPRIMARYKEYDEFAULTgen_random_uuid(),tenant_idUUIDNOTNULLREFERENCEStenants.tenants(id),nameVARCHAR(100)NOTNULL,descriptionTEXT,-- Tipo de calculo
typecommissions.scheme_typeNOTNULL,-- Configuracion
rateDECIMAL(10,4),-- Porcentaje (ej: 0.10 = 10%)
fixed_amountDECIMAL(15,2),-- Monto fijo
tiersJSONBDEFAULT'[]',-- Para escalonado
-- Aplicabilidad
applies_tocommissions.applies_toDEFAULT'all',product_idsJSONBDEFAULT'[]',-- Si applies_to = 'products'
category_idsJSONBDEFAULT'[]',-- Si applies_to = 'categories'
-- Limites
min_amountDECIMAL(15,2),max_amountDECIMAL(15,2),is_activeBOOLEANDEFAULTtrue,created_atTIMESTAMPTZDEFAULTNOW(),updated_atTIMESTAMPTZDEFAULTNOW());-- Asignacion vendedor-esquema
CREATETABLEcommissions.assignments(idUUIDPRIMARYKEYDEFAULTgen_random_uuid(),tenant_idUUIDNOTNULLREFERENCEStenants.tenants(id),user_idUUIDNOTNULLREFERENCESusers.users(id),scheme_idUUIDNOTNULLREFERENCEScommissions.schemes(id),-- Vigencia
starts_atDATENOTNULL,ends_atDATE,-- Override de rate
custom_rateDECIMAL(10,4),is_activeBOOLEANDEFAULTtrue,created_atTIMESTAMPTZDEFAULTNOW(),CONSTRAINTunique_assignmentUNIQUE(user_id,scheme_id,starts_at));-- Comisiones generadas
CREATETABLEcommissions.entries(idUUIDPRIMARYKEYDEFAULTgen_random_uuid(),tenant_idUUIDNOTNULLREFERENCEStenants.tenants(id),-- Beneficiario
user_idUUIDNOTNULLREFERENCESusers.users(id),scheme_idUUIDREFERENCEScommissions.schemes(id),-- Transaccion origen
reference_typeVARCHAR(50)NOTNULL,-- 'sale', 'subscription', 'referral'
reference_idUUIDNOTNULL,-- Montos
base_amountDECIMAL(15,2)NOTNULL,-- Monto de la venta
rate_appliedDECIMAL(10,4)NOTNULL,commission_amountDECIMAL(15,2)NOTNULL,currencyVARCHAR(3)DEFAULT'USD',-- Estado
statuscommissions.entry_statusNOTNULLDEFAULT'pending',-- Periodo de pago
period_idUUIDREFERENCEScommissions.periods(id),paid_atTIMESTAMPTZ,-- Metadata
notesTEXT,metadataJSONBDEFAULT'{}',created_atTIMESTAMPTZDEFAULTNOW(),updated_atTIMESTAMPTZDEFAULTNOW());-- Periodos de pago
CREATETABLEcommissions.periods(idUUIDPRIMARYKEYDEFAULTgen_random_uuid(),tenant_idUUIDNOTNULLREFERENCEStenants.tenants(id),nameVARCHAR(100)NOTNULL,starts_atDATENOTNULL,ends_atDATENOTNULL,-- Totales
total_entriesINTEGERDEFAULT0,total_amountDECIMAL(15,2)DEFAULT0,currencyVARCHAR(3)DEFAULT'USD',-- Estado
statuscommissions.period_statusNOTNULLDEFAULT'open',closed_atTIMESTAMPTZ,paid_atTIMESTAMPTZ,created_atTIMESTAMPTZDEFAULTNOW());-- Enums
CREATETYPEcommissions.scheme_typeASENUM('percentage','fixed','tiered');CREATETYPEcommissions.applies_toASENUM('all','products','categories');CREATETYPEcommissions.entry_statusASENUM('pending','approved','rejected','paid','cancelled');CREATETYPEcommissions.period_statusASENUM('open','closed','processing','paid');