Creo que se está complicando demasiado.
Crear un usuario tabla:
pk id_user
nm_user
fl_status (active, canceled, pendent, etc)
crear una suscripción de tabla de un usuario a muchas suscripciones:
pk id_subscription
fk id_user
fl_type (maybe there are different subscriptions, with different prices)
dt_in
dt_out
crea un pago mesa de una suscripción a muchos pagos:
pk id_payment
fk id_subscription
fl_type (card, payment order, something else)
fl_status (generated, sent, confirmed, canceled because of subscription canceled, canceled because of something else, etc)
dt_generated
dt_sent
dt_confirmed
dt_canceled
[I think you will need another fields to follow and confirm the payment, but it depends of your payment model)
Ahora necesitará construir algunos robots que se ejecutarán todos los días en un momento específico.
Si obtiene todos los clientes activos y el último pago de cada uno sabrá si se debe generar un nuevo pago si el último pago confirmado se realizó más de x días en comparación con la fecha real (depende si es prepago, postpago, etc.). En caso afirmativo, generó una nueva orden de pago.
Un robot enviará un correo electrónico o algo con la orden (y luego la bandera como).
Otro robot confirmará el pago utilizando su modelo de pago.
Por supuesto, debe definir su modelo muy bien porque cada estado de usuario necesita un robot para mantener las cosas hasta que se cancela o se envía a un juez debido a la falta de pago. es mucho trabajo que hacer, pero no hay gran problema.
ps: si se trata de un sistema más complejo, la base de datos persistirá, usted tendrá toda la información que necesita, tiene un registro de cada orden, usted sabe lo que le sucedió a cada uno de ellos porque tienen fechas y estado. Puede estimar, mensualmente, cuántas fechas de vencimiento tendrá, cuántas pagará después de un día, después de dos, y así sucesivamente.
Yo separaría los pagos en la tabla de facturas y pagos, y usaría un nombre de campo más estándar ('id', 'subscription_id', etc.) que no sea que esto se vea bien. Agile Toolkit puede manejar diferentes diseños de diseño de base de datos: http: // agiletoolkit.org/learn/understand/model/add – romaninsh