Preámbulo
Mi objetivo es crear código reutilizable para múltiples proyectos (y también publicarlo en github) para administrar suscripciones. Sé acerca de los proveedores de stripe y facturación recurrente, pero ese no es el objetivo de este módulo. Solo debe ser un contenedor / ayuda para calcular el saldo de la cuenta, notificaciones fáciles para renovar una suscripción y manejar los cálculos de precios.
Hay países en los que no puede utilizar la facturación recurrente debido a que los proveedores o las posibilidades de pago tienen poco o ningún soporte o son demasiado caros (micropagos). Y hay personas que no quieren usar la facturación recurrente, sino que pagan su factura manualmente / esperando una factura al final del año. Por lo tanto, no sugiera la facturación recurrente de PayPal, servicios recurrentes o similares.
Situación
Supongamos que tiene un modelo que puede suscribirse a un plan de suscripción (por ejemplo User
). Este modelo tiene un campo que almacena el identificador de un plan de suscripción al que está suscrito actualmente. Entonces, en cada cambio de plan, se registra el cambio.
Hay un modelo (por ejemplo SubscriptionPlanChanges
) con los siguientes campos que registran los cambios mencionados:
subscriber
relacionado con el modelo de suscripción (User
en este caso)from_plan
Definir el identificador del plan que tenía el modelo antes del cambioto_plan
definiendo el identificador de plan que el modelo ha seleccionado ahoracreated_at
es un campo de fecha y hora que almacena el cambiovalid_until
almacena la fecha hasta que la suscripción real sea válidapaid_at
también es un campo de fecha y hora que define si (y cuándo) se pagó la suscripción
Por supuesto, ese diseño es discutible.
Pregunta sobre el saldo de la cuenta
Cuando un Usuario cambia su plan de suscripción, necesito comparar los campos del plan, obtener los precios y calcular la deducción para el nuevo plan en función del plan actual valid_until
y su precio. Diga: Se suscribió por un año del plan A pero después de 6 meses, se actualiza al plan B, por lo que obtiene una deducción de la mitad del precio pagado por los 6 meses del plan A.
Lo que me pregunto: si un usuario, por ejemplo, cambia al plan gratuito, tiene un crédito que puede deducirse si el usuario desea cambiar nuevamente. ¿Guardaría ese valor en un campo adicional o calcularía todos los registros relacionados con ese usuario cada vez? ¿Agregarías / cambiarías algo sobre el diseño de la tabla?
Cuestión de fácil comprensión
Cuando llega el final de un período de suscripción, el usuario recibe una notificación y tiene la posibilidad de renovar su suscripción pagando nuevamente. La forma más fácil sería simplemente actualizar paid_at
y valid_until
con nuevas opciones de suscripción. Sin embargo, no estoy seguro de si almacena todos los datos que alguien pueda necesitar, como un historial de pagos / suscripciones.
Otra opción sería crear un registro adicional para esto, donde from_plan
y to_plan
estén teniendo el mismo identificador (simbolizando así "sin cambio"). ¿Pero eso no interferiría con el cálculo del saldo de la cuenta de alguna manera?
Si alguien pudiera señalarme en la dirección correcta sobre las lógicas que manejan tales suscripciones, lo agradecería mucho.
ACTUALIZACIÓN
Gracias por la ayuda por ahora. Creo que mi pregunta era demasiado vaga, así que intentaré ser más preciso usando menos abstracción. Desafortunadamente, no pude resolver mi problema todavía.
El caso A
User
puede seleccionar Subscription Plan A
. Actualmente almacena un SubscriptionPlanChange
para realizar un seguimiento. Después de, por ejemplo, 5 meses, User
actualiza su suscripción a Subscription Plan B
. Entonces paga el precio de su nueva suscripción, deduciendo el precio del plan a por los 7 meses no utilizados.
Caso B
Después de 3 meses, User
regresa al suyo Subscription Plan A
. No tiene que pagar, pero recibe un saldo para que, al final de la suscripción, obtenga ese saldo deducido por su nueva suscripción.
El Caso C
User
puede seleccionar un plan de suscripción para un subservicio que tenga planes de suscripción independientes. Lo mismo Case A
y Case B
puede solicitar esa suscripción de sub-servicio.
_Case D_
El usuario cancela una de sus suscripciones. Esto resulta en una recarga de su saldo.
Mi pregunta (actualmente, al menos) depende principalmente de cómo almacenar esos datos correctamente para poder reproducir un historial de suscripciones para análisis de negocios y calcular saldos, obtener pagos pendientes basados en las suscripciones, etc.
Tampoco estoy seguro de si la balanza debe almacenarse, por ejemplo, en el modelo del usuario, o si no está almacenada, pero puede calcularse en cualquier momento en función de los datos / historial almacenados.
Algunas cosas a tener en cuenta, aunque no creo que deban introducir problemas:
- No tiene que ser un
User
, podría ser cualquier cosa, es por eso queSubscriber
es polimórfico Plans
no necesariamente tiene que ser un plan, pero podría ser, por ejemplo,Magazines
como se menciona. Eso es lo que he descrito con el asunto C y Caso D .