function CancelOrder($ID, $val, $description = "") { global $DB, $USER; $ID = IntVal($ID); $val = $val != "Y" ? "N" : "Y"; $description = Trim($description); if ($ID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGO_NO_ORDER_ID1"), "NO_ORDER_ID"); return False; } $arOrder = CSaleOrder::GetByID($ID); if (!$arOrder) { $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGO_NO_ORDER")), "NO_ORDER"); return False; } if ($arOrder["CANCELED"] == $val) { $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGO_DUB_CANCEL")), "ALREADY_FLAG"); return False; } foreach (GetModuleEvents("sale", "OnSaleBeforeCancelOrder", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array($ID, $val)) === false) { return false; } } if ($val == "Y") { if ($arOrder["PAYED"] == "Y") { if (!CSaleOrder::PayOrder($ID, "N", True, True)) { return False; } } else { $arOrder["SUM_PAID"] = DoubleVal($arOrder["SUM_PAID"]); if ($arOrder["SUM_PAID"] > 0) { if (!CSaleUserAccount::UpdateAccount($arOrder["USER_ID"], $arOrder["SUM_PAID"], $arOrder["CURRENCY"], "ORDER_CANCEL_PART", $ID)) { return False; } } } if ($arOrder["ALLOW_DELIVERY"] == "Y") { if (!CSaleOrder::DeliverOrder($ID, "N")) { return False; } } } $arFields = array("CANCELED" => $val, "=DATE_CANCELED" => $DB->GetNowFunction(), "REASON_CANCELED" => strlen($description) > 0 ? $description : false, "EMP_CANCELED_ID" => IntVal($USER->GetID()) > 0 ? IntVal($USER->GetID()) : false); $res = CSaleOrder::Update($ID, $arFields); unset($GLOBALS["SALE_ORDER"]["SALE_ORDER_CACHE_" . $ID]); //this method is used only for catalogs without reservation and deduction support CSaleBasket::OrderCanceled($ID, $val == "Y" ? True : False); foreach (GetModuleEvents("sale", "OnSaleCancelOrder", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($ID, $val, $description)); } if ($val == "Y") { CTimeZone::Disable(); $arOrder = CSaleOrder::GetByID($ID); CTimeZone::Enable(); $userEmail = ""; $dbOrderProp = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $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"]; } } $event = new CEvent(); $arFields = array("ORDER_ID" => $ID, "ORDER_DATE" => $arOrder["DATE_INSERT_FORMAT"], "EMAIL" => $userEmail, "ORDER_CANCEL_DESCRIPTION" => $description, "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@" . $_SERVER["SERVER_NAME"])); $eventName = "SALE_ORDER_CANCEL"; $bSend = true; foreach (GetModuleEvents("sale", "OnOrderCancelSendEmail", 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"); } if (CModule::IncludeModule("statistic")) { CStatEvent::AddByEvents("eStore", "order_cancel", $ID, "", $arOrder["STAT_GID"]); } } if ($val == "Y") { if ($arOrder["DEDUCTED"] == "Y") { $rs = CSaleOrder::DeductOrder($ID, "N"); if (!$rs) { return false; } } if ($arOrder["RESERVED"] == "Y") { if (!CSaleOrder::ReserveOrder($ID, "N")) { } return false; } } else { if (COption::GetOptionString("sale", "product_reserve_condition", "O") == "O" && $arOrder["RESERVED"] != "Y") { if (!CSaleOrder::ReserveOrder($ID, "Y")) { } return false; } } return $res; }
/** * @param Main\Event $event * * @return Main\EventResult */ public static function onSaleOrderCancelSendEmail(Main\Event $event) { $parameters = $event->getParameters(); /** @var Sale\Order $order */ $order = $parameters[0]; if (!$order instanceof Sale\Order) { return new Main\EventResult(Main\EventResult::ERROR, new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_COMPATIBILITY_ORDER_CANCEL_SEND_EMAIL_WRONG_ORDER'), 'SALE_EVENT_COMPATIBILITY_ORDER_CANCEL_SEND_EMAIL_WRONG_ORDER'), 'sale'); } $id = $order->getId(); $value = $order->getField('CANCELED'); $description = $order->getField('REASON_CANCELED'); if ($value == "Y") { $userEmail = ""; /** @var Sale\PropertyValueCollection $propertyCollection */ if ($propertyCollection = $order->getPropertyCollection()) { if ($propUserEmail = $propertyCollection->getUserEmail()) { $userEmail = $propUserEmail->getValue(); } } if (strval($userEmail) == '') { $resUser = \CUser::GetByID($order->getUserId()); if ($userData = $resUser->Fetch()) { $userEmail = $userData["EMAIL"]; } } $fields = array("ORDER_ID" => $order->getField("ACCOUNT_NUMBER"), "ORDER_DATE" => $order->getDateInsert()->toString(), "EMAIL" => $userEmail, "ORDER_CANCEL_DESCRIPTION" => $description, "SALE_EMAIL" => Main\Config\Option::get("sale", "order_email", "order@" . $_SERVER["SERVER_NAME"])); $eventName = "SALE_ORDER_CANCEL"; $send = true; foreach (GetModuleEvents("sale", static::EVENT_COMPATIBILITY_ON_ORDER_CANCEL_SEND_EMAIL, true) as $oldEvent) { if (ExecuteModuleEventEx($oldEvent, array($id, &$eventName, &$fields)) === false) { $send = false; } } if ($send) { $event = new \CEvent(); $event->Send($eventName, $order->getField('LID'), $fields, "N"); } $orderFields = null; /** @var Sale\Result $r */ $r = OrderCompatibility::getOrderFields($order); if ($r->isSuccess()) { if ($resultOrderFieldsData = $r->getData()) { if (!empty($resultOrderFieldsData['ORDER_FIELDS']) && is_array($resultOrderFieldsData['ORDER_FIELDS'])) { $orderFields = $resultOrderFieldsData['ORDER_FIELDS']; } } } \CSaleMobileOrderPush::send("ORDER_CANCELED", array("ORDER" => $orderFields)); if (Main\Loader::includeModule("statistic")) { \CStatEvent::AddByEvents("eStore", "order_cancel", $id, "", $order->getField("STAT_GID")); } } return new Main\EventResult(Main\EventResult::SUCCESS, null, 'sale'); }
function CancelOrder($ID, $val, $description = "") { global $DB, $USER, $APPLICATION; $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N'); $ID = IntVal($ID); $val = $val != "Y" ? "N" : "Y"; $description = Trim($description); if ($ID <= 0) { $APPLICATION->ThrowException(Loc::getMessage("SKGO_NO_ORDER_ID1"), "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["CANCELED"] == $val) { $APPLICATION->ThrowException(str_replace("#ID#", $ID, Loc::getMessage("SKGO_DUB_CANCEL")), "ALREADY_FLAG"); return false; } if ($isOrderConverted == "Y") { $r = \Bitrix\Sale\Compatible\OrderCompatibility::cancel($ID, $val, $description); if ($r->isSuccess(true)) { $res = true; } else { $errorMessage = ""; foreach ($r->getErrorMessages() as $error) { $errorMessage .= " " . $error; } $APPLICATION->ThrowException(Loc::getMessage("SKGO_CANCEL_ERROR", array("#MESSAGE#" => $errorMessage)), "CANCEL_ERROR"); return false; } } else { foreach (GetModuleEvents("sale", "OnSaleBeforeCancelOrder", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array($ID, $val)) === false) { return false; } } if ($val == "Y") { if ($arOrder["DEDUCTED"] == "Y") { if (!CSaleOrder::DeductOrder($ID, "N")) { return false; } } if ($arOrder["RESERVED"] == "Y") { if (!CSaleOrder::ReserveOrder($ID, "N")) { return false; } } if ($arOrder["PAYED"] == "Y") { if (!CSaleOrder::PayOrder($ID, "N", True, True)) { return False; } } else { $arOrder["SUM_PAID"] = DoubleVal($arOrder["SUM_PAID"]); if ($arOrder["SUM_PAID"] > 0) { if (!CSaleUserAccount::UpdateAccount($arOrder["USER_ID"], $arOrder["SUM_PAID"], $arOrder["CURRENCY"], "ORDER_CANCEL_PART", $ID)) { return False; } CSaleOrder::Update($arOrder["ID"], array("SUM_PAID" => 0)); } } if ($arOrder["ALLOW_DELIVERY"] == "Y") { if (!CSaleOrder::DeliverOrder($ID, "N")) { return False; } } } else { if (COption::GetOptionString("sale", "product_reserve_condition", "O") == "O" && $arOrder["RESERVED"] != "Y") { if (!CSaleOrder::ReserveOrder($ID, "Y")) { return false; } } } $arFields = array("CANCELED" => $val, "=DATE_CANCELED" => $DB->GetNowFunction(), "REASON_CANCELED" => strlen($description) > 0 ? $description : false, "EMP_CANCELED_ID" => IntVal($USER->GetID()) > 0 ? IntVal($USER->GetID()) : false); $res = CSaleOrder::Update($ID, $arFields); } unset($GLOBALS["SALE_ORDER"]["SALE_ORDER_CACHE_" . $ID]); if ($isOrderConverted != "Y") { //this method is used only for catalogs without reservation and deduction support CSaleBasket::OrderCanceled($ID, $val == "Y" ? True : False); foreach (GetModuleEvents("sale", "OnSaleCancelOrder", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($ID, $val, $description)); } } if ($val == "Y") { CTimeZone::Disable(); $arOrder = CSaleOrder::GetByID($ID); CTimeZone::Enable(); $userEmail = ""; $dbOrderProp = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $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"]; } } if (CModule::IncludeModule("statistic")) { CStatEvent::AddByEvents("eStore", "order_cancel", $ID, "", $arOrder["STAT_GID"]); } } return $res; }