All checks were successful
- Fix platform-grouped merchant sidebar menu with core items at root level - Add merchant store management (detail page, create store, team page) - Fix store settings 500 error by removing dead stripe/API tab - Move onboarding translations to module-owned locale files - Fix onboarding banner i18n with server-side rendering + context inheritance - Refactor login language selectors to use languageSelector() function (LANG-002) - Move HTTPException handling to global exception handler in merchant routes (API-003) - Add language selector to all login pages and portal headers - Fix customer module: drop order stats from customer model, add to orders module - Fix admin menu config visibility for super admin platform context - Fix storefront auth and layout issues - Add missing i18n translations for onboarding steps (en/fr/de/lb) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
# app/modules/loyalty/services/loyalty_onboarding.py
|
|
"""
|
|
Onboarding provider for the loyalty module.
|
|
|
|
Provides the "Create your first loyalty program" step.
|
|
Completed when at least 1 LoyaltyProgram exists for the store's merchant.
|
|
"""
|
|
|
|
import logging
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.modules.contracts.onboarding import OnboardingStepDefinition
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class LoyaltyOnboardingProvider:
|
|
"""Onboarding provider for loyalty module."""
|
|
|
|
@property
|
|
def onboarding_category(self) -> str:
|
|
return "loyalty"
|
|
|
|
def get_onboarding_steps(self) -> list[OnboardingStepDefinition]:
|
|
return [
|
|
OnboardingStepDefinition(
|
|
key="loyalty.create_program",
|
|
title_key="loyalty.onboarding.create_program.title",
|
|
description_key="loyalty.onboarding.create_program.description",
|
|
icon="gift",
|
|
route_template="/store/{store_code}/loyalty/programs",
|
|
order=300,
|
|
category="loyalty",
|
|
),
|
|
]
|
|
|
|
def is_step_completed(
|
|
self, db: Session, store_id: int, step_key: str
|
|
) -> bool:
|
|
if step_key != "loyalty.create_program":
|
|
return False
|
|
|
|
from app.modules.loyalty.models.loyalty_program import LoyaltyProgram
|
|
from app.modules.tenancy.models.store import Store
|
|
|
|
# Programs belong to merchant, not store — join through store
|
|
store = db.query(Store).filter(Store.id == store_id).first()
|
|
if not store:
|
|
return False
|
|
|
|
count = (
|
|
db.query(LoyaltyProgram)
|
|
.filter(LoyaltyProgram.merchant_id == store.merchant_id)
|
|
.limit(1)
|
|
.count()
|
|
)
|
|
return count > 0
|
|
|
|
|
|
loyalty_onboarding_provider = LoyaltyOnboardingProvider()
|