/** * Выполняет платеж */ private function addOperation() { global $DB; $DB->error_output = false; $shopParams = $this->getShopParams(); $payment = $DB->row(' SELECT aoy.id, aoy.descr, ao.id AS acc_op_id FROM account_operations_yd AS aoy LEFT JOIN account_operations AS ao ON ao.id = aoy.acc_op_id AND ao.billing_id = aoy.billing_id WHERE invoice_id = ?', $this->params['invoiceId']); //Пополнение и покупка уже были отвечаем успехом if ($payment['acc_op_id'] > 0) { return 0; } $DB->start(); $op_id = 0; $data = array(); $billing = null; $account = new account(); //Заносим деньги на ЛС $error = $account->deposit($op_id, $this->params['customerNumber'], $shopParams['ammount'], $payment['descr'], array_search($this->params['paymentType'], $this->payments), $this->params['orderSumAmount'], $shopParams['op_code']); //Если все без ошибок и ЛС зачислены то пробуем купить заказ if (!$error && $op_id > 0) { $success = true; $data['acc_op_id'] = $op_id; //Пробуем купить заказ за который занесли деньги выше //Если заказ уже куплен или отменен то ничего не делаем но получим успех if ($this->params['orderId']) { $billing = new billing($account->uid); if ($success = $billing->buyOrder($this->params['orderId'], $shopParams['op_code'], $this->params)) { $data['bill_reserve_id'] = $this->params['orderId']; } } //Фиксируем ID операции пополнения ЛС и ID купленного заказа при наличии if ($success) { $DB->update('account_operations_yd', $data, 'id = ?i', $payment['id']); $DB->commit(); return 0; } else { $this->message = sprintf('Failed to purchase order #%s', $this->params['orderId']); } } else { $this->message = 'Failed deposit to account'; } //Не удалось приобрести заказ откатываем транзакцию //и возвращаем ошибку что приводит к возврату средств $DB->rollback(); //Если отказ принять деньги то и отменяем заказ //чтобы не висел в истории if ($billing && $this->params['orderId'] > 0) { $billing->cancelReserveById($this->params['orderId']); } //Ошибка, возврат средств return 100; }