<?php

/**
 * Payments module
 *
 * @package payments
 * @version 1.1.2
 * @author CMSWorks Team
 * @copyright Copyright (c) CMSWorks.ru
 * @license BSD
 */
defined('COT_CODE') or die('Wrong URL');

// Requirements
require_once cot_langfile('payments', 'module');

cot::$db->registerTable('payments');
cot::$db->registerTable('payments_outs');
cot::$db->registerTable('payments_transfers');
cot::$db->registerTable('payments_services');

$cfg['payments']['payout_types_arr'] = array(
  'card' => 'Банковская карта',
  'yandex' => 'ЮMoney (Яндекс.Деньги)',
  'qiwi' => 'Qiwi Кошелек',
  'wm' => 'WebMoney',
  
);

$cfg['payments']['payout_tax'] = array(
  //Моб. телефон
  'mc' => array(
    'tax' => 2, // Комиссия платежной системы (в процентах)
    'systax' => 3, // Комиссия сайта (в процентах)
    'mintax' => 10, // Минимальная комиссия (в рублях)
    'minsum' => 200, // Минимальная сумма для вывода (в рублях)
    'maxsum' => 15000, // Максимальная сумма для вывода (в рублях)
    'desc' => ''
  ),
  //киви
  'qiwi' => array(
    'tax' => 2,
    'systax' => 3,
    'mintax' => 10,
    'minsum' => 200,
    'maxsum' => 250000,
    'desc' => '
      <strong>Выплаты только на Qiwi-кошельки со статусами "Основной" или "Профессиональный".</strong>
      <br>
      Комиccия платежной системы на вывод составляет {$taxsum}%. Минимальная сумма вывода {$minsum} руб.
      <br>
      Вывод средств осуществляется 3 раза в неделю  (в первой половине дня в пн, ср и пт).
      <br>
      После обработки заявки на вывод, средства зачисляются на кошелек в течение нескольких минут. В редких случаях срок операции может занимать до 3 рабочих дней.
    '
  ),
  //Банк. карта
  'card' => array(
    'tax' => 3,
    'systax' => 3,
    'mintax' => 10, // Если есть минимальная комиссия, нужно учитывать системный % и минимальную сумму, она должна составлять минимум = (mintax / tax) * 100
    'minsum' => 200,
    'maxsum' => 60000,
    'desc' => '
      Вывод возможен на карты Visa и MasterСard.
      <br>
      Комиccия платежной системы на вывод составляет {$taxsum}%. Минимальная сумма вывода {$minsum} руб.
      <br>
      Вывод средств осуществляется 3 раза в неделю (в первой половине дня в пн, ср и пт).
      <br>
      После обработки заявки на вывод, средства зачисляются на карту в течение нескольких часов. В редких случаях срок операции может занимать до 7 рабочих дней.
    '
  ),
  //WebMoney
  'wm' => array(
    'tax' => 3,
    'systax' => 3,
    'mintax' => 10,
    'minsum' => 200,
    'maxsum' => 140000,
    'desc' => '
      Комиccия платежной системы на вывод составляет {$taxsum}%. Минимальная сумма вывода {$minsum} руб.
      <br>
      Вывод средств осуществляется 3 раза в неделю (в первой половине дня в пн, ср и пт).
      <br>
      После обработки заявки на вывод, средства зачисляются на кошелек в течение нескольких минут. В редких случаях срок операции может занимать до 3 рабочих дней.
    '
  ),
  //Яндекс.Деньги
  'yandex' => array(
    'tax' => 2,
    'systax' => 3,
    'mintax' => 10,
    'minsum' => 200,
    'maxsum' => 15000,
    'desc' => '
      Комиccия платежной системы на вывод составляет {$taxsum}%. Минимальная сумма вывода {$minsum} руб.
      <br>
      Вывод средств осуществляется 3 раза в неделю (в первой половине дня в пн, ср и пт).
      <br>
      После обработки заявки на вывод, средства зачисляются на кошелек в течение нескольких минут. В редких случаях срок операции может занимать до 3 рабочих дней.
    '
  ),
);

foreach($cfg['payments']['payout_tax'] as $key => $val) {
  $cfg['payments']['payout_tax'][$key]['taxsum'] = $cfg['payments']['payout_tax'][$key]['tax'] + $cfg['payments']['payout_tax'][$key]['systax'];
}

function cot_payment_cfg_info_json($bill = '') {
  global $cfg;
  $return = '';

  if(!empty($bill)) {
    $return = trim($cfg['payments']['payout_tax'][$bill]['desc']);
    $return = str_replace(array("\n\r", "\n", "\r", "\n".PHP_EOL, PHP_EOL), '', $return);
    $return = cot_rc($return, $cfg['payments']['payout_tax'][$bill]);
  }
  return $return;
}

function cot_payment_get_payout_summ_withtax($summ = 0, $paytype = '') {
  global $cfg;

  $payout_summ = $summ;
  if(!empty($paytype) && is_array($cfg['payments']['payout_tax'][$paytype])) {
    $payout_cfg = $cfg['payments']['payout_tax'][$paytype];

    if(is_array($payout_cfg)) {
      if($payout_cfg['systax'] > 0) {
        $payout_tax = $payout_summ - $payout_summ * (($payout_cfg['tax'] + $payout_cfg['systax']) / 100);
        $payout_summ = round((($payout_tax / (100 - $payout_cfg['tax'])) * 100), 2);

        $jj = 0;
        while($jj < 10 && $payout_tax > ($payout_summ * ((100 - $payout_cfg['tax']) / 100))) {
          $jj++;
          $payout_summ += 0.01;
        }
      }
    }
  }

  return $payout_summ;
}

/**
 * Удаление услуг с истекщим сроком действия (если установлен параметр service_expire)
 * 
 * @param string $area идентификатор услуги
 * @param int $userid id пользователя
 * @return bool
 */
function cot_payments_delete_expired_services($area, $userid = null)
{
	global $db_payments_services, $db, $sys;
	
	if($userid > 0) $query_string = "AND service_userid=".$userid;
		
	if ($db->delete($db_payments_services, "service_expire > 0 AND service_expire < " . $sys['now'] . $query_string))
		return true;
	else
		return false;
}

/**
 * Добавление / Изменение услуги для пользователя
 *
 * @param string $area идентификатор услуги
 * @param int $userid id пользователя
 * @param int $expire срок действия
 * @param string $action действие get /set
 * @return int
 */
function cot_payments_userservice($area, $userid, $expire, $action='set')
{
	global $db_payments_services, $db, $sys;
	
	$service_expire = $db->query("SELECT service_expire FROM $db_payments_services 
		WHERE service_userid=" . $userid . " AND service_area='".$area."' AND service_expire > " . $sys['now'])->fetchColumn();
	
	if($action == 'get')
	{
		return $service_expire;
	}
	
	$initialtime = ($service_expire > $sys['now']) ? $service_expire : $sys['now'];
	$res['service_expire'] = $initialtime + (int)$expire;	

	if((int)$service_expire > 0 && (int)$expire <= 0)
	{
		$db->delete($db_payments_services, "service_area=? AND service_userid=?", array($area, $userid));
		return false;
	}	
	elseif((int)$service_expire > 0)
	{
		$db->update($db_payments_services, $res, "service_area=? AND service_userid=?", array($area, $userid));
	}
	elseif((int)$expire > 0)
	{
		$res['service_area'] = $area;
		$res['service_userid'] = $userid;	
		$db->insert($db_payments_services, $res);
	}
	return $res['service_expire'];
}

/**
 * Создание платежки
 * @param string $area тип услуги, по-умолчанию пополнение счета
 * @param int $summ стоимость
 * @param array $options дополнительные параметры
 */
function cot_payments_create_order($area = 'balance', $summ, $options = array(), $billservice = '')
{
	global $db_payments, $db_payments_balance, $db, $sys, $cfg, $usr;

	if(empty($summ))
	{
		return 0;
	}
	
	$payinfo['pay_userid'] = $usr['id'];
	$payinfo['pay_area'] = $area;
	$payinfo['pay_summ'] = $summ;
  $payinfo['pay_paydodji'] = 0;
  $payinfo['pay_dodji'] = 0;
	$payinfo['pay_cdate'] = $sys['now'];
	$payinfo['pay_status'] = 'new';

	if (count($options) > 0)
	{
		foreach ($options as $i => $opt)
		{
			$payinfo['pay_' . $i] = $opt;
		}
	}

  if($payinfo['pay_paydodji'] && $payinfo['pay_summ'] > 0 && !$payinfo['pay_dodji']) {
     $payinfo['pay_dodji'] = $payinfo['pay_summ'];
  }

	// Создание платежного поручения для системы

	$db->insert($db_payments, $payinfo);
	$id = $db->lastInsertId();

  return $id;
}

/**
 * Создание платежки валюте RZ-WORK
 * @param string $area тип услуги, по-умолчанию пополнение счета
 * @param int $summ стоимость
 * @param array $options дополнительные параметры
 */
function cot_payments_create_order_dodji($area = 'balance', $summ, $options = array(), $billservice = '')
{
	global $db_payments, $db_payments_balance, $db, $sys, $cfg, $usr;

	if(empty($summ))
	{
		return 0;
	}

	$payinfo['pay_userid'] = $usr['id'];
	$payinfo['pay_area'] = $area;
	$payinfo['pay_summ'] = 0;
  $payinfo['pay_paydodji'] = 1;
  $payinfo['pay_dodji'] = $summ;
	$payinfo['pay_cdate'] = $sys['now'];
	$payinfo['pay_status'] = 'new';

	if (count($options) > 0)
	{
		foreach ($options as $i => $opt)
		{
			$payinfo['pay_' . $i] = $opt;
		}
	}

	// Создание платежного поручения для системы

	$db->insert($db_payments, $payinfo);
	$id = $db->lastInsertId();

  return $id;
}

function cot_payments_updateuserbalance_hand($userid, $summ, $desc = '', $indodji = false)
{
	global $db_payments, $db, $sys;

  $pid = 0;

  $pdata = array();
  $pdata['pay_userid'] = $userid;
  $pdata['pay_area'] = 'balance';
  $pdata['pay_status'] = 'done';
  $pdata['pay_code'] = 0;
  $pdata['pay_cdate'] = $sys['now'];
  $pdata['pay_pdate'] = $sys['now'];
  $pdata['pay_adate'] = $sys['now'];
  $pdata['pay_desc'] = $desc;

  if($summ < 0) {
    $pdata['pay_area'] = 'handpay';
    if($indodji) {
      $pdata['pay_paydodji'] = 1;
      $pdata['pay_summ'] = 0;
      $pdata['pay_dodji'] = -$summ;
    } else {
      $pdata['pay_paydodji'] = 0;
      $pdata['pay_summ'] = -$summ;
      $pdata['pay_dodji'] = 0;
    }
    $sql = $db->insert($db_payments, $pdata);
    $pid = $db->lastInsertId();

    $pdata['pay_area'] = 'balance';
    $pdata['pay_code'] = $pid;
  }

  if($indodji) {
    $pdata['pay_paydodji'] = 1;
    $pdata['pay_summ'] = 0;
    $pdata['pay_dodji'] = $summ;
  } else {
    $pdata['pay_paydodji'] = 0;
    $pdata['pay_summ'] = $summ;
    $pdata['pay_dodji'] = 0;
  }
  $sql = $db->insert($db_payments, $pdata);
  $pid = $db->lastInsertId();

	return $pid;
}

/**
 * Получение информации о платежке
 */
function cot_payments_payinfo($pid)
{
	global $db_payments, $db;

	$sql = $db->query("SELECT * FROM $db_payments WHERE pay_id=" . $pid);
	return ($pinfo = $sql->fetch()) ? $pinfo : false;
}

/**
 * Получение всех платежек по услуге с заданным статусом 
 */
function cot_payments_getallpays($area, $status = 'all')
{
	global $db_payments, $db;

	if ($status == 'all')
	{
		$allpays = $db->query("SELECT * FROM $db_payments WHERE pay_area='" . $area . "'")->fetchAll();
	}
	else
	{
		$allpays = $db->query("SELECT * FROM $db_payments WHERE pay_area='" . $area . "' AND pay_status='" . $status . "'")->fetchAll();
	}
	return ($allpays) ? $allpays : false;
}

/**
 * Обновление статуса платежки:
 * new - новая
 * process - в процессе оплаты
 * paid - оплачена
 * done - исполнено (услуга активирована)
 */
function cot_payments_updatestatus($pid, $status)
{
	global $db_payments, $db, $sys;

	$pdata['pay_status'] = $status;
	if ($status == 'paid') // Оплачено
	{
		$pdata['pay_pdate'] = $sys['now'];
	}
	if ($status == 'done') // Исполнено
	{
		$pdata['pay_adate'] = $sys['now'];
	}
	$sql = $db->update($db_payments, $pdata, "pay_id=?", array($pid));

	/* === Hook === */
	foreach (cot_getextplugins('payments.updatestatus') as $pl)
	{
		include $pl;
	}
	/* ===== */

	return ($sql) ? true : false;
}


function cot_payments_getuserbalance($userid, $indodji = false){
	global $db_payments, $db;
	
	$balance = $db->query("SELECT SUM(".($indodji ? "pay_dodji" : "pay_summ").") FROM $db_payments
		WHERE pay_userid=".$userid." AND pay_paydodji=".($indodji ? 1 : 0)." AND pay_area='balance' AND pay_status='done'")->fetchColumn();
	
	return ($balance > 0) ? $balance : 0;
}


function cot_payments_updateuserbalance($userid, $summ, $pid, $indodji = false)
{
	global $db_payments, $db, $sys;

	$pdata['pay_userid'] = $userid;
  if($indodji) {
    $pdata['pay_paydodji'] = 1;
	  $pdata['pay_summ'] = 0;
    $pdata['pay_dodji'] = $summ;
  } else {
    $pdata['pay_paydodji'] = 0;
	  $pdata['pay_summ'] = $summ;
    $pdata['pay_dodji'] = 0;
  }
	$pdata['pay_area'] = 'balance';
	$pdata['pay_status'] = 'done';
	$pdata['pay_code'] = $pid;
	$pdata['pay_cdate'] = $sys['now'];
	$pdata['pay_pdate'] = $sys['now'];
	$pdata['pay_adate'] = $sys['now'];
	
	$sql = $db->insert($db_payments, $pdata);
	return ($sql) ? true : false;
}

function cot_generate_paytags($item_data, $tag_prefix = '')
{
	global $db, $cfg, $L, $Ls, $R, $db_payments, $usr, $sys;
	static $extp_first = null, $extp_main = null;

	if (is_null($extp_first))
	{
		$extp_first = cot_getextplugins('paytags.first');
		$extp_main = cot_getextplugins('paytags.main');
	}

	/* === Hook === */
	foreach ($extp_first as $pl)
	{
		include $pl;
	}
	/* ===== */
	if (!is_array($item_data))
	{
		$sql = $db->query("SELECT * FROM $db_payments WHERE pay_id = '" . (int)$item_data . "' LIMIT 1");
		$item_data = $sql->fetch();
	}

	if ($item_data['pay_id'] > 0 && !empty($item_data['pay_area']))
	{
		$temp_array = array(
			'ID' => $item_data['pay_id'],
			'USERID' => $item_data['pay_userid'],
			'CDATE' => $item_data['pay_cdate'],
			'PDATE' => $item_data['pay_pdate'],
			'ADATE' => $item_data['pay_adate'],
			'AREA' => $item_data['pay_area'],
			'CODE' => $item_data['pay_code'],
			'DESC' => $item_data['pay_desc'],
			'SUMM' => round($item_data['pay_summ'], 0),
      'SUMM_DODJI' => round($item_data['pay_dodji'], 0),
      'IN_DODJI' => ($item_data['pay_paydodji'] ? 1 : 0),
      'VALUTA' => ($item_data['pay_paydodji'] ? $cfg['payments']['valutadodji'] : $cfg['payments']['valuta']),
			'TIME' => $item_data['pay_time'],
			'STATUS' => $item_data['pay_status'],
		);

		/* === Hook === */
		foreach ($extp_main as $pl)
		{
			include $pl;
		}
		/* ===== */
	}

	$return_array = array();
	foreach ($temp_array as $key => $val)
	{
		$return_array[$tag_prefix . $key] = $val;
	}

	return $return_array;
}

?>