Пишемо примітивну білінг-статистику для Asterisk

Етап 1: вивчаємо структуру таблиці cdr та що в ній зберігається

Нам цікаві поля:

  • src-джерело;
  • dst – призначення;
  • billsec – секунди, що тарифікуються (секунди після зняття трубки);
  • channel - використовуваний канал;
  • dstchannel - канал напряму;
  • calldate – дата та час;
  • uniqueid – унікальний ідентифікатор;
  • disposition – що трапилося з викликом: ANSWERED, NO ANSWER, BUSY, FAILED.
  • userfield – вільне поле.
Етап 2: Створюємо свої таблиці.

price_russia – таблиця з кодами регіонів України та цінами.

price_international - таблиця з кодами країн та цінами.

clients - таблиця з клієнтами.

* Поле rate дозволяє давати знижку або ставити націнку для клієнта (пишемо 90 - даємо знижку в 10 відсотків, ставимо 110 - отримуємо націнку в 10 відсотків).

clients_ext – зіставлення клієнтів та екстеншенів.

сalls - таблиця з обробленими дзвінками.

*type – тип дзвінка (вхідний/вихідний).

Етап 3: Обробка даних.

Передбачається, що даний скрипт буде запускатися за розкладом, і що б нічого не пропустити, на початку виконання скрипту ми помічаємо необроблені рядки, для того щоб обробляти тільки їх, і не чіпати ті, які можуть з'явитися поки виконується скрипт:

Перше що ми робимо - це завантажуємо в масив інформацію про: 1. Клієнтах, їх екстеншенах, групах та множнику.

2. Коди регіонів, опис та ціни по Україні.

3. Коди країн, опис та ціни по світу.

Відповідно робимо ми ось що:

Тепер можемо вибрати з бази, зазначені рядки та розпочати обробку.

Власне обробка (перед першим викликом функції я наводжу цю функцію, хоча природно вониповинні розташовуватися або на початку файлу або в сусідньому файлі.) :

Визначаємо напрям дзвінка:

Тепер нам потрібно визначити екстеншен, яким ми зможемо визначити клієнта. Екстеншен можна витягти з каналу, у таблиці cdr - це поля "channel" при вихідному виклику і "dstchannel" при вхідному.

* знаю що тут краще використовувати регулярні вирази, але…

Тепер визначаємо, якому клієнту належить екстеншен.

Округлюємо секунди до хвилин:

Якщо внутрішній або вхідний дзвінок, ціну можна встановити в нуль, а опис залишити порожнім. А в іншому випадку потрібно визначити куди пішов дзвінок.

Визначаємо ціну дзвінка:

Тепер ми маємо все, що б, записати інформацію про дзвінок в таблицю.

І в самому кінці, помітити рядки як повністю в оброблені:

Написане вище писалося під Москву, але легко може бути перероблено під інше місто або країну. Посилання на вихідні коди: 77.108.85.102/habr/import.php.txt, 77.108.85.102/habr/functions.php.txt,

А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»