46 if ($this->payableItemCollection ===
null)
51 $itemCollectionClassName = $registry->getPayableItemCollectionClassName();
52 $this->payableItemCollection = $itemCollectionClassName::load($this);
64 if (isset($values[
'PAID']))
66 if ($this->getField(
'PAID') ===
'Y')
68 if ($values[
'PAID'] ===
'N')
70 $values = [
'PAID' => $values[
'PAID']] + $values;
75 if ($values[
'PAID'] ===
'Y')
78 unset($values[
'PAID']);
79 $values[
'PAID'] =
'Y';
99 'PS_STATUS_DESCRIPTION',
104 'PS_RECURRING_TOKEN',
119 'PAY_RETURN_COMMENT',
121 'EMP_RESPONSIBLE_ID',
122 'DATE_RESPONSIBLE_ID',
143 return [
'PAY_SYSTEM_ID'];
154 $paymentClassName = $registry->getPaymentClassName();
156 return new $paymentClassName($fields);
182 'XML_ID' => static::generateXmlId(),
183 'IS_RETURN' => static::RETURN_NONE,
184 'CURRENCY' =>
$collection->getOrder()->getCurrency(),
188 $payment = static::createPaymentObject();
189 $payment->setFieldsNoDemand($fields);
192 if ($paySystem !==
null)
194 $payment->setPaySystemService($paySystem);
208 $result = $this->setField(
"PAY_SYSTEM_ID",
$service->getField(
'ID'));
209 if ($result->isSuccess())
211 $this->setField(
"PAY_SYSTEM_NAME",
$service->getField(
'NAME'));
220 return uniqid(
'bx_');
233 if (intval($id) <= 0)
240 $paymentDataList = static::getList([
'filter' => [
'=ORDER_ID' => $id]]);
241 while ($paymentData = $paymentDataList->fetch())
243 $payments[] = static::createPaymentObject($paymentData);
261 $dbRes = static::getList([
263 "filter" => [
"=ORDER_ID" => $orderId]
266 while ($payment = $dbRes->fetch())
268 $r = static::deleteInternal($payment[
'ID']);
269 if (!$r->isSuccess())
271 $result->addErrors($r->getErrors());
283 public function delete()
293 $r = $this->callEventOnBeforeEntityDeleted();
294 if (!$r->isSuccess())
296 return $result->addErrors($r->getErrors());
299 $r = parent::delete();
300 if (!$r->isSuccess())
302 $result->addErrors($r->getErrors());
305 $r = $this->callEventOnEntityDeleted();
306 if (!$r->isSuccess())
308 $result->addErrors($r->getErrors());
317 private function callEventOnBeforeEntityDeleted()
322 $event =
new Main\Event(
'sale',
"OnBeforeSalePaymentEntityDeleted", [
324 'VALUES' => $this->fields->getOriginalValues(),
328 if ($event->getResults())
331 foreach($event->getResults() as $eventResult)
333 if ($eventResult->getType() == Main\EventResult::ERROR)
336 Loc::getMessage(
'SALE_EVENT_ON_BEFORE_SALEPAYMENT_ENTITY_DELETED_ERROR'),
337 'SALE_EVENT_ON_BEFORE_SALEPAYMENT_ENTITY_DELETED_ERROR'
339 if ($eventResultData = $eventResult->getParameters())
341 if (isset($eventResultData) && $eventResultData instanceof
ResultError)
344 $errorMsg = $eventResultData;
348 $result->addError($errorMsg);
359 private function callEventOnEntityDeleted()
361 $result =
new Result();
364 $event =
new Main\Event(
'sale',
"OnSalePaymentEntityDeleted", [
366 'VALUES' => $this->fields->getOriginalValues(),
370 if ($event->getResults())
373 foreach($event->getResults() as $eventResult)
375 if($eventResult->getType() == Main\EventResult::ERROR)
377 $errorMsg =
new ResultError(
379 'SALE_EVENT_ON_SALEPAYMENT_ENTITY_DELETED_ERROR'
381 if ($eventResultData = $eventResult->getParameters())
383 if (isset($eventResultData) && $eventResultData instanceof ResultError)
386 $errorMsg = $eventResultData;
390 $result->addError($errorMsg);
413 $result =
new Result();
415 if ($name ===
"PAID")
421 $this->setField(
'DATE_PAID',
new Main\
Type\DateTime());
424 $this->setField(
'EMP_PAID_ID', $USER->GetID());
426 if ($this->getField(
'IS_RETURN') === self::RETURN_INNER)
428 $paySystemId = Sale\PaySystem\Manager::getInnerPaySystemId();
435 $service = Sale\PaySystem\Manager::getObjectById($paySystemId);
438 $operationResult =
$service->creditNoDemand($this);
439 if (!$operationResult->isSuccess())
441 return $result->addErrors($operationResult->getErrors());
445 $this->setField(
'IS_RETURN', static::RETURN_NONE);
447 Internals\EventsPool::addEvent(
452 'VALUES' => $this->fields->getOriginalValues(),
459 elseif ($name ===
"IS_RETURN")
461 if ($value === static::RETURN_NONE)
466 if ($oldValue === static::RETURN_NONE)
468 $this->setField(
'EMP_RETURN_ID', $USER->GetID());
479 $creditSum = $this->
getSum();
482 elseif ($this->
getSum() - $overPaid > 0)
484 $creditSum = $this->
getSum() - $overPaid;
487 if ($value == static::RETURN_PS)
493 $psId = Sale\PaySystem\Manager::getInnerPaySystemId();
496 $service = Sale\PaySystem\Manager::getObjectById($psId);
502 if ($value == static::RETURN_PS)
506 $userBudget = Internals\UserBudgetPool::getUserBudgetByOrder(
$collection->getOrder());
509 return $result->addError(
510 new Entity\EntityError(
512 'SALE_ORDER_PAYMENT_RETURN_PAID'
519 $refResult =
$service->refund($this);
520 if (!$refResult->isSuccess())
522 return $result->addErrors($refResult->getErrors());
525 $refResultOperation = $refResult->getOperationType();
528 $setUnpaidResult = $this->setField(
'PAID',
'N');
529 if (!$setUnpaidResult->isSuccess())
531 return $result->addErrors($setUnpaidResult->getErrors());
538 return $result->addError(
539 new Entity\EntityError(
541 'SALE_ORDER_PAYMENT_RETURN_NO_SUPPORTED'
546 elseif($name ===
"SUM")
550 $result =
new Result();
552 return $result->addError(
555 'SALE_PAYMENT_NOT_ALLOWED_CHANGE_SUM'
560 elseif ($name ===
"MARKED")
562 if ($oldValue !==
"Y")
564 $this->setField(
'DATE_MARKED',
new Main\
Type\DateTime());
566 if (is_object($USER))
568 $this->setField(
'EMP_MARKED_ID', $USER->GetID());
571 elseif ($value ===
"N")
573 $r = $this->setField(
'REASON_MARKED',
'');
574 if (!$r->isSuccess())
576 return $result->addErrors($r->getErrors());
580 elseif ($name ===
'RESPONSIBLE_ID')
582 $this->setField(
'DATE_RESPONSIBLE_ID',
new Main\
Type\DateTime());
585 return parent::onFieldModify($name, $oldValue, $value);
592 $r = $this->getPayableItemCollection()->onBeforeBasketItemDelete($basketItem);
593 if (!$r->isSuccess())
595 $result->addErrors($r->getErrors());
612 $this->checkCallingContext();
616 $id = $this->getId();
619 $this->callEventOnBeforeEntitySaved();
639 if (!$r->isSuccess())
641 $result->addErrors($r->getErrors());
650 if ($this->fields->isChanged(
'PAID'))
652 $this->calculateStatistic();
655 $this->callEventOnEntitySaved();
657 $this->callDelayedEvents();
661 if (!$r->isSuccess())
663 return $result->addErrors($r->getErrors());
673 $isChanged = parent::isChanged();
679 return $this->getPayableItemCollection()->isChanged();
685 private function checkCallingContext()
689 if (!$order->isSaveRunning())
691 trigger_error(
"Incorrect call to the save process. Use method save() on \Bitrix\Sale\Order entity", E_USER_WARNING);
711 Cashbox\Internals\Pool::addDoc($this->
getOrder()->getInternalId(), $this);
718 protected function calculateStatistic()
732 private function add()
734 $result =
new Result();
738 $orderHistory = $registry->getOrderHistoryClassName();
742 $this->setFieldNoDemand(
'ORDER_ID', $this->
getOrder()->getId());
745 $r = $this->
addInternal($this->getFields()->getValues());
746 if (!$r->isSuccess())
748 $orderHistory::addAction(
754 [
"ERROR" => $r->getErrorMessages()]
757 $result->addErrors($r->getErrors());
762 $this->setFieldNoDemand(
'ID', $id);
767 $orderHistory::addAction(
786 $result =
new Result();
788 $r = static::updateInternal($this->getId(), $this->
getFields()->getChangedValues());
789 if (!$r->isSuccess())
794 $orderHistory = $registry->getOrderHistoryClassName();
796 $orderHistory::addAction(
799 'PAYMENT_UPDATE_ERROR',
802 [
"ERROR" => $r->getErrorMessages()]
805 $result->addErrors($r->getErrors());
814 private function callEventOnBeforeEntitySaved()
817 $event =
new Main\Event(
'sale',
'OnBeforeSalePaymentEntitySaved', [
819 'VALUES' => $this->fields->getOriginalValues()
828 private function callEventOnEntitySaved()
831 $event =
new Main\Event(
'sale',
'OnSalePaymentEntitySaved', [
833 'VALUES' => $this->fields->getOriginalValues(),
842 private function callDelayedEvents()
844 $eventList = Internals\EventsPool::getEvents(
'p'.$this->
getInternalIndex());
847 foreach ($eventList as $eventName => $eventData)
849 $event =
new Main\Event(
'sale', $eventName, $eventData);
855 $notifyClassName = $registry->getNotifyClassName();
856 $notifyClassName::callNotify($this, $eventName);
876 return floatval($this->getField(
'SUM'));
884 return $this->getField(
'PS_SUM');
892 return $this->getField(
'PAID') ===
'Y';
901 $this->getField(
'IS_RETURN') === static::RETURN_INNER
903 $this->getField(
'IS_RETURN') === static::RETURN_PS
912 return (
int)$this->getField(
'ORDER_ID');
920 if ($this->service ===
null)
935 return Sale\PaySystem\Manager::getObjectById($paySystemId);
946 return (
int)$this->getField(
'PAY_SYSTEM_ID');
954 return $this->getField(
'PAY_SYSTEM_NAME');
964 public function setPaid($value)
969 $r = $this->setField(
'PAID', $value);
970 if (!$r->isSuccess())
972 $result->addErrors($r->getErrors());
974 elseif($r->hasWarnings())
976 $result->addWarnings($r->getWarnings());
989 public function setReturn($value)
991 $result =
new Result();
993 if ($value === static::RETURN_INNER || $value === static::RETURN_PS)
1000 elseif($value === static::RETURN_NONE)
1004 return new Result();
1009 throw new Main\ArgumentOutOfRangeException(
'value');
1013 $r = $this->setField(
'IS_RETURN', $value);
1014 if (!$r->isSuccess())
1016 $result->addErrors($r->getErrors());
1027 return $this->
getPaymentSystemId() === Sale\PaySystem\Manager::getInnerPaySystemId();
1044 elseif ($name ===
'REASON_MARKED')
1046 $value = (string)$value;
1047 if (mb_strlen($value) > 255)
1049 $value = mb_substr($value, 0, 255);
1053 return parent::normalizeValue($name, $value);
1064 $result = parent::checkValueBeforeSet($name, $value);
1066 if ($name ==
"PAY_SYSTEM_ID")
1068 if (intval($value) > 0 && !
Sale\PaySystem\Manager::isExist($value))
1073 'SALE_PAYMENT_WRONG_PAYMENT_SERVICE'
1078 elseif ($name ===
'ACCOUNT_NUMBER')
1080 $dbRes = static::getList([
1082 'filter' => [
'=ACCOUNT_NUMBER' => $value]
1085 if ($dbRes->fetch())
1105 if ($this->getId() > 0)
1109 if ($order && $order->getId() > 0)
1132 $result->addError(
new ResultError(
Loc::getMessage(
"SALE_PAYMENT_PAYMENT_SERVICE_EMPTY"),
'SALE_PAYMENT_PAYMENT_SERVICE_EMPTY'));
1148 $value = Internals\AccountNumberGenerator::generateForPayment($this);
1152 $r = static::updateInternal($id, [
"ACCOUNT_NUMBER" => $value]);
1153 $res = $r->isSuccess(
true);
1162 $this->setFieldNoDemand(
'ACCOUNT_NUMBER', $value);
1174 $providerInstance =
null;
1176 if (is_array($mapping) && isset($mapping[
'PROVIDER_KEY']))
1178 switch ($mapping[
'PROVIDER_KEY'])
1181 $providerInstance = $this;
1184 $providerInstance = $this->getField(
'COMPANY_ID');
1190 $providerInstance = $order->getBusinessValueProviderInstance($mapping);
1195 return $providerInstance;
1206 return $order->getPersonTypeId();
1219 public static function getList(array $parameters = [])
1221 return Internals\PaymentTable::getList($parameters);
1230 public function createClone(\SplObjectStorage $cloneEntity)
1232 if ($this->
isClone() && $cloneEntity->contains($this))
1234 return $cloneEntity[$this];
1238 $paymentClone = parent::createClone($cloneEntity);
1243 if (!$cloneEntity->contains($paySystem))
1245 $cloneEntity[$paySystem] = $paySystem->createClone($cloneEntity);
1248 if ($cloneEntity->contains($paySystem))
1250 $paymentClone->service = $cloneEntity[$paySystem];
1254 return $paymentClone;
1281 public function isAllowPay()
1286 return $order->isAllowPay();
1294 return $this->getField(
'MARKED') ==
"Y";
1304 static $className =
null;
1305 $errorsList = static::getAutoFixErrorsList();
1306 if (is_array($errorsList) && in_array($value, $errorsList))
1308 if ($className ===
null)
1309 $className = static::getClassName();
1323 $errorsList = static::getAutoFixErrorsList();
1324 if (is_array($errorsList) && in_array($value, $errorsList))
1368 $name ===
'PRICE_COD'
1381 return Internals\PaymentTable::add($data);
1392 return Internals\PaymentTable::update($primary, $data);
1402 return Internals\PaymentTable::delete($primary);
1410 return Internals\PaymentTable::getMap();
1418 return Internals\PaymentTable::getUfId();
1428 return 'SalePayment';
static update($id, array $data)
static loadMessages($file)
static getMessage($code, $replace=null, $language=null)
static calculate($userId, $currency, $lid)
const EVENT_ON_PAYMENT_PAID
onFieldModify($name, $oldValue, $value)
static addField($entityName, $orderId, $field, $oldValue=null, $value=null, $id=null, $entity=null, array $fields=array())
static deleteNoDemand($orderId)
static getRegistryEntity()
updateInternal($primary, array $data)
static createPaymentObject(array $fields=[])
checkValueBeforeSet($name, $value)
getBusinessValueProviderInstance($mapping)
static getMeaningfulFields()
static create(PaymentCollection $collection, Sale\PaySystem\Service $paySystem=null)
onBeforeBasketItemDelete(BasketItem $basketItem)
static getEntityEventName()
static getAvailableFields()
onBeforeSetFields(array $values)
isPriceField(string $name)
addChangesToHistory($name, $oldValue=null, $value=null)
static deleteInternal($primary)
normalizeValue($name, $value)
setPaySystemService(Sale\PaySystem\Service $service)
static getList(array $parameters=[])
static roundPrecision($value)
static getInstance($type)
const REGISTRY_TYPE_ORDER