import phonenumbers from frappe.utils import floor from phonenumbers import NumberParseException from phonenumbers import PhoneNumberFormat as PNF def parse_phone_number(phone_number, default_country="IN"): try: # Parse the number number = phonenumbers.parse(phone_number, default_country) # Get various information about the number result = { "is_valid": phonenumbers.is_valid_number(number), "country_code": number.country_code, "national_number": str(number.national_number), "formats": { "international": phonenumbers.format_number(number, PNF.INTERNATIONAL), "national": phonenumbers.format_number(number, PNF.NATIONAL), "E164": phonenumbers.format_number(number, PNF.E164), "RFC3966": phonenumbers.format_number(number, PNF.RFC3966), }, "type": phonenumbers.number_type(number), "country": phonenumbers.region_code_for_number(number), "is_possible": phonenumbers.is_possible_number(number), } return {"success": True, **result} except NumberParseException as e: return {"success": False, "error": str(e)} def are_same_phone_number(number1, number2, default_region="IN", validate=True): """ Check if two phone numbers are the same, regardless of their format. Args: number1 (str): First phone number number2 (str): Second phone number default_region (str): Default region code for parsing ambiguous numbers Returns: bool: True if numbers are same, False otherwise """ try: # Parse both numbers parsed1 = phonenumbers.parse(number1, default_region) parsed2 = phonenumbers.parse(number2, default_region) # Check if both numbers are valid if validate and not (phonenumbers.is_valid_number(parsed1) and phonenumbers.is_valid_number(parsed2)): return False # Convert both to E164 format and compare formatted1 = phonenumbers.format_number(parsed1, phonenumbers.PhoneNumberFormat.E164) formatted2 = phonenumbers.format_number(parsed2, phonenumbers.PhoneNumberFormat.E164) return formatted1 == formatted2 except phonenumbers.NumberParseException: return False def seconds_to_duration(seconds): if not seconds: return "0s" hours = floor(seconds // 3600) minutes = floor((seconds % 3600) // 60) seconds = floor((seconds % 3600) % 60) # 1h 0m 0s -> 1h # 0h 1m 0s -> 1m # 0h 0m 1s -> 1s # 1h 1m 0s -> 1h 1m # 1h 0m 1s -> 1h 1s # 0h 1m 1s -> 1m 1s # 1h 1m 1s -> 1h 1m 1s if hours and minutes and seconds: return f"{hours}h {minutes}m {seconds}s" elif hours and minutes: return f"{hours}h {minutes}m" elif hours and seconds: return f"{hours}h {seconds}s" elif minutes and seconds: return f"{minutes}m {seconds}s" elif hours: return f"{hours}h" elif minutes: return f"{minutes}m" elif seconds: return f"{seconds}s" else: return "0s"