From 814271e7b1452f7674e9ab1d5b79dc381b71708f Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 29 Jan 2026 13:20:38 +0530 Subject: [PATCH] feat: check for duplicate phone number in campaign --- api/services/campaign/source_validator.py | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/api/services/campaign/source_validator.py b/api/services/campaign/source_validator.py index b622808..e031e56 100644 --- a/api/services/campaign/source_validator.py +++ b/api/services/campaign/source_validator.py @@ -85,6 +85,36 @@ def _validate_source_data( ), ) + # Check for duplicate phone numbers + seen_phones: dict[str, int] = {} # phone -> first row where it appeared + duplicate_rows = [] + for row_idx, row in enumerate(rows, start=2): + if len(row) <= phone_number_idx: + continue + + phone_number = row[phone_number_idx].strip() + if not phone_number: + continue + + if phone_number in seen_phones: + duplicate_rows.append(row_idx) + else: + seen_phones[phone_number] = row_idx + + if duplicate_rows: + if len(duplicate_rows) > 5: + rows_str = f"{', '.join(map(str, duplicate_rows[:5]))} and {len(duplicate_rows) - 5} more" + else: + rows_str = ", ".join(map(str, duplicate_rows)) + + return ValidationResult( + is_valid=False, + error=ValidationError( + message=f"Duplicate phone numbers found in rows: {rows_str}. Phone numbers in a campaign must be unique.", + invalid_rows=duplicate_rows, + ), + ) + return ValidationResult(is_valid=True)