powered_by.png, 1 kB
Простой биллинг для СommuniGate PRO Версия в формате PDF Версия для печати Отправить на e-mail
Написал Administrator   
20.04.2014

Если Ваш тариф включает определенное количество минут и Ваш оператор обновляет остатки слишком редко тогда можно воспользоваться небольшим биллингом для учета израсходованных минут.

1. Голосовой информатор остатка и процедуры коррекции, рассчитан на руский голосовой модуль ComuniGate.

// ================================================== //
// Balance application //
// //
// Version 1.0 //
// Copyright (c) 2004-2011, InvitNET, Inc. //
// ================================================== //
procedure cashReload(user) external;
procedure cashCorrector(user,minfix) external;
procedure sayNumber(x) forward;
function readPIN(maxDigits) external;

entry Main is
if AcceptCall() != null then stop; end if;
if RemoteAuthentication() == null or RemoteAuthentication() == "" then playFile("accessdenied.wav"); stop; end if;
PlayFileInLoop("Blank",500);
params = NewDictionary();
params.op = "read";
params.balance = "";
result = DoBalance(params, RemoteAuthentication());
cash = objectToString(result);
result = Number(subString(cash,9,5)) / 100;
sayNumber(result);
playFile("minute.wav");
command = ReadInput(3);
if command == "1" then
cashReload(RemoteAuthentication());
PlayFile("done.wav");
end if;
if command == "2" then
playFile("entervaliddigits.wav"); playFile("finishbypound.wav");
minfix = readPIN(10);
cashCorrector(RemoteAuthentication(),minfix);
PlayFile("done.wav");
end if;
ClearDTMF();
PlayFile("GoodBye");
end entry;

procedure sayNumber(x) is
x = x % 1000;
if x >= 100 then
PlayFile(String(x/100*100)+"__0.wav");
x = x % 100;
end if;
if x >= 20 then
PlayFile(String(x/10*10)+"__0.wav");
x = x % 10;
end if;
if x >= 10 and x < 20 then
PlayFile(String(x)+"__0.wav");
x = x * 0;
end if;
if x != 0 then
PlayFile(String(x%10)+".wav");
end if;
end procedure;

2. Восстановление баланса по умолчанию восстанавливает 300 минут трафика по запросу (обычно выполняется раз в месяц), если тариф не один тогда нужно передавать дополнительную переменную с указанием месячного трафика по тарифу.

// ================================================== //
// Balance Application //
// //
// Version 1.1 //
// Copyright (c) 2004-2011, InvitNET, Inc. //
// ================================================== //
// This util reset my traffic //
// //

procedure cashReload(user) is
params = NewDictionary();
params.op = "read";
params.balance = "";
result = DoBalance(params, user);
cash = objectToString(result);
result = Number(subString(cash,9,5));
cash = 30000 - Number(result);
params.op = "credit";
params.balance = "";
params.amount = cash;
params.description = "Mounth refill";
result = DoBalance(params, user);
SysLog("Balance is restored to " + objectToString(result));
end procedure;

3. Корректировка трафика
Не очень нужная процедура, но всё же если Ваш учет и начисления от оператора разошлись, тогда вызвав данную процедуру можно скорректировать баланс просто набрав кол-во израсходованных минут

// ================================================== //
// Balance Application //
// //
// Version 1.0 //
// Copyright (c) 2004-2011, InvitNET, Inc. //
// ================================================== //
// This util correct my traffic //
// //

procedure cashCorrector(user,minfix) is
params = NewDictionary();
params.op = "read";
params.balance = "";
result = DoBalance(params, user);
cash = objectToString(result);
result = Number(subString(cash,9,5));
minfix = number(minfix) * 100;
cash = 30000 - Number(result) - minfix;
if cash >= 0 then
params.op = "credit";
params.balance = "";
params.amount = cash;
params.description = "Minutes correction";
else
params.op = "charge";
params.balance = "";
params.amount = minfix;
params.description = "Minutes correction";
end if;
result = DoBalance(params, user);
SysLog("Balance is restored to " + objectToString(result));
end procedure;

Модуль начислений интегрируется в Ваш getewaycaller
1. Так как биллинг простой все функции храним прямо в gatewaycaller однако можно и вынести во внешние функции

// if the PSTNCallPlan setting is set, consult the plan database
if callerSettings.PSTNBillingPlan != null and callerSettings.PSTNBillingPlan != "" then
if getKeyedSetting(callerSettings, "PSTNBillingPlan", gwkey) == "generic" then
// cost = charge(callerEmail);
// SysLog(cost);
SysLog("Billing started...");
tst = 1;
end if;
end if;

Функция выполняющая начисления

function charge(user,callStarted) is
params = NewDictionary();
params.op = "charge";
params.balance = "";
dur = GMTTime() - callStarted;
params.amount = 100 + (Number(dur) / 60 * 100);
cost = DoBalance(params, user);
return(cost);

условие выполняющееся после того как соединение завершится (что бы списать израсходованние минуты) вносится в самый конец main функции gatewaycaller

if tst == 1 then
cost = charge(callerEmail,callStarted);
SysLog(cost);
end if;

 
< Пред.   След. >
Фонд Развития Интернет
InvitNET © 2018
Страница сгенерирована за 0.041775 секунд