# 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/settings", 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 exists = ( db.query(LoyaltyProgram) .filter(LoyaltyProgram.merchant_id == store.merchant_id) .first() is not None ) return exists loyalty_onboarding_provider = LoyaltyOnboardingProvider()