Preambolo Il
mio obiettivo è creare codice riutilizzabile per più progetti (e anche pubblicarlo su github) per gestire gli abbonamenti. Conosco i fornitori di fatturazione stripe e ricorrenti, ma non è questo l'obiettivo del modulo. Dovrebbe essere solo un wrapper / helper per il calcolo del saldo del conto, facili notifiche per rinnovare un abbonamento e gestire i calcoli dei prezzi.
Esistono paesi in cui non è possibile utilizzare la fatturazione ricorrente a causa del fatto che i fornitori o le possibilità di pagamento hanno un supporto scarso o assente o sono troppo costosi (micropagamenti). E ci sono persone che non vogliono utilizzare la fatturazione ricorrente ma pagano la fattura manualmente / vendendo una fattura alla fine dell'anno. Quindi, per favore, non suggerire servizi di fatturazione ricorrenti, ricorrenti o simili su paypal.
Situazione
Supponiamo che tu abbia un modello che può abbonarsi a un piano di abbonamento (ad es User
.). Questo modello ha un campo che memorizza l'identificatore di un piano di abbonamento a cui è attualmente abbonato. Quindi, ad ogni modifica del piano, la modifica viene registrata.
Esiste un modello (ad es. SubscriptionPlanChanges
) Con i seguenti campi che registrano le modifiche menzionate:
subscriber
relativo al modello di abbonamento (User
in questo caso)from_plan
definendo l'identificatore del piano che il modello aveva prima della modificato_plan
definendo l'identificatore del piano che il modello ha selezionato oracreated_at
è un campo data-ora in cui è memorizzata la modificavalid_until
memorizza la data fino a quando l'abbonamento effettivo è validopaid_at
è anche un campo data-ora che definisce se (e quando) l'abbonamento è stato pagato
Certo, questo layout è discutibile.
Domanda sul saldo del conto
Quando un utente modifica il proprio piano di abbonamento, devo confrontare i campi del piano, ottenere i prezzi e calcolare la detrazione per il nuovo piano in base al piano corrente valid_until
e al suo prezzo. Dì: Ti sei iscritto per un anno del piano A ma dopo 6 mesi esegui l'upgrade al piano B, in modo da ottenere una detrazione della metà del prezzo pagato per i 6 mesi del piano A.
Quello che mi chiedo: se un utente, ad esempio, passa al piano gratuito, ha un credito che può essere dedotto se l'utente desidera passare nuovamente. Vuoi memorizzare tale valore in un campo aggiuntivo o calcolare ogni volta tutti i record relativi a quell'utente? Vuoi aggiungere / modificare qualcosa sul layout della tabella?
Domanda di facile comprensibilità
Quando arriva la fine di un periodo di abbonamento, l'utente viene avvisato e ha la possibilità di rinnovare l'abbonamento pagando di nuovo. Il modo più semplice sarebbe semplicemente aggiornare paid_at
e valid_until
con nuove opzioni di abbonamento. Tuttavia, non sono sicuro se memorizzi tutti i dati di cui qualcuno potrebbe aver bisogno, come una cronologia di pagamenti / abbonamenti.
Un'altra opzione sarebbe quella di creare un record aggiuntivo per questo, dove from_plan
e to_plan
stanno avendo lo stesso identificatore (che simboleggia quindi "nessuna modifica"). Ma ciò non interferirebbe in qualche modo con il calcolo del saldo del conto?
Se qualcuno potesse indicarmi la giusta direzione riguardo alle logiche che gestiscono tali abbonamenti, lo apprezzerei molto.
AGGIORNAMENTO
Grazie per l'aiuto ormai. Penso che la mia domanda fosse troppo vaga, quindi cercherò di essere più preciso usando meno astrazioni. Sfortunatamente, non sono ancora riuscito a risolvere il mio problema.
Il caso A
User
può essere selezionato Subscription Plan A
. Questo attualmente memorizza un SubscriptionPlanChange
per tenerne traccia. Dopo, ad esempio, 5 mesi, User
aggiorna il suo abbonamento a Subscription Plan B
. Quindi paga il prezzo per il suo nuovo abbonamento, deducendo il prezzo del piano a per i 7 mesi inutilizzati.
Caso B
Dopo 3 mesi, User
torna al suo Subscription Plan A
. Non deve pagare, ma riceve un saldo per questo in modo che, al termine dell'abbonamento, venga detratto tale saldo per il suo nuovo abbonamento.
Il caso C
User
può selezionare un piano di abbonamento per un servizio secondario con piani di abbonamento indipendenti. Lo stesso Case A
e Case B
può richiedere l'abbonamento al servizio secondario.
_Case D_
L'utente annulla uno dei suoi abbonamenti. Ciò si traduce in una ricarica del suo equilibrio.
La mia domanda (almeno attualmente) dipende principalmente da come archiviare correttamente quei dati in modo da poter riprodurre una cronologia degli abbonamenti per l'analisi aziendale e calcolare i saldi, ottenere pagamenti in sospeso in base agli abbonamenti ecc.
Inoltre, non sono sicuro se la bilancia debba essere archiviata, ad esempio nel modello stesso degli utenti, o se non è memorizzata, ma può essere calcolata in qualsiasi momento in base ai dati / cronologia memorizzati.
Alcune cose da notare, anche se non credo che dovrebbero introdurre problemi:
- Non deve essere un
User
, potrebbe essere qualsiasi cosa, ecco perchéSubscriber
è polimorfico Plans
non devono necessariamente essere piani, ma potrebbero essere ad esempioMagazines
come menzionati. Questo è quello che ho descritto con procedimento C e Caso D .