/**
  * Get current discount
  *
  * @return integer
  */
 public function getCurrentDiscount()
 {
     return PaymentService::getDiscountCouponInfo() ? PaymentService::getDiscountCouponInfo()['discount'] : 0;
 }
 /**
  * Deactivate current discount coupon
  */
 public function ajaxDeactivateDiscountCouponAction()
 {
     $request = $this->getRequest();
     if ($request->isPost() && $this->applicationCsrf()->isTokenValid($request->getPost('csrf'))) {
         if (null != ($discountCouponInfo = PaymentService::getDiscountCouponInfo())) {
             PaymentService::setDiscountCouponId(null);
             // fire the deactivate discount coupon event
             PaymentEvent::fireDeactivateDiscountCouponEvent($discountCouponInfo['slug']);
             $this->flashMessenger()->setNamespace('success')->addMessage($this->getTranslator()->translate('The coupon code has been deactivated'));
         }
     }
     return $this->getResponse();
 }
 /**
  * Add a new transaction
  *
  * @param integer $userId
  * @param array $transactionInfo
  *      integer payment_type - required
  *      string comments - optional
  *      string first_name - required
  *      string last_name - required
  *      string email - required
  *      string phone - required
  *      string address - optional
  * @param array $items
  *      integer object_id
  *      integer module
  *      string title
  *      string slug
  *      float cost
  *      float discount
  *      integer count
  * @return integer|string
  */
 public function addTransaction($userId, array $transactionInfo, array $items)
 {
     try {
         $this->adapter->getDriver()->getConnection()->beginTransaction();
         $basicData = ['user_hidden' => self::TRANSACTION_USER_NOT_HIDDEN, 'paid' => self::TRANSACTION_NOT_PAID, 'language' => $this->getCurrentLanguage(), 'date' => time(), 'currency' => PaymentService::getPrimaryCurrency()['id']];
         // add the user id
         if (UserBaseModel::DEFAULT_GUEST_ID != $userId) {
             $basicData['user_id'] = $userId;
         }
         // add the discount id
         if (PaymentService::getDiscountCouponInfo()) {
             $basicData['discount_coupon'] = PaymentService::getDiscountCouponInfo()['id'];
         }
         if (!$transactionInfo['comments']) {
             $transactionInfo['comments'] = null;
         }
         $insert = $this->insert()->into('payment_transaction_list')->values(array_merge($transactionInfo, $basicData));
         $statement = $this->prepareStatementForSqlObject($insert);
         $statement->execute();
         $transactionId = $this->adapter->getDriver()->getLastGeneratedValue();
         // generate a random slug
         $update = $this->update()->table('payment_transaction_list')->set(['slug' => strtoupper($this->generateSlug($transactionId, $this->generateRandString(self::TRANSACTION_MIN_SLUG_LENGTH, self::ALLOWED_SLUG_CHARS), 'payment_transaction_list', 'id'))])->where(['id' => $transactionId]);
         $statement = $this->prepareStatementForSqlObject($update);
         $statement->execute();
         // update the discount coupon info
         if (PaymentService::getDiscountCouponInfo()) {
             $update = $this->update()->table('payment_discount_coupon')->set(['used' => self::COUPON_USED])->where(['id' => PaymentService::getDiscountCouponInfo()['id']]);
             $statement = $this->prepareStatementForSqlObject($update);
             $statement->execute();
         }
         // add  transaction's items
         foreach ($items as $item) {
             $insert = $this->insert()->into('payment_transaction_item')->values(['transaction_id' => $transactionId, 'object_id' => $item['object_id'], 'module' => $item['module'], 'title' => $item['title'], 'slug' => $item['slug'], 'cost' => $item['cost'], 'discount' => $item['discount'], 'count' => $item['count'], 'paid' => self::TRANSACTION_NOT_PAID, 'extra_options' => !empty($item['extra_options']) ? $item['extra_options'] : null]);
             $statement = $this->prepareStatementForSqlObject($insert);
             $statement->execute();
         }
         $this->adapter->getDriver()->getConnection()->commit();
     } catch (Exception $e) {
         $this->adapter->getDriver()->getConnection()->rollback();
         ApplicationErrorLogger::log($e);
         return $e->getMessage();
     }
     // fire the add payment transaction event
     PaymentEvent::fireAddPaymentTransactionEvent($transactionId, $transactionInfo);
     return $transactionId;
 }