Нарахування податків в Tariscope
Ця стаття призначена телекомунікаційним провайдерам (операторам зв’язку та провайдерам телекомунікаційних послуг, зокрема інтернет), які використовують або планують використовувати білінгову систему Tariscope Provider (SoftPI або ПП «СОФТ ПІ АЙ»)
Якщо розглядати українських телекомунікаційних провайдерів, то вони повинні нараховувати лише один податок на надані послуги, а саме податок на додану вартість (ПДВ). В Україні нарахування ПДВ регламентується Податковим Кодексом України (ПКУ).
Українські телеком провайдери мають право нараховувати ПДВ на весь обсяг послуг, наданих за місяць, оскільки електронні комунікаційні послуги (доступ до інтернету, телефонія тощо) мають безперервний або ритмічний характер. Тому можна розглядати два варіанта адміністрування ПДВ:
- Формувати зведену податкову накладну за весь місяць.
- Формування накладних за принципом першої події (або при отриманні оплати від абонента, або підписання акту наданих послуг).
В першому варіанті для абонентів – фізичних осіб (неплатників ПДВ) провайдер може скласти одну загальну зведену податкову накладну наприкінці місяця. А для абонентів – юридичних осіб, які є платниками ПДВ, зведена податкова накладна повинна створюватися окремо для кожного абонента не пізніше останнього дня місяця із врахуванням усього місячного обсягу наданих йому послуг.
В другому варіанті при отримання декількох оплат від абонента протягом місяця, на кожну з оплат треба складати окрему податкову накладну. Тому на нашу думку перший варіант адміністрування ПДВ має перевагу, бо зменшує витрати на адміністрування ПДВ і зменшує документообіг.
Тепер перейдемо до налаштування білінгової системи Tariscope Provider, що стосується послуг і ПДВ.
Тут також існують варіанти: ціни тарифів для тарифікації викликів та послуг (періодичні та разові) можна задати як з ПДВ, так і без нього.
В першому варіанті сума наданих послуг за місяць вже буде містити ПДВ, і відповідно, його треба відрахувати з цієї суми.
В другому варіанті сума наданих послуг буде без ПДВ і, виходячи з цього, треба її нарахувати.
Ми не маємо статистики, який з цих варіантів в більшості обирають провайдери. Але Tariscope дозволяє реалізувати будь-який з цих варіантів. На нашу думку більш правильним є варіант, коли ціна тарифів і послуг задається в Tariscope без ПДВ, а ПДВ нараховується на загальну суму наданих послуг за місяць.
Розглянемо в першу чергу цей варіант.
Створіть всі необхідні тарифи для всіх тарифних планів, де ціни тарифів не включають ПДВ. Як це зробити, дивіться в документації на Tariscope.
Створіть необхідні періодичні та разові послуги, які надає ваша компанія, вказавши ціни послуг без ПДВ. Опис того, як послуги задаються в Tariscope, описано в документації. Призначте ці послуги абонентам або на їх окремі телефонні номери або IP адреси.
ПДВ на послуги
В Tariscope існує можливість додання податків, але вони повинні прив’язуватися до конкретної послуги. Відповідно, вони і нараховуються на кожну окрему послугу. Якщо ми бажаємо, щоб ПДВ нараховувалося на всі послуги, які були надані протягом місяця, то це можна зробити за допомогою звіту – процедури, які є в комплекті Tariscope. При цьому нарахування ПДВ буде виконуватися дещо подібно до нарахування послуги. Тому на сторінці «Послуги» треба створити нову послугу, наприклад, з назвою «Нарахування ПДВ». При цьому в якості періоду розрахунку слід обрати «Особливий період». Приклад цього на малюнку 1.

Малюнок 1
В залежності від того, в який період прийнято в компанії нараховувати вартість послуг на рахунки абонентів, виконайте це нарахування.
Нарахування періодичних послуг абонентам можливо як індивідуально, так і для всіх абонентів або групи абонентів.
Індивідуальне нарахування періодичних послуг виконується на відповідній сторінці рахунку конкретного абонента в розділі «Рахунки абонентів». Виберіть необхідний рік і місяць і клацніть по іконці «Операції по рахунку» на панелі інструментів. В меню, що з’явиться виберіть пункт «Нарахувати періодичні послуги». Тут також можна нарахувати індивідуально одноразові послуги. Для цього слід скористатися пунктом меню «Нарахувати послугу вручну».
Нарахування послуг всім абонентам можна зробити або вручну на сторінці «Рахунки абонентів» або автоматично за допомогою відповідної задачі Планувальника Tariscope.
Для ручної ініціації нарахування періодичних послуг абонентам перейдіть на сторінку «Рахунки абонентів» і клацніть по іконці «Нарахування послуг за місяць». У вікні з такою ж назвою, що з’явиться, виберіть рік і місяць за який повинні бути нараховані періодичні послуги, а також відповідний вузол зв’язку, якщо в Tariscope налаштовано декілька вузлів зв’язку. Клацніть по кнопці «Запустити».
Для автоматичного нарахування періодичних послуг абонентам треба створити відповідну задачу для Планувальника Tariscope. Перейдіть в цей пункт меню і виберіть «Перелік задач» і створіть відповідну задачу, як показано на малюнку 2.

Малюнок 2
По закінченню місяця, коли перевірено правильність тарифікації викликів, нараховані періодичні послуги і додані одноразові послуги всім абонентам, можна виконати нарахування ПДВ.
Нарахувати одноразові послуги можна абоненту як вручну, задавши відповідні параметри одноразової послуги в рахунку конкретного абонента («Операції по рахунку» → «Нарахувати послугу вручну»), так і імпортувавши їх з Excel файлу для всіх абонентів, куди вони попередньо були занесені (сторінка «Рахунки абонентів» → «Нарахування одноразової послуги»).
Нарахування ПДВ можливо як запуском вручну відповідного звіту – процедури, так і автоматично за допомогою відповідної задачі Планувальника Tariscope.
Tariscope містить дві форми звітів – процедур, які можна використати для нарахування ПДВ на всі послуги надані в конкретному місяці:
- «Звіт - процедура для нарахування ПДВ всім абонентам», файл vat-calculation.rdl.
- «Звіт - процедура для індивідуального нарахування ПДВ», файл individual-vat-calculation.rdl.
Звіт - процедура для нарахування ПДВ всім абонентам виконує нарахування ПДВ всім абонентам. Після виконання нарахування ПДВ створюється один звіт, який містить таблицю зі списком абонентів, нарахованими їм сумами за послуг за обраний місяць, нарахованому ПДВ, та загальній сумі по кожному абоненту. Є також рядок з загальними сумами по всім абонентам.
Перед запуском виконання цього звіту треба перевірити, що в системних змінних (Додаткові опції → Системні змінні) є змінна VAT, значення якої відповідає відсотку ПДВ. Якщо у вас такої системної змінної немає, створіть її і призначте їй відсоток ПДВ, який діє в поточний час.
Далі треба задати параметри звіту. Приклад задання параметрів звіту показаний на малюнку 3.

Малюнок 3
Номер місяця: треба вказати номер місяця, за який буде виконано нарахування ПДВ.
Рік: рік, за який буде виконано нарахування ПДВ.
ID послуги: ідентифікатор послуги для ПДВ, яка була створена на попередньому кроці.
Опис: назва, з якою нарахування ПДВ буде записуватися в рахунок абонента.
Запуск цієї процедури – звіту на виконання призводить до нарахування ПДВ всім абонентам, у яких нарахування послуг за відповідний місяць більше 0, а також формується звіт, приклад якого наведений на малюнку 4.

Малюнок 4
Звіт містить інформацію про місяць і рік, за які нарахований ПДВ, і таблицю зі списком абонентів. Таблиця відображає номер особистого рахунку абонента, його повну назву, суму за нараховані послуги, ПДВ і загальну суму.
В кінці таблиці є рядок з підсумковими даними.
Для автоматичного виконання цього звіту треба створити відповідну задачу для Планувальника Tariscope. Приклад параметрів такої задачі показаний на малюнку 5.

Малюнок 5
Для автоматичного виконання цієї задачі треба в списку Тип вибрати значення Щомісяця.
Тип задачі: вибрати Формування звіту
Назва звіту: вибрати Звіт - процедура для нарахування ПДВ всім абонентам
В параметрах звіту задати ті ж самі, що і на малюнку 3, але для Номер місяця вказати 0, якщо ви бажаєте виконувати нарахування за попередній місяць.
Шлях до файлу: вказати теку, де будуть зберігатися згенеровані звіти. Така тека повинна існувати на диску. Шаблон файлу: вказати шаблон файлу звіту.
Після цього запустити задачу.
Перевагою цього звіту є нарахування ПДВ зразу всім абонентам з отриманням даних по цім нарахуванням.
В тому випадку, якщо після такого нарахування ПДВ в нарахування послуг якомусь з абонентів вносилися зміни, то простіше перерахувати тільки цього абонента. Для цього треба використати звіт «Звіт - процедура для індивідуального нарахування ПДВ».
Цей звіт виконує нарахування ПДВ конкретному абоненту, ідентифікатор якого вказується серед параметрів. Приклад задання параметрів для цього звіту показаний на малюнку 6.

Малюнок 6
«ID абонента» - це ідентифікатор абонента в Tariscope. Його можна подивитися, наприклад, на сторінці Абоненти, якщо ввімкнути відображення відповідного стовпця таблиці.
«Від» - треба вказати дату початку місяця, за який нараховується ПДВ. Якщо, наприклад, нарахування виконується на початку вересня за серпень, то можна задати значення, яке показано на малюнку 3, або вказати конкретну дату і час: 01.08.2026 00:00:00
«До» - треба вказати дату кінця місяця, за який нараховується ПДВ. Якщо, наприклад, нарахування виконується на початку вересня за серпень, то можна задати значення, яке показано на малюнку 3, або вказати конкретну дату і час: 31.08.2026 23:59:59
Параметр «Опис для рахунків» використовується для задання назви нарахування в рахунку абонента.
«ID послуги для ПДВ» - треба вказати ідентифікатор послуги, яку створили на попередніх кроках. Цей ідентифікатор можна подивитися на сторінці Послуги.
Запуск цієї процедури – звіту на виконання призводить до нарахування ПДВ відповідному абоненту, а також формується короткий звіт, приклад якого наведений на малюнку 7.

Малюнок 7
Як видно з цього малюнку абоненту «Абонент СМ» за серпень 2026 року були нараховані послуги на суму 1470,00 грн. На цю суму нарахований ПДВ у сумі 294,00 грн.
Якщо відкрити рахунок цього абонента за серпень, то буде відображені нараховані послуги і ПДВ, як показано на малюнку 8.
Малюнок 8
Цей звіт можна використати і для нарахування ПДВ всім абонентам в автоматичному режимі. Для цього треба створити відповідну задачу для Планувальника. Приклад створення такої задачі показаний на малюнку 9. Для автоматичного виконання цієї задачі треба в списку Тип вибрати значення Щомісяця.
Тип задачі: вибрати Формування звіту
Назва звіту: вибрати Звіт - процедура для індивідуального нарахування ПДВ
В параметрах звіту задати ті ж самі, що і на малюнку 6, але для параметру ID абонента вказати 0.
Шлях до файлу: вказати теку, де будуть зберігатися згенеровані звіти. Така тека повинна існувати на диску. Шаблон файлу: вказати шаблон файлу звіту.
Після цього запустити задачу.

Малюнок 9
Після виконанні задачі в призначений час ПДВ буде нараховано всім абонентам.
ПДВ на виклики
В тому випадку, якщо тарифи на виклики задані без ПДВ, нарахування ПДВ на всі виклики абонента можуть виконуватися за допомогою двох процедур – звітів:
- Звіт - процедура для нарахування ПДВ всім абонентам за виклики
- Звіт - процедура для індивідуального нарахування ПДВ на суму за виклики
Перший звіт - процедура виконує нарахування ПДВ на виклики для всіх абонентів, а другий звіт – процедура виконує нарахування ПДВ за виклики конкретному абоненту.
Звіт - процедура для нарахування ПДВ всім абонентам за виклики нараховує ПДВ для всіх абонентів за їх виклики в конкретному місяці. ПДВ нараховується на всі нарахування за будь-які виклики в рахунках абонента в Tariscope за період. Якщо нарахувань не було, ПДВ не нараховується. Налаштування параметрів звіту аналогічні тому, як показано на малюнку 3.
За результатами виконання процедури формується звіт, приклад якого наведено на малюнку 10.

Малюнок 10
Звіт - процедура для індивідуального нарахування ПДВ на суму за виклики нараховує ПДВ для конкретного абонента за заданий період на всі його виклики. Якщо нарахувань не було, ПДВ не нараховується. Налаштування параметрів звіту аналогічні тому, як показано на малюнку 6.
За результатами виконання процедури формується звіт, приклад якого наведено на малюнку 11.

Малюнок 11
Обидві процедури можуть виконуватися і автоматично Планувальником Tariscope. Для цього слід створити відповідні задачі. Після нарахування ПДВ на послуги і виклики можна виконувати формування документів, таких як рахунки, квитанції, акти і тому подібне.
Tariscope та висока точність рахунків за телекомунікаційні послуги
Ця стаття в першу чергу призначена для операторів зв’язку, які використовують або планують використовувати білінгову систему Tariscope Provider (SoftPI).
Рахунки за телекомунікаційні послуги часто потребують високої точності, при цьому 3 або 4 знаки після коми використовуються внутрішньо для розрахунку тарифів та вартості послуг, щоб забезпечити точність перед округленням остаточної суми рахунку до двох знаків після коми перед наданням його клієнту. Використання більшої кількості знаків після коми (наприклад, 4) мінімізує помилки округлення в складних обчисленнях, забезпечуючи справедливу плату, навіть якщо клієнт бачить у своєму рахунку лише копійки.
Чому важлива більша ніж 2 знаки після коми в рахунках за телекомунікаційні послуги?
Точність розрахунку: Під час стягнення плати за дзвінки (наприклад, 0,0857 долара США за хвилину) або передачу даних (наприклад, 0,0018 долара США за мегабайт), використання чотирьох знаків після коми зберігає точність проміжного підсумку перед застосуванням до використання в рахунках.
Мінімізація помилок: Занадто раннє округлення (наприклад, до двох або трьох знаків після коми) може призвести до суттєвих помилок у рахунках для користувачів з великим обсягом дзвінків або тих, хто часто телефонує.
Відповідність нормативним вимогам: В деяких країнах стандарти якості вимагають від систем виставлення рахунків зводити до мінімуму кількість помилок.
По суті, 3 або 4 знаки після коми в першу чергу в вартості тарифу на дзвінки забезпечує необхідну деталізацію для того, щоб виставлення рахунків за телекомунікаційні послуги були точними та справедливими, навіть якщо остаточний рахунок для клієнта містить менше цифр (зазвичай 2 знаки після коми).
Білінгова система Tariscope Provider дозволяє задати індивідуальну точність розрахунку вартості тарифу. Це задається в параметрах тарифу.
Приклад цього показано на малюнку 1.

Малюнок 1
Як видно, в параметрах конкретного тарифу є позиція Символів після коми. За замовчуванням вона містить значення: 2, яке ви можете змінити на будь-яке інше.
Як правило, для задання вартості послуг достатньо 2 знаків після коми. І саме з такою точністю буде розраховуватися вартість послуги, якщо в якості тарифу для послуги вибрати значення Фіксована сума (малюнок 2).

Малюнок 2
Часом у операторів зв’язку виникає необхідність розраховувати вартість послуг з більшою точністю ніж 2 знаки після коми. В цьому випадку в Tariscope існує два варіанти для обчислення з 3 або більше знаками після коми.
Можна створити тариф-послугу (меню -> Додаткові опції -> Тариф-послуга, для якої як для тариф можна задати індивідуальну точність розрахунку (малюнок 1). Після цього на сторінці Послуги слід створити нову послугу для якої в списку Тариф вибрати найменування тариф-послуги, що була створена на попередньому кроці.
В тому випадку, коли оператору зв’язку треба, щоб усі послуги, для яких використовується значення тарифу Фіксована сума, розраховувалися з точністю, наприклад, 4 знаки після коми, треба внести маленьку правку в базі даних Tariscope.
Цю операцію повинен виконувати або адміністратор Tariscope, або адміністратор Microsoft SQL Server-у.
Для цього відкрийте SQL Server Management Studio (SSMS). Відкрийте в ній БД Tariscope і знайдіть функцію dbo.ab_gettarifstable, як показано на малюнку 3.

Малюнок 3
Виберіть цю функцію і клацніть правою кнопкою миші. З’явиться меню, де виберіть: Modify.
Відкриється вкладка зі змістом цієї функції.
В рядку 91 змініть значення 2 (округлення до 2 знаків) на 4 (якщо треба точність до 4 знаків після коми). Приклад цього показаний на малюнку 4.

Малюнок 4
Після цього на панелі інструментів SSMS клацніть по кнопці Execute.
Повинно з’явитися повідомлення: Commands completed successfully. Після цього залишається тільки перевірити точність нарахування послуги.
Обробка SMDR від Mitel MiVoice Business в Tariscope
Обробка SMDR даних від Mitel MiVoice Business в системі обліку телефонних викликів Tariscope виконана для наступних налаштувань SMDR параметрів в АТС цього типу:
| DASS II - Call Charge Information Provided: | No |
| Extended Digit Length: | No |
| MCD - Report Transfers: | No |
| Network Format: | Yes |
| Report Account Codes: | No |
| Report Incoming Calls: | Yes |
| Report Internal Calls: | Yes |
| Report Meter Pulses: | No |
| Report Outgoing Calls: | Yes |
| SMDR Meter Unit Per Station: | Yes |
| SMDR Record Transfer: | No |
| System Identification: | |
| Time Change Reporting: | No |
| Twenty-four Hour Time Reporting: | No |
| ANI/DNIS/ISDN/CLASS Number Delivery Reporting: | No |
| SMDR Real Time Reporting: | No |
| OLI Node ID Format for Incoming Trunk Calls: | No |
| Extended Time To Answer: | Yes |
| SMDR File Transfer: | Yes |
| Standardized Network OLI: | No |
| Standardized Call ID Format: | No |
| Suite Services Reporting: | No |
| Report Internal Unanswered Calls: | No |
| SMDR Extended Reporting Level 1: | No |
| Report Attendant Name: | No |
| Account Code Reporting for Internal Calls: | No |
| Tag Call Reporting: | No |
| Tag Call Identifier: | |
| Path Reporting for Internal ACD2 Calls: | No |
| Number of destination address digits to mask: | 0 |
| SMDR Extended Reporting Level 2: | No |
| Two B-Channel Transfer Reporting: | No |
| External Hot Desk User Reporting: | No |
| Suppress Initial SMDR Record with Account Code Entered Timer | 5 |
| Location Information Reporting: | No |
| SMDR Port Enabled: | Yes |
Рекомендуємо саме таким чином налаштовувати АТС Mitel MiVoice Business.
Mitel MiVoice Business (3300) використовує передачу даних з IP порту 1752. З боку Tariscope для отримання SMDR даних слід використовувати Tariscope Observer, у якого в якості джерела даних використовується TCP клієнт.
Особливістю парсеру Mitel 3300 (MiVoice Business) є те, що в поле Код проєкту для викликів з використанням трансферу заноситься наступна інформація: для першого етапу трансферу - про номер, на який переданий виклик, а для другого етапу трансферу – про номер, з якого отриманий виклик. Приклад цього можна побачити на малюнку нижче.

На цьому малюнку відображені етапи виклику з використанням трансферу. Якщо в поданні для викликів вибрати рядок, де є один із етапів виконання трансферу і клацнути на панелі інструментів по іконці Показати пов’язані записи, то подання відобразить всі етапи цього виклику, як показано на малюнку вище.
Взаємодія Tariscope з 3CX v20
Ця стаття призначена для користувачів ліцензій на системи Tariscope Enterprise або Tariscope Provider, з функцією обмеження, яка використовується для керування IP АТС 3CX v20.
Починаючи з версії Tariscope 4.6.7, був розроблений новий сценарій для додатку Tariscope Observer, який передає команди на обмеження абонентів або зняття цих обмежень окремому додатку TSconnector. Цей додаток встановлюється на сервері з 3CX v20, і вже він безпосередньо відправляє команди на цю АТС. Є окремі додатки для Windows і Linux, залежно від того, на якій операційній системі працює 3CX. Для роботи функції обмеження в Tariscope не має значення, на якій системі працює Tariscope, під Windows чи під Linux.
Схема взаємодії білінгової системи (системи обліку викликів) Tariscope з 3CX показана на малюнку 1.

Малюнок 1
Всі налаштування системи обмеження в Tariscope виконуються, як і раніше, за виключенням вибору сценарію і встановлення додатку TSconnector.
Завантажте з сайту Tariscope відповідний додаток:
для Windows (tsconnector.zip) або Linux (tsconnector.tar.gz) залежно від того, на якій операційній системі у вас встановлений 3CX.
Для роботи додатку TSconnector потрібен конфігураційний файл від 3CX: 3CXPhoneSystem.ini
В Windows цей файл повинен знаходитися в теці: C:\ProgramData\3CX\Bin
В Linux цей файл повинен знаходитися в каталозі: /var/lib/3cxpbx/Bin/
Взаємодія сценарію для встановлення/зняття обмеження, який працює в Tariscope Observer з додатком TSconnector виконується за допомогою протоколу TCP. TSconnector працює як сервер TCP, а сценарій Tariscope Observer, як клієнт TCP. IP порт, через який працює TCP сервер додатку TSconnector задається в файлі config.json, який є частиною додатку TSconnector. За замовчуванням використовується IP порт 8089. Користувач може його змінити за своїм бажанням.
Потурбуйтеся, щоб цей порт був відкритий як на сервері 3CX, де встановлюється додаток TSconnector, так і на сервері Tariscope.
Встановлення додатку під Windows
Розпакуйте архів tsconnector.zip в якусь теку, наприклад, в теку: C:\TSconnector
Копіюйте в цю теку файл 3CXPhoneSystem.ini
TSconnector виконує дії із встановлення або зняття обмежень, залежно від того, які команди від Tariscope він отримає.
Додаток TSconnector має лише одне налаштування: TCP/IP порт, на якому працює його TCP сервер. За замовчуванням використовується IP порт 8089.
Якщо ви бажаєте змінити його, відкрийте в текстовому редакторі файл config.json, що знаходиться в теці, де був розпакований архів.
В рядку "IPPort": "8089" змініть значення 8089 на бажане.
Відкрийте в Windows Командний рядок з правами адміністратора. Створіть службу Windows наступною командою:
sc create TSconnector binpath= [шлях до файлу tsconnector.exe]
Наприклад, якщо ви розпакували архів до теки C:\TSconnector, то ця команда повинна виглядати наступним чином:
sc create TSconnector binpath= C:\TSconnector\ tsconnector.exe
Запустіть цю службу наступною командою:
sc start TSconnector
У випадку вдалого запуску служби в теці, де розпакований додаток TSconnector, буде створений файл журналу роботи додатку TS_restrictions.log. Перевірте його вміст, що він не містить помилок.
При нормальному запуску журнал додатку буде містити рядки, подібні до наведених нижче:
===========================================
05.03.2026 15:33:43 The TSconnector service has been launched.
05.03.2026 15:33:43 Lookup for 3CXPhoneSystem.ini...
The current folder is C:\temp\TSconnector\
Reading the 3CXPhoneSystem.ini file
Path to the 3CX folder: C:\Program Files\3CX Phone System\Bin
IP port: 8089
C:\Program Files\3CX Phone System\Bin\3cxpscomcpp2.dll
3CX Connection options: 5485, cfguser_default, gev4y8qyjn4ja
C:\Program Files\3CX Phone System\Bin\3cxpscomcpp2.XmlSerializers.dll
05.03.2026 15:33:45 Connection to 3CX API has been completed
05.03.2026 15:33:48 Server has been started on the port = 8089
Waiting for a connection from a client
Останній рядок означає, що TSconnector очікує підключення TCP клієнта, а саме сценарію Tariscope Observer.
Встановлення додатку під Linux
Розпакуйте архів tsconnector.tar.gz у якомусь каталозі, наприклад: /home/softpi/TSconnector (softpi тут ім'я користувача, з яким логінилися до системи).
Скопіюйте у цей каталог файл 3CXPhoneSystem.ini
Зробіть файл TSconnector виконуваним. Для цього в Терміналі перейдіть до каталогу, де розпакували TSconnector і виконайте команду:
chmod +x TSconnector
Створіть файл unit для служби Linux, наприклад, з ім'ям ts-connector.service
Цей файл повинен містити наступні рядки:
[Unit]
Description=Tariscope restrictions
[Service]
Type=simpe
ExecStart=/home/softpi/TSconnector
[Install]
WantedBy=multi-user.target
Коментарі до вмісту файлу:
Description – може бути довільним.
ExecStart - шлях до файлу TSconnector в каталозі, де розпакований архів.
Скопіюйте цей файл у каталог /etc/systemd/system за допомогою команди:
sudo cp /home/softpi/TSconnector/ts-connector.service /etc/systemd/system
Перезавантажте служби Linux. Слід враховувати, що перезавантажуються всі служби, у тому числі й служби 3CX. Тому виберіть потрібний для цього час.
sudo systemctl daemon-reload
Перевірте стан демона ts-connector (якщо ви створите unit файл для служби з іншим ім'ям, використовуйте це ім'я і в наступній команді):
sudo systemctl status ts-connector
Якщо служба неактивна, запустіть її.
sudo systemctl start ts-connector
Якщо все виконано правильно, то має бути статус "active". У цьому випадку буде створено журнал роботи служби. Журнал роботи служби TS_restrictions.log перебуватиме в каталозі, де розпакували архів.
Налаштування сценарію Tariscope
В Tariscope виберіть Збір даних/Observer -> Керування збором даних.
На сторінці Збір даних/Observer виберіть рядок з Observer, який працює з 3CX v20.
На панелі інструментів клацніть по іконці Змінити і виберіть Сценарії Observer.
В переліку Подія виберіть необхідну, наприклад, Зміна класу абонента, яка відповідає умовам ліцензії на Tariscope.
В списку Сценарій виберіть: setcos-subscriber-3cx-v20.cs
Клацніть по іконці Змінити. З’явиться вікно Редагування, де буде відображений текст сценарію.
Знайдіть там наступні рядки і внесіть в них відповідні зміни:
const string TCPserverIPaddress = "127.0.0.1";
const int TCPserverIPport = 8089;
Для константи TCPserverIPaddress вкажіть IP адресу сервера, де встановлений 3CX.
Для константи TCPserverIPport вкажіть IP порт, який ви задали для роботи TSconnector.
Збережіть зміни.
Після цього, якщо всі інші налаштування системи обмеження в Tariscope зроблені, можна запускати Observer. Після запуску Tariscope Observer відкрийте його журнал.
Журнал повинен містити рядок:
Observer script compilation successful!
Що означає, що сценарій не містить помилок і готовий до роботи.
Як швидко перевірити, що функція обмеження працює
Щоб не чекати, коли якийсь з абонентів вичерпає встановлений йому ліміт на виклики, можна швидко перевірити роботу функції обмеження наступним шляхом.
Створить якогось тестового абонента, який буде мати телефонний номер на 3CX, і якому в Tariscope треба встановити будь-яке обмеження.
Виберіть в меню сторінку Абоненти, на цій сторінці рядок з тестовим абонентом.
Клацніть по іконці Обмеження на панелі інструментів.
На сторінці, що з’явиться, виберіть в таблиці рядок з параметрами обмеження і клацніть по іконці Змінити статус вручну (малюнок 2).

Малюнок 2
В наслідок цього в сценарій Observer-а буде відправлена команда на заборону абоненту на виконання виклику через зовнішні лінії, який передасть цю команду в TSconnector.
Щоб перевірити, чи виконана команда, спробуйте виконати зовнішній виклик з цього номеру. Крім того можна подивитися значення відповідного прапорця в налаштуваннях цього номера в 3CX.
Крім цього інформація про виконання команди з’явиться в журналі Observer і TSconnector.
Якщо команда виконана, то, щоб повернути статус номеру для виконання ним зовнішніх викликів, ще раз клацніть по іконці Змінити статус вручну.
Обмеження на виконання викликів буде знято.
Додатковий автоматичний аналіз викликів
У ряді випадків отримання обробленої в Tariscope інформації про виклики недостатньо і потрібен додатковий аналіз даних, який хотілося б, щоб Tariscope виконував автоматично. Наприклад, служба безпеки компанії хотіла б оперативно знати про всі виклики, які виконані співробітниками з телефонів відомчої АТС до пожежної охорони, поліції або швидкої допомоги. Інший приклад, коли бажано знати про всі вихідних дзвінків, вартість яких вище певної величини, або про дзвінки на (з) телефони із «чорного списку». Можна придумати ще цілий ряд випадків, коли необхідно оперативно отримувати повідомлення про певні виклики.
Звичайно, буде не кращим рішенням подібних завдань посадити за монітор з Tariscope співробітника, який би відстежував такі виклики. Але цього робити і не треба, якщо використовувати всі можливості Tariscope. Tariscope можна налаштувати так, що він буде після закінчення кожного виклику автоматично виконувати додатковий аналіз даних виклику на предмет відповідності попередньо заданим умовам, наприклад, як ми згадували раніше, виконання будь-яким співробітником компанії виклику на якісь конкретні телефонні номери.
Особливий випадок, який вимагає оперативного відстеження, це виявлення телефонного фрода. Під телефонним фродом мається на увазі певний тип шахрайства, коли різними засобами виконуються несанкціоновані виклики, як правило, міжнародні, за рахунок компанії. У 2023 році за даними міжнародної асоціації CFCA (Communications Fraud Control Association) втрати від телефонного фрода становлять десь 38,95 млрд. доларів США [1].
Виявлення фрода істотно складніше, ніж виявлення, наприклад, викликів на конкретні телефонні номери, так як заздалегідь невідомо, на які номери виконуються виклики, коли, якої тривалості. Для виявлення фрода, як правило, рекомендується використовувати спеціальні системи, в більшості випадків робота яких заснована на порівнянні конкретного виклику з моделлю поведінки конкретного абонента, групи абонентів і в цілому компанії. Tariscope має таку підсистему виявлення фрода, але ця підсистема не входить до базової ліцензії на Tariscope і повинна купуватися додатково до базової ліцензії.
В той же час, навіть не купивши таку підсистему, Tariscope дає можливість виявляти підозрілі виклики, які можуть бути фродом. В цій статті ми як раз і розглянемо, як це зробити.
По-перше, будемо розглядати тільки вихідні міжнародні дзвінки вартістю понад заданої величини, так як фрод значно рідше використовується для міжміських і тим більше міських викликів.
По-друге, із зазначених викликів в першій умові найбільш підозрілими викликами з ознаками фрода слід вважати ті, які виконуються в неробочий час, у вихідні та святкові дні.
По-третє, можна оцінювати країни, куди виконувався виклик. Вважається, що найбільше дзвінків, які є фродом, виконується в країни Карибського басейну, а також Азії і Африки.
І, нарешті, можна оцінювати виклики на належність до фроду від абонентів, дані по яких відсутні в базі даних системи Tariscope.
Тепер розглянемо, яким чином пошук викликів із частиною зазначених вище ознак можна реалізувати в системі Tariscope.
У налаштуваннях служби Tariscope Observer є можливість виконувати сценарії при настанні певних подій. Для цього в гілці меню Збір даних/Observer системи Tariscope слід вибрати пункт меню Керування збором даних. Відкриється сторінка налаштування Збір даних/Observer, приклад якої наведений на малюнку 1.

Малюнок 1
Виберіть рядок з необхідних Observer-ом, якщо у вас їх декілька, і клацніть на панелі інструментів по іконці Змінити. В меню, що з’явиться, виберіть пункт Сценарії Observer. В наслідок чого відкриється сторінка Сценарії Observer, приклад якої показаний на малюнку 2.

Малюнок 2
Це вікно містить перелік подій, при настанні яких Tariscope може запустити пов'язаний з цією подією сценарій.
Можлива реакція на такі події:
- Підключення джерела даних.
- Відключення джерела даних.
- Зміна класу абонента.
- Зміна класу групи.
- Періодична дія.
- Новий виклик опрацьовано.
- Помилка підключення бази даних.
Для аналізу викликів на предмет належності їх до фроду в переліку Подія, слід вибрати подію Новий виклик опрацьовано, а в переліку Сценарії вибрати файл, який містить сценарій з аналізу фрода. Сценарії, що поставляються з Tariscope, за замовчуванням встановлюються в папку C:\ProgramData\Tariscope\ObserverScripts
Після вибору необхідного сценарію, збережіть налаштування (малюнок 2).
Сценарії повинні бути написані на мові C#. Серед сценаріїв, що постачаються з Tariscope є файл fraud.cs. Він дозволяє відправляти повідомлення або на задану в сценарії електронну адресу або на електронну адресу, задану в налаштуваннях Tariscope, про вихідні міжнародні дзвінки тривалістю понад 150 секунд, які виконані в проміжок часу: з 19:00 до 08:00. Ці параметри користувач Tariscope може змінити, видалити або додати інші.
Для написання нових сценаріїв або редагування існуючих бажано мати уявлення про програмування на мові C#, а також про створення SQL запитів.
Якщо ви не впевнені в своїх силах, зверніться в службу технічної підтримки компанії SoftPI, так як неправильно написаний сценарій може завдати шкоди системі Tariscope.
Написання сценаріїв силами компанії SoftPI не входить в послуги гарантійної або післягарантійних підтримок і виконується за окрему оплату.
Структура всіх сценаріїв, що використовуються в Tariscope, однакова. Кожен сценарій реалізує інтерфейс IScript.
У цьому інтерфейсі є два методи:
1. Метод Init. Цей метод викликається один раз під час запуску сценарію, коли служба Tariscope Observer компілює і ініціалізує цей сценарій.
2. Метод Main. У ньому виконуються операції, пов'язані з конкретною подією. У метод Main передається об'єкт Parameters.
3. При ініціалізації сценарію в нього передається інтерфейс IScriptHost, який дозволяє сценарію виконувати деякі операції. Наприклад, відправити повідомлення по електронній пошті.
Лістинг сценарію fraud.cs наведено нижче:
using Microsoft.Data.SqlClient;
using SoftPI.Tariscope.WebAdministration.Observer.Scripting.Interfaces;
using SoftPI.Tariscope.WebAdministration.Observer.Scripting.Models;
using System;
using SoftPi.Tariscope.DAL;
public class FraudScanner : IScript
{
private IScriptHost Host;
private bool NeedFinish = false;
//
//
********************************************************************************************
//
private int MAX_CALL_DURATION_S = 150;
private int CALLTYPE_INTERNATIONAL = 5;
private TimeSpan BEGINNING_OF_WORK = TimeSpan.Parse("08:00:00");
private TimeSpan END_OF_WORK = TimeSpan.Parse("19:00:00");
//
//
*********************************************************************************************
//
public void Init(IScriptHost host)
{
this.Host = host;
host.Close += OnClose;
NeedFinish = false;
}
private void OnClose(ref bool Cancel)
{
return;
}
public void Main(object Parameters)
{
NewCallActionParameters actionParameters = (NewCallActionParameters)Parameters;
try
{
this.Host.AddEvent("New call processing, ID= " + actionParameters.Id);
using (SqlConnection cn = new SqlConnection(this.Host.DatabaseConnectionString))
{
cn.Open();
CallItems CallItems = CallItems.Instance(cn);
SqlCommand cmd = CallItems.GetCommand("SELECT ID, Originator, Dialnumber,
CallDateTime, CallSeconds, CallType FROM viCalls WHERE ID=@callid");
cmd.Parameters.AddWithValue("@callid", actionParameters.Id);
using (SqlDataReader rs = cmd.ExecuteReader())
{
if (rs.Read())
{
if (rs.GetInt16(5) == CALLTYPE_INTERNATIONAL &&
rs.GetInt32(4) > MAX_CALL_DURATION_S &&
(((rs.GetDateTime(3).TimeOfDay > END_OF_WORK ||
rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK)) ||
(rs.GetDateTime(3).DayOfWeek == DayOfWeek.Sunday ||
rs.GetDateTime(3).DayOfWeek == DayOfWeek.Saturday)))
this.Host.SendMail("", "Fraud Detection system", "Suspicious call detected. ID=" + actionParameters.Id + " CallDateTime=" + rs.GetDateTime(3) + " Call duration=" + rs.GetInt32(4));
}
}
}
}
catch (Exception ex)
{
this.Host.AddEvent("Error running script: " + ex.ToString());
}
}
}
Для людини далекої від програмування наведений вище код сценарію може здатися зовсім незрозумілим. Насправді це не зовсім так. У тексті сценарію червоним кольором виділені ті рядки коду, в яких при необхідності можливо вносити зміни.
Розглянемо перші чотири виділені рядки:
private int MAX_CALL_DURATION_S = 150;
private int CALLTYPE_INTERNATIONAL = 5;
private TimeSpan BEGINNING_OF_WORK = TimeSpan.Parse("08:00:00");
private TimeSpan END_OF_WORK = TimeSpan.Parse("19:00:00");
Ці рядки оголошують чотири змінні:
- MAX_CALL_DURATION_S – це тривалість розмови, яка дорівнює 150 секунд, тобто 2 хвилини 30 секунд. Ви можете змінити це значення на будь-яке ціле позитивне число або 0.
- CALLTYPE_INTERNATIONAL – це тип виклику для міжнародних розмов, який застосовується в Tariscope. Його значення дорівнює 5. Якщо ви збираєтеся розглядати тільки міжнародні виклики, то не змінюйте це значення. Якщо вас цікавлять інші виклики, то визначити їх значення ви можете з документу Tariscope 4.6. Каталог бази даних.
- BEGINNING_OF_WORK – це час початку роботого дня, який тут дорівнює 8 годині ранку. Ви можете змінити це значення на будь-яке інше реальне значення часу початку робочого дня.
- END_OF_WORK – це час закінчення робочого дня, який тут дорівнює 7 годині вечора. Ви можете змінити це значення на будь-яке інше реальне значення часу закінчення робочого дня.
Наступний виділений рядок:
SELECT ID, Originator, Dialnumber, CallDateTime, CallSeconds, CallType FROM viCalls WHERE ID=@callid
Це SQL запит до подання viCalls на отримання з нього для поточного виклику, що задається умовою ID=@callid , де @callid є параметром, який містить ідентифікатор останнього виклику, що був оброблений в Observer. Цей SQL запит дозволяє отримати наступні поля:
- ID. Ідентифікатор запису.
- Originator. Телефонний номер, з якого був виконаний виклик.
- Dialnumber. Телефонний номер, на який був виконаний виклик.
- CallDateTime. Дата і час виконання виклику.
- CallSeconds. Тривалість виклику в секундах.
- CallType. Тип виклику.
За необхідності можливо отримати і інші параметри виклику з переліку полів подання viCall.
Наступна виділена частина сценарію виконує аналіз даних на відповідність заданим умовам:
(rs.GetInt16(5) == CALLTYPE_INTERNATIONAL &&
rs.GetInt32(4) > MAX_CALL_DURATION_S &&
(((rs.GetDateTime(3).TimeOfDay > END_OF_WORK ||
rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK)) ||
(rs.GetDateTime(3).DayOfWeek == DayOfWeek.Sunday ||
rs.GetDateTime(3).DayOfWeek == DayOfWeek.Saturday)))
Цей код використовується в операторі if як умова відповідності даних. Він складається з наступних умов:
rs.GetInt16(5) = CALLTYPE_INTERNATIONAL
Береться значення 5-го поля запиту (поле CallType в SQL запиті). Відлік полів починається з 0. Значення поля порівнюється зі значенням змінної CALLTYPE_INTERNATIONAL. Тобто ця умова дозволяє виявити чи є цей виклик міжнародним.
rs.GetInt32(4) > MAX_CALL_DURATION_S
Береться значення 4-го поля SQL запиту (поле CallSeconds). Відлік значень починається з 0. Значення поля порівнюється зі значенням змінної MAX_CALL_DURATION_S.
(rs.GetDateTime(3).TimeOfDay > END_OF_WORK ||
rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK))
В цій умові використовується значення 3-го поля запиту, тобто поля CallDateTime. Перевіряється, чи припадає час виклику на проміжок часу між закінченням робочого дня і початком наступного робочого дня.
(rs.GetDateTime(3).DayOfWeek == DayOfWeek.Sunday ||
rs.GetDateTime(3).DayOfWeek == DayOfWeek.Saturday)
Це є альтернативна умова часу виклику, якій повинні відповідати всі міжнародні виклики тривалістю більше 150 секунд, що виконані в суботу або неділю.
Використовуючи логічні оператори && та || можна по різному розглядати відповідність виклика умовам, які потрібні.
Якщо результат перевірки є істина, то виконується команда з відправки електронною поштою повідомлення про цей виклик.
this.Host.SendMail("", "Fraud Detection system", "Suspicious call detected. ID=" + actionParameters.Id + " CallDateTime=" + rs.GetDateTime(3) + " Call duration=" + rs.GetInt32(4));
this.Host.SendMail() – це функція, за допомогою якої виконується відправка повідомлення електронною поштою. Ця функція має три параметри, які знаходяться всередині дужок і розділяються комами:
- Перший параметр задає електронну адресу, куди виконується відправка повідомлення. Якщо цей параметр порожній (""), як зазначено в наведеному вище виразі, то використовується електронна адреса, вказана в налаштуванні Tariscope Повідомлення та пошта. Якщо ви бажаєте відправляти повідомлення на якусь іншу адресу, ніж зазначену на цій сторінці налаштування або ви не налаштовували цей параметр в Tariscope, то в лапках слід задати цю адресу, наприклад, "Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її.".
- Другим параметром є тема електронного листа. У цьому сценарії таким параметром є "Fraud Detection system". При бажанні можно замінити цей параметр, наприклад, на "Отримано виклик з ознаками фрода" або якийсь інший.
- Третій параметр - це вміст тексту повідомлення. В даному сценарії це:
"Suspicious call detected. ID=" + actionParameters.Id + " CallDateTime=" + rs.GetDateTime(3) + " Call duration=" + rs.GetInt32(4) .
Розглянемо більш докладно цей рядок.
Частину рядка "Suspicious call detected. ID=" можна замінити, наприклад, на наступне:
“Виявлений підозрілий виклик з ідентифікатором =” . Значення цього ідентифікатора знаходиться в параметрі actionParameters.ID.
Наступна частина рядка " CallDateTime=" + rs.GetDateTime(3) буде відображати дату і час цього виклику. Можливо, буде краще, якщо цю частину рядка замінити на наступну:
“ Дата і час виклику: “ & rs.GetDateTime(3)
І, наостанок, вираз + " Call duration=" + rs.GetInt32(4) буде містити тривалість виклику. Також, для зручності сприйняття інформації, можна замінити цю частину рядка на:
“ Тривалість виклику:” & rs.GetInt32(4)
У рядку SQL запиту, який розглядався вище, міститься запит ще двох параметрів: Originator і Dialnumber. Відповідно, їх значення також можливо виводити в тілі електронного листа. Для цього слід додати наступний рядок:
“ Виклик виконувався з номера ” & rs.GetInt32(1) “ на номер “ & rs.GetImt32(2)
Якщо модифікувати SQL запит, то в повідомленні можливо виводити інформацію про абонента, з номера якого виконувався виклик, найменування населеного пункту, куди виконувався виклик та іншу інформацію.
Тепер повернемося до наших умов для виявлення викликів, які можна підозрювати, як фрод. Додамо спочатку аналіз вартості виклику. Для цього в місці сценарію, де задавалися розглянуті вище змінні, додамо змінну MAX_CALL_COST, для якої задамо значення вартості виклику, починаючи з якого виклик може розглядатися, як підозрілий. Наприклад, нехай це буде значення 10 гривень. Тобто сценарій повинен реагувати на будь-який виклик, вартість якого більше, ніж 10 гривень.
Private decimal MAX_CALL_COST = 10.0
Тепер необхідно додати в SQL запит отримання інформації про вартість виклику. Для цього слід скористатися описом подання viCalls в документі "Каталог баз даних Tariscope 4.x", щоб знайти необхідне поле. Це поле Cost. Тоді запит повинен виглядати наступним чином:
SELECT ID, Originator, Dialnumber, CallDateTime, CallSeconds, CallType, Cost FROM viCalls WHERE ID=@callid
Якщо нас не цікавить тривалість виклику, то із запиту можна виключити поле CallSeconds. І тепер, отримавши за допомогою цього SQL запиту дані за викликом, слід їх проаналізувати на відповідність умов, які нас цікавлять: міжнародний виклик з вартістю понад 10 гривень. Для цього рядок, де проводиться аналіз, потрібно записати наступним чином:
(rs.GetInt16(5) = CALLTYPE_INTERNATIONAL &&
rs.GetInt32(4)> MAX_CALL_DURATION_S &&
rs.GetDecimal(6) > 10.0) &&
(((rs.GetDateTime(3).TimeOfDay > END_OF_WORK ||
rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK)) ||
(rs.GetDateTime(3).DayOfWeek == DayOfWeek.Sunday ||
rs.GetDateTime(3).DayOfWeek == DayOfWeek.Saturday))
Цей рядок передбачає, що запит поля CallSeconds залишився. У разі, якщо його видалили, у рядку аналізу даних зміниться значення в дужках, які вказують на номер поля в запиті, починаючи з 0.
Аналогічним чином можна і далі ускладнювати умови для виявлення викликів з ознаками фрода.
При використанні сценаріїв для додаткової обробки даних викликів слід завжди пам'ятати, що це використання підвищує навантаження на сервер і може привести до уповільнення обробки.
Крім цього, якщо дані про виклики надходять в Tariscope з затримкою, наприклад, при отриманні їх через FTP сервер, то і повідомлення про підозрілі виклики також будуть сформовані з затримкою.
Якщо наведеної вище інформації вам недостатньо для створення необхідного сценарію, зверніться в службу технічної підтримки компанії SoftPI.
Посилання
Дочірні категорії
How to configure
Категорія містить у собі статті, які описують особливости налаштування та роботи з системою Tariscope.
Telecom services
Ця категорія містить статті, пов'язані з налаштуванням, нарахуванням і аналізом телекомунікаційних послуг зв'язку.
