مقدمه

در سامانه‌های تلفنی، نمایش درست Caller ID (شماره تماس‌گیرنده) اهمیت زیادی دارد. اگر فرمت شماره‌ها متفاوت باشد — مثلاً بعضی با +98، بعضی با 0098، یا بدون صفر اولیه نه‌تنها ظاهر گزارش‌ها به‌هم می‌ریزد، بلکه ممکن است ماژول‌های ارتباطی (مثل 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
}
?>

نحوه عملکرد

نوع شماره ورودی خروجی اصلاح‌شده توضیح
+989121234567 09121234567 شماره موبایل با کد بین‌المللی
989121234567 09121234567 موبایل بدون +
9121234567 09121234567 اضافه‌کردن صفر اول
02144556677 02144556677 شماره ثابت صحیح
2144556677 02144556677 افزودن پیش‌شماره تهران
4455 4455 داخلی یا شماره ۴-۵ رقمی

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

  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 استفاده می‌کنی، بهتر است قبل از ذخیره در دیتابیس اجرا شود.

  • برای تماس‌های بین‌المللی، می‌توانی شرط‌های جدید اضافه کنی تا با +971 یا +964 و … هم سازگار شود.

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

5/5 - (1 امتیاز)