Malo da razmrdamo vijuge, a i da krene bar jedan post ovde
Dakle, billing sistem.
- Postoje
services
- Postoje
premium_services (velika je razlika u odnosu na services)
- Postoje
users
- Postoje
user_services
- Postoje
user_premium_services
Jedan korisnik može biti prijavljen na više servisa, kao što i više korisnika može biti prijavljeno na isti servis. Klasična M2M. Isto važi i za premium services.
Neke services su besplatne, neke se naplaćuju odmah (one-time), neke na kraju meseca, neke su recurring i to na periode weekly, bi-weekly, monhtly, quarterly. Pored toga, postoje i support, gde se neke stvari naplaćuju a neke ne. Recimo ne naplaćuje se otvaranje servisa, ali modifikacija postojećih servisa se naplaćuje.
Dakle, kako organizovati bazu podataka?
- Tabela
billings u kojoj se nalaze sve payable items: negativne vrednosti su plaćanja user-a, pozivine stavke su dugovanja usera. Nešto kao izvod sa bankovnog računa. Napomena: billing items se ne naplaćuju same po sebi već se kreiraju Invoices (fakture) u kojoj može biti jedna ili više billing items.
Ovde korisnik ili admin može da vidi kompletno stanje, zajedno sa history, kao i trenutni balans sa računa. Može da izabere period po želji, i tu mora biti sve što se tiče naplate korisnika.
- Tabela
invoices u kojoj se nalaze računi korisnika koje on plaća. Invoice može biti kreiran samo jednom i plaćen samo jednom. Za svako novo recurring plaćanje se kreira novi invoice.
- Tabela
recurring u kojoj su samo pravila kako i kada se kreiraju billing items. Znači, jednom dnevno, cronjob čita iz te tabele da li je nešto dospelo za billing i ako jeste kreira billing item
Pošto se neke invoices kreiraju odmah, odnosno korisnik mora prvo da plati da bi mogao da koristi sistem, pa se tek onda aktivira servis, a neke korisnik može da plati na kraju meseca, ideja je da postoje i flag-ovi koji određuju invoice rules.
Ko ima malo vremena? Neke dodatne ideje?
Napomena: pitanje je samo normalizacija baze podatak, ne sam kod ili bilo šta slično.