static function determineRequisiteLinkBeforeSave($entityTypeId, $entityId, $operation, &$entityFields,
$modifyFields = true, $requisiteId = null, $bankDetailId = null, $mcRequisiteId = null, $mcBankDetailId = null)
{
$modifyFields = (bool)$modifyFields;
$resultLink = [
'CLIENT_ENTITY_TYPE_ID' => \CCrmOwnerType::Undefined,
'CLIENT_ENTITY_ID' => 0,
'REQUISITE_ID' => 0,
'BANK_DETAIL_ID' => 0,
'SELLER_ENTITY_TYPE_ID' => \CCrmOwnerType::Undefined,
'SELLER_ENTITY_ID' => 0,
'MC_REQUISITE_ID' => 0,
'MC_BANK_DETAIL_ID' => 0
];
$availableEntityIds = static::getAvailableEntityTypeIds();
if (!isset($availableEntityIds[$entityTypeId]))
{
return $resultLink;
}
$skipSeller = ($entityTypeId === \CCrmOwnerType::Deal/* || $entityTypeId === \CCrmOwnerType::Order*/);
$entityId = (int)$entityId;
$operation = (int)$operation;
if ($operation !== self::ENTITY_OPERATION_ADD && $operation !== self::ENTITY_OPERATION_UPDATE)
{
return $resultLink;
}
$params = self::prepareClientSellerParamsByEntityFields($entityTypeId, $entityFields);
$clientEntityTypeId = $params['CLIENT_ENTITY_TYPE_ID'] === null ? null : (int)$params['CLIENT_ENTITY_TYPE_ID'];
$clientEntityId = $params['CLIENT_ENTITY_ID'] === null ? null : (int)$params['CLIENT_ENTITY_ID'];
$requisiteId = $requisiteId === null ? null : (int)$requisiteId;
$bankDetailId = $bankDetailId === null ? null : (int)$bankDetailId;
$sellerEntityTypeId = $params['SELLER_ENTITY_TYPE_ID'] === null ? null : (int)$params['SELLER_ENTITY_TYPE_ID'];
$sellerEntityId = $params['SELLER_ENTITY_ID'] === null ? null : (int)$params['SELLER_ENTITY_ID'];
$mcRequisiteId = $mcRequisiteId === null ? null : (int)$mcRequisiteId;
$mcBankDetailId = $mcBankDetailId === null ? null : (int)$mcBankDetailId;
unset($params);
$resetClientRequisite = false;
$resetClientBankDetail = false;
$resetSellerRequisite = false;
$resetSellerBankDetail = false;
$parentEntityMap = self::prepareParrentEntityMap($entityTypeId, $entityFields);
$currentLink = $resultLink;
$entityExists = ($operation === self::ENTITY_OPERATION_UPDATE && $entityId > 0);
if ($entityExists)
{
try
{
$csInfo = self::getEntityClientSellerInfo($entityTypeId, $entityId, ['GET_PARENT_ENTITY_FILEDS' => true]);
}
catch (Main\SystemException $e)
{
switch ($e->getCode())
{
case self::ERR_ENTITY_NOT_FOUND:
$entityExists = false;
break;
}
}
if (!$entityExists)
{
return $resultLink;
}
$currentParrentEntityMap = self::prepareParrentEntityMap($entityTypeId, $csInfo);
foreach (array_keys($parentEntityMap) as $parentEntityTypeId)
{
$currentParrentEntityMap[$parentEntityTypeId] = $parentEntityMap[$parentEntityTypeId];
}
$parentEntityMap = $currentParrentEntityMap;
unset($currentParrentEntityMap, $parentEntityTypeId);
$currentLink['CLIENT_ENTITY_TYPE_ID'] = (int)$csInfo['CLIENT_ENTITY_TYPE_ID'];
$currentLink['CLIENT_ENTITY_ID'] = (int)$csInfo['CLIENT_ENTITY_ID'];
$currentLink['SELLER_ENTITY_TYPE_ID'] = $csInfo['MYCOMPANY_ID'] > 0 ?
\CCrmOwnerType::Company : \CCrmOwnerType::Undefined;
$currentLink['SELLER_ENTITY_ID'] = (int)$csInfo['MYCOMPANY_ID'];
$isClientDefined = ($currentLink['CLIENT_ENTITY_TYPE_ID'] !== \CCrmOwnerType::Undefined
&& $currentLink['CLIENT_ENTITY_ID'] > 0);
$isSellerDefined = ($currentLink['SELLER_ENTITY_TYPE_ID'] === \CCrmOwnerType::Company
&& $currentLink['SELLER_ENTITY_ID'] > 0);
if ($isClientDefined || $isSellerDefined)
{
if ($row = self::getList(
array(
'filter' => array(
'=ENTITY_TYPE_ID' => $entityTypeId,
'=ENTITY_ID' => $entityId
),
'select' => array('REQUISITE_ID', 'BANK_DETAIL_ID', 'MC_REQUISITE_ID', 'MC_BANK_DETAIL_ID'),
'limit' => 1
)
)->fetch())
{
if ($isClientDefined && isset($row['REQUISITE_ID']) && $row['REQUISITE_ID'] > 0)
{
$currentLink['REQUISITE_ID'] = (int)$row['REQUISITE_ID'];
if (isset($row['BANK_DETAIL_ID']) && $row['BANK_DETAIL_ID'] > 0)
{
$currentLink['BANK_DETAIL_ID'] = (int)$row['BANK_DETAIL_ID'];
}
}
if ($isSellerDefined && isset($row['MC_REQUISITE_ID']) && $row['MC_REQUISITE_ID'] > 0)
{
$currentLink['MC_REQUISITE_ID'] = (int)$row['MC_REQUISITE_ID'];
if (isset($row['MC_BANK_DETAIL_ID']) && $row['MC_BANK_DETAIL_ID'] > 0)
{
$currentLink['MC_BANK_DETAIL_ID'] = (int)$row['MC_BANK_DETAIL_ID'];
}
}
}
unset($row);
}
unset($isClientDefined, $isSellerDefined);
$resultLink = $currentLink;
}
$parentEntityList = [];
foreach ($parentEntityMap as $parentEntityTypeId => $parentEntityId)
{
$parentEntityList[] = [
'ENTITY_TYPE_ID' => $parentEntityTypeId,
'ENTITY_ID' => $parentEntityId
];
}
unset($parentEntityMap, $parentEntityTypeId, $parentEntityId);
if (($clientEntityTypeId === \CCrmOwnerType::Company || $clientEntityTypeId === \CCrmOwnerType::Contact)
&& $clientEntityId !== null && $clientEntityId >= 0)
{
$resultLink['CLIENT_ENTITY_TYPE_ID'] = $clientEntityTypeId;
$resultLink['CLIENT_ENTITY_ID'] = $clientEntityId;
if ($clientEntityTypeId !== $currentLink['CLIENT_ENTITY_TYPE_ID']
|| $clientEntityId !== $currentLink['CLIENT_ENTITY_ID'])
{
$resultLink['REQUISITE_ID'] = 0;
$resultLink['BANK_DETAIL_ID'] = 0;
}
}
if ($resultLink['CLIENT_ENTITY_TYPE_ID'] === \CCrmOwnerType::Company && $resultLink['CLIENT_ENTITY_ID'] > 0)
{
if (self::isMyCompany($resultLink['CLIENT_ENTITY_ID']))
{
$resultLink['CLIENT_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
$resultLink['CLIENT_ENTITY_ID'] = 0;
$resultLink['REQUISITE_ID'] = 0;
$resultLink['BANK_DETAIL_ID'] = 0;
$resetClientRequisite = true;
$resetClientBankDetail = true;
}
}
if ($skipSeller)
{
$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
$resultLink['SELLER_ENTITY_ID'] = 0;
$resultLink['MC_REQUISITE_ID'] = 0;
$resultLink['MC_BANK_DETAIL_ID'] = 0;
}
else
{
if ($sellerEntityTypeId === \CCrmOwnerType::Company && $sellerEntityId !== null && $sellerEntityId >= 0)
{
$resultLink['SELLER_ENTITY_TYPE_ID'] = $sellerEntityTypeId;
$resultLink['SELLER_ENTITY_ID'] = $sellerEntityId;
if ($sellerEntityTypeId !== $currentLink['SELLER_ENTITY_TYPE_ID']
|| $sellerEntityId !== $currentLink['SELLER_ENTITY_ID'])
{
$resultLink['MC_REQUISITE_ID'] = 0;
$resultLink['MC_BANK_DETAIL_ID'] = 0;
}
}
}
if ($resultLink['SELLER_ENTITY_TYPE_ID'] === \CCrmOwnerType::Company && $resultLink['SELLER_ENTITY_ID'] > 0)
{
if (!self::isMyCompany($resultLink['SELLER_ENTITY_ID']))
{
$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
$resultLink['SELLER_ENTITY_ID'] = 0;
$resultLink['MC_REQUISITE_ID'] = 0;
$resultLink['MC_BANK_DETAIL_ID'] = 0;
$resetSellerRequisite = true;
$resetSellerBankDetail = true;
}
}
$defaultMyCompanyId = null;
$needBankDetailId = true;
if ($resetClientRequisite || $requisiteId === null)
{
if ($resultLink['REQUISITE_ID'] <= 0)
{
$link = self::getDefaultEntityRequisiteLink(
$parentEntityList,
$resultLink['CLIENT_ENTITY_TYPE_ID'],
$resultLink['CLIENT_ENTITY_ID']
);
$resultLink['REQUISITE_ID'] = $link['REQUISITE_ID'];
if ($resetClientBankDetail || $bankDetailId === null)
{
$resultLink['BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
$needBankDetailId = false;
}
}
}
else
{
$resultLink['REQUISITE_ID'] = $requisiteId;
}
if ($resetClientBankDetail || $bankDetailId === null)
{
if ($needBankDetailId && $resultLink['REQUISITE_ID'] > 0 && $resultLink['BANK_DETAIL_ID'] <= 0)
{
$link = self::getDefaultEntityRequisiteLink(
$parentEntityList,
$resultLink['CLIENT_ENTITY_TYPE_ID'],
$resultLink['CLIENT_ENTITY_ID'],
$resultLink['REQUISITE_ID']
);
$resultLink['REQUISITE_ID'] = $link['REQUISITE_ID'];
$resultLink['BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
}
}
else
{
$resultLink['BANK_DETAIL_ID'] = $bankDetailId;
}
if (!$skipSeller)
{
if (($resultLink['SELLER_ENTITY_TYPE_ID'] !== \CCrmOwnerType::Company
|| $resultLink['SELLER_ENTITY_ID'] <= 0)
&& $sellerEntityId !== 0)
{
if ($defaultMyCompanyId === null)
{
$defaultMyCompanyId = self::getDefaultMyCompanyId();
}
if ($defaultMyCompanyId > 0)
{
$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Company;
$resultLink['SELLER_ENTITY_ID'] = $defaultMyCompanyId;
$resultLink['MC_REQUISITE_ID'] = 0;
$resultLink['MC_BANK_DETAIL_ID'] = 0;
$resetSellerRequisite = true;
$resetSellerBankDetail = true;
}
else
{
$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
$resultLink['SELLER_ENTITY_ID'] = 0;
$resultLink['MC_REQUISITE_ID'] = 0;
$resultLink['MC_BANK_DETAIL_ID'] = 0;
}
}
$needBankDetailId = true;
if ($resetSellerRequisite || $mcRequisiteId === null)
{
if ($resultLink['MC_REQUISITE_ID'] <= 0)
{
$link = self::getDefaultEntityRequisiteLink(
$parentEntityList,
$resultLink['SELLER_ENTITY_TYPE_ID'],
$resultLink['SELLER_ENTITY_ID'],
0,
true
);
$resultLink['MC_REQUISITE_ID'] = $link['REQUISITE_ID'];
if ($resetSellerBankDetail || $mcBankDetailId === null)
{
$resultLink['MC_BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
$needBankDetailId = false;
}
}
}
else
{
$resultLink['MC_REQUISITE_ID'] = $mcRequisiteId;
}
if ($resetSellerBankDetail || $mcBankDetailId === null)
{
if ($needBankDetailId && $resultLink['MC_REQUISITE_ID'] > 0 && $resultLink['MC_BANK_DETAIL_ID'] <= 0)
{
$link = self::getDefaultEntityRequisiteLink(
$parentEntityList,
$resultLink['SELLER_ENTITY_TYPE_ID'],
$resultLink['SELLER_ENTITY_ID'],
$resultLink['MC_REQUISITE_ID'],
true
);
$resultLink['MC_REQUISITE_ID'] = $link['REQUISITE_ID'];
$resultLink['MC_BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
}
}
else
{
$resultLink['MC_BANK_DETAIL_ID'] = $mcBankDetailId;
}
}
$continueCheck = true;
while ($continueCheck)
{
$continueCheck = false;
try
{
self::checkConsistence(
$entityTypeId, $entityId,
$resultLink['REQUISITE_ID'], $resultLink['BANK_DETAIL_ID'],
$resultLink['MC_REQUISITE_ID'], $resultLink['MC_BANK_DETAIL_ID'],
[
'ENTITY_CHECK' => $entityExists,
'IS_MY_COMPANY_CHECK' => false,
'CLIENT_SELLER_INFO' => [
'CLIENT_ENTITY_TYPE_ID' => $resultLink['CLIENT_ENTITY_TYPE_ID'],
'CLIENT_ENTITY_ID' => $resultLink['CLIENT_ENTITY_ID'],
'MYCOMPANY_ID' => $resultLink['SELLER_ENTITY_ID']
]
]
);
}
catch (Main\SystemException $e)
{
$continueCheck = true;
switch ($e->getCode())
{
case self::ERR_ENTITY_NOT_FOUND:
case self::ERR_INVALID_ENTITY_TYPE:
case self::ERR_INVALID_ENTITY_ID:
$resultLink['CLIENT_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
$resultLink['CLIENT_ENTITY_ID'] = 0;
$resultLink['REQUISITE_ID'] = 0;
$resultLink['BANK_DETAIL_ID'] = 0;
$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
$resultLink['SELLER_ENTITY_ID'] = 0;
$resultLink['MC_REQUISITE_ID'] = 0;
$resultLink['MC_BANK_DETAIL_ID'] = 0;
$continueCheck = false;
break;
case self::ERR_REQUISITE_TIED_TO_ENTITY_WITHOUT_CLIENT:
$resultLink['CLIENT_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
$resultLink['CLIENT_ENTITY_ID'] = 0;
$resultLink['REQUISITE_ID'] = 0;
$resultLink['BANK_DETAIL_ID'] = 0;
break;
case self::ERR_INVALID_REQUSIITE_ID:
case self::ERR_REQUISITE_NOT_FOUND:
case self::ERR_REQUISITE_NOT_ASSIGNED:
$link = self::getDefaultEntityRequisiteLink(
$parentEntityList,
$resultLink['CLIENT_ENTITY_TYPE_ID'],
$resultLink['CLIENT_ENTITY_ID']
);
$resultLink['REQUISITE_ID'] = $link['REQUISITE_ID'];
$resultLink['BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
unset($link);
break;
case self::ERR_INVALID_BANK_DETAIL_ID:
case self::ERR_BANK_DETAIL_NOT_ASSIGNED_WO_REQUISITE:
case self::ERR_BANK_DETAIL_NOT_FOUND:
case self::ERR_BANK_DETAIL_NOT_ASSIGNED:
if ($requisiteId === 0)
{
$resultLink['BANK_DETAIL_ID'] = 0;
}
else
{
$link = self::getDefaultEntityRequisiteLink(
$parentEntityList,
$resultLink['CLIENT_ENTITY_TYPE_ID'],
$resultLink['CLIENT_ENTITY_ID'],
$resultLink['REQUISITE_ID']
);
$resultLink['REQUISITE_ID'] = $link['REQUISITE_ID'];
$resultLink['BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
}
break;
case self::ERR_MC_REQUISITE_TIED_TO_ENTITY_WITHOUT_MYCOMPANY:
if ($defaultMyCompanyId === null)
{
$defaultMyCompanyId = self::getDefaultMyCompanyId();
}
if ($defaultMyCompanyId > 0)
{
$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Company;
$resultLink['SELLER_ENTITY_ID'] = $defaultMyCompanyId;
if ($resultLink['SELLER_ENTITY_TYPE_ID'] !== $currentLink['SELLER_ENTITY_TYPE_ID']
|| $resultLink['SELLER_ENTITY_ID'] !== $currentLink['SELLER_ENTITY_ID'])
{
$resultLink['MC_REQUISITE_ID'] = 0;
$resultLink['MC_BANK_DETAIL_ID'] = 0;
}
}
else
{
$resultLink['SELLER_ENTITY_TYPE_ID'] = \CCrmOwnerType::Undefined;
$resultLink['SELLER_ENTITY_ID'] = 0;
$resultLink['MC_REQUISITE_ID'] = 0;
$resultLink['MC_BANK_DETAIL_ID'] = 0;
}
unset($defaultMyCompanyId);
break;
case self::ERR_INVALID_MC_REQUSIITE_ID:
case self::ERR_MC_REQUISITE_NOT_FOUND:
case self::ERR_MC_REQUISITE_NOT_ASSIGNED:
$link = self::getDefaultEntityRequisiteLink(
$parentEntityList,
$resultLink['SELLER_ENTITY_TYPE_ID'],
$resultLink['SELLER_ENTITY_ID'],
0,
true
);
$resultLink['MC_REQUISITE_ID'] = $link['REQUISITE_ID'];
$resultLink['MC_BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
unset($link);
break;
case self::ERR_INVALID_MC_BANK_DETAIL_ID:
case self::ERR_MC_BANK_DETAIL_NOT_ASSIGNED_WO_MC_REQUISITE:
case self::ERR_MC_BANK_DETAIL_NOT_FOUND:
case self::ERR_MC_BANK_DETAIL_NOT_ASSIGNED:
if ($mcRequisiteId === 0)
{
$resultLink['MC_BANK_DETAIL_ID'] = 0;
}
else
{
$link = self::getDefaultEntityRequisiteLink(
$parentEntityList,
$resultLink['SELLER_ENTITY_TYPE_ID'],
$resultLink['SELLER_ENTITY_ID'],
$resultLink['MC_REQUISITE_ID'],
true
);
$resultLink['MC_REQUISITE_ID'] = $link['REQUISITE_ID'];
$resultLink['MC_BANK_DETAIL_ID'] = $link['BANK_DETAIL_ID'];
unset($link);
}
break;
default:
throw $e;
}
}
}
if ($modifyFields && is_array($entityFields))
{
switch ($entityTypeId)
{
case \CCrmOwnerType::Quote:
$entityFields['MYCOMPANY_ID'] = $resultLink['SELLER_ENTITY_ID'];
break;
case \CCrmOwnerType::Invoice:
$entityFields['UF_MYCOMPANY_ID'] = $resultLink['SELLER_ENTITY_ID'];
break;
}
}
return $resultLink;
}