Технически все элементарно - один скрипт на php, запускаемый к примеру в час ночи. Выбираем платежи за предыдущий день, проверяем блокировки по каждому аккаунту, вносим бонусы разовой услугой (чтоб не загаживать отчет по платежам).
Если кому понадобиться, выложу скрипт.
А теперь вопрос в экономической части - кто нибудь делал подобное, какие сроки и проценты использовать? Хочется и заинтересовать клиентов, и не прогореть самому

2 месяца - 1%
3 месяца - 2%
4 месяца - 3%
5 месяцев - 4%
6 месяцев - 5%
На этом все, большую скидку жаба давит предоставлять

Какие мысли будут у уважаемых коллег?
UPDATE 20.10.2014
Готовый рабочий скрипт, обкатан и реально работает уже неделю.
Состоит из трех файлов:
loyalty.ini.php - параметры
loyalty.func.php - функция вычисления лояльности (результат процент лояльности вида от 0.00 до 0.05)
loyalty.php - скрипт обработки платежей за предыдущие сутки (у меня запускается в час ночи по крону).
loyalty.ini.php
Код: Выделить всё
<?php
$loyalty_config=array (
'loyalty_db_host'=>'127.0.0.1:3306',
'loyalty_db_base'=>'UTM5',
'loyalty_db_user'=>'***********',
'loyalty_db_password'=>'***********'
);
$log_file = "/netup/utm5/log/loyalty.log";
//$log2screen = false;
$log2screen = true;
// Применимые методы платежей (таблица payment_methods, поле id)
$payment_methods = '(10,12,100,101)';
?>
Код: Выделить всё
<?php
include_once("/netup/utm5/bin/loyalty.ini.php");
function mylog($log_str) {
global $log_file,$log2screen;
$file_handle = fopen($log_file,"a+");
$log_str = "$log_str\r\n";
if ($log2screen) echo $log_str;
fwrite($file_handle, $log_str);
fclose($file_handle);
}
function get_loyalty($account,$loyalty_config) {
$loyalty = 0;
$db_connect=mysql_connect($loyalty_config['loyalty_db_host'],$loyalty_config['loyalty_db_user'],$loyalty_config['loyalty_db_password']) or die ("Connect failed");
mysql_select_db($loyalty_config['loyalty_db_base'],$db_connect);
$query = "SELECT is_blocked FROM accounts WHERE id = $account AND is_blocked = 0";
$mysql_block_result = mysql_query($query,$db_connect);
$mysql_result_count = mysql_num_rows($mysql_block_result);
if ($mysql_result_count==0) {
$loyalty = 0;
mysql_close($db_connect);
return $loyalty;
}
$query = "SELECT (TO_DAYS(curdate()) - TO_DAYS(FROM_UNIXTIME(start_date))) DIV 30 as month_loyalty FROM blocks_info WHERE start_date >= UNIX_TIMESTAMP(date_sub(curdate(), INTERVAL 6 MONTH)) AND block_type = 1 AND account_id = $account ORDER BY start_date DESC LIMIT 1";
$mysql_block_result = mysql_query($query,$db_connect);
if ($mysql_block_result==false) {
$loyalty = 0;
return $loyalty;
}
$mysql_result_count = mysql_num_rows($mysql_block_result);
if ($mysql_result_count==0) {
$month_loyalty = 6;
} else {
$block_result=mysql_fetch_array($mysql_block_result);
$month_loyalty = $block_result['month_loyalty'];
}
switch ($month_loyalty) {
case 0:
$loyalty = 0.00;
break;
case 1:
$loyalty = 0.00;
break;
case 2:
$loyalty = 0.01;
break;
case 3:
$loyalty = 0.02;
break;
case 4:
$loyalty = 0.03;
break;
case 5:
$loyalty = 0.04;
break;
case 6:
$loyalty = 0.05;
break;
default:
$loyalty = 0.00;
break;
}
mysql_close($db_connect);
return $loyalty;
}
?>
Код: Выделить всё
<?php
// @ini_set("display_errors", "1"); error_reporting(E_ALL);
@ini_set("display_errors", "0"); error_reporting(0);
$UTMCore_Login='**********';
$UTMCore_Password='********';
$UTMCoreHost='127.0.0.1';
$UTMCorePort='11758';
// Разовая услуга для внесения бонуса
$ServiceID=257;
require_once("путь к urfaphp/urfa/URFAClient.php");
include_once("/netup/utm5/bin/loyalty.func.php");
$str_log = date("d.m.Y H:i:s")." ---------------------------------------------------------------";
mylog($str_log);
$db_connect=mysql_connect($loyalty_config['loyalty_db_host'],$loyalty_config['loyalty_db_user'],$loyalty_config['loyalty_db_password']) or die ("Connect failed");
mysql_select_db($loyalty_config['loyalty_db_base'],$db_connect);
//Выборка платежей за предыдущие сутки
$query = "SELECT account_id, SUM(payment_absolute) as summa, users.id FROM payment_transactions INNER JOIN users ON users.basic_account = payment_transactions.account_id ";
$query = $query."WHERE payment_transactions.actual_date >= UNIX_TIMESTAMP(date_sub(curdate( ), INTERVAL 1 DAY)) AND payment_transactions.actual_date < UNIX_TIMESTAMP(curdate( )) AND ";
$query = $query."payment_transactions.payment_absolute > 0 AND payment_transactions.method IN $payment_methods AND ";
$query = $query."users.is_juridical = 0 AND is_canceled = 0 GROUP BY payment_transactions.account_id ORDER BY actual_date DESC";
$mysql_payment=mysql_query($query);
$Summ = 0;
$payment_array = array();
while ($mysql_payment_row=mysql_fetch_array($mysql_payment)) {
$payment_array[$mysql_payment_row['account_id']]['user_id'] = $mysql_payment_row['id'];
$payment_array[$mysql_payment_row['account_id']]['summa'] = $mysql_payment_row['summa'];
$Summ = $Summ+$mysql_payment_row["summa"];
}
try { $urfa_admin = new URFAClient_Admin($UTMCore_Login,$UTMCore_Password);
} catch (Exception $exception) {
echo "Error in line ", $exception->getLine();
echo $exception->getMessage();
exit;}
foreach($payment_array as $key => $value) {
$payment_account = $key;
$payment_summa = $value['summa'];
$user_id = $value['user_id'];
$loyalty = get_loyalty($payment_account,$loyalty_config);
$bonus_summa = $payment_summa*$loyalty;
$str_log = "Лояльность : ".($loyalty * 100)."%, Аккаунт ".$payment_account.", User_ID=".$user_id." , Платеж = ".$payment_summa."р."." , Бонус = ".$bonus_summa."р.";
if ($loyalty<>0) {
$urfa_admin->rpcf_add_once_service_new(0, 0, $ServiceID, 'Бонус лояльности', '', 0, -$bonus_summa, 0); //0x2116
sleep(1);
$urfa_admin->rpcf_add_once_service_to_user($user_id,$payment_account,$ServiceID,0,0,time(),1,0); //0x2555
sleep(1);
}
mylog($str_log);
}
$str_log = "Сумма: ".$Summ;
mylog($str_log);
$str_log = date("d.m.Y H:i:s")." ---------------------------------------------------------------";
mylog($str_log);
?>