""" Customer Activity Logger Helper service for logging all customer-related events """ import logging from typing import Optional, Dict, Any import json from app.core.database import execute_insert logger = logging.getLogger(__name__) class CustomerActivityLogger: """Centralized customer activity logging""" @staticmethod def log( customer_id: int, activity_type: str, description: str, user_id: Optional[int] = 1, # Default to system user metadata: Optional[Dict[str, Any]] = None ) -> Optional[int]: """ Log a customer activity event Args: customer_id: Customer ID activity_type: Type of activity (customer_updated, contact_added, subscription_changed, etc.) description: Human-readable description user_id: User ID performing action (1 = system) metadata: Additional event data as dict Returns: Activity ID or None on failure """ try: # Store metadata as JSON string if provided metadata_str = json.dumps(metadata) if metadata else None activity_id = execute_insert( """INSERT INTO customer_activities (customer_id, activity_type, description, user_id, metadata) VALUES (%s, %s, %s, %s, %s) RETURNING id""", (customer_id, activity_type, description, user_id, metadata_str) ) logger.debug(f"📝 Logged customer activity: {activity_type} for customer {customer_id}") return activity_id except Exception as e: logger.error(f"❌ Failed to log customer activity: {e}") return None # Specific activity types @staticmethod def log_created(customer_id: int, customer_name: str, user_id: Optional[int] = 1): """Log customer creation""" return CustomerActivityLogger.log( customer_id=customer_id, activity_type='customer_created', description=f'Kunde oprettet: {customer_name}', user_id=user_id ) @staticmethod def log_updated(customer_id: int, customer_name: str, fields_changed: list, user_id: Optional[int] = 1): """Log customer update""" fields_str = ', '.join(fields_changed) return CustomerActivityLogger.log( customer_id=customer_id, activity_type='customer_updated', description=f'Kunde opdateret: {customer_name} - Ændrede felter: {fields_str}', user_id=user_id, metadata={'fields_changed': fields_changed} ) @staticmethod def log_deleted(customer_id: int, customer_name: str, user_id: Optional[int] = 1): """Log customer deletion""" return CustomerActivityLogger.log( customer_id=customer_id, activity_type='customer_deleted', description=f'Kunde slettet: {customer_name}', user_id=user_id ) @staticmethod def log_contact_added(customer_id: int, contact_name: str, user_id: Optional[int] = 1): """Log contact added""" return CustomerActivityLogger.log( customer_id=customer_id, activity_type='contact_added', description=f'Kontaktperson tilføjet: {contact_name}', user_id=user_id ) @staticmethod def log_contact_updated(customer_id: int, contact_name: str, user_id: Optional[int] = 1): """Log contact updated""" return CustomerActivityLogger.log( customer_id=customer_id, activity_type='contact_updated', description=f'Kontaktperson opdateret: {contact_name}', user_id=user_id ) @staticmethod def log_contact_deleted(customer_id: int, contact_name: str, user_id: Optional[int] = 1): """Log contact deleted""" return CustomerActivityLogger.log( customer_id=customer_id, activity_type='contact_deleted', description=f'Kontaktperson slettet: {contact_name}', user_id=user_id ) @staticmethod def log_subscription_created(customer_id: int, subscription_name: str, user_id: Optional[int] = 1): """Log subscription created""" return CustomerActivityLogger.log( customer_id=customer_id, activity_type='subscription_created', description=f'Abonnement oprettet: {subscription_name}', user_id=user_id ) @staticmethod def log_subscription_updated(customer_id: int, subscription_name: str, user_id: Optional[int] = 1): """Log subscription updated""" return CustomerActivityLogger.log( customer_id=customer_id, activity_type='subscription_updated', description=f'Abonnement opdateret: {subscription_name}', user_id=user_id ) @staticmethod def log_subscription_deleted(customer_id: int, subscription_name: str, user_id: Optional[int] = 1): """Log subscription deleted""" return CustomerActivityLogger.log( customer_id=customer_id, activity_type='subscription_deleted', description=f'Abonnement slettet: {subscription_name}', user_id=user_id ) @staticmethod def log_sync(customer_id: int, source: str, details: str, user_id: Optional[int] = 1): """Log external sync""" return CustomerActivityLogger.log( customer_id=customer_id, activity_type=f'{source}_sync', description=f'{source} synkronisering: {details}', user_id=user_id, metadata={'source': source} ) # Export singleton instance customer_activity_logger = CustomerActivityLogger()