Пока только скрипт (в будущем модуль) для разнесения бонусов исходя из диапазона оплаченных денег:
#!/usr/bin/perl -w use Env; use DBI; use Time::Local;
Параметры подключения к базе:
my $db_host = "localhost"; my $db_database = "abills"; my $db_user = "dbuser"; my $db_pass = "dbpass"; my $db_db = 0;
Открываем базу:
if (!($db_db = DBI->connect("DBI:mysql:$db_database:$db_host",$db_user,$db_pass)))
{
die "Could not connect to database...";
}
Запрос, который выгребает сумму оплат по всем пользователям из базы за 10 месяц 2006 года, по типу оплаты 0 и 2 (Нал. и оплата по карточкам) и тарифным планам 86, 8 и 72:
my $db_query = $db_db->prepare("
SELECT
dv_main.uid,
SUM(payments.`sum`) AS Bal,
bills.id,
bills.deposit
FROM
payments
LEFT OUTER JOIN dv_main ON (payments.uid = dv_main.uid)
INNER JOIN bills ON (payments.uid = bills.uid)
WHERE
((tp_id = 86) OR (tp_id = 8) OR (tp_id = 72)) AND
(payments.`date` LIKE '2006-10-%') AND
((payments.method = 0) OR (payments.method = 2))
GROUP BY
dv_main.uid,
bills.id,
bills.deposit
");
$db_query->execute;
while (my @db_result = $db_query->fetchrow_array)
{
my $bonus=0;
Если Сумма оплат находится в диапозоне от 15 до 20, то пользователь получит от этой суммы на счет 4%:
if ($db_result[1]>=15)
{
if($db_result[1]<20)
{
$bonus=$db_result[1]*0.04;
}
}
Если Сумма оплат находится в диапозоне от 20 до 25, то пользователь получит от этой суммы на счет 5%:
if ($db_result[1]>=20)
{
if($db_result[1]<25)
{
$bonus=$db_result[1]*0.05;
}
}
Если Сумма оплат находится в диапозоне от 25 до 30, то пользователь получит от этой суммы на счет 7%:
if ($db_result[1]>=25)
{
if($db_result[1]<30)
{
$bonus=$db_result[1]*0.07;
}
}
Если Сумма оплат находится в диапозоне от 30 до 40, то пользователь получит от этой суммы на счет 10%:
if ($db_result[1]>=30)
{
if($db_result[1]<40)
{
$bonus=$db_result[1]*0.1;
}
}
Если Сумма оплат находится в диапозоне от 40 до 50, то пользователь получит от этой суммы на счет 15%:
if ($db_result[1]>=40)
{
if($db_result[1]<50)
{
$bonus=$db_result[1]*0.15;
}
}
Если Сумма оплат более 50, то пользователь получит от этой суммы на счет 20%:
if ($db_result[1]>=50)
{
$bonus=$db_result[1]*0.20;
}
Если пользователь попал хоть в один из диапазонов, то заносим в базу изменения:
if ($bonus!=0)
{
my $userid=$db_result[0];
my $billid=$db_result[2];
my $paysum=$bonus;
my $desctext='Bonus 2006_10';
my $ipadd='127.0.0.1';
my $oldsum=$db_result[3];
my $admid=1;
my $metod=4;
$db_db->do("INSERT INTO payments (uid, bill_id, date, sum, dsc, ip, last_deposit, aid, method, ext_id)
values ('$userid', '$billid', now(), '$paysum', '$desctext', INET_ATON ('$ipadd'), '$oldsum', '$admid', '$metod', '')");
$db_db->do("UPDATE bills SET deposit=deposit+$paysum WHERE id='$billid'");
}
}
$db_query->finish;
$db_db->disconnect;
Диапазонов может быть сколь угодно. Интеграцию в билинг я вижу примерно так:
1. Добавляем таблицу в базу, в которой будут храниться диапазоны и процент вознаграждения. 2. В меню тарифных планов необходим признак начисления бонусов. 3. В конфиге билинга список видов оплат по которым возможно начисление (либо забить в код статично). 4. Раз в месяц по крону выполнять данный скрипт.