GET /piranyaplatform/rest/v1/ordering/catalog shares the OnDemand and Repeat catalog resolver. Supply either iso_week_start_date (Monday, yyyy-MM-dd) or inclusive period_start_date/period_end_date, with an authorized program/account/department scope. Live periods span at most 93 inclusive days and must select one fulfillment source throughout. Native PCD and unrestricted contexts retain native pricing.
Local product content, categories, media and account access form the catalog foundation. The selected source enriches it with dated offers, availability and optional prices. Source filtering precedes pagination; navigation-free browsing still requires authorized category definitions. Offers keep opaque public IDs and local product/category IDs; fulfillment references remain server-side. Multiple delivery dates remain separate offers.
Display money may contain unknown tax components or be absent. Uniform VAT-inclusive amounts can supply a display total; varying amounts supply a range. A dated offer's unit_price contains complete money only when its price and Shop tax context are resolved. Missing prices never become free products. IPriceService resolves the customer/department tax region, with ITaxService site fallback, and resolves each local product's VAT rate. Source vat_included determines whether to extract VAT from the source amount or add VAT to it. There is no parallel source-specific tax setting.
Shared products expose independent presentation preferences and an eligible detail-page URL. See product presentation for nullable page availability, the wire contract and separate view/add decisions; these fields do not change source routing or purchasing authority.
Shop.Ordering.SourcePricing.ContextsByProgram is a JSON dictionary keyed by local program ID:
{
"12": { "PricingContextKey": "private-web" },
"13": { "AllowAccountPricing": true }
}
A nonempty PricingContextKey declares common program pricing. The selected provider resolves its source configuration and customer restrictions. The key identifies a logical pricing context; it does not imply an external price-group identifier. Account pricing is a separate explicit opt-in requiring an authorized selected account. Unconfigured source pricing remains non-orderable.
Source enrichment is cached independently of local product/query caches. Common pricing can be reused across accounts; customer restrictions must remain isolated. Source-specific cache keys, expiry and price precedence belong to the provider's documentation. OnDemand source-enriched full/category responses expire after one minute; native catalog caching remains unchanged.
A program's Shop.Ordering.SourcePricing.ContextsByProgram entry can opt into TestFallbackPrice alongside a nonempty common PricingContextKey:
{
"1": {
"PricingContextKey": "private-web",
"TestFallbackPrice": { "Amount": 999.99, "Currency": "DKK", "IsVatIncluded": true }
}
}
This is a configured test price, not a source price or a local product-price fallback. It fills only otherwise unpriced, valid source offers; genuine source prices take precedence. Source identities, availability, customer restrictions and tax rules remain authoritative. Amount must be positive, currency must be an uppercase three-letter code, and VAT inclusion must be explicit. Without the opt-in, unpriced offers stay unpriced.
Offers expose is_test_price; quote fingerprints and persisted ordering_source_offer evidence retain that provenance. Changing or removing the test price, or replacing it with a genuine price, invalidates accepted checkout quotes. Remove TestFallbackPrice after real common prices are verified. Payment and external submission readiness remains separate from catalog pricing.
OnDemand product-first additions carry time_cycle_period_id and product quantities, with no customer-selected offer ID. A source draft has no payable line/order money or accepted quote until its order-wide delivery_date is chosen. Catalog display prices remain independent of payable draft prices. Native contexts retain their local pricing behavior.
Date choices intersect the selected period, a unique available offer for every product, authorized source openness and local address/shipping/department/preparation constraints. Missing or ambiguous offers cannot be substituted. Cart evaluation resolves exact offer_id/offer_delivery_date values after date selection; changing the date requotes every line. One product is one cart line unless local configuration rules require otherwise; source quotes reject variants and duplicate products. Availability, local purchasing access, complete source money, currency and tax remain required. Lazy delivery-time reads use the same cart eligibility and date boundary.
The cart persists its period, selected delivery time and fulfillment context independently of its authorized scope key. SelectedDepartmentId is the resolved fulfillment choice; it does not replace the scope's department identity. Rehydration reevaluates source facts. Order persistence carries the validated period and immutable exact-offer evidence; source calendar reads perform no writes. Normal Shop migration order-1.22.13.sql supplies the cart context and exact-offer columns; no administrator-maintained publication list or product-date picker is required.
Cart evaluation resolves address-aware shipping and its fulfilling department before requesting source money. Resolved shipping selections are carried in the cart projection used by checkout. Cart responses expose source_quote_fingerprint; unavailable source quotes have null money rather than guessed totals. Source cart GET re-evaluates displayed pricing without changing cart mutation versions. Checkout sends the last displayed fingerprint and reads source enrichment fresh before customer/order/payment writes. A changed quote returns checkout.source_quote_changed; the customer refreshes and confirms again. A rejection before persistence has no order continuation or active payment. Local rebates/manual prices are unsupported for source quotes.
A trusted server quote supplies persisted order-item money and immutable source evidence through the existing order-product pricing hook. Client metadata cannot supply a quote. Department identity uses the resolved relation or its foreign key; conflicting relation/key identities are rejected. Later recalculation preserves the persisted price; changing quantity, date, account, department, program, currency or variants requires a new trusted quote. Commitment locking, payment capture scheduling and external dispatch remain separate responsibilities.
No cutover, purchasing flags or deadline calculator is activated by these services. Enrolled source-aware periods validate source-provided week/day openness for fresh quotes; calendar activation and customer availability remain separate. Runtime acceptance of rebuilt pricing remains a local integration check. Group Plan and other consumers can reuse the source-aware catalog and pricing-context seam; their commitment/write flows remain owned by those consumers.
Source-backed category navigation retains categories with offers in the complete requested week and their ancestors. It does not infer emptiness from a selected-category page or require products to be currently purchasable.