示例#1
0
 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;
 }