Example #1
0
 /**
  * Совершить покупку
  *
  * @param integer $id				возвращает id покупки
  * @param integer $transaction_id	идентификатор текущей транзакции
  * @param integer $op_code			идентификатор операции
  * @param integer $uid				UID
  * @param string  $descr			описание для системы
  * @param string  $comments			описание для истории юзера
  * @param integer $ammount			количество товара
  * @param integer $commit			завершать ли транзакцию?
  * @param integer $promo_code   	ИД промо-кода
  * 
  * @return integer					0
  */
 function Buy(&$id, $transaction_id, $op_code, $uid, $descr = "", $comments = "", $ammount = 1, $commit = 1, $promo_code = 0, $payment_sys = 0, $trs_sum = 0)
 {
     global $DB;
     if (!$transaction_id || $transaction_id != $this->check_transaction($transaction_id, $uid)) {
         return "Невозможно завершить транзакцию";
     } else {
         $res = $DB->query("SELECT op_codes.sum as op_sum, account.sum, account.id FROM op_codes, account WHERE op_codes.id=? AND account.uid=?", $op_code, $uid);
         if (pg_errormessage()) {
             return "Ошибка при получении информации о счете!";
         }
         list($op_sum, $ac_sum, $bill_id) = pg_fetch_row($res);
         $sum = $op_sum * $ammount;
         if ($promo_code) {
             $promoCodes = new PromoCodes();
             $sum = $sum - $promoCodes->getDiscount($promo_code, $sum);
         }
         $ac_sum = round($ac_sum, 2);
         $sum = round($sum, 2);
         //@todo: зачем мемкеш? если занос денег deposit и покупка в отдной сессии php
         //можно было старое значение передать глобальной переменной или реестром
         $memBuff = new memBuff();
         $ac_sum_old = round($memBuff->get("ac_sum_old_" . $uid), 2);
         $memBuff->delete("ac_sum_old_" . $uid);
         $new_ac_sum = $ac_sum_old < 0 ? $ac_sum - $ac_sum_old : $ac_sum;
         if ($sum > 0 && $sum > $new_ac_sum) {
             return "Недостаточно средств на счету!";
         }
         if ($sum < 0) {
             return "Покупка на отрицательную сумму!";
         }
         $id = $DB->insert('account_operations', array('billing_id' => $bill_id, 'op_code' => $op_code, 'ammount' => -$sum, 'descr' => $descr, 'comments' => $comments, 'payment_sys' => $payment_sys, 'trs_sum' => $trs_sum), 'id');
         if ($DB->error) {
             return "Ошибка при записи счета!";
         } else {
             if ($uid == get_uid(false)) {
                 $_SESSION['ac_sum'] = $_SESSION['ac_sum'] - $sum;
             }
         }
         if ($promo_code) {
             $promoCodes->markUsed($promo_code);
         }
         // количество операций
         $_SESSION['account_operations'] = intval($_SESSION['account_operations']) + 1;
         // для счетчика everesttech.net (см. engine/templates/footer.tpl)
         if ($sum > 0) {
             $_SESSION['everesttech_conter'] = 1;
         }
         if ($commit) {
             $this->commit_transaction($transaction_id, $uid, $id);
         }
     }
     return 0;
 }