Fakturační propojení
Jak care hlídá, že co dodává, link fakturuje - zrcadlo předplatných a noční drift check.
Peníze řeší tři systémy s jasnými rolemi: link drží předplatná a je zdroj pravdy o tom, kdo za co platí. invo.space vystavuje doklady. care dodává službu a hlídá, že se obojí potkává.
Vazba: skupina, ne klient
Skupina webů se váže na předplatné přes site_groups.subscription_id. Vazba vede na předplatné, ne na kontakt klienta: plátce nemusí být provozovatel. Chaloupku provozují Míšovy chaloupky, platí za ni TPR LIBERUM HOLIDAY s.r.o. - odvození "klient, jeho kontakt, jeho předplatná" by tenhle vztah minulo. Care proto plátce vůbec nemodeluje; předplatné si svůj kontakt nese samo.
Zrcadlo linku
Care si drží kopii fakturačního přehledu v link_billing_cache (jeden řádek na kontakt, obsah jako jsonb ve tvaru, který vrací link). Plní se nočním cronem v 3:17 přes MCP tool get_billing_overview, ručně jde obnovit z adminu (stránka Skupiny). Kontakty, které z přehledu zmizí, se mažou - cache nesmí tvrdit, že někdo platí, když neplatí.
Admin díky tomu nečeká na cizí API a drift check funguje i bez sítě.
Drift check
Každou noc po zálohové údržbě se porovná stav skupin s cache (detectBillingDrift, čistá funkce v @care/shared). Hlídá se obojím směrem:
| Drift | Význam |
|---|---|
missing_subscription | skupina má tarif, ale nikdo za ni neplatí |
unknown_subscription | skupina odkazuje na předplatné, které link nezná |
inactive_subscription | předplatné existuje, ale fakturovat se nebude |
plan_mismatch | fakturuje se jiný tarif, než se dodává |
no_invo_contact | kontakt nemá vazbu na invo.space, faktura nejde vystavit |
addon_not_billed | addon (addon: "seo" nebo "ai") je zapnutý, ale jeho produkt se nefakturuje |
addon_not_delivered | produkt addonu se fakturuje, ale addon není zapnutý (nebo je Partner, kde je v ceně) |
orphan_subscription | platí se care produkt, ale žádná skupina se k němu nehlásí |
Příplatky se fakturují jako samostatné položky předplatného: care-seo (SEO monitoring, 490 Kč) a care-ai (viditelnost v AI, 690 Kč). Tarif Partner má oba v ceně, kód se u něj nefakturuje.
Nalezený drift jde na Telegram (flag billingDrift) - jednou denně, dokud trvá. Je to připomínka, ne spam: drift je vždy něco, co má člověk vyřešit rukama (propojit, přestat dodávat, nebo začít fakturovat).
Hlídaný zápis
subscription_id jde zapsat jen přes PATCH /api/admin/groups/:id a projde jen předplatné, které:
- zrcadlo linku zná (jinak: obnovit z linku),
- je aktivní,
- fakturuje produkt tarifu skupiny (
care-dohled,care-pece,care-partner), - neplatí už jinou skupinu.
Překlep v id by jinak vyrobil drift, který by se řešil až z nočního alertu. Admin UI vybírá kandidáty ze zrcadla podle stejných pravidel, takže poctivý zápis projde na první pokus.