/**
* @var CUser $USER
* @var CMain $APPLICATION
*/
use Bitrix\Sale;
use Bitrix\Sale\Helpers\Admin\OrderEdit;
use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\Helpers\Admin\Blocks;
use \Bitrix\Sale\Exchange\Integration\Admin\Link,
\Bitrix\Sale\Exchange\Integration\Admin\Registry,
\Bitrix\Sale\Exchange\Integration\Admin\ModeType,
\Bitrix\Sale\Helpers\Admin\Blocks\FactoryMode,
\Bitrix\Sale\Helpers\Admin\Blocks\BlockType;
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/prolog.php");
Bitrix\Main\Loader::includeModule('sale');
$moduleId = "sale";
$result = new \Bitrix\Sale\Result();
$order = null;
Loc::loadMessages(__FILE__);
$saleModulePermissions = $APPLICATION->GetGroupRight("sale");
$arUserGroups = $USER->GetUserGroupArray();
$boolLocked = false;
$link = Link::getInstance();
$factory = FactoryMode::create($link->getType());
$registry = Sale\Registry::getInstance(Sale\Registry::REGISTRY_TYPE_ORDER);
/** @var Sale\Order $orderClass */
$orderClass = $registry->getOrderClassName();
if ($saleModulePermissions == "D")
$APPLICATION->AuthForm(Loc::getMessage("ACCESS_DENIED"));
/** @var Sale\Order $order */
if(!isset($_REQUEST["ID"]) || intval($_REQUEST["ID"]) <= 0)
$link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER)
->redirect();
$ID = intval($_REQUEST["ID"]);
$boolLocked = $orderClass::isLocked($ID);
if($boolLocked)
$link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER_VIEW)
->setField('ID', $ID)
->redirect();
//Unlocking if we leave this page
if(isset($_REQUEST['unlock']) && 'Y' == $_REQUEST['unlock'])
{
$lockStatusRes = $orderClass::getLockedStatus($ID);
if($lockStatusRes->isSuccess())
$lockStatusData = $lockStatusRes->getData();
if(isset($lockStatusData['LOCK_STATUS'])
&&
( $lockStatusData['LOCK_STATUS'] != $orderClass::SALE_ORDER_LOCK_STATUS_RED
|| !isset($_REQUEST['target'])
)
)
{
$res = $orderClass::unlock($ID);
if($res->isSuccess())
{
/** @var Sale\DiscountCouponsManager $discountCouponsClass */
$discountCouponsClass = $registry->getDiscountCouponClassName();
$discountCouponsClass::clearByOrder($ID);
}
}
if(isset($_REQUEST['target']) && 'list' == $_REQUEST['target'])
$link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER)
->redirect();
else
$link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER_EDIT)
->setField('ID', $ID)
->redirect();
}
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/lib/helpers/admin/orderedit.php");
//load order
$boolLocked = $orderClass::isLocked($ID);
if ($boolLocked)
{
$result->addError(
new \Bitrix\Main\Entity\EntityError(
OrderEdit::getLockingMessage($ID)
)
);
}
$order = $orderClass::load($_REQUEST["ID"]);
if(!$order)
{
$link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER)
->redirect();
}
$orderStatusClass = $registry->getOrderStatusClassName();
$allowedStatusesUpdate = $orderStatusClass::getStatusesUserCanDoOperations($USER->GetID(), array('update'));
if(!in_array($order->getField("STATUS_ID"), $allowedStatusesUpdate))
$link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER_VIEW)
->setField('ID', $ID)
->redirect();
$isUserResponsible = false;
$isAllowCompany = false;
if ($saleModulePermissions == 'P')
{
$userCompanyList = array();
$groups = $USER->GetUserGroupArray();
$userCompanyList = \Bitrix\Sale\Services\Company\Manager::getUserCompanyList($USER->GetID());
if ($order->getField('RESPONSIBLE_ID') == $USER->GetID())
{
$isUserResponsible = true;
}
if (in_array($order->getField('COMPANY_ID'), $userCompanyList))
{
$isAllowCompany = true;
}
if (!$isUserResponsible && !$isAllowCompany)
{
$link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER)
->redirect();
}
}
$userId = isset($_POST["USER_ID"]) ? intval($_POST["USER_ID"]) : $order->getUserId();
OrderEdit::initCouponsData(
$userId,
$ID,
isset($_POST["OLD_USER_ID"]) ? intval($_POST["USER_ID"]) : null
);
if(!$boolLocked)
$orderClass::lock($ID);
$customTabber = new CAdminTabEngine("OnAdminSaleOrderEdit", array("ID" => $ID));
$customDraggableBlocks = new CAdminDraggableBlockEngine('OnAdminSaleOrderEditDraggable', array('ORDER' => $order));
$isSavingOperation = $_SERVER["REQUEST_METHOD"] == "POST" && (isset($_POST["apply"]) || isset($_POST["save"]));
$isRefreshDataAndSaveOperation = ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["refresh_data_and_save"]) && $_POST["refresh_data_and_save"] == "Y");
$isNeedFieldsRestore = $_SERVER["REQUEST_METHOD"] == "POST" && !$isSavingOperation && !$isRefreshDataAndSaveOperation;
//save order params
if (($isSavingOperation || $isNeedFieldsRestore || $isRefreshDataAndSaveOperation)
&& ($saleModulePermissions >= "U" || ($saleModulePermissions == "P" && ($isAllowCompany === true || $isUserResponsible === true)))
&& check_bitrix_sessid()
&& $result->isSuccess()
)
{
if(($isSavingOperation || $isRefreshDataAndSaveOperation))
{
if($isSavingOperation)
OrderEdit::$isTrustProductFormData = true;
if($isRefreshDataAndSaveOperation)
OrderEdit::$isRefreshData = true;
$res = OrderEdit::editOrderByFormData($_POST, $order, $USER->GetID(), true, $_FILES, $result);
if($res)
$order = $res;
if($res)
{
if (!$customTabber->Check())
{
if ($ex = $APPLICATION->GetException())
$errorMessage .= $ex->GetString();
else
$errorMessage .= "Custom tabber check unknown error!";
$result->addError(new \Bitrix\Main\Entity\EntityError($errorMessage));
}
if (!$customDraggableBlocks->check())
{
if ($ex = $APPLICATION->GetException())
$errorMessage .= $ex->GetString();
else
$errorMessage .= "Custom draggable block check unknown error!";
$result->addError(new \Bitrix\Main\Entity\EntityError($errorMessage));
}
$res = OrderEdit::saveCoupons($order->getUserId(), $_POST);
if(!$res)
$result->addError(new \Bitrix\Main\Entity\EntityError("Can't save coupons!"));
$discount = $order->getDiscount();
if ($isRefreshDataAndSaveOperation)
{
/** @var Sale\DiscountCouponsManager $discountCouponsClass */
$discountCouponsClass = $registry->getDiscountCouponClassName();
$discountCouponsClass::clearApply(true);
$discountCouponsClass::useSavedCouponsForApply(true);
$discount->setOrderRefresh(true);
$discount->setApplyResult(array());
/** @var \Bitrix\Sale\Basket $basket */
if (!($basket = $order->getBasket()))
throw new \Bitrix\Main\ObjectNotFoundException('Entity "Basket" not found');
$res = $basket->refreshData(array('PRICE', 'COUPONS'));
if(!$res->isSuccess())
$result->addErrors($res->getErrors());
}
$res = $discount->calculate();
if(!$res->isSuccess())
$result->addErrors($res->getErrors());
else
{
$discountData = $res->getData();
if (!empty($discountData) && is_array($discountData))
{
$t = $order->applyDiscount($discountData);
if (!$t->isSuccess())
{
$result->addErrors($t->getErrors());
}
unset($t);
}
unset($discountData);
}
if ($isRefreshDataAndSaveOperation && !$order->isCanceled() && !$order->isPaid())
{
/** @var \Bitrix\Sale\PaymentCollection $paymentCollection */
if (($paymentCollection = $order->getPaymentCollection()) && count($paymentCollection) == 1)
{
/** @var \Bitrix\Sale\Payment $payment */
if (($payment = $paymentCollection->rewind()) && !$payment->isPaid())
{
$payment->setFieldNoDemand('SUM', $order->getPrice());
}
}
}
if ($result->isSuccess())
{
$res = $order->verify();
if ($res->isSuccess())
{
$res = $order->save();
if (!$res->isSuccess())
{
$result->addErrors($res->getErrors());
}
}
else
{
$result->addErrors($res->getErrors());
}
if ($result->isSuccess())
{
\Bitrix\Sale\Provider::resetTrustData($order->getSiteId());
if(isset($_POST["BUYER_PROFILE_ID"]))
{
$profResult = OrderEdit::saveProfileData(intval($_POST["BUYER_PROFILE_ID"]), $order, $_POST);
if(!$profResult->isSuccess())
$result->addErrors($profResult->getErrors());
}
if (!$customTabber->Action())
{
if ($ex = $APPLICATION->GetException())
$errorMessage .= $ex->GetString();
else
$errorMessage .= "Custom tabber action unknown error!";
$result->addError(new \Bitrix\Main\Error($errorMessage));
}
if (!$customDraggableBlocks->action())
{
if ($ex = $APPLICATION->GetException())
$errorMessage .= $ex->GetString();
else
$errorMessage .= "Custom draggable block action unknown error!";
$result->addError(new \Bitrix\Main\Error($errorMessage));
}
if(!$result->isSuccess())
$_SESSION['SALE_ORDER_EDIT_ERROR'] = implode('
\n',$result->getErrorMessages());
if(isset($_POST["save"]))
{
if ($orderClass::isLocked($ID))
$orderClass::unlock($ID);
$link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER_EDIT)
->setField('unlock','Y')
->setField('target','list')
->setField('ID', $ID)
->redirect();
}
else
{
$link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER_EDIT)
->setField('ID', $ID)
->redirect();
}
}
}
}
else
{
$result->addError(new \Bitrix\Main\Error(Loc::getMessage('SOE_ORDER_UPDATE_ERROR')));
}
}
}
CUtil::InitJSCore();
$APPLICATION->SetTitle(
Loc::getMessage(
"NEWO_TITLE_EDIT",
array(
"#ID#" => $order->getId(),
"#NUM#" => $order->getField('ACCOUNT_NUMBER') <> '' ? $order->getField('ACCOUNT_NUMBER') : $order->getId(),
"#DATE#" => $order->getDateInsert()->toString()
)
)
);
\Bitrix\Main\Page\Asset::getInstance()->addJs("/bitrix/js/sale/admin/order_edit.js");
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");
/* context menu */
$aMenu = array();
$aMenu[] = array(
"ICON" => "btn_list",
"TEXT" => Loc::getMessage("SOE_TO_LIST"),
"TITLE"=> Loc::getMessage("SOE_TO_LIST_TITLE"),
"LINK" => $link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER_EDIT)
->setField('unlock','Y')
->setField('target','list')
->setField('ID', $ID)
->build()
);
if ($boolLocked && $saleModulePermissions >= 'W')
{
$aMenu[] = array(
"TEXT" => GetMessage("SOE_TO_UNLOCK"),
"LINK" => $link
->create()
->setFilterParams(false)
->fill()
->setPageByType(Registry::SALE_ORDER_EDIT)
->setField('unlock','Y')
->setField('ID', $ID)
->build()
);
}
$aMenu[] = array(
"TEXT" => Loc::getMessage("SOE_ORDER_VIEW"),
"TITLE"=> Loc::getMessage("SOE_ORDER_VIEW_TITLE"),
"LINK" => $link
->create()
->setFilterParams(false)
->fill()->setPageByType(Registry::SALE_ORDER_VIEW)
->setField('ID', $ID)
->build()
);
if($link->getType() == ModeType::APP_LAYOUT_TYPE)
{
//nothing
}
else
{
$arSysLangs = array();
$db_lang = CLangAdmin::GetList("sort", "asc", array("ACTIVE" => "Y"));
while ($arLang = $db_lang->Fetch())
$arSysLangs[] = $arLang["LID"];
$arReports = array();
$dirs = array(
$_SERVER["DOCUMENT_ROOT"]."/bitrix/admin/reports/",
$_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/reports/"
);
foreach ($dirs as $dir)
{
if (file_exists($dir))
{
if ($handle = opendir($dir))
{
while (($file = readdir($handle)) !== false)
{
$file_contents = '';
if ($file == "." || $file == ".." || $file == ".access.php" || isset($arReports[$file]))
continue;
if (is_file($dir.$file) && ToUpper(mb_substr($file, -4)) == ".PHP")
{
$rep_title = $file;
if ($dir == $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/reports/")
{
if (is_file($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/ru/reports/".$file))
$file_contents = file_get_contents($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/sale/ru/reports/".$file);
}
if (empty($file_contents))
$file_contents = file_get_contents($dir.$file);
$rep_langs = "";
$arMatches = array();
if (preg_match("#