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:
subscriberrelative au modèle d'abonnement (Userdans ce cas)from_plandéfinir l'identifiant du plan du modèle avant le changementto_plandéfinir l'identifiant du plan que le modèle a sélectionné maintenantcreated_atest un champ date-heure stockant la modificationvalid_untilstocke la date jusqu'à ce que l'abonnement réel soit validepaid_atest é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_untilet 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_atet valid_untilavec 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_planet to_planayant 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 SubscriptionPlanChangepour en garder la trace. Après par exemple 5 mois, Usermet à 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, Userrevient 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 Aet Case Bpeut 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 leSubscriberpolymorphe est Plansne doivent pas nécessairement être des plans, mais pourraient être par exempleMagazinescomme mentionné. Voilà ce que je viens de décrire avec l' affaire C et Type D .