""" Customer Service Module This module contains customer-related functions including: - Stripe customer ID lookup and creation - MySQL customer billing queries - Customer data retrieval """ import logging import pymysql from typing import Optional, Dict, Any logger = logging.getLogger(__name__) def get_stripe_customer_id_from_mysql(splynx_id: int, mysql_config: dict) -> Optional[str]: """ Query MySQL database to get Stripe customer ID for a Splynx customer. Args: splynx_id: Customer ID in Splynx mysql_config: MySQL connection configuration dictionary Returns: Stripe customer ID if found, None otherwise """ connection = None try: connection = pymysql.connect( host=mysql_config['host'], database=mysql_config['database'], user=mysql_config['user'], password=mysql_config['password'], port=mysql_config['port'], autocommit=False, cursorclass=pymysql.cursors.DictCursor ) query = """ SELECT field_1 AS stripe_customer_id FROM payment_account_data WHERE customer_id = %s LIMIT 1 """ with connection.cursor() as cursor: cursor.execute(query, (splynx_id,)) result = cursor.fetchone() if result and result.get('stripe_customer_id'): logger.info(f"Found Stripe customer ID for Splynx ID {splynx_id}: {result['stripe_customer_id']}") return result['stripe_customer_id'] else: logger.warning(f"No Stripe customer ID found for Splynx ID {splynx_id}") return None except pymysql.Error as e: logger.error(f"MySQL Error while fetching Stripe customer ID: {e}") return None except Exception as e: logger.error(f"Unexpected error while fetching Stripe customer ID: {e}") return None finally: if connection: connection.close() def get_customer_from_splynx(splynx, splynx_id: int) -> Optional[Dict[str, Any]]: """ Get customer information from Splynx API. Args: splynx: Splynx API client instance splynx_id: Customer ID in Splynx Returns: Customer data dictionary if found, None otherwise """ try: customer_data = splynx.Customer(splynx_id) if customer_data != 'unknown': return customer_data else: logger.warning(f"Customer {splynx_id} not found in Splynx") return None except Exception as e: logger.error(f"Error fetching customer {splynx_id} from Splynx: {e}") return None def get_stripe_customer_id_from_splynx(splynx, splynx_id: int) -> Optional[str]: """ Get Stripe customer ID from Splynx additional attributes. Args: splynx: Splynx API client instance splynx_id: Customer ID in Splynx Returns: Stripe customer ID if found, None otherwise """ try: customer_data = get_customer_from_splynx(splynx, splynx_id) if customer_data: # Check for Stripe customer ID in additional attributes additional_attrs = customer_data.get('additional_attributes', {}) stripe_id = additional_attrs.get('stripe_customer_id') if stripe_id: logger.info(f"Found Stripe customer ID in Splynx attributes for customer {splynx_id}") return stripe_id return None except Exception as e: logger.error(f"Error fetching Stripe ID from Splynx for customer {splynx_id}: {e}") return None def create_stripe_customer(stripe_processor, email: str, name: str, splynx_id: int) -> Optional[str]: """ Create a new Stripe customer. Args: stripe_processor: StripePaymentProcessor instance email: Customer email name: Customer name splynx_id: Customer ID in Splynx (for metadata) Returns: Stripe customer ID if created successfully, None otherwise """ try: # This would use the Stripe API via stripe_processor # For now, just log that this would need implementation logger.info(f"Creating new Stripe customer for {email} (Splynx ID: {splynx_id})") # Implementation would go here using stripe_processor # customer = stripe_processor.create_customer(email=email, name=name, metadata={'splynx_id': splynx_id}) # return customer.id return None except Exception as e: logger.error(f"Error creating Stripe customer: {e}") return None