public function importParsedRequisites($entityTypeId, $entityId, $dupControlType)
{
$result = new Main\Result();
foreach ($this->requisiteList as $requisiteFields)
{
$presetId = isset($requisiteFields['PRESET_ID']) ? (int)$requisiteFields['PRESET_ID'] : 0;
if(!in_array($dupControlType, array('REPLACE', 'MERGE', 'SKIP'), true))
$dupControlType = 'NO_CONTROL';
$rqImportMode = 'MERGE';
switch ($dupControlType)
{
case 'REPLACE':
$rqImportMode = $dupControlType;
break;
}
if (!EntityRequisite::checkEntityType($entityTypeId))
{
$result->addError(
new Main\Error(
GetMessage('CRM_RQ_IMP_HLPR_ERR_INVALID_ENTITY_TYPE'),
self::ERR_INVALID_ENTITY_TYPE
)
);
return $result;
}
if ($entityId <= 0)
{
$result->addError(
new Main\Error(
GetMessage('CRM_RQ_IMP_HLPR_ERR_INVALID_ENTITY_ID'),
self::ERR_INVALID_ENTITY_ID
)
);
return $result;
}
$requisite = EntityRequisite::getSingleInstance();
if (!$requisite->validateEntityExists($entityTypeId, $entityId))
{
$errMsg = '';
$errCode = 0;
switch ($entityTypeId)
{
case \CCrmOwnerType::Company:
$errMsg = GetMessage('CRM_RQ_IMP_HLPR_ERR_COMPANY_NOT_EXISTS', array('#ID#' => $entityId));
$errCode = self::ERR_COMPANY_NOT_EXISTS;
break;
case \CCrmOwnerType::Contact:
$errMsg = GetMessage('CRM_RQ_IMP_HLPR_ERR_CONTACT_NOT_EXISTS', array('#ID#' => $entityId));
$errCode = self::ERR_CONTACT_NOT_EXISTS;
break;
}
$result->addError(new Main\Error($errMsg, $errCode));
return $result;
}
if (!EntityRequisite::checkUpdatePermissionOwnerEntity($entityTypeId, $entityId))
{
$errMsg = '';
$errCode = 0;
switch ($entityTypeId)
{
case \CCrmOwnerType::Company:
$errMsg = GetMessage(
'CRM_RQ_IMP_HLPR_ERR_ACCESS_DENIED_COMPANY_UPDATE',
array('#ID#' => $entityId)
);
$errCode = self::ERR_ACCESS_DENIED_COMPANY_UPDATE;
break;
case \CCrmOwnerType::Contact:
$errMsg = GetMessage(
'CRM_RQ_IMP_HLPR_ERR_ACCESS_DENIED_CONTACT_UPDATE',
array('#ID#' => $entityId)
);
$errCode = self::ERR_ACCESS_DENIED_CONTACT_UPDATE;
break;
}
$result->addError(new Main\Error($errMsg, $errCode));
return $result;
}
$entityTypeName = \CCrmOwnerType::ResolveName($entityTypeId);
if ($presetId === 0)
{
$presetId = EntityRequisite::getDefaultPresetId($entityTypeId);
if ($presetId <= 0)
{
$result->addError(
new Main\Error(
GetMessage(
'CRM_RQ_IMP_HLPR_ERR_DEF_IMP_PRESET_NOT_DEFINED',
array('#ENTITY_TYPE_NAME_GENITIVE#' => $entityTypeName)
),
self::ERR_DEF_IMP_PRESET_NOT_DEFINED
)
);
return $result;
}
}
$presetId = (int)$presetId;
if ($presetId <= 0)
{
$result->addError(
new Main\Error(
GetMessage('CRM_RQ_IMP_HLPR_ERR_INVALID_IMP_PRESET_ID'),
self::ERR_INVALID_IMP_PRESET_ID
)
);
return $result;
}
$preset = EntityPreset::getSingleInstance();
$presetInfo = $preset->getById($presetId);
$requisiteFieldMap = array(
'ID' => true,
'PRESET_ID' => true,
'NAME' => true,
'ACTIVE' => true,
'SORT' => true
);
if (!is_array($presetInfo))
{
$result->addError(
new Main\Error(
GetMessage('CRM_RQ_IMP_HLPR_ERR_IMP_PRESET_NOT_EXISTS', array('#ID#' => $presetId)),
self::ERR_IMP_PRESET_NOT_EXISTS
)
);
return $result;
}
$presetName = EntityPreset::formatName($presetId, $presetInfo['NAME']);
$countryId = (int)$presetInfo['COUNTRY_ID'];
if (is_array($presetInfo['SETTINGS']))
{
$presetFieldsInfo = $preset->settingsGetFields($presetInfo['SETTINGS']);
foreach ($presetFieldsInfo as $fieldInfo)
{
if (isset($fieldInfo['FIELD_NAME']) && !empty($fieldInfo['FIELD_NAME']))
$requisiteFieldMap[$fieldInfo['FIELD_NAME']] = true;
}
}
unset($preset, $presetHasAddress, $presetFieldsInfo, $fieldInfo);
$rqRes = $requisite->getList(
array(
'select' => array_keys($requisiteFieldMap),
'filter' => array(
'=PRESET_ID' => $presetId,
'=ENTITY_TYPE_ID' => $entityTypeId,
'=ENTITY_ID' => $entityId
)
)
);
$rqFieldTypeInfoMap = null;
$bankDetailFieldMap = null;
$bdFieldTypeInfoMap = null;
$rqComplianceFound = false;
$bankDetail = EntityBankDetail::getSingleInstance();
while($rqRow = $rqRes->fetch())
{
if($rqFieldTypeInfoMap === null)
{
$rqFieldTypeInfoMap = array();
foreach ($requisite->getFormFieldsInfo($countryId) as $fieldName => $fieldInfo)
{
$rqFieldTypeInfoMap[$fieldName] = array(
'type' => $fieldInfo['type'],
'isUF' => $fieldInfo['isUF']
);
}
}
// load fields of existing requisite
$exRequisiteFields = array();
foreach (array_keys($requisiteFieldMap) as $fieldName)
{
if(isset($rqFieldTypeInfoMap[$fieldName]))
{
$fieldType = $rqFieldTypeInfoMap[$fieldName]['type'];
$isUF = $rqFieldTypeInfoMap[$fieldName]['isUF'];
if($fieldName === EntityRequisite::ADDRESS)
{
$value = array();
}
else
{
switch ($fieldType)
{
case 'integer':
$value = isset($rqRow[$fieldName]) ? (int)$rqRow[$fieldName] : null;
break;
case 'boolean':
$value = isset($rqRow[$fieldName]) ? (bool)$rqRow[$fieldName] : false;
if($isUF)
$value = (intval($value) > 0) ? 1 : 0;
else
$value = ($value === 'Y') ? 'Y' : 'N';
break;
case 'datetime':
$value = isset($rqRow[$fieldName]) ? $rqRow[$fieldName] : '';
if($value instanceof Main\Type\DateTime)
$value = $value->toString();
break;
default:
$value = isset($rqRow[$fieldName]) ? strval($rqRow[$fieldName]) : '';
}
}
$exRequisiteFields[$fieldName] = $value;
}
}
// check requisite compliance
$dupCriterionFields = EntityRequisite::getDuplicateCriterionFieldsMap();
$dupCriterionFields = isset($dupCriterionFields[$countryId]) ?
$dupCriterionFields[$countryId] : array();
$compKeyFields = array_merge(array('NAME'), $dupCriterionFields);
unset($dupCriterionFields);
$rqComplianceByKeyField = false;
foreach ($compKeyFields as $fieldName)
{
if (isset($requisiteFields[$fieldName]) && isset($exRequisiteFields[$fieldName])
&& $requisiteFields[$fieldName] === $exRequisiteFields[$fieldName])
{
$rqComplianceByKeyField = true;
$rqComplianceFound = true;
break;
}
}
if ($rqComplianceByKeyField)
{
// load addresses of existing requisite
$requisiteId = (int)$rqRow['ID'];
$exRequisiteAddresses = EntityRequisite::getAddresses($requisiteId);
// update requisite fields
$requisiteFieldsToUpdate = array();
foreach (array_keys($requisiteFieldMap) as $fieldName)
{
// $dupControlType may be only 'REPLACE' or 'MERGE'
if ($dupControlType === 'REPLACE')
{
if (array_key_exists($fieldName, $requisiteFields))
{
if (!array_key_exists($fieldName, $exRequisiteFields) ||
$exRequisiteFields[$fieldName] !== $requisiteFields[$fieldName])
{
$requisiteFieldsToUpdate[$fieldName] = $requisiteFields[$fieldName];
}
}
}
else if ($dupControlType === 'MERGE')
{
if (!array_key_exists($fieldName, $exRequisiteFields)
|| $exRequisiteFields[$fieldName] === null
|| (is_string($exRequisiteFields[$fieldName])
&& $exRequisiteFields[$fieldName] == '')
|| (!is_int($exRequisiteFields[$fieldName])
&& empty($exRequisiteFields[$fieldName])))
{
if (isset($requisiteFields[$fieldName])
&& (is_int($requisiteFields[$fieldName])
|| (is_string($requisiteFields[$fieldName]
&& mb_strlen(is_string($requisiteFields[$fieldName]) > 0)))
|| !empty($requisiteFields[$fieldName])))
{
$requisiteFieldsToUpdate[$fieldName] = $requisiteFields[$fieldName];
}
}
}
}
if (isset($requisiteFieldsToUpdate['ID']))
unset($requisiteFieldsToUpdate['ID']);
if (!empty($requisiteFieldsToUpdate))
{
$errorOccured = false;
$errMsg = '';
try
{
$rqUpdRes = $requisite->update($requisiteId, $requisiteFieldsToUpdate);
}
catch (Main\SystemException $e)
{
$errorOccured = true;
$errMsg = $e->getMessage();
}
if (!$errorOccured && !$rqUpdRes->isSuccess())
{
$errorOccured = true;
$errMsg = $this->getErrorMessage($rqUpdRes);
}
unset($rqUpdRes);
if ($errorOccured)
{
$result->addError(
new Main\Error(
GetMessage(
'CRM_RQ_IMP_HLPR_ERR_UPDATE_REQUISITE',
array(
'#ENTITY_TYPE_NAME_GENITIVE#' => GetMessage(
'CRM_RQ_IMP_HLPR_ERR_'.$entityTypeName.'_GENITIVE'
),
'#ID#' => $entityId,
).': '.$errMsg
),
self::ERR_UPDATE_REQUISITE
)
);
return $result;
}
unset($errorOccured, $errMsg);
}
// update addresses
$requisiteAddresses = array();
$addressFields = array(
'ADDRESS_1',
'ADDRESS_2',
'CITY',
'POSTAL_CODE',
'REGION',
'PROVINCE',
'COUNTRY',
'COUNTRY_CODE'/*,
'LOC_ADDR_ID'*/
);
if (is_array($requisiteFields)
&& is_array($requisiteFields[EntityRequisite::ADDRESS])
&& !empty($requisiteFields[EntityRequisite::ADDRESS]))
{
$rqAddrTypeMap = array_fill_keys(EntityAddressType::getAvailableIds(), true);
foreach ($requisiteFields[EntityRequisite::ADDRESS] as $addrTypeId => $address)
{
if (isset($rqAddrTypeMap[$addrTypeId]) && !RequisiteAddress::isEmpty($address))
{
foreach ($addressFields as $fieldName)
{
$requisiteAddresses[$addrTypeId][$fieldName] =
isset($address[$fieldName]) ? $address[$fieldName] : null;
}
}
}
}
foreach($requisiteAddresses as $addrTypeId => $address)
{
// $rqImportMode may be only 'REPLACE' or 'MERGE'
if(!isset($exRequisiteAddresses[$addrTypeId])
|| RequisiteAddress::isEmpty($exRequisiteAddresses[$addrTypeId])
|| ($rqImportMode === 'REPLACE'
&& !RequisiteAddress::areEquals(
$requisiteAddresses[$addrTypeId], $exRequisiteAddresses[$addrTypeId]
)))
{
RequisiteAddress::register(
\CCrmOwnerType::Requisite,
$requisiteId,
$addrTypeId,
$address
);
}
}
unset($requisiteAddresses);
// update bank details
if (is_array($requisiteFields['BANK_DETAILS']) && count($requisiteFields['BANK_DETAILS']) > 0)
{
foreach ($requisiteFields['BANK_DETAILS'] as $bankDetailFields)
{
// load bank details of existing requisite
if ($bankDetailFieldMap === null)
{
$bankDetailFieldMap = array(
'ID' => true,
'NAME' => true,
'COUNTRY_ID' => true,
'ACTIVE' => true,
'SORT' => true
);
$bankDetailRqFieldsByCountry = $bankDetail->getRqFieldByCountry();
if (is_array($bankDetailRqFieldsByCountry[$countryId]))
{
foreach ($bankDetailRqFieldsByCountry[$countryId] as $fieldName)
$bankDetailFieldMap[$fieldName] = true;
}
$bankDetailFieldMap['COMMENTS'] = true;
unset($bankDetailRqFieldsByCountry);
}
$bdRes = $bankDetail->getList(
array(
'select' => array_keys($bankDetailFieldMap),
'filter' => array(
'=ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
'=ENTITY_ID' => $requisiteId
)
)
);
$bdComplianceFound = false;
while($bdRow = $bdRes->fetch())
{
$bankDetailId = (int)$bdRow['ID'];
if($bdFieldTypeInfoMap === null)
{
$bdFieldTypeInfoMap = array();
foreach ($bankDetail->getFormFieldsInfo($countryId) as $fieldName => $fieldInfo)
{
$bdFieldTypeInfoMap[$fieldName] = array(
'type' => $fieldInfo['type'],
'isUF' => $fieldInfo['isUF']
);
}
}
// load fields of existing bank details
$exBankDetailFields = array();
foreach (array_keys($bankDetailFieldMap) as $fieldName)
{
if(isset($bdFieldTypeInfoMap[$fieldName]))
{
$fieldType = $bdFieldTypeInfoMap[$fieldName]['type'];
$isUF = $bdFieldTypeInfoMap[$fieldName]['isUF'];
switch ($fieldType)
{
case 'integer':
$value = isset($bdRow[$fieldName]) ? (int)$bdRow[$fieldName] : null;
break;
case 'boolean':
$value = isset($bdRow[$fieldName]) ? (bool)$bdRow[$fieldName] : false;
if($isUF)
$value = (intval($value) > 0) ? 1 : 0;
else
$value = ($value === 'Y') ? 'Y' : 'N';
break;
case 'datetime':
$value = isset($bdRow[$fieldName]) ? $bdRow[$fieldName] : '';
if($value instanceof Main\Type\DateTime)
$value = $value->toString();
break;
default:
$value = isset($bdRow[$fieldName]) ? strval($bdRow[$fieldName]) : '';
}
$exBankDetailFields[$fieldName] = $value;
}
}
// check bank detail compliance
$dupCriterionFields = EntityBankDetail::getDuplicateCriterionFieldsMap();
$dupCriterionFields = isset($dupCriterionFields[$countryId]) ?
$dupCriterionFields[$countryId] : array();
$compKeyFields = array_merge(array('NAME'), $dupCriterionFields);
unset($dupCriterionFields);
$bdComplianceByKeyField = false;
foreach ($compKeyFields as $fieldName)
{
if (isset($bankDetailFields[$fieldName]) && isset($exBankDetailFields[$fieldName])
&& $bankDetailFields[$fieldName] === $exBankDetailFields[$fieldName])
{
$bdComplianceByKeyField = true;
$bdComplianceFound = true;
break;
}
}
if ($bdComplianceByKeyField)
{
// update bank detail fields
$bankdetailFieldsToUpdate = array();
foreach (array_keys($bankDetailFieldMap) as $fieldName)
{
// $dupControlType may be only 'REPLACE' or 'MERGE'
if ($dupControlType === 'REPLACE')
{
if (array_key_exists($fieldName, $bankDetailFields))
{
if (!array_key_exists($fieldName, $exBankDetailFields) ||
$exBankDetailFields[$fieldName] !== $bankDetailFields[$fieldName])
{
$bankdetailFieldsToUpdate[$fieldName]
= $bankDetailFields[$fieldName];
}
}
}
else if ($dupControlType === 'MERGE')
{
if (!array_key_exists($fieldName, $exBankDetailFields)
|| $exBankDetailFields[$fieldName] === null
|| (is_string($exBankDetailFields[$fieldName])
&& $exBankDetailFields[$fieldName] == '')
|| (!is_int($exBankDetailFields[$fieldName])
&& empty($exBankDetailFields[$fieldName])))
{
if (isset($bankDetailFields[$fieldName])
&& (is_int($bankDetailFields[$fieldName])
|| (is_string($bankDetailFields[$fieldName]
&& mb_strlen(is_string($bankDetailFields[$fieldName]) > 0)))
|| !empty($bankDetailFields[$fieldName])))
{
$bankdetailFieldsToUpdate[$fieldName] =
$bankDetailFields[$fieldName];
}
}
}
}
if (isset($bankdetailFieldsToUpdate['ID']))
unset($bankdetailFieldsToUpdate['ID']);
if (!empty($bankdetailFieldsToUpdate))
{
$errorOccured = false;
$errMsg = '';
try
{
$bdUpdRes = $bankDetail->update($bankDetailId, $bankdetailFieldsToUpdate);
}
catch (Main\SystemException $e)
{
$errorOccured = true;
$errMsg = $e->getMessage();
}
if (!$errorOccured && !$bdUpdRes->isSuccess())
{
$errorOccured = true;
$errMsg = $this->getErrorMessage($bdUpdRes);
}
unset($bdUpdRes);
if ($errorOccured)
{
$result->addError(
new Main\Error(
GetMessage(
'CRM_RQ_IMP_HLPR_ERR_UPDATE_BANK_DETAIL',
array(
'#ENTITY_TYPE_NAME_GENITIVE#' => GetMessage(
'CRM_RQ_IMP_HLPR_ERR_'.$entityTypeName.'_GENITIVE'
),
'#ID#' => $entityId,
).': '.$errMsg
),
self::ERR_UPDATE_BANK_DETAIL
)
);
return $result;
}
unset($errorOccured, $errMsg);
}
}
}
if (!$bdComplianceFound)
{
$bankDetailFieldsToAdd = array(
'ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
'ENTITY_ID' => $requisiteId,
'COUNTRY_ID' => $countryId,
'ACTIVE' => 'Y',
'SORT' => 500
);
foreach (array_keys($bankDetailFieldMap) as $fieldName)
{
if (isset($bankDetailFields[$fieldName]))
$bankDetailFieldsToAdd[$fieldName] = $bankDetailFields[$fieldName];
}
if (isset($bankDetailFieldsToAdd['ID']))
unset($bankDetailFieldsToAdd['ID']);
$errorOccured = false;
$errMsg = '';
try
{
$bdAddRes = $bankDetail->add($bankDetailFieldsToAdd);
}
catch (Main\SystemException $e)
{
$errorOccured = true;
$errMsg = $e->getMessage();
}
unset($bankDetailFieldsToAdd);
if(!$errorOccured && !$bdAddRes->isSuccess())
{
$errorOccured = true;
$errMsg = $this->getErrorMessage($bdAddRes);
}
unset($bdAddRes);
if ($errorOccured)
{
$result->addError(
new Main\Error(
GetMessage(
'CRM_RQ_IMP_HLPR_ERR_CREATE_BANK_DETAIL',
array(
'#ENTITY_TYPE_NAME_GENITIVE#' => GetMessage(
'CRM_RQ_IMP_HLPR_ERR_'.$entityTypeName.'_GENITIVE'
),
'#ID#' => $entityId,
)
).': '.$errMsg,
self::ERR_CREATE_BANK_DETAIL
)
);
return $result;
}
unset($errorOccured, $errMsg);
}
unset($bdRes, $bdRow);
}
}
}
}
if (!$rqComplianceFound)
{
$requisiteFieldsToAdd = array(
'ENTITY_TYPE_ID' => $entityTypeId,
'ENTITY_ID' => $entityId,
'PRESET_ID' => $presetId,
'NAME' => $presetName,
'ACTIVE' => 'Y',
'SORT' => 500
);
foreach (array_keys($requisiteFieldMap) as $fieldName)
{
if (isset($requisiteFields[$fieldName]))
$requisiteFieldsToAdd[$fieldName] = $requisiteFields[$fieldName];
}
if (isset($requisiteFieldsToAdd['ID']))
unset($requisiteFieldsToAdd['ID']);
$errorOccured = false;
$errMsg = '';
try
{
$rqAddRes = $requisite->add($requisiteFieldsToAdd);
}
catch (Main\SystemException $e)
{
$errorOccured = true;
$errMsg = $e->getMessage();
}
if(!$errorOccured && !$rqAddRes->isSuccess())
{
$errorOccured = true;
$errMsg = $this->getErrorMessage($rqAddRes);
}
if ($errorOccured)
{
$result->addError(
new Main\Error(
GetMessage(
'CRM_RQ_IMP_HLPR_ERR_CREATE_REQUISITE',
array(
'#ENTITY_TYPE_NAME_GENITIVE#' => GetMessage(
'CRM_RQ_IMP_HLPR_ERR_'.$entityTypeName.'_GENITIVE'
),
'#ID#' => $entityId,
)
).': '.$errMsg,
self::ERR_CREATE_REQUISITE
)
);
return $result;
}
$requisiteId = $rqAddRes->getId();
unset($rqAddRes, $errorOccured, $errMsg);
if (is_array($requisiteFields['BANK_DETAILS']) && count($requisiteFields['BANK_DETAILS']) > 0)
{
foreach ($requisiteFields['BANK_DETAILS'] as $bankDetailFields)
{
if ($bankDetailFieldMap === null)
{
$bankDetailFieldMap = array(
'ID' => true,
'NAME' => true,
'COUNTRY_ID' => true,
'ACTIVE' => true,
'SORT' => true
);
$bankDetailRqFieldsByCountry = $bankDetail->getRqFieldByCountry();
if (is_array($bankDetailRqFieldsByCountry[$countryId]))
{
foreach ($bankDetailRqFieldsByCountry[$countryId] as $fieldName)
$bankDetailFieldMap[$fieldName] = true;
}
$bankDetailFieldMap['COMMENTS'] = true;
unset($bankDetailRqFieldsByCountry);
}
$bankDetailFieldsToAdd = array(
'ENTITY_TYPE_ID' => \CCrmOwnerType::Requisite,
'ENTITY_ID' => $requisiteId,
'COUNTRY_ID' => $countryId,
'ACTIVE' => 'Y',
'SORT' => 500
);
foreach (array_keys($bankDetailFieldMap) as $fieldName)
{
if (isset($bankDetailFields[$fieldName]))
$bankDetailFieldsToAdd[$fieldName] = $bankDetailFields[$fieldName];
}
if (isset($bankDetailFieldsToAdd['ID']))
unset($bankDetailFieldsToAdd['ID']);
$errorOccured = false;
$errMsg = '';
try
{
$bdAddRes = $bankDetail->add($bankDetailFieldsToAdd);
}
catch (Main\SystemException $e)
{
$errorOccured = true;
$errMsg = $e->getMessage();
}
unset($bankDetailFieldsToAdd);
if(!$errorOccured && !$bdAddRes->isSuccess())
{
$errorOccured = true;
$errMsg = $this->getErrorMessage($bdAddRes);
}
unset($bdAddRes);
if ($errorOccured)
{
$result->addError(
new Main\Error(
GetMessage(
'CRM_RQ_IMP_HLPR_ERR_CREATE_BANK_DETAIL',
array(
'#ENTITY_TYPE_NAME_GENITIVE#' => GetMessage(
'CRM_RQ_IMP_HLPR_ERR_'.$entityTypeName.'_GENITIVE'
),
'#ID#' => $entityId,
)
).': '.$errMsg,
self::ERR_CREATE_BANK_DETAIL
)
);
return $result;
}
unset($errorOccured, $errMsg);
}
}
}
unset($rqRes, $rqRow);
}
return $result;
}