مقدمه

در سامانه‌های تلفنی، نمایش درست Caller ID (شماره تماس‌گیرنده) اهمیت زیادی دارد. اگر فرمت شماره‌ها متفاوت باشد — مثلاً بعضی با +۹۸، بعضی با ۰۰۹۸، یا بدون صفر اولیه نه‌تنها ظاهر گزارش‌ها به‌هم می‌ریزد، بلکه ممکن است ماژول‌های ارتباطی (مثل API یا CRM) شماره را به‌درستی تشخیص ندهند.

برای رفع این مشکل، معمولاً در لایهٔ AGI یا API سمت سرور تابعی نوشته می‌شود تا فرمت همهٔ شماره‌ها را یکسان (نرمال‌سازی) کند.

هدف تابع EditCid()

تابع زیر برای اصلاح شماره‌ها در سیستم تلفنی طراحی شده است. هدف آن این است که شمارهٔ ورودی (اعم از موبایل، ثابت یا داخلی) را به فرمتی استاندارد تبدیل کند که همیشه با صفر شروع شود و برای تحلیل یا ذخیره‌سازی مناسب باشد.

کد کامل تابع اصلاح Caller ID

<?php
/**
 * EditCid()
 * Normalize and correct caller IDs for Iranian phone numbers.
 * Usage: echo EditCid('+989121234567'); // returns 09121234567
 */

function EditCid($PhoneNumber) {
    $PhoneNumber = preg_replace('/\D/', '', $PhoneNumber); // remove non-digits

    if (substr($PhoneNumber, 0, 2) == '09' && strlen($PhoneNumber) == 11) {
        return $PhoneNumber; // already correct mobile
    } elseif (substr($PhoneNumber, 0, 1) == '9' && strlen($PhoneNumber) == 10) {
        return "0$PhoneNumber"; // add missing 0
    } elseif (substr($PhoneNumber, 0, 4) == '+989' && strlen($PhoneNumber) == 13) {
        return substr_replace($PhoneNumber, "09", 0, 4); // remove +98
    } elseif (substr($PhoneNumber, 0, 3) == '989' && strlen($PhoneNumber) == 12) {
        return substr_replace($PhoneNumber, "09", 0, 3); // remove 98
    } elseif (substr($PhoneNumber, 0, 4) == '2109' && strlen($PhoneNumber) == 13) {
        return substr_replace($PhoneNumber, "09", 0, 4); // handle malformed prefixes
    } elseif (substr($PhoneNumber, 0, 3) == '219' && strlen($PhoneNumber) == 12) {
        return substr_replace($PhoneNumber, "09", 0, 3);
    } elseif (substr($PhoneNumber, 0, 4) == '9821' && strlen($PhoneNumber) == 12) {
        return substr_replace($PhoneNumber, "021", 0, 4); // Tehran numbers
    } elseif (substr($PhoneNumber, 0, 2) == '21' && strlen($PhoneNumber) == 10) {
        return substr_replace($PhoneNumber, "021", 0, 2); // missing 0 for landline
    } elseif (strlen($PhoneNumber) == 10) {
        return "0$PhoneNumber";
    } elseif (substr($PhoneNumber, 0, 1) == '0' && substr($PhoneNumber, 0, 2) != '09' && strlen($PhoneNumber) == 11) {
        return $PhoneNumber; // valid landline
    } elseif (strlen($PhoneNumber) == 4) {
        return $PhoneNumber; // extension
    }

    return $PhoneNumber; // fallback
}
?>

نحوه عملکرد

نوع شماره ورودی خروجی اصلاح‌شده توضیح
+۹۸۹۱۲۱۲۳۴۵۶۷ ۰۹۱۲۱۲۳۴۵۶۷ شماره موبایل با کد بین‌المللی
۹۸۹۱۲۱۲۳۴۵۶۷ ۰۹۱۲۱۲۳۴۵۶۷ موبایل بدون +
۹۱۲۱۲۳۴۵۶۷ ۰۹۱۲۱۲۳۴۵۶۷ اضافه‌کردن صفر اول
۰۲۱۴۴۵۵۶۶۷۷ ۰۲۱۴۴۵۵۶۶۷۷ شماره ثابت صحیح
۲۱۴۴۵۵۶۶۷۷ ۰۲۱۴۴۵۵۶۶۷۷ افزودن پیش‌شماره تهران
۴۴۵۵ ۴۴۵۵ داخلی یا شماره ۴-۵ رقمی

چرا این تابع مهم است؟

  1. جلوگیری از تکرار شماره‌ها در CRM — همه شماره‌ها در یک فرمت ذخیره می‌شوند.

  2. تطبیق راحت‌تر تماس‌ها با مشتریان — تماس‌های ورودی با شماره‌های ذخیره‌شده مطابقت می‌یابند.

  3. افزایش دقت گزارش‌گیری — در آمار تماس‌ها و فاکتورهای فروش.

  4. استفاده در AGI یا Webhook تماس — قبل از ذخیره‌سازی CallerID در دیتابیس.

استفاده در استریسک (AGI)

مثال ساده در دیال‌پلن:

exten => 200,1,NoOp(Normalizing CallerID)
 same => n,AGI(edit_cid.php,${CALLERID(num)})
 same => n,Set(CALLERID(num)=${NEWCID})
 same => n,Playback(thank-you)
 same => n,Hangup()

و در فایل edit_cid.php می‌توانید نتیجه را با دستور زیر برگردانید:

#!/usr/bin/php -q
<?php
require_once '/var/lib/asterisk/agi-bin/EditCid.php';

$agi = new AGI();
$number = $argv[1];
$normalized = EditCid($number);

$agi->set_variable("NEWCID", $normalized);
?>

نکات حرفه‌ای

  • اگر از این تابع در پروژه‌های CRM استفاده می‌کنی، بهتر است قبل از ذخیره در دیتابیس اجرا شود.

  • برای تماس‌های بین‌المللی، می‌توانی شرط‌های جدید اضافه کنی تا با +۹۷۱ یا +۹۶۴ و … هم سازگار شود.

  • حتماً preg_replace('/\D/', '', $PhoneNumber) را نگه دار تا ورودی‌های آلوده به کاراکترهای غیرعددی حذف شوند.

۵/۵ - (۱ امتیاز)