Préambule
Mon objectif est de créer du code réutilisable pour plusieurs projets (et aussi de le publier sur github) pour gérer les abonnements. Je connais les fournisseurs de facturation récurrente et stripe, mais ce n'est pas ce que vise ce module. Il devrait simplement être un wrapper / helper pour le calcul du solde du compte, des notifications faciles pour renouveler un abonnement et gérer les calculs de prix.
Il existe des pays dans lesquels vous ne pouvez pas utiliser la facturation récurrente en raison du manque ou de l'absence de prise en charge des fournisseurs ou des possibilités de paiement ou trop chers (micropaiements). Et il y a des gens qui ne veulent pas utiliser la facturation récurrente mais qui paient leur facture manuellement / avingg une facture à la fin de l'année. Veuillez donc ne pas suggérer de facturation récurrente paypal, de services récurrents ou similaires.
Situation
Imaginons que vous disposiez d'un modèle pouvant souscrire à un plan d'abonnement (par exemple User
). Ce modèle possède un champ qui stocke l'identifiant d'un plan d'abonnement auquel il est actuellement abonné. Ainsi, à chaque changement de plan, le changement est enregistré.
Il existe un modèle (par exemple SubscriptionPlanChanges
) avec les champs suivants enregistrant les changements mentionnés:
subscriber
relative au modèle d'abonnement (User
dans ce cas)from_plan
définir l'identifiant du plan du modèle avant le changementto_plan
définir l'identifiant du plan que le modèle a sélectionné maintenantcreated_at
est un champ date-heure stockant la modificationvalid_until
stocke la date jusqu'à ce que l'abonnement réel soit validepaid_at
est également un champ date-heure qui définit si (et quand) l'abonnement a été payé
Bien sûr, cette disposition est discutable.
Question du solde du compte
Lorsqu'un utilisateur modifie son plan d'abonnement, je dois comparer les champs du plan, obtenir les prix et calculer la déduction pour le nouveau plan en fonction du plan actuel valid_until
et de son prix. Dites: Vous avez souscrit pour une année de plan A mais après 6 mois, vous passez au plan B, vous obtenez donc une déduction de la moitié du prix payé pour les 6 mois du plan A.
Ce que je me demande: Si un utilisateur passe par exemple au forfait gratuit, il a un crédit qui peut être déduit si l'utilisateur veut changer de nouveau. Souhaitez-vous mettre cette valeur en cache dans un champ supplémentaire, ou calculer à travers tous les enregistrements liés à cet utilisateur à chaque fois? Souhaitez-vous ajouter / modifier quelque chose sur la disposition du tableau?
Question de facilité de compréhension
Lorsque la fin d'une période d'abonnement arrive, l'utilisateur est prévenu et a la possibilité de renouveler son abonnement en payant à nouveau. Le moyen le plus simple serait de simplement mettre à jour paid_at
et valid_until
avec de nouvelles options d'abonnement. Cependant, je ne sais pas si vous stockez toutes les données dont quelqu'un pourrait avoir besoin, comme un historique de paiement / abonnement.
Une autre option serait de créer un enregistrement supplémentaire pour cela, où from_plan
et to_plan
ayant le même identifiant (symbolisant ainsi "aucun changement"). Mais cela n'interférerait-il pas d'une manière ou d'une autre dans le calcul du solde du compte?
Si quelqu'un pouvait m'orienter dans la bonne direction concernant les logiques gérant de tels abonnements, je l'apprécierais beaucoup.
MISE
À JOUR Merci pour l'aide maintenant. Je pense que ma question était trop vague donc je vais essayer d'être plus précis en utilisant moins d'abstraction. Malheureusement, je n'ai pas encore pu résoudre mon problème.
Le cas A
User
peut être sélectionné Subscription Plan A
. Cela stocke actuellement un SubscriptionPlanChange
pour en garder la trace. Après par exemple 5 mois, User
met à niveau son abonnement vers Subscription Plan B
. Il paie donc le prix de son nouvel abonnement, en déduisant le prix du plan a pour les 7 mois non utilisés.
Cas B
Après 3 mois, User
revient au sien Subscription Plan A
. Il n'a pas à payer mais reçoit un solde pour que, à la fin de l'abonnement, il soit déduit de ce solde pour son nouvel abonnement.
Le cas C
User
peut sélectionner un plan d'abonnement pour un sous-service qui a des plans d'abonnement indépendants. Idem Case A
et Case B
peut demander cet abonnement de sous-service.
_Case D_
L'utilisateur annule l'un de ses abonnements. Il en résulte un rechargement de son équilibre.
Ma question (actuellement, au moins) dépend principalement de la façon de stocker correctement ces données afin que je puisse reproduire un historique des abonnements pour l'analyse commerciale et calculer les soldes, obtenir des paiements en cours en fonction des abonnements, etc.
Je ne sais pas non plus si le solde doit être stocké dans, par exemple, le modèle utilisateur lui-même, ou s'il n'est pas stocké mais peut être calculé à tout moment en fonction des données / de l'historique stockés.
Certaines choses à noter, bien que je ne pense pas qu'elles devraient introduire des problèmes:
- Il n'est pas nécessaire que ce soit un
User
, cela pourrait être n'importe quoi, c'est pourquoi leSubscriber
polymorphe est Plans
ne doivent pas nécessairement être des plans, mais pourraient être par exempleMagazines
comme mentionné. Voilà ce que je viens de décrire avec l' affaire C et Type D .