function PayOrder($ID, $val, $bWithdraw = True, $bPay = True, $recurringID = 0, $arAdditionalFields = array()) { global $DB, $USER, $APPLICATION; $ID = IntVal($ID); $val = $val != "Y" ? "N" : "Y"; $bWithdraw = $bWithdraw ? True : False; $bPay = $bPay ? True : False; $recurringID = IntVal($recurringID); $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N'); $NO_CHANGE_STATUS = "N"; if (is_set($arAdditionalFields["NOT_CHANGE_STATUS"]) && $arAdditionalFields["NOT_CHANGE_STATUS"] == "Y") { $NO_CHANGE_STATUS = "Y"; unset($arAdditionalFields["NOT_CHANGE_STATUS"]); } if ($ID <= 0) { $APPLICATION->ThrowException(Loc::getMessage("SKGO_NO_ORDER_ID"), "NO_ORDER_ID"); return False; } $arOrder = CSaleOrder::GetByID($ID); if (!$arOrder) { $APPLICATION->ThrowException(str_replace("#ID#", $ID, Loc::getMessage("SKGO_NO_ORDER")), "NO_ORDER"); return False; } if ($arOrder["PAYED"] == $val) { $APPLICATION->ThrowException(str_replace("#ID#", $ID, Loc::getMessage("SKGO_DUB_PAY")), "ALREADY_FLAG"); return False; } foreach (GetModuleEvents("sale", "OnSaleBeforePayOrder", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array($ID, $val, $bWithdraw, $bPay, $recurringID, $arAdditionalFields)) === false) { return false; } } if ($isOrderConverted != "Y" && $bWithdraw) { if ($val == "Y") { $needPaySum = DoubleVal($arOrder["PRICE"]) - DoubleVal($arOrder["SUM_PAID"]); if ($bPay) { if (!CSaleUserAccount::UpdateAccount($arOrder["USER_ID"], $needPaySum, $arOrder["CURRENCY"], "OUT_CHARGE_OFF", $ID)) { return False; } } if ($needPaySum > 0 && !CSaleUserAccount::Pay($arOrder["USER_ID"], $needPaySum, $arOrder["CURRENCY"], $ID, False)) { return False; } } else { if (!CSaleUserAccount::UpdateAccount($arOrder["USER_ID"], $arOrder["PRICE"], $arOrder["CURRENCY"], "ORDER_UNPAY", $ID)) { return False; } } } $arFields = array("PAYED" => $val, "=DATE_PAYED" => $DB->GetNowFunction(), "EMP_PAYED_ID" => IntVal($USER->GetID()) > 0 ? IntVal($USER->GetID()) : false, "SUM_PAID" => 0); if (count($arAdditionalFields) > 0) { foreach ($arAdditionalFields as $addKey => $addValue) { if (!array_key_exists($addKey, $arFields)) { $arFields[$addKey] = $addValue; } } } if ($isOrderConverted == "Y") { $errorMessage = ""; /** @var \Bitrix\Sale\Result $r */ $r = \Bitrix\Sale\Compatible\OrderCompatibility::pay($ID, $arFields, $bWithdraw, $bPay); if (!$r->isSuccess(true)) { foreach ($r->getErrorMessages() as $error) { $errorMessage .= " " . $error; } $APPLICATION->ThrowException(Loc::getMessage("SKGB_PAY_ERROR", array("#MESSAGE#" => $errorMessage)), "RESERVATION_ERROR"); return false; } $res = true; } else { $res = CSaleOrder::Update($ID, $arFields); foreach (GetModuleEvents("sale", "OnSalePayOrder", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($ID, $val)); } } if ($val == "Y") { CTimeZone::Disable(); $arOrder = CSaleOrder::GetByID($ID); CTimeZone::Enable(); if ($NO_CHANGE_STATUS != "Y") { $orderStatus = COption::GetOptionString("sale", "status_on_paid", ""); if (strlen($orderStatus) > 0 && $orderStatus != $arOrder["STATUS_ID"]) { $dbStatus = CSaleStatus::GetList(array("SORT" => "ASC"), array("LID" => LANGUAGE_ID)); while ($arStatus = $dbStatus->GetNext()) { $arStatuses[$arStatus["ID"]] = $arStatus["SORT"]; } if ($arStatuses[$orderStatus] >= $arStatuses[$arOrder["STATUS_ID"]]) { CSaleOrder::StatusOrder($ID, $orderStatus); } } } $userEMail = ""; $dbOrderProp = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $arOrder["ID"], "PROP_IS_EMAIL" => "Y")); if ($arOrderProp = $dbOrderProp->Fetch()) { $userEMail = $arOrderProp["VALUE"]; } if (strlen($userEMail) <= 0) { $dbUser = CUser::GetByID($arOrder["USER_ID"]); if ($arUser = $dbUser->Fetch()) { $userEMail = $arUser["EMAIL"]; } } $arFields = array("ORDER_ID" => $arOrder["ACCOUNT_NUMBER"], "ORDER_DATE" => $arOrder["DATE_INSERT_FORMAT"], "EMAIL" => $userEMail, "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@" . $_SERVER["SERVER_NAME"])); $eventName = "SALE_ORDER_PAID"; $bSend = true; foreach (GetModuleEvents("sale", "OnOrderPaySendEmail", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array($ID, &$eventName, &$arFields)) === false) { $bSend = false; } } if ($bSend) { $event = new CEvent(); $event->Send($eventName, $arOrder["LID"], $arFields, "N"); } CSaleMobileOrderPush::send("ORDER_PAYED", array("ORDER" => $arOrder)); if (CModule::IncludeModule("statistic")) { CStatEvent::AddByEvents("eStore", "order_paid", $ID, "", $arOrder["STAT_GID"], $arOrder["PRICE"], $arOrder["CURRENCY"]); } } else { if (CModule::IncludeModule("statistic")) { CStatEvent::AddByEvents("eStore", "order_chargeback", $ID, "", $arOrder["STAT_GID"], $arOrder["PRICE"], $arOrder["CURRENCY"], "Y"); } } if ($isOrderConverted != "Y") { //reservation if (COption::GetOptionString("sale", "product_reserve_condition", "O") == "P" && $arOrder["RESERVED"] != $val) { if (!CSaleOrder::ReserveOrder($ID, $val)) { return false; } } if ($val == "Y") { $allowDelivery = COption::GetOptionString("sale", "status_on_payed_2_allow_delivery", ""); if ($allowDelivery == "Y" && $arOrder["ALLOW_DELIVERY"] == "N") { CSaleOrder::DeliverOrder($ID, "Y"); } } } return $res; }