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áblaFő mezők
subscription_definitionname, code, company_client_id (gazda client), description, status, enabled, sort_order, version, valid_from, valid_to
subscription_definition_to_storeboltok
subscription_definition_planválasztható csomagok: billing_cycle (monthly, annual), subscription_price, general_discount, annual_discount, érvényesség, státusz, sorrend
subscription_definition_itemcsomagonké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

  1. Jog: form canAction(edit); mentés canSave($route, definition_id).
  2. Üres név → error_name; a client csak a felhasználó tartalmi joga szerinti, csoporthoz rendelt aktív cég lehet (error_client).
  3. 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.
  4. A modell upserteli a definíciót, a csomag- és tétel-sorokat törli és újraírja, a boltokat cseréli.
  5. A parentMap() a feature.parent_feature_id láncot járja fel (legfeljebb 20 szint, körvédett), és a hiányzó szülőket enabled = 1, unlimited tétellel ugyanabba a csomagba veszi.
  6. 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 a user_permission_state rö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 a subscription forrású sorokat cserélve, majd syncCoreRouteAccess().
  • 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 a SYSTEM ú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.

Kapcsolódó témák: előfizetés csomag használati korlát