Программа лояльности

Технические вопросы по UTM 5.0
Ответить
Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Программа лояльности

Сообщение Kayfolom »

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

А теперь вопрос в экономической части - кто нибудь делал подобное, какие сроки и проценты использовать? Хочется и заинтересовать клиентов, и не прогореть самому ;) Предварительно планирую следующую схему:
2 месяца - 1%
3 месяца - 2%
4 месяца - 3%
5 месяцев - 4%
6 месяцев - 5%
На этом все, большую скидку жаба давит предоставлять ;) Была идея ввести штраф за сход с дистанции, к примеру аннулирование 50% предоставленной скидки, но отбросил ее как античеловеческую.

Какие мысли будут у уважаемых коллег?

UPDATE 20.10.2014

Готовый рабочий скрипт, обкатан и реально работает уже неделю.
Состоит из трех файлов:
loyalty.ini.php - параметры
loyalty.func.php - функция вычисления лояльности (результат процент лояльности вида от 0.00 до 0.05)
loyalty.php - скрипт обработки платежей за предыдущие сутки (у меня запускается в час ночи по крону).

loyalty.ini.php

Код: Выделить всё

<?php

$loyalty_config=array &#40;	
	'loyalty_db_host'=>'127.0.0.1&#58;3306',
	'loyalty_db_base'=>'UTM5',
	'loyalty_db_user'=>'***********',
	'loyalty_db_password'=>'***********'
&#41;;

$log_file = "/netup/utm5/log/loyalty.log";
//$log2screen = false;
$log2screen = true;

// Применимые методы платежей &#40;таблица payment_methods, поле id&#41; 
$payment_methods = '&#40;10,12,100,101&#41;';
?>
loyalty.func.php

Код: Выделить всё

<?php

include_once&#40;"/netup/utm5/bin/loyalty.ini.php"&#41;;

function mylog&#40;$log_str&#41; &#123;
	global $log_file,$log2screen;
	$file_handle = fopen&#40;$log_file,"a+"&#41;;
	$log_str = "$log_str\r\n";
	if &#40;$log2screen&#41; echo $log_str;	
	fwrite&#40;$file_handle, $log_str&#41;;
	fclose&#40;$file_handle&#41;;
&#125;

function get_loyalty&#40;$account,$loyalty_config&#41; &#123;
	$loyalty = 0;
	$db_connect=mysql_connect&#40;$loyalty_config&#91;'loyalty_db_host'&#93;,$loyalty_config&#91;'loyalty_db_user'&#93;,$loyalty_config&#91;'loyalty_db_password'&#93;&#41; or die &#40;"Connect failed"&#41;;
	mysql_select_db&#40;$loyalty_config&#91;'loyalty_db_base'&#93;,$db_connect&#41;;
	$query = "SELECT is_blocked FROM accounts WHERE id = $account AND is_blocked = 0";
	$mysql_block_result = mysql_query&#40;$query,$db_connect&#41;;
  $mysql_result_count = mysql_num_rows&#40;$mysql_block_result&#41;;
	if &#40;$mysql_result_count==0&#41; &#123;
		$loyalty = 0;
		mysql_close&#40;$db_connect&#41;;
		return $loyalty;
	&#125;
	$query = "SELECT &#40;TO_DAYS&#40;curdate&#40;&#41;&#41; - TO_DAYS&#40;FROM_UNIXTIME&#40;start_date&#41;&#41;&#41; DIV 30 as month_loyalty FROM blocks_info WHERE start_date >= UNIX_TIMESTAMP&#40;date_sub&#40;curdate&#40;&#41;, INTERVAL 6 MONTH&#41;&#41; AND block_type = 1 AND account_id = $account ORDER BY start_date DESC LIMIT 1";
	$mysql_block_result = mysql_query&#40;$query,$db_connect&#41;;
	if &#40;$mysql_block_result==false&#41; &#123;
		$loyalty = 0;
		return $loyalty;
	&#125;
  $mysql_result_count = mysql_num_rows&#40;$mysql_block_result&#41;;
	if &#40;$mysql_result_count==0&#41; &#123;
		$month_loyalty = 6;
	&#125; else &#123;
		$block_result=mysql_fetch_array&#40;$mysql_block_result&#41;;
		$month_loyalty = $block_result&#91;'month_loyalty'&#93;;
	&#125;
	switch &#40;$month_loyalty&#41; &#123;
		case 0&#58;
			$loyalty = 0.00;
			break;
		case 1&#58;
			$loyalty = 0.00;
			break;
		case 2&#58;
			$loyalty = 0.01;
			break;
		case 3&#58;
			$loyalty = 0.02;
			break;
		case 4&#58;
			$loyalty = 0.03;
			break;
		case 5&#58;
			$loyalty = 0.04;
			break;
		case 6&#58;
			$loyalty = 0.05;
			break;
		default&#58;
			$loyalty = 0.00;
			break;	
	&#125;
	mysql_close&#40;$db_connect&#41;;
	return $loyalty;
&#125;

?>
loyalty.php

Код: Выделить всё

<?php
// @ini_set&#40;"display_errors", "1"&#41;; error_reporting&#40;E_ALL&#41;;
@ini_set&#40;"display_errors", "0"&#41;; error_reporting&#40;0&#41;;

$UTMCore_Login='**********';
$UTMCore_Password='********';
$UTMCoreHost='127.0.0.1';
$UTMCorePort='11758';
// Разовая услуга для внесения бонуса
$ServiceID=257;

require_once&#40;"путь к urfaphp/urfa/URFAClient.php"&#41;;
include_once&#40;"/netup/utm5/bin/loyalty.func.php"&#41;;

$str_log = date&#40;"d.m.Y H&#58;i&#58;s"&#41;." ---------------------------------------------------------------";
mylog&#40;$str_log&#41;;

$db_connect=mysql_connect&#40;$loyalty_config&#91;'loyalty_db_host'&#93;,$loyalty_config&#91;'loyalty_db_user'&#93;,$loyalty_config&#91;'loyalty_db_password'&#93;&#41; or die &#40;"Connect failed"&#41;;
mysql_select_db&#40;$loyalty_config&#91;'loyalty_db_base'&#93;,$db_connect&#41;;

//Выборка платежей за предыдущие сутки
$query = "SELECT account_id, SUM&#40;payment_absolute&#41; 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&#40;date_sub&#40;curdate&#40; &#41;, INTERVAL 1 DAY&#41;&#41; AND payment_transactions.actual_date < UNIX_TIMESTAMP&#40;curdate&#40; &#41;&#41; 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&#40;$query&#41;;
$Summ = 0;
$payment_array = array&#40;&#41;;
while &#40;$mysql_payment_row=mysql_fetch_array&#40;$mysql_payment&#41;&#41; &#123;
	$payment_array&#91;$mysql_payment_row&#91;'account_id'&#93;&#93;&#91;'user_id'&#93; = $mysql_payment_row&#91;'id'&#93;;
	$payment_array&#91;$mysql_payment_row&#91;'account_id'&#93;&#93;&#91;'summa'&#93; = $mysql_payment_row&#91;'summa'&#93;;
	$Summ = $Summ+$mysql_payment_row&#91;"summa"&#93;;
&#125;

try &#123;	$urfa_admin = new URFAClient_Admin&#40;$UTMCore_Login,$UTMCore_Password&#41;;
  &#125; catch &#40;Exception $exception&#41; &#123; 
		echo "Error in line ", $exception->getLine&#40;&#41;;
		echo $exception->getMessage&#40;&#41;;
		exit;&#125; 

foreach&#40;$payment_array as $key => $value&#41; &#123; 
	$payment_account = $key;
	$payment_summa = $value&#91;'summa'&#93;;
	$user_id = $value&#91;'user_id'&#93;;

	$loyalty = get_loyalty&#40;$payment_account,$loyalty_config&#41;;

	$bonus_summa = $payment_summa*$loyalty;
	$str_log = "Лояльность &#58; ".&#40;$loyalty * 100&#41;."%, Аккаунт ".$payment_account.", User_ID=".$user_id." , Платеж = ".$payment_summa."р."." , Бонус = ".$bonus_summa."р.";
  if &#40;$loyalty<>0&#41; &#123;
		$urfa_admin->rpcf_add_once_service_new&#40;0, 0, $ServiceID, 'Бонус лояльности', '', 0, -$bonus_summa, 0&#41;; //0x2116
		sleep&#40;1&#41;;
		$urfa_admin->rpcf_add_once_service_to_user&#40;$user_id,$payment_account,$ServiceID,0,0,time&#40;&#41;,1,0&#41;; //0x2555
		sleep&#40;1&#41;;
	&#125;
	mylog&#40;$str_log&#41;;
&#125; 

$str_log = "Сумма&#58; ".$Summ;
mylog&#40;$str_log&#41;;

$str_log = date&#40;"d.m.Y H&#58;i&#58;s"&#41;." ---------------------------------------------------------------";
mylog&#40;$str_log&#41;;

?>
Последний раз редактировалось Kayfolom Пн окт 20, 2014 11:41, всего редактировалось 1 раз.

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Re: Программа лояльности

Сообщение Magnum72 »

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

А теперь вопрос в экономической части - кто нибудь делал подобное, какие сроки и проценты использовать? Хочется и заинтересовать клиентов, и не прогореть самому ;) Предварительно планирую следующую схему:
2 месяца - 1%
3 месяца - 2%
4 месяца - 3%
5 месяцев - 4%
6 месяцев - 5%
На этом все, большую скидку жаба давит предоставлять ;) Была идея ввести штраф за сход с дистанции, к примеру аннулирование 50% предоставленной скидки, но отбросил ее как античеловеческую.

Какие мысли будут у уважаемых коллег?
Лучше не бонус на счет зачислять, а уменьшать коэффициент в услугах.
Ну и дополнительно можно подумать за такое:
1) Скидка в зависимости от стажа
2) Скидка в зависимости от количества подключенных услуг
2) Скидка в зависимости от количества подключенных доп сервисов
3) Скидка в зависимости от количества приведенных друзей
4) Скидка если были обоснованные претензии от абонента
5) Скидка за действия абонентов (например лайк в контакте, покупка антивируса, это позволит подогревать аудиторию)

gtk
Сообщения: 232
Зарегистрирован: Пт янв 21, 2005 18:33

Re: Программа лояльности

Сообщение gtk »

Kayfolom писал(а):Решил внедрить для своих клиентов программу лояльности - если клиент не пропускал платежи, не допускал блокировку по балансу, при платеже ему начисляется дополнительный бонус.

Какие мысли будут у уважаемых коллег?

Скинь, очень интересно.

Antares
Сообщения: 59
Зарегистрирован: Вт мар 11, 2008 08:28

Re: Программа лояльности

Сообщение Antares »

gtk писал(а):
Kayfolom писал(а):Решил внедрить для своих клиентов программу лояльности - если клиент не пропускал платежи, не допускал блокировку по балансу, при платеже ему начисляется дополнительный бонус.

Какие мысли будут у уважаемых коллег?

Скинь, очень интересно.
И мне ))

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Re: Программа лояльности

Сообщение Kayfolom »

gtk писал(а):
Kayfolom писал(а):Решил внедрить для своих клиентов программу лояльности - если клиент не пропускал платежи, не допускал блокировку по балансу, при платеже ему начисляется дополнительный бонус.

Какие мысли будут у уважаемых коллег?

Скинь, очень интересно.
Через недельку скину. Сейчас вхолостую обкатываю, устраняю баги. Будет пока простейшая версия. Предложения Магнума буду в последующем внедрять, кроме наверное уменьшения коэффициентов - не представляю как это технически реализовать и как потом диагностировать и откатывать спорные ситуации.

gtk
Сообщения: 232
Зарегистрирован: Пт янв 21, 2005 18:33

Re: Программа лояльности

Сообщение gtk »

Kayfolom писал(а):
gtk писал(а):
Kayfolom писал(а):Решил внедрить для своих клиентов программу лояльности - если клиент не пропускал платежи, не допускал блокировку по балансу, при платеже ему начисляется дополнительный бонус.

Какие мысли будут у уважаемых коллег?

Скинь, очень интересно.
Через недельку скину. Сейчас вхолостую обкатываю, устраняю баги. Будет пока простейшая версия. Предложения Магнума буду в последующем внедрять, кроме наверное уменьшения коэффициентов - не представляю как это технически реализовать и как потом диагностировать и откатывать спорные ситуации.
ЖДЕМС!

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Опубликовал в первом сообщении. Вычисление лояльности отдельной функцией сделано для использования в Личном кабинете и утилите UTMTray - и там и там добавил строчку для информирования пользователя. Так же в личном кабинете сделал дополнительный отчет по блокировкам за год, чтоб клиент знал откуда у него такой процент лояльности.

UPD Если кому пригодится, то не откажусь от символического вознаграждения на яндекс.деньги 4100165201893 к примеру ;-)
Принимаю и биткоины 193JhFJVNzKjtnQgJgTG1h5hJdTtWtNfNT

apathy_sidex
Сообщения: 14
Зарегистрирован: Ср июл 30, 2014 16:39

Сообщение apathy_sidex »

Как адаптировать данный скрипт к 5.3.002 up-18 там отсутствует функция в урфе $urfa_admin->rpcf_add_once_service_to_user($user_id,$payment_account,$ServiceID,0,0,time(),1,0); //0x2555

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

apathy_sidex писал(а):Как адаптировать данный скрипт к 5.3.002 up-18 там отсутствует функция в урфе $urfa_admin->rpcf_add_once_service_to_user($user_id,$payment_account,$ServiceID,0,0,time(),1,0); //0x2555
Это всего лишь способ начисления бонусов на счет клиента. Можете использовать платеж, или разовую услугу. Разовая услуга есть в урфе, просто функция другая, универсальная под все услуги.

alexandr_nv
Сообщения: 3
Зарегистрирован: Пт окт 01, 2010 13:54

Сообщение alexandr_nv »

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

apathy_sidex
Сообщения: 14
Зарегистрирован: Ср июл 30, 2014 16:39

Сообщение apathy_sidex »

Многоуважаемый Kayfolom, не могли бы вы поделиться новой версией программы лояльности - где скидка плюсуется за года пользования?

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

apathy_sidex писал(а):Многоуважаемый Kayfolom, не могли бы вы поделиться новой версией программы лояльности - где скидка плюсуется за года пользования?
Конечно. Кстати с Новым годом Вас уважаемые коллеги! :-)

Изменения коснулись в основном файла loyalty.func.php.
function get_loyalty_year($account,$loyalty_config) - численная величина лояльности за выслугу лет (от 0.00 до 0.10)
function get_loyalty_payment($account,$loyalty_config) - численная величина лояльности по платежам (от 0.00 до 0.10)
function get_loyalty($account,$loyalty_config) - численная величина лояльности (от 0.00 до 0.20) суммирует результат предыдущих двух функций
function get_loyalty_text($account,$loyalty_config) - краткая текстовая версия лояльности для Интернет агента вида "1 мес(0%)+10 лет(10%)=10%"
function get_loyalty_full_text($account,$loyalty_config) - полная текстовая версия лояльности для Личного кабинета вида "Баланс в плюсе 1 мес.(0%) + С нами 10 лет(10%) Итого: 10%"

Содержимое loyalty.func.php:

Код: Выделить всё

<?php

include_once&#40;"/netup/utm5/bin/loyalty.ini.php"&#41;;

function mylog&#40;$log_str&#41; &#123;
	global $log_file,$log2screen;
	$file_handle = fopen&#40;$log_file,"a+"&#41;;
	$log_str = "$log_str\r\n";
	if &#40;$log2screen&#41; echo $log_str;	
	fwrite&#40;$file_handle, $log_str&#41;;
	fclose&#40;$file_handle&#41;;
&#125;


function get_loyalty_year&#40;$account,$loyalty_config&#41; &#123;
	$loyalty_year = 0;
//	print_r&#40;$loyalty_config&#41;;
//	echo "loyalty_db_host=".$loyalty_config&#91;'loyalty_db_host'&#93;."\r\n<BR>";
	$db_connect=mysql_connect&#40;$loyalty_config&#91;'loyalty_db_host'&#93;,$loyalty_config&#91;'loyalty_db_user'&#93;,$loyalty_config&#91;'loyalty_db_password'&#93;&#41; or die &#40;"Connect failed"&#41;;
	mysql_select_db&#40;$loyalty_config&#91;'loyalty_db_base'&#93;,$db_connect&#41;;

	$query = "SELECT FLOOR&#40;&#40;UNIX_TIMESTAMP&#40;&#41; - create_date&#41;/3600/24/365&#41; as year_between FROM users WHERE basic_account = $account";           

	$mysql_block_result = mysql_query&#40;$query,$db_connect&#41;;
  $mysql_result_count = mysql_num_rows&#40;$mysql_block_result&#41;;
	if &#40;$mysql_result_count==0&#41; &#123;
		$loyalty_year = 0;
		mysql_close&#40;$db_connect&#41;;
		return $loyalty_year;
	&#125;
	$block_result=mysql_fetch_array&#40;$mysql_block_result&#41;;
	$loyalty_year = $block_result&#91;'year_between'&#93;;
	
	if &#40;$loyalty_year>10&#41; $loyalty_year = 10;
	mysql_close&#40;$db_connect&#41;;
	$loyalty_year = $loyalty_year / 100;
	return $loyalty_year;
&#125;

function get_loyalty_payment&#40;$account,$loyalty_config&#41; &#123;
//	global $loyalty_db_host,$loyalty_db_base,$loyalty_db_user,$loyalty_db_password;
	$loyalty = 0;
//	print_r&#40;$loyalty_config&#41;;
//	echo "loyalty_db_host=".$loyalty_config&#91;'loyalty_db_host'&#93;."\r\n<BR>";
	$db_connect=mysql_connect&#40;$loyalty_config&#91;'loyalty_db_host'&#93;,$loyalty_config&#91;'loyalty_db_user'&#93;,$loyalty_config&#91;'loyalty_db_password'&#93;&#41; or die &#40;"Connect failed"&#41;;
	mysql_select_db&#40;$loyalty_config&#91;'loyalty_db_base'&#93;,$db_connect&#41;;

	$query = "SELECT is_blocked FROM accounts WHERE id = $account AND is_blocked = 0";
	$mysql_block_result = mysql_query&#40;$query,$db_connect&#41;;
  $mysql_result_count = mysql_num_rows&#40;$mysql_block_result&#41;;
	if &#40;$mysql_result_count==0&#41; &#123;
		$loyalty = 0;
		mysql_close&#40;$db_connect&#41;;
		return $loyalty;
	&#125;

//	$query = "SELECT &#40;TO_DAYS&#40;curdate&#40;&#41;&#41; - TO_DAYS&#40;FROM_UNIXTIME&#40;start_date&#41;&#41;&#41; DIV 30 as month_loyalty FROM blocks_info WHERE start_date >= UNIX_TIMESTAMP&#40;date_sub&#40;curdate&#40;&#41;, INTERVAL 6 MONTH&#41;&#41; AND start_date < UNIX_TIMESTAMP&#40;curdate&#40; &#41;+1&#41; AND block_type = 1 AND account_id = $account ORDER BY start_date DESC LIMIT 1";
	$query = "SELECT &#40;TO_DAYS&#40;curdate&#40;&#41;&#41; - TO_DAYS&#40;FROM_UNIXTIME&#40;start_date&#41;&#41;&#41; DIV 30 as month_loyalty FROM blocks_info WHERE start_date >= UNIX_TIMESTAMP&#40;date_sub&#40;curdate&#40;&#41;, INTERVAL 11 MONTH&#41;&#41; AND block_type = 1 AND account_id = $account ORDER BY start_date DESC LIMIT 1";
//	echo $query."\r\n<BR>";
	$mysql_block_result = mysql_query&#40;$query,$db_connect&#41;;
	if &#40;$mysql_block_result==false&#41; &#123;
		$loyalty = 0;
		return $loyalty;
	&#125;
  $mysql_result_count = mysql_num_rows&#40;$mysql_block_result&#41;;
//	echo "mysql_result_count=".$mysql_result_count."\r\n<BR>";
	if &#40;$mysql_result_count==0&#41; &#123;
		$month_loyalty = 11;
	&#125; else &#123;
		$block_result=mysql_fetch_array&#40;$mysql_block_result&#41;;
		$month_loyalty = $block_result&#91;'month_loyalty'&#93;;
	&#125;
//	echo "month_loyalty=".$month_loyalty."\r\n<BR>";
	switch &#40;$month_loyalty&#41; &#123;
		case 0&#58;
			$loyalty = 0.00;
			break;
		case 1&#58;
			$loyalty = 0.00;
			break;
		case 2&#58;
			$loyalty = 0.01;
			break;
		case 3&#58;
			$loyalty = 0.02;
			break;
		case 4&#58;
			$loyalty = 0.03;
			break;
		case 5&#58;
			$loyalty = 0.04;
			break;
		case 6&#58;
			$loyalty = 0.05;
			break;
		case 7&#58;
			$loyalty = 0.06;
			break;
		case 8&#58;
			$loyalty = 0.07;
			break;
		case 9&#58;
			$loyalty = 0.08;
			break;
		case 10&#58;
			$loyalty = 0.09;
			break;
		case 11&#58;
			$loyalty = 0.10;
			break;

		default&#58;
			$loyalty = 0.00;
			break;	
	&#125;
//	echo $loyalty."\r\n";
	mysql_close&#40;$db_connect&#41;;
	return $loyalty;
&#125;


function get_loyalty&#40;$account,$loyalty_config&#41; &#123;
	$loyalty = 0;
	$loyalty_payment = get_loyalty_payment&#40;$account,$loyalty_config&#41;;
	$loyalty_year = get_loyalty_year&#40;$account,$loyalty_config&#41;;
	$loyalty = 	$loyalty_payment + $loyalty_year;
	return $loyalty;	
&#125;

function get_loyalty_text&#40;$account,$loyalty_config&#41; &#123;
	$loyalty_payment_text = '';
	$loyalty_year_text = '';
	$loyalty_payment = intval&#40;get_loyalty_payment&#40;$account,$loyalty_config&#41; * 100&#41;;
//	echo "loyalty_payment=$loyalty_payment\n";
	$loyalty_payment_month = $loyalty_payment + 1;
	$loyalty_year = intval&#40;get_loyalty_year&#40;$account,$loyalty_config&#41; * 100&#41;;
	$loyalty_procent = $loyalty_payment+$loyalty_year;
//	$loyalty_payment_text = "Баланс в плюсе $loyalty_payment_month мес.&#40;$loyalty_payment%&#41;";
	$loyalty_payment_text = "$loyalty_payment_month мес&#40;$loyalty_payment%&#41;";
	switch &#40;$loyalty_year&#41; &#123;
		case 0&#58;
		case 5&#58;
		case 6&#58;
		case 7&#58;
		case 8&#58;
		case 9&#58;
		case 10&#58;
			$loyalty_year_text = "лет";
			break;
		case 1&#58;
			$loyalty_year_text = "год";
			break;
		case 2&#58;
		case 3&#58;
		case 4&#58;
			$loyalty_year_text = "года";
			break;
	&#125;
//	echo "loyalty_year_text = $loyalty_year_text\n";

	$loyalty_year_text = "$loyalty_year $loyalty_year_text&#40;$loyalty_year%&#41;";
	$loyalty =  $loyalty_payment_text.'+'.$loyalty_year_text."=".$loyalty_procent."%";
	
	return $loyalty;	
&#125;

function get_loyalty_full_text&#40;$account,$loyalty_config&#41; &#123;
	$loyalty_payment_text = '';
	$loyalty_year_text = '';
	$loyalty_payment = intval&#40;get_loyalty_payment&#40;$account,$loyalty_config&#41; * 100&#41;;
//	echo "loyalty_payment=$loyalty_payment\n";
	$loyalty_payment_month = $loyalty_payment + 1;
	$loyalty_year = intval&#40;get_loyalty_year&#40;$account,$loyalty_config&#41; * 100&#41;;
	$loyalty_procent = $loyalty_payment+$loyalty_year;
	$loyalty_payment_text = "Баланс в плюсе $loyalty_payment_month мес.&#40;$loyalty_payment%&#41;";
//	$loyalty_payment_text = "$loyalty_payment_month мес&#40;$loyalty_payment%&#41;";
	switch &#40;$loyalty_year&#41; &#123;
		case 0&#58;
		case 5&#58;
		case 6&#58;
		case 7&#58;
		case 8&#58;
		case 9&#58;
		case 10&#58;
			$loyalty_year_text = "лет";
			break;
		case 1&#58;
			$loyalty_year_text = "год";
			break;
		case 2&#58;
		case 3&#58;
		case 4&#58;
			$loyalty_year_text = "года";
			break;
	&#125;
//	echo "loyalty_year_text = $loyalty_year_text\n";

	$loyalty_year_text = "С нами $loyalty_year $loyalty_year_text&#40;$loyalty_year%&#41;";
	$loyalty =  $loyalty_payment_text.' + '.$loyalty_year_text."<BR> Итого&#58; ".$loyalty_procent."%";
	
	return $loyalty;	
&#125;

?>

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

На всякий случай код скрипта начисления бонусов loyalty.php (у меня запускается по крону в 10:00)
Из неизвестного здесь только функция SendLoyaltyMessageToUser($payment_account,$loyalty_procent,$bonus_summa) - рассылает сообщения о начислении бонусов через Интернет агент и SMS

loyalty.php

Код: Выделить всё

<?php
// @ini_set&#40;"display_errors", "1"&#41;; error_reporting&#40;E_ALL&#41;;
@ini_set&#40;"display_errors", "0"&#41;; error_reporting&#40;0&#41;;

$UTMCore_Login='**************';
$UTMCore_Password='****************';
$UTMCoreHost='*************************';
$UTMCorePort='11758';
$ServiceID=257;

require_once&#40;"/var/www/html/stat/urfa/URFAClient.php"&#41;;
include_once&#40;"/netup/utm5/bin/loyalty.func.php"&#41;;
require&#40;"/netup/utm5/bin/helpdesk/helpdesk.php"&#41;;

$str_log = date&#40;"d.m.Y H&#58;i&#58;s"&#41;." ---------------------------------------------------------------";
mylog&#40;$str_log&#41;;

$db_connect=mysql_connect&#40;$loyalty_config&#91;'loyalty_db_host'&#93;,$loyalty_config&#91;'loyalty_db_user'&#93;,$loyalty_config&#91;'loyalty_db_password'&#93;&#41; or die &#40;"Connect failed"&#41;;
mysql_select_db&#40;$loyalty_config&#91;'loyalty_db_base'&#93;,$db_connect&#41;;

//Выборка платежей за предыдущие сутки
$query = "SELECT account_id, SUM&#40;payment_absolute&#41; as summa, users.id , FROM_UNIXTIME&#40;payment_transactions.actual_date&#41; as payment_date FROM payment_transactions ";
$query = $query."INNER JOIN users ON users.basic_account = payment_transactions.account_id WHERE ";
$query = $query."payment_transactions.actual_date >= UNIX_TIMESTAMP&#40;date_sub&#40;curdate&#40; &#41;, INTERVAL 1 DAY&#41;&#41; AND ";
$query = $query."payment_transactions.actual_date < UNIX_TIMESTAMP&#40;curdate&#40; &#41;&#41; 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&#40;$query&#41;;
$Summ = 0;
$payment_array = array&#40;&#41;;
while &#40;$mysql_payment_row=mysql_fetch_array&#40;$mysql_payment&#41;&#41; &#123;
//	print_r&#40;$mysql_payment_row&#41;;
//	echo "\n";
//	$payment_array&#91;$mysql_payment_row&#91;"account_id"&#93;&#93; = $mysql_payment_row&#91;"summa"&#93;;
	$payment_array&#91;$mysql_payment_row&#91;'account_id'&#93;&#93;&#91;'user_id'&#93; = $mysql_payment_row&#91;'id'&#93;;
	$payment_array&#91;$mysql_payment_row&#91;'account_id'&#93;&#93;&#91;'summa'&#93; = $mysql_payment_row&#91;'summa'&#93;;
	$payment_array&#91;$mysql_payment_row&#91;'account_id'&#93;&#93;&#91;'payment_date'&#93; = $mysql_payment_row&#91;'payment_date'&#93;;

//	echo $mysql_row&#91;"account_id"&#93;." - ".$mysql_row&#91;"summa"&#93;."\r\n";
	$Summ = $Summ+$mysql_payment_row&#91;"summa"&#93;;
&#125;


try &#123;	$urfa_admin = new URFAClient_Admin&#40;$UTMCore_Login,$UTMCore_Password&#41;;
  &#125; catch &#40;Exception $exception&#41; &#123; 
//		echo "Error in line ", $exception->getLine&#40;&#41;;
		$str_log = date&#40;"d.m.Y H&#58;i&#58;s"&#41;."URFAClient error in line ".$exception->getLine&#40;&#41;." exception&#58; ".$exception->getMessage&#40;&#41;;
		mylog&#40;$str_log&#41;;
//		echo $exception->getMessage&#40;&#41;;
		exit;&#125; 

//print_r&#40;$payment_array&#41;;

foreach&#40;$payment_array as $key => $value&#41; &#123; 
	$payment_account = $key;
	$payment_summa = $value&#91;'summa'&#93;;
	$user_id = $value&#91;'user_id'&#93;;
	$payment_date = $value&#91;'payment_date'&#93;;

	$loyalty = get_loyalty&#40;$payment_account,$loyalty_config&#41;;
	$loyalty_procent = $loyalty * 100;

	$bonus_summa = $payment_summa*$loyalty;
	$str_log = "Лояльность &#58; ".$loyalty_procent."% \t Аккаунт ".$payment_account."\tUser_ID=".$user_id."\tПлатеж = ".$payment_summa."р.\tДата ".$payment_date."\tБонус = ".$bonus_summa."р."; 
  if &#40;$bonus_summa>0&#41; &#123;

	$str_log.= "\t***";
		$urfa_admin->rpcf_add_once_service_new&#40;0, 0, $ServiceID, 'Бонус лояльности', '', 0, -$bonus_summa, 0&#41;; //0x2116
		sleep&#40;1&#41;;
		$urfa_admin->rpcf_add_once_service_to_user&#40;$user_id,$payment_account,$ServiceID,0,0,time&#40;&#41;,1,0&#41;; //0x2555
		sleep&#40;1&#41;;

		SendLoyaltyMessageToUser&#40;$payment_account,$loyalty_procent,$bonus_summa&#41;;
	&#125;
	mylog&#40;$str_log&#41;;

&#125; 

$str_log = "Сумма платежей&#58; ".$Summ."р.";
mylog&#40;$str_log&#41;;

$str_log = date&#40;"d.m.Y H&#58;i&#58;s"&#41;." ---------------------------------------------------------------";
mylog&#40;$str_log&#41;;
?>

gtk
Сообщения: 232
Зарегистрирован: Пт янв 21, 2005 18:33

Сообщение gtk »

На 5.2.1(008) работать будет? У вас аськи нету? связаться с вами?

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

gtk писал(а):На 5.2.1(008) работать будет? У вас аськи нету? связаться с вами?
Ну а почему не будет? Будет конечно. Перепроверьте только работу sql запросов (хотя разработчики вряд ли структуру базы меняли) и код зачисления бонусов замените на работающий в нужной версии.

P.S. Аськи у меня уже много лет нет. Пишите на мыло evgeniy.korepov{*}gmail.com

Ответить