/** * @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 $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; }