Esempio n. 1
0
 /**
  * @param Order $order
  * @param Payment $payment
  * @param $operation
  * @return Result
  * @throws \Exception
  */
 public static function createOperation(Order &$order, Payment &$payment, $operation)
 {
     $result = new Result();
     $paymentSum = $payment->getSum();
     if ($operation == self::OPERATION_DEBIT) {
         $userBudget = UserBudgetPool::getUserBudgetByOrder($order);
         if ($userBudget >= $paymentSum) {
             UserBudgetPool::addPoolItem($order, $paymentSum * -1, UserBudgetPool::BUDGET_TYPE_ORDER_PAY, $payment);
             //				$payment->setField('PAID', 'Y');
         } else {
             $result->addError(new EntityError(Loc::getMessage('ORDER_PS_INNER_ERROR_INSUFFICIENT_MONEY')));
         }
     } elseif ($operation == self::OPERATION_CREDIT) {
         UserBudgetPool::addPoolItem($order, $paymentSum, UserBudgetPool::BUDGET_TYPE_ORDER_UNPAY, $payment);
         //			$payment->setField('PAID', 'N');
     } elseif ($operation == self::OPERATION_RETURN) {
         $sumPaid = $order->getSumPaid();
         $sumTrans = UserBudgetPool::getUserBudgetTransForOrder($order);
         $finalSumPaid = $paymentSum + $sumTrans;
         if ($finalSumPaid > 0) {
             $paymentSum = $paymentSum - $finalSumPaid;
         }
         //			Internals\UserBudgetPool::addPoolItem($order->getUserId(), ( $paymentSum ), UserBudgetPool::BUDGET_TYPE_CANCEL_RETURN, $order, $payment);
         //			$payment->setField('PAID', 'N');
         $payment->setField('IS_RETURN', 'Y');
     } else {
         throw new InvalidOperationException('Wrong operation type!');
     }
     return $result;
 }
Esempio n. 2
0
 /**
  * @return Result
  */
 protected function syncOrderPaid()
 {
     $result = new Result();
     if ($this->getSumPaid() == $this->getPrice()) {
         return $result;
     }
     $debitSum = $this->getPrice() - $this->getSumPaid();
     $paymentCollection = $this->getPaymentCollection();
     $sumPaid = $paymentCollection->getPaidSum();
     $userBudget = Internals\UserBudgetPool::getUserBudgetByOrder($this);
     $bePaid = $sumPaid - $this->getSumPaid();
     if ($bePaid > 0) {
         if ($debitSum > $bePaid) {
             $debitSum = $bePaid;
         }
         if ($debitSum >= $userBudget) {
             $debitSum = $userBudget;
         }
         if ($userBudget >= $debitSum && $debitSum > 0) {
             Internals\UserBudgetPool::addPoolItem($this, $debitSum * -1, Internals\UserBudgetPool::BUDGET_TYPE_ORDER_PAY);
             $finalSumPaid = $this->getSumPaid() + $debitSum;
             $result->setData(array('SUM_PAID' => $finalSumPaid));
         }
     }
     return $result;
 }
Esempio n. 3
0
 /**
  * @param $orderId
  * @param array $values
  * @param bool $withdraw
  * @param bool $pay
  * @return Sale\Result
  * @throws Main\ObjectNotFoundException
  * @throws \Bitrix\Main\ArgumentNullException
  */
 public static function pay($orderId, array $values, $withdraw = false, $pay = false)
 {
     $result = new Sale\Result();
     $paid = null;
     if (isset($values['PAYED']) && strval($values['PAYED']) != '') {
         $values['PAID'] = $values['PAYED'];
     }
     if (intval($orderId) <= 0) {
         $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_COMPATIBLE_ORDER_ID_NOT_FOUND'), 'SALE_COMPATIBLE_ORDER_ID_NOT_FOUND'));
         return $result;
     }
     /** @var Sale\Order $order */
     if (!($order = Sale\Order::load($orderId))) {
         $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_COMPATIBLE_ORDER_NOT_FOUND'), 'SALE_COMPATIBLE_ORDER_NOT_FOUND'));
         return $result;
     }
     if ($order->isCanceled()) {
         /** @var Sale\Result $r */
         $r = $order->setField('CANCELED', 'N');
         if (!$r->isSuccess()) {
             return $r;
         }
     }
     /** @var Sale\PaymentCollection $paymentCollection */
     if (!($paymentCollection = $order->getPaymentCollection())) {
         throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found');
     }
     $paidFormUserBudget = false;
     if ($withdraw) {
         /** @var Sale\Result $r */
         $r = static::payFromBudget($order, $pay);
         if (!$r->isSuccess()) {
             $result->addErrors($r->getErrors());
         } else {
             $payBudgetData = $r->getData();
             if (array_key_exists('PAID_FROM_BUDGET', $payBudgetData)) {
                 $paidFormUserBudget = $payBudgetData['PAID_FROM_BUDGET'];
             }
         }
     }
     if (!$paidFormUserBudget) {
         /** @var Sale\Payment $payment */
         foreach ($paymentCollection as $payment) {
             if (empty($fields)) {
                 if (isset($values['=DATE_PAYED'])) {
                     $values['DATE_PAID'] = $values['=DATE_PAYED'];
                     unset($values['=DATE_PAYED']);
                 }
                 $values = static::convertDateFields($values, static::getPaymentDateFields());
                 $fields = static::clearFields($values, $payment->getAvailableFields());
             }
             if ($values['PAID'] == "N" && !$payment->isPaid()) {
                 continue;
             }
             if ($withdraw && $values['PAID'] == "N" && $payment->isInner()) {
                 /** @var Sale\Result $r */
                 $r = $payment->setReturn('Y');
                 if (!$r->isSuccess()) {
                     $result->addErrors($r->getErrors());
                 }
             } else {
                 $oldPaid = $payment->isPaid();
                 /** @var Sale\Result $r */
                 $r = $payment->setPaid($values['PAID']);
                 if (!$r->isSuccess()) {
                     $result->addErrors($r->getErrors());
                 }
                 if ($payment->isInner() && !$oldPaid && $payment->isPaid()) {
                     Sale\Internals\UserBudgetPool::addPoolItem($order, $payment->getSum() * -1, Sale\Internals\UserBudgetPool::BUDGET_TYPE_ORDER_UNPAY, $payment);
                     if (!$r->isSuccess()) {
                         $result->addErrors($r->getErrors());
                     }
                 }
             }
             if (isset($fields['PAID'])) {
                 unset($fields['PAID']);
             }
             $r = $payment->setFields($fields);
             if (!$r->isSuccess()) {
                 $result->addErrors($r->getErrors());
             }
         }
     }
     if (!$result->isSuccess()) {
         return $result;
     }
     /** @var Sale\Result $r */
     $r = $order->save();
     if (!$r->isSuccess()) {
         $result->addErrors($r->getErrors());
     }
     return $result;
 }