/** * @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; }
/** * @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; }
/** * @param float $needSum * @param int $userId * @param string $currency * @param bool $fullPay * @return bool */ public static function canPayWithUserBudget($needSum, $userId, $currency, $fullPay = true) { $budget = Sale\Internals\UserBudgetPool::getUserBudget($userId, $currency); if ($fullPay === false && $budget > 0) { return true; } if ($fullPay === true && $budget >= $needSum) { return true; } return false; }