codebros care
Architektura

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:

DriftVýznam
missing_subscriptionskupina má tarif, ale nikdo za ni neplatí
unknown_subscriptionskupina odkazuje na předplatné, které link nezná
inactive_subscriptionpředplatné existuje, ale fakturovat se nebude
plan_mismatchfakturuje se jiný tarif, než se dodává
no_invo_contactkontakt nemá vazbu na invo.space, faktura nejde vystavit
addon_not_billedaddon (addon: "seo" nebo "ai") je zapnutý, ale jeho produkt se nefakturuje
addon_not_deliveredprodukt addonu se fakturuje, ale addon není zapnutý (nebo je Partner, kde je v ceně)
orphan_subscriptionplatí 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.

On this page