The storefront create/edit/manage UI and the public storefront page were
give's church-donation flow relabeled. Replace with genuine merchant
storefronts, reusing the QR-core manager + validator (which already build
sections/services content):
- Merchant create: type picker (shop/menu/booking) + per-type editors in a
shared partial (products/menu items with prices; bookable services with
days/hours). x-if per type so inputs never collide across types.
- StorefrontController store/update/create now delegate to QrCodeManagerService
for all three types (was hardcoded church org_type/denomination/collection).
- Storefront show = QR preview + download + live toggle + delete + full editor.
- QrCodeManagerService: shop/menu/booking are free (no QR-wallet gate); drop
the duplicate church TYPE_SHOP arm in hasContentChanges.
- Public: new storefront catalog+cart view for shop/menu (posts items[] to the
existing order/Pay flow); route shop+menu to it. Booking already had a real
public page; church TYPE_SHOP landing branch retired.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The customize script's blind TYPE_CHURCH→TYPE_SHOP and churchLogo→menuLogo
replacements created a duplicate QrCode::TYPE_SHOP constant and duplicate
QrScanController::menuLogo()/menuCover() methods — fatal at request time
(crashed /dashboard with 500). The menu* methods already cover TYPE_SHOP,
so drop the redundant church-origin copies.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>