%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/lib/helpers/admin/blocks/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/lib/helpers/admin/blocks/orderbuyer.php |
<?php
namespace Bitrix\Sale\Helpers\Admin\Blocks;
use Bitrix\Main\ArgumentNullException;
use Bitrix\Main\UserTable;
use Bitrix\Sale\Helpers\Admin\OrderEdit;
use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\Internals\OrderPropsTable;
use \Bitrix\Sale\Internals\Input;
use Bitrix\Sale\OrderUserProperties;
use Bitrix\Sale\Order;
use Bitrix\Sale\OrderTable;
Loc::loadMessages(__FILE__);
class OrderBuyer
{
public static function getEdit(Order $order, $showProfiles = false, $profileId = 0)
{
$data = self::prepareData($order);
$result = '
<div class="adm-bus-table-container">
<table border="0" cellspacing="0" cellpadding="0" width="100%" class="adm-detail-content-table edit-table">
<tbody>
<tr'.(intval($data["USER_ID"]) > 0 ? ' style="display: none"': '' ).' id="sale-order-buyer-find-button-wrap">
<td class="adm-detail-content-cell-l fwb" width="40%">
</td>
<td class="adm-detail-content-cell-r">
<input type="button" name="FIND_BUYER" value="'.Loc::getMessage("SALE_ORDER_BUYER_FIND").'" onclick="BX.Sale.Admin.OrderBuyer.showChooseBuyerWindow(\''.LANGUAGE_ID.'\')"><br>
<i>'.Loc::getMessage("SALE_ORDER_BUYER_START_TO_CREATE").':</i>
</td>
</tr>
<tr'.(intval($data["USER_ID"]) <= 0 ? ' style="display: none"': '' ).' id="sale-order-buyer-name-wrap">
<td class="adm-detail-content-cell-l" width="40%">'.Loc::getMessage("SALE_ORDER_BUYER").':</td>
<td class="adm-detail-content-cell-r">
<div class="adm-s-order-person-choose">
<a id="BUYER_USER_NAME" href="'.$data["BUYER_URL"].'">'.
htmlspecialcharsbx($data["BUYER_USER_NAME"]).
'</a>
<a class="adm-s-bus-morelinkqhsw" onclick="BX.Sale.Admin.OrderBuyer.showChooseBuyerWindow(\''.LANGUAGE_ID.'\')" href="javascript:void(0);">
'.Loc::getMessage("SALE_ORDER_BUYER_CHANGE").'
</a>
<a class="adm-s-bus-morelinkqhsw" onclick="BX.Sale.Admin.OrderBuyer.clearBuyer();" href="javascript:void(0);">
'.Loc::getMessage("SALE_ORDER_BUYER_CLEAR").'
</a>
<input type="hidden" name="USER_ID" id="USER_ID" value="'.intval($data["USER_ID"]).'" onchange="BX.Sale.Admin.OrderBuyer.onBuyerIdChange(this);">
</div>
</td>
</tr>
<tr>
<td class="adm-detail-content-cell-l fwb">'.Loc::getMessage("SALE_ORDER_BUYER_PAYER_TYPE").':</td>
<td class="adm-detail-content-cell-r">'.
\Bitrix\Sale\Helpers\Admin\OrderEdit::makeSelectHtml(
"PERSON_TYPE_ID",
self::getBuyerTypesList($order->getSiteId()),
isset($data["PERSON_TYPE_ID"]) ? $data["PERSON_TYPE_ID"] : "",
false,
array(
"class" => "adm-bus-select",
"id" => "PERSON_TYPE_ID",
"onchange" => "BX.Sale.Admin.OrderBuyer.onBuyerTypeChange(this.value);"
)
).
'</td>
</tr>
<tr id="sale-order-buyer-profiles-list-row"'.($showProfiles ? '' : ' style="display:none;"').'>
<td class="adm-detail-content-cell-l">'.Loc::getMessage("SALE_ORDER_BUYER_CHOOSE_PROFILE").':</td>
<td class="adm-detail-content-cell-r"><div id="BUYER_PROFILE_ID_CONTAINER">';
if($showProfiles)
{
$result .= \Bitrix\Sale\Helpers\Admin\OrderEdit::makeSelectHtml(
"BUYER_PROFILE_ID",
self::getBuyerProfilesList($data["USER_ID"], $data["PERSON_TYPE_ID"]),
$profileId,
false,
array(
"class" => "adm-bus-select",
"id" => "BUYER_PROFILE_ID",
"onchange" => "BX.Sale.Admin.OrderBuyer.onBuyerProfileChange();"
)
);
}
$result .= '</div></td>
</tr>
</tbody>
</table>
</div>'.
'<div id="order_properties_container"></div>'.
'<div>'.self::getOrderPropertiesByJS($order).'</div>'.
'<div class="adm-bus-table-container caption border sale-order-props-group">'.
'<div class="adm-bus-table-caption-title">'.Loc::getMessage("SALE_ORDER_BUYER_COMMENT").'</div>
<table border="0" cellspacing="0" cellpadding="0" width="100%" class="adm-detail-content-table edit-table ">
<tbody>
<tr>
<td class="adm-detail-content-cell-l" width="40%">'.Loc::getMessage("SALE_ORDER_BUYER_ORDERCOMMENT").':</td>
<td class="adm-detail-content-cell-r">
<textarea style="width:400px;min-height:100px;" name="USER_DESCRIPTION" id="USER_DESCRIPTION">'.
htmlspecialcharsbx($data["USER_DESCRIPTION"]).
'</textarea>
</td>
</tr>
</tbody>
</table>
</div>';
return $result;
}
public static function getPropsEdit(Order $order)
{
$result = '
<div>
<div id="order_properties_container_add"></div>'.
'<div>'.self::getOrderRelPropertiesByJS($order).'</div>'.
'</div>';
return $result;
}
public static function getView(Order $order)
{
$data = self::prepareData($order);
$buyersList = self::getBuyerTypesList($order->getSiteId());
return '
<div class="adm-bus-table-container">
<table border="0" cellspacing="0" cellpadding="0" width="100%" class="adm-detail-content-table edit-table">
<tbody>
<tr>
<td class="adm-detail-content-cell-l" width="40%">'.Loc::getMessage("SALE_ORDER_BUYER").':</td>
<td class="adm-detail-content-cell-r">
<div>
<a href="'.$data["BUYER_URL"].'">'.
htmlspecialcharsbx($data["BUYER_USER_NAME"]).
'</a>
</div>
</td>
</tr>
<tr>
<td class="adm-detail-content-cell-l">'.Loc::getMessage("SALE_ORDER_BUYER_PAYER_TYPE").':</td>
<td class="adm-detail-content-cell-r">'.$buyersList[$data["PERSON_TYPE_ID"]].
'</td>
</tr>
</tbody>
</table>
</div>'.
self::getOrderPropertiesHtml($order, true).
'<div class="adm-bus-table-container caption border sale-order-props-group">'.
'<div class="adm-bus-table-caption-title">'.Loc::getMessage("SALE_ORDER_BUYER_COMMENT").'</div>
<table border="0" cellspacing="0" cellpadding="0" width="100%" class="adm-detail-content-table edit-table ">
<tbody>
<tr>
<td class="adm-detail-content-cell-l" width="40%">'.Loc::getMessage("SALE_ORDER_BUYER_ORDERCOMMENT").':</td>
<td class="adm-detail-content-cell-r"><p id="sale-adm-user-description-view" style="color:gray; max-width:800px; overflow:auto;">'.(strlen($data["USER_DESCRIPTION"]) > 0 ? nl2br(htmlspecialcharsbx($data["USER_DESCRIPTION"])) : Loc::getMessage("SALE_ORDER_BUYER_NO")).'</p></td>
</tr>
</tbody>
</table>
</div>';
}
public static function getScripts()
{
\Bitrix\Main\Page\Asset::getInstance()->addJs("/bitrix/js/sale/admin/order_buyer.js");
\Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/sale/input.js');
\Bitrix\Sale\PropertyValueCollection::initJs();
$langPhrases = array("SALE_ORDER_BUYER_CREATE_NEW", "SALE_ORDER_BUYER_UNKNOWN_GROUP");
$result = '<script type="text/javascript">'.
'BX.Sale.Admin.OrderBuyer.isFeatureSaleAccountsEnabled = '.(\CBXFeatures::IsFeatureEnabled('SaleAccounts') ? 'true' : 'false').';';
foreach($langPhrases as $phrase)
$result .= ' BX.message({'.$phrase.': "'.\CUtil::jsEscape(Loc::getMessage($phrase)).'"});';
$result .= '
BX.ready(function(){
BX.Sale.Admin.OrderEditPage.registerFieldsUpdaters( BX.Sale.Admin.OrderBuyer.getFieldsUpdaters() );
});
</script>
';
return $result;
}
public static function getDefaultPersonType($siteId)
{
$personTypes = self::getBuyerTypesList($siteId);
reset($personTypes);
return key($personTypes);
}
public static function prepareData(Order $order)
{
if (\CBXFeatures::IsFeatureEnabled('SaleAccounts'))
{
$strBuyerProfileUrl = '/bitrix/admin/sale_buyers_profile.php?USER_ID='.intval($order->getUserId()).'&lang='.LANGUAGE_ID;
}
else
{
$strBuyerProfileUrl = '/bitrix/admin/user_edit.php?ID='.$order->getUserId().'&lang='.LANGUAGE_ID;
}
$result = array(
"USER_ID" => intval($order->getUserId()),
"PERSON_TYPE_ID" => $order->getPersonTypeId(),
"BUYER_USER_NAME" => OrderEdit::getUserName(
$order->getUserId(),
$order->getSiteId()
),
"USER_DESCRIPTION" => $order->getField("USER_DESCRIPTION"),
"BUYER_URL" => $strBuyerProfileUrl
);
return $result;
}
public static function getBuyerTypesList($siteId)
{
static $result = array();
if(!isset($result[$siteId]))
{
$result[$siteId] = array();
$dbPersonType = \CSalePersonType::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array("ACTIVE" => "Y", "LID"=> $siteId));
while ($personType = $dbPersonType->GetNext())
$result[$siteId][$personType["ID"]] = $personType["NAME"]." [".$personType["ID"]."]";
}
return $result[$siteId];
}
public static function getProfileParams($userId, $profileId)
{
return OrderUserProperties::getProfileValues($profileId);
}
public static function getUserProfiles($userId, $personTypeId = null)
{
if(intval($userId) <=0)
return array();
$result = array();
$profilesResult = OrderUserProperties::loadProfiles($userId, $personTypeId);
$profiles = $profilesResult->getData();
if(is_array($profiles))
{
foreach($profiles as $typeId => $types)
{
if(!isset($result[$typeId]))
$result[$typeId] = array();
foreach($types as $key => $value)
{
$result[$typeId][$key] = $value["VALUES"];
}
}
}
if($personTypeId && empty($result[$personTypeId]))
{
$result[$personTypeId] = array(self::getProfileValuesFromPrevOrder($userId, $personTypeId));
if(empty($result[$personTypeId]))
$result[$personTypeId] = array(self::getProfileValuesFromUser($userId, $personTypeId));
}
return $result;
}
protected static function getProfileValuesFromPrevOrder($userId, $personTypeId)
{
if(intval($personTypeId) <= 0)
throw new ArgumentNullException('userId');
if(intval($personTypeId) <= 0)
throw new ArgumentNullException('personTypeId');
$res = OrderTable::getList(array(
'filter' => array(
'USER_ID' => $userId
),
'order' => array('DATE_INSERT' => 'DESC'),
'select' => array('ID')
));
if(!$order = $res->fetch())
return array();
/** @var \Bitrix\Sale\Order $order */
$order = Order::load($order['ID']);
if(!$order)
return array();
$propCollection = $order->getPropertyCollection();
if(!$propCollection)
return array();
$result = array();
$pRes = OrderPropsTable::getList(array(
'filter' => array(
'PERSON_TYPE_ID' => $personTypeId,
'ACTIVE' => 'Y',
'USER_PROPS' => 'Y'
)
));
while($prop = $pRes->fetch())
{
if(strlen($prop['DEFAULT_VALUE']) > 0)
{
$result[$prop['ID']] = $prop['DEFAULT_VALUE'];
}
else
{
$property = null;
if($prop['IS_EMAIL'] == 'Y')
$property = $propCollection->getUserEmail();
elseif($prop['IS_PAYER'] == 'Y')
$property = $propCollection->getPayerName();
elseif($prop['IS_PHONE'] == 'Y')
$property = $propCollection->getPhone();
elseif($prop['IS_ADDRESS'] == 'Y')
$property = $propCollection->getAddress();
if($property)
$result[$prop['ID']] = $property->getValue();
}
}
return $result;
}
protected static function getProfileValuesFromUser($userId, $personTypeId)
{
if(intval($personTypeId) <= 0)
throw new ArgumentNullException('userId');
if(intval($personTypeId) <= 0)
throw new ArgumentNullException('personTypeId');
$uRes = UserTable::getById($userId);
if(!$user= $uRes->fetch())
return array();
$result = array();
$pRes = OrderPropsTable::getList(array(
'filter' => array(
'PERSON_TYPE_ID' => $personTypeId,
'ACTIVE' => 'Y',
'USER_PROPS' => 'Y'
)
));
while($prop = $pRes->fetch())
{
if(strlen($prop['DEFAULT_VALUE']) > 0)
{
$result[$prop['ID']] = $prop['DEFAULT_VALUE'];
}
elseif($prop['IS_EMAIL'] == 'Y' && !empty($user['EMAIL']))
{
$result[$prop['ID']] = $user['EMAIL'];
}
elseif($prop['IS_PAYER'] == 'Y')
{
$name = '';
if(!empty($user['LAST_NAME']))
$name .= $user['LAST_NAME'];
if(!empty($user['NAME']))
$name .= $user['NAME'];
if(!empty($user['SECOND_NAME']))
$name .= $user['SECOND_NAME'];
if(strlen($name) > 0)
$result[$prop['ID']] = $name;
}
elseif($prop['IS_PHONE'] == 'Y' && !empty($user['PERSONAL_MOBILE']))
{
$result[$prop['ID']] = $user['PERSONAL_MOBILE'];
}
elseif($prop['IS_ADDRESS'] == 'Y')
{
$address = '';
if(!empty($user['PERSONAL_STREET']))
$address .= $user['PERSONAL_STREET'];
if(!empty($user['PERSONAL_CITY']))
$address .= $user['PERSONAL_CITY'];
if(!empty($user['PERSONAL_STATE']))
$address .= $user['PERSONAL_STATE'];
if(!empty($user['PERSONAL_ZIP']))
$address .= $user['PERSONAL_ZIP'];
if(!empty($user['PERSONAL_COUNTRY']))
$address .= $user['PERSONAL_COUNTRY'];
$result[$prop['ID']] = $address;
}
}
return $result;
}
public static function getBuyerProfilesList($userId, $personTypeId = null)
{
$result = array(0 => Loc::getMessage("SALE_ORDER_BUYER_CREATE_NEW"));
if(intval($userId) > 0)
{
$profilesResult = OrderUserProperties::loadProfiles($userId, $personTypeId);
$profiles = $profilesResult->getData();
if(is_array($profiles))
foreach($profiles as $types)
foreach($types as $key => $value)
$result[$key] = htmlspecialcharsback($value["NAME"]);
}
return $result;
}
public static function getOrderPropertiesHtml(Order $order, $readonly = false)
{
$propertyCollection = $order->getPropertyCollection();
$result = "";
foreach ($propertyCollection->getGroups() as $group)
{
$resultBody = "";
$groupProperties = $propertyCollection->getPropertiesByGroupId($group['ID']);
if(!is_array($groupProperties))
continue;
/** @var \Bitrix\Sale\PropertyValue $property */
foreach ($propertyCollection->getPropertiesByGroupId($group['ID']) as $property)
{
$propertyValue = $property->getValue();
if ($readonly
&& (
!isset($propertyValue)
|| (is_array($propertyValue) && empty($propertyValue))
|| $propertyValue === ""
)
)
continue;
$p = $property->getProperty();
if($p['IS_PHONE'] == 'Y' && $readonly)
{
$phoneVal = $property->getValue();
if($phoneVal != '')
{
if(!is_array($phoneVal))
$phoneVal = array($phoneVal);
$showHtml = '';
foreach($phoneVal as $number)
{
$number = str_replace("'", "", htmlspecialcharsbx($number));
if(strlen($showHtml) > 0)
$showHtml .= ', ';
$showHtml .= '<a href="javascript:void(0)" onclick="BX.Sale.Admin.OrderEditPage.desktopMakeCall(\''.$number.'\');">'.
$number.
'</a>';
}
}
else
{
$showHtml = '';
}
}
else
{
$showHtml = (($readonly) ? $property->getViewHtml() : $property->getEditHtml());
}
$resultBody .= '
<tr>
<td class="adm-detail-content-cell-l" width="40%" valign="top">'.htmlspecialcharsbx($property->getName()).':</td>
<td class="adm-detail-content-cell-r"><div>'.$showHtml.'</div></td>
</tr>';
}
if (!empty($resultBody))
{
$result .= '<div class="adm-bus-table-container caption border sale-order-props-group">
<div class="adm-bus-table-caption-title">'.htmlspecialcharsbx($group['NAME']).'</div>
<table border="0" cellspacing="0" cellpadding="0" width="100%" class="adm-detail-content-table edit-table ">
<tbody>'.$resultBody.'
</tbody>
</table>
</div>';
}
}
return $result;
}
public static function getRelPropData(Order $order)
{
$result = array();
$groups = array();
$items = $order->getPropertyCollection()->getArray();
foreach ($items as $key => $item)
{
if ($key == 'properties')
{
$result[$key] = array();
foreach ($item as $property)
{
if (isset($property['RELATION']))
{
foreach ($property['RELATION'] as $relation)
{
if (
in_array($relation['ENTITY_ID'], $order->getPaymentSystemId())
||
in_array($relation['ENTITY_ID'], $order->getDeliverySystemId())
)
{
if ($property['TYPE'] === 'ENUM' && is_array($property['OPTIONS']))
{
$property['OPTIONS_SORT'] = array_keys($property['OPTIONS']);
}
$result[$key][] = $property;
$groups[$property['PROPS_GROUP_ID']] = true;
break;
}
}
}
}
}
else
{
$result[$key] = $item;
}
}
foreach ($result['groups'] as $i => $group)
{
if (!isset($groups[$group['ID']]))
unset($result['groups'][$i]);
}
return $result;
}
public static function getNotRelPropData(Order $order)
{
$result = array();
$groups = array();
$items = $order->getPropertyCollection()->getArray();
foreach ($items as $key => $item)
{
if ($key == 'properties')
{
$result[$key] = array();
foreach ($item as $property)
{
if (!isset($property['RELATION']))
{
$result[$key][] = $property;
$groups[$property['PROPS_GROUP_ID']] = true;
}
}
}
else
{
$result[$key] = $item;
}
}
foreach ($result['groups'] as $i => $group)
{
if (!isset($groups[$group['ID']]) && $group['ID'] != 0)
unset($result['groups'][$i]);
}
return $result;
}
public static function getOrderPropertiesByJS(Order $order)
{
if ($order->getId() > 0)
$result = $order->getPropertyCollection()->getArray();
else
$result = self::getNotRelPropData($order);
if (!empty($result['properties']))
{
$propertyTypes = Input\Manager::getTypes();
$baseTypes = array();
foreach ($propertyTypes as $typeName => $typeData)
{
if (strpos($typeData['CLASS'], 'Bitrix\\Sale\\Internals\\Input') !== false)
$baseTypes[] = $typeName;
}
foreach ($result['properties'] as &$property)
{
$propertyClassName = $propertyTypes[$property['TYPE']]['CLASS'];
if (
!in_array($property['TYPE'], $baseTypes)
&& class_exists($propertyClassName)
&& new $propertyClassName instanceof Input\Base
)
{
ob_start();
$propertyCustomName = "PROPERTIES[".$property['ID']."]";
/** @var Input\Base $propertyClassName */
echo $propertyClassName::getEditHtml($propertyCustomName, $property, $property['VALUE']);
$property['EDIT_HTML'] = ob_get_contents();
ob_end_clean();
$property['TYPE'] = 'UF';
}
if ($property['TYPE'] === 'ENUM' && is_array($property['OPTIONS']))
{
$property['OPTIONS_SORT'] = array_keys($property['OPTIONS']);
}
}
}
if (!empty($result['groups']) && !empty($result['properties']))
{
$groupIndexList = array();
foreach ($result['groups'] as $groupdData)
{
$groupIndexList[] = intval($groupdData['ID']);
}
if (!empty($groupIndexList))
{
foreach ($result['properties'] as $index => $propertyData)
{
if (array_key_exists('PROPS_GROUP_ID', $propertyData))
{
if (!in_array($propertyData['PROPS_GROUP_ID'], $groupIndexList))
{
$result['properties'][$index]['PROPS_GROUP_ID'] = 0;
}
}
}
}
}
return '
<script type="text/javascript">
BX.ready(function(){
BX.Sale.Admin.OrderBuyer.setOrderPropsArray('.\CUtil::PhpToJSObject($result).');
});
</script>
';
}
public static function getOrderRelPropertiesByJS(Order $order)
{
$result = self::getRelPropData($order);
return '
<script type="text/javascript">
BX.ready(function(){
BX.Sale.Admin.OrderBuyer.setOrderRelPropsArray('.\CUtil::PhpToJSObject($result).');
var updater = [];
updater["RELATED_PROPS"] = {
callback: BX.Sale.Admin.OrderBuyer.setOrderRelPropsArray,
context: this
};
BX.Sale.Admin.OrderEditPage.registerFieldsUpdaters(updater);
});
</script>
';
}
}