/** * Совершить покупку * * @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; }