Core & Plugins

Subscription

Tarif plans, add-ons, subscriptions and a cart-backed checkout — extracted entirely into a plugin; core keeps only invoices.

The subscription storefront — choosing a plan (fe-user).
The subscription storefront — choosing a plan (fe-user).
A subscriber's private view — active plan, tokens, add-ons, invoices.
A subscriber's private view — active plan, tokens, add-ons, invoices.
Subscriptions in the admin.
Subscriptions in the admin.
Editing a tarif plan in the admin.
Editing a tarif plan in the admin.

Model ownership

The subscription models (plan, add-on, subscription, …) live in plugins/subscription/. Core keeps only user, user_details, token and invoice tables — a core invoice has no subscription FK. The link is a SUBSCRIPTION line item whose item_id == subscription.id.

Lifecycle & payments

Payment plugins drive subscription state through the ISubscriptionLifecycle port and the line-item registry — core routes money out as bus events and line items, never by calling the plugin. Activation credits tokens and can grant permissions / user groups via events.

Checkout

Checkout selections are cart-backed: the store derives bundles/add-ons from the persisted fe-core cart (single source of truth), so a selection survives navigation and logout/login. The generic PublicCheckoutView is driven by a checkout-source registry that subscription and shop each populate.