예제 #1
0
 /**
  * Выполняет платеж
  */
 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;
 }