Előfizetés-definíció és kiosztás – rendszerleírás
A definíció, a csomag-kapcsolat és a tételek adatmodellje, a mentés törlés-és-újraírás logikája, a szülő-funkciók pótlása és a csomag felhasználókra vitele.
Áttekintés
A definíció az előfizetési ajánlat. Ezen a képernyőn kerülnek funkciók a csomagokba; a tartalmat a kiosztó könyvtár (Dlbtprovision) viszi a felhasználók hozzárendelés-soraira. A táblanevek a telepítés saját előtagjával állnak az adatbázisban.
Adatmodell
| Tábla | Fő mezők |
|---|---|
subscription_definition | name, code, company_client_id (gazda client), description, status, enabled, sort_order, version, valid_from, valid_to |
subscription_definition_to_store | boltok |
subscription_definition_plan | választható csomagok: billing_cycle (monthly, annual), subscription_price, general_discount, annual_discount, érvényesség, státusz, sorrend |
subscription_definition_item | csomagonként: item_type (feature, product, service), item_id, enabled, limit_type (count, amount, metered, unlimited), limit_value, limit_unit, limit_period, included_quantity, unit_price, overage_price, discount (0–100), currency, note; migrált sémán reset_rule, rollover, overage_rule, pricing_rule, is_unlimited, priority |
Mentés
- Jog: form
canAction(edit); mentéscanSave($route, definition_id). - Üres név →
error_name; a client csak a felhasználó tartalmi joga szerinti, csoporthoz rendelt aktív cég lehet (error_client). - Tétel csak a definícióhoz rendelt csomagra menthető; korlát nélküli tételnél a korlát-mezők ürülnek; a kedvezmény 0–100 közé szorul.
- A modell upserteli a definíciót, a csomag- és tétel-sorokat törli és újraírja, a boltokat cseréli.
- A
parentMap()afeature.parent_feature_idláncot járja fel (legfeljebb 20 szint, körvédett), és a hiányzó szülőketenabled = 1,unlimitedtétellel ugyanabba a csomagba veszi. - Végül
dlbtentitlement->flush().
Végpontok: definition.itemsearch (Dlbtbilling::searchItems: minden aktív funkció besorolástól függetlenül, legfeljebb 12 találat, a már felvett tételeket a lekérdezés után szűri), definition.plansearch, definition.plans (a funkciójog-képernyő „Paraméterek betöltése” választója hívja). Az előre betöltött assignable lista csak BASE és SUBSCRIPTION funkciókat tartalmaz.
Törlés
Ha van hozzárendelés-sor ezzel a definition_id-val, nem töröl (error_in_use névvel és darabszámmal); különben fizikai törlés a tételekre, csomag-kapcsolatokra és a definícióra. Kuka-változat nincs. Csoportos törlésnél canBulk(delete, n).
A tartalom kiosztása
resolveTemplate($definition_id, $plan_id): a csomag-láncot (legfeljebb 50, körvédett) bejárva gyűjti az engedélyezett tételeket; ugyanaz a tétel az első előfordulással (a gyerek csomaggal) nyer.materialise(...): a sablon minden tételére upsert a felhasználó soraira (usable, korlátok, árak,origin = 'plan', dátumablak). Csere módban törli a felhasználó minden, a sablonban nem szereplő sorát (megadott forrásnál csak azt a forrást). A választást auser_permission_staterögzíti.syncClientPlan(): a client aktív előfizetését (az előfizetés-gazdán át öröklődve) a client minden felhasználójára viszi, csak asubscriptionforrású sorokat cserélve, majdsyncCoreRouteAccess().syncCoreRouteAccess(): clienthez tartozó, nem super felhasználót a client saját alap-csoportjába tesz, és a csoport útvonal-jogait a felhasználók érvényes funkcióira, azok függőségeire és aSYSTEMútvonalakra cseréli; client nélküli felhasználónál csak hozzáad.materialiseResources(): a tételekből idempotens keret-jóváírás az erőforrás-főkönyvbe.
Jogosultság
list, edit, delete, debug: SYSTEM; az add nincs besorolva (csak canSave kérdezi, az edit dönt). A lista nem szűr tartalmi jogra; a client-szűrő a getCompanyGroupFilter()-en át szűkül.