42 private $handler =
null;
45 private $fields =
array();
63 $this->fields = $fields;
64 $this->handler =
new $className($handlerType, $this);
77 $onBeforeInitResult = $this->callEventOnBeforeInitiatePay(
$payment);
78 if (!$onBeforeInitResult->isSuccess())
80 $error = implode(
"\n", $onBeforeInitResult->getErrorMessages());
83 $this->markPayment(
$payment, $onBeforeInitResult);
85 return $onBeforeInitResult;
88 $this->handler->setInitiateMode($mode);
91 $psData = $initResult->getPsData();
94 $setResult =
$payment->setFields($psData);
95 if ($setResult->isSuccess())
100 $saveResult =
$order->save();
101 if (!$saveResult->isSuccess())
103 $initResult->addErrors($saveResult->getErrors());
109 $initResult->addErrors($setResult->getErrors());
113 if ($initResult->isSuccess())
115 $this->callEventOnInitiatePaySuccess(
$payment);
119 $error = implode(
"\n", $initResult->getErrorMessages());
122 $this->markPayment(
$payment, $onBeforeInitResult);
124 $this->callEventOnInitiatePayError(
$payment, $initResult);
136 self::EVENT_BEFORE_ON_INITIATE_PAY,
145 foreach(
$event->getResults() as $eventResult)
147 if ($eventResult->getType() === EventResult::ERROR)
149 $parameters = $eventResult->getParameters();
150 $error = $parameters[
'ERROR'] ??
null;
156 Loc::getMessage(
'SALE_PS_SERVICE_ERROR_ON_BEFORE_INITIATE_PAY')
165 private function callEventOnInitiatePaySuccess(Payment
$payment)
169 self::EVENT_INITIATE_PAY_SUCCESS,
178 private function callEventOnInitiatePayError(Payment
$payment, ServiceResult
$result)
182 self::EVENT_INITIATE_PAY_ERROR,
185 'errors' =>
$result->getErrorMessages(),
198 return $this->handler->isRefundableExtended();
201 return $this->handler instanceof
IRefund;
213 if ($this->isRefundable())
219 $result->addError(
new ResultError(Loc::getMessage(
'SALE_PS_SERVICE_PAYMENT_NOT_PAID')));
223 if ($refundableSum == 0)
224 $refundableSum =
$payment->getSum();
230 Logger::addError(get_class($this->handler).
': refund: '.implode(
"\n",
$result->getErrorMessages()));
236 throw new SystemException();
252 $processResult =
new Result();
254 if (!($this->handler instanceof ServiceHandler))
256 return $processResult;
259 $debugInfo = http_build_query(
$request->toArray(),
"",
"\n");
260 if (empty($debugInfo))
262 $debugInfo = file_get_contents(
"php://input");
264 Logger::addDebugInfo(
265 get_class($this->handler).
" ProcessRequest. paySystemId=".$this->
getField(
"ID").
", request=".($debugInfo ? $debugInfo :
"empty")
268 $paymentId = $this->handler->getPaymentIdFromRequest(
$request);
270 if (empty($paymentId))
272 $processResult->addError(
new Error(Loc::getMessage(
'SALE_PS_SERVICE_PAYMENT_ERROR_EMPTY')));
275 get_class($this->handler).
'. ProcessRequest: '.Loc::getMessage(
'SALE_PS_SERVICE_PAYMENT_ERROR_EMPTY')
278 return $processResult;
281 [
$orderId, $paymentId] = Manager::getIdsByPayment($paymentId, $this->
getField(
'ENTITY_REGISTRY_TYPE'));
288 Logger::addError(get_class($this->handler).
'. ProcessRequest: '.
$errorMessage);
290 return $processResult;
293 $registry = Registry::getInstance($this->
getField(
'ENTITY_REGISTRY_TYPE'));
295 $orderClassName = $registry->getOrderClassName();
303 Logger::addError(get_class($this->handler).
'. ProcessRequest: '.
$errorMessage);
305 return $processResult;
310 $errorMessage = str_replace(
'#ORDER_ID#',
$orderId, Loc::getMessage(
'SALE_PS_SERVICE_ORDER_CANCELED'));
313 Logger::addError(get_class($this->handler).
'. ProcessRequest: '.
$errorMessage);
315 return $processResult;
319 $collection =
$order->getPaymentCollection();
322 $payment = $collection->getItemById($paymentId);
326 $errorMessage = str_replace(
'#PAYMENT_ID#', $paymentId, Loc::getMessage(
'SALE_PS_SERVICE_PAYMENT_ERROR'));
329 Logger::addError(get_class($this->handler).
'. ProcessRequest: '.
$errorMessage);
331 return $processResult;
336 if ($serviceResult->isSuccess())
339 $operationType = $serviceResult->getOperationType();
341 if ($operationType === ServiceResult::MONEY_COMING)
345 else if ($operationType === ServiceResult::MONEY_LEAVING)
352 $event =
new Event(
'sale', self::EVENT_ON_BEFORE_PAYMENT_PAID,
356 'pay_system_id' => $this->
getField(
'ID')
364 'IS_RETURN' => Payment::RETURN_PS,
365 'PAY_RETURN_DATE' =>
new Date(),
370 if (!$paidResult->isSuccess())
372 $error =
'PAYMENT SET PAID: '.join(
' ', $paidResult->getErrorMessages());
373 Logger::addError(get_class($this->handler).
'. ProcessRequest: '.
$error);
375 $serviceResult->setResultApplied(
false);
379 $psData = $serviceResult->getPsData();
383 if (!
$res->isSuccess())
385 $error =
'PAYMENT SET PAID: '.join(
' ',
$res->getErrorMessages());
386 Logger::addError(get_class($this->handler).
'. ProcessRequest: '.
$error);
388 $serviceResult->setResultApplied(
false);
392 $saveResult =
$order->save();
394 if (!$saveResult->isSuccess())
396 $error =
'ORDER SAVE: '.join(
' ', $saveResult->getErrorMessages());
397 Logger::addError(get_class($this->handler).
'. ProcessRequest: '.
$error);
399 $serviceResult->setResultApplied(
false);
402 PullManager::onSuccessfulPayment(
$payment);
406 $serviceResult->setResultApplied(
false);
407 $processResult->addErrors($serviceResult->getErrors());
409 $error = implode(
"\n", $serviceResult->getErrorMessages());
410 Logger::addError(get_class($this->handler).
'. ProcessRequest Error: '.
$error);
412 $this->markPayment(
$payment, $serviceResult);
414 PullManager::onFailurePayment(
$payment);
419 self::EVENT_ON_AFTER_PROCESS_REQUEST,
422 'serviceResult' => $serviceResult,
428 $this->handler->sendResponse($serviceResult,
$request);
430 return $processResult;
438 $id = $this->fields[
'ID'] ?? 0;
440 return static::PAY_SYSTEM_PREFIX.$id;
448 return $this->handler->getDescription();
456 return $this->handler instanceof
IHold || $this->handler instanceof
IPartialHold;
468 return $this->handler->cancel(
$payment);
471 throw new SystemException(Loc::getMessage(
'SALE_PS_SERVICE_ERROR_HOLD_IS_NOT_SUPPORTED'));
490 throw new SystemException(Loc::getMessage(
'SALE_PS_SERVICE_ERROR_PARTIAL_CONFIRM_IS_NOT_SUPPORTED'));
493 return $this->handler->confirm(
$payment);
496 throw new SystemException(Loc::getMessage(
'SALE_PS_SERVICE_ERROR_HOLD_IS_NOT_SUPPORTED'));
505 return $this->fields[
$name] ??
null;
513 return $this->handler->getCurrencyList();
523 return $this->handler->getClientType(
524 $this->fields[
'PS_MODE'] ??
null
543 return $this->fields[
'IS_CASH'] ===
'Y';
551 return $this->fields[
'CAN_PRINT_CHECK'] ===
'Y';
561 if (!
$service || !$this->isSupportPrintCheck() || !$this->canPrintCheck())
567 $cashboxClass = $this->getCashboxClass();
568 $kkm = $cashboxClass::getKkmValue(
$service);
572 '=HANDLER' => $cashboxClass,
580 return (
bool)Cashbox\Manager::getList([
592 return $this->handler->creditNoDemand(
$payment);
601 return $this->handler->debitNoDemand(
$payment);
609 if ($this->handler instanceof
IPayable)
612 if (method_exists($this->handler,
'isPayableCompatibility'))
613 return $this->handler->isPayableCompatibility();
623 return $this->handler instanceof
IPdf;
643 return $this->handler->getContent(
$payment);
658 return $this->handler->getFile(
$payment);
677 throw new NotSupportedException(
'Handler is not implemented interface '.IDocumentGeneratePdf::class);
689 return $this->handler->isGenerated(
$payment);
702 return $this->handler->getPrice(
$payment);
712 $this->handler->setExtraParams(
$params);
722 return $this->handler->showTemplate(
$payment, $templateName);
753 return $this->handler->getProps();
766 return $this->handler->basketButtonAction($orderData);
779 return $this->handler->setOrderConfig($orderData);
792 return $this->handler->payOrder($orderData);
810 return $this->fields[
'ALLOW_EDIT_PAYMENT'] ==
'Y';
821 if (method_exists($this->handler,
'isCheckableCompatibility'))
822 return $this->handler->isCheckableCompatibility();
835 if ($this->isCheckable())
843 if (!
$order->isCanceled())
846 $checkResult = $this->handler->check(
$payment);
847 if ($checkResult instanceof
ServiceResult && $checkResult->isSuccess())
849 $psData = $checkResult->getPsData();
853 if (!
$res->isSuccess())
857 if ($checkResult->getOperationType() == ServiceResult::MONEY_COMING)
860 if (!
$res->isSuccess())
865 if (!
$res->isSuccess())
870 $result->addError(
new Error(Loc::getMessage(
'SALE_PS_SERVICE_ERROR_CONNECT_PS')));
875 $result->addError(
new EntityError(Loc::getMessage(
'SALE_PS_SERVICE_ORDER_CANCELED',
array(
'#ORDER_ID#' =>
$order->getId()))));
889 if ($this->
isClone() && $cloneEntity->contains($this))
891 return $cloneEntity[$this];
894 $paySystemServiceClone = clone $this;
895 $paySystemServiceClone->isClone =
true;
897 if (!$cloneEntity->contains($this))
899 $cloneEntity[$this] = $paySystemServiceClone;
902 if ($handler = $this->handler)
904 if (!$cloneEntity->contains($handler))
906 $cloneEntity[$handler] = $handler->createClone($cloneEntity);
909 if ($cloneEntity->contains($handler))
911 $paySystemServiceClone->handler = $cloneEntity[$handler];
915 return $paySystemServiceClone;
923 return $this->isClone;
931 return in_array($this->handler->getHandlerType(),
array(
'CUSTOM',
'USER'));
940 return $this->handler->getParamsBusValue(
$payment);
948 return $this->handler->isTuned();
956 return $this->handler->getDemoParams();
964 $this->handler->setInitiateMode($mode);
1039 $cashboxClassName = $this->handler::getCashboxClass();
1040 if (!
Cashbox\Manager::isPaySystemCashbox($cashboxClassName))
1043 'Cashbox is not extended class '.
Cashbox\CashboxPaySystem::class
1047 return $cashboxClassName;
1076 return $this->handler->isFiscalizationEnabled(
$payment);
1088 return $this->handler->getRestrictionList();
1096 return (
int)($this->
getField(
'ID') ?? 0);
1102 ->mark($serviceResult)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)