- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/conversion/quoteconversionmapper.php
- Класс: Bitrix\Crm\Conversion\QuoteConversionMapper
- Вызов: QuoteConversionMapper::map
public function map(EntityConversionMap $map, array $options = null)
{
$srcFields = $this->getSourceFields();
if(empty($srcFields))
{
return array();
}
if(!is_array($options))
{
$options = array();
}
$dstFields = array();
$dstEntityTypeID = $map->getDestinationEntityTypeID();
foreach($map->getItems() as $item)
{
$dstFieldID = $item->getDestinationField();
//Skip empty binding
if($dstFieldID === '-')
{
continue;
}
$srcFieldID = $item->getSourceField();
if((!isset($srcFields[$srcFieldID]) || $srcFields[$srcFieldID] === '')
&& $srcFieldID !== 'PRODUCT_ROWS')
{
$altSrcFieldID = '';
foreach($item->getAlternativeSourceFields() as $fieldID)
{
if(isset($srcFields[$fieldID]))
{
$altSrcFieldID = $fieldID;
break;
}
}
if($altSrcFieldID !== '')
{
$srcFieldID = $altSrcFieldID;
}
}
if($dstFieldID === '')
{
$dstFieldID = $srcFieldID;
}
if(mb_strpos($srcFieldID, 'UF_') === 0 && mb_strpos($dstFieldID, 'UF_') === 0)
{
self::mapUserField(\CCrmOwnerType::Quote, $srcFieldID, $srcFields, $dstEntityTypeID, $dstFieldID, $dstFields, $options);
}
elseif($srcFieldID === 'PRODUCT_ROWS')
{
$productRows = \CCrmQuote::LoadProductRows($this->srcEntityID);
if(count($productRows) > 0)
{
if($dstEntityTypeID === \CCrmOwnerType::Invoice)
{
$entityProductRows = array();
$entityDbResult = \CCrmInvoice::GetList(
array(),
array('=UF_QUOTE_ID' => $this->srcEntityID, 'CHECK_PERMISSIONS' => 'N'),
false,
false,
array('ID')
);
while($entityFields = $entityDbResult->Fetch())
{
$entityProductRows[] = \CCrmInvoice::GetProductRows((int)$entityFields['ID']);
}
$productRows = \CCrmProductRow::GetDiff(array($productRows), $entityProductRows);
$currencyID = isset($srcFields['CURRENCY_ID']) ? $srcFields['CURRENCY_ID'] : '';
if($currencyID === '' || !\CCrmCurrency::IsExists($currencyID))
{
$currencyID = \CCrmCurrency::GetBaseCurrencyID();
}
$actualRows = \CCrmInvoice::ProductRows2BasketItems($productRows, $currencyID, \CCrmInvoice::GetCurrencyID());
if (count($actualRows) > 0)
{
foreach($actualRows as &$productRow)
{
$productRow['ID'] = 0;
}
unset($productRow);
$dstFields[$dstFieldID] = $actualRows;
}
}
elseif($dstEntityTypeID === \CCrmOwnerType::Deal)
{
$entityProductRows = array();
$entityDbResult = \CCrmDeal::GetListEx(
array(),
array('=QUOTE_ID' => $this->srcEntityID, 'CHECK_PERMISSIONS' => 'N'),
false,
false,
array('ID')
);
while($entityFields = $entityDbResult->Fetch())
{
$entityProductRows[] = \CCrmDeal::LoadProductRows((int)$entityFields['ID']);
}
$dstFields[$dstFieldID] = \CCrmProductRow::GetDiff(array($productRows), $entityProductRows);
}
}
}
elseif($srcFieldID === 'CONTACT_PRIMARY_BINDING')
{
$binding = EntityBinding::findPrimaryBinding(QuoteContactTable::getQuoteBindings($this->srcEntityID));
if(is_array($binding))
{
$dstFields[$dstFieldID] = EntityBinding::prepareEntityID(\CCrmOwnerType::Contact, $binding);
}
}
elseif($srcFieldID === 'CONTACT_BINDINGS')
{
$dstFields[$dstFieldID] = QuoteContactTable::getQuoteBindings($this->srcEntityID);
}
elseif(isset($srcFields[$srcFieldID]))
{
$dstFields[$dstFieldID] = $srcFields[$srcFieldID];
}
}
if(!empty($dstFields))
{
if($dstEntityTypeID === \CCrmOwnerType::Invoice)
{
//region Status
if(!isset($dstFields['STATUS_ID']))
{
$dstFields['STATUS_ID'] = \CCrmInvoice::GetDefaultStatusId();
}
//endregion
//region Person Type
$personTypes = \CCrmPaySystem::getPersonTypeIDs();
$dstFields['PERSON_TYPE_ID'] = 0;
if (isset($personTypes['CONTACT']) && (!isset($dstFields['UF_COMPANY_ID']) || $dstFields['UF_COMPANY_ID'] <= 0))
{
$dstFields['PERSON_TYPE_ID'] = (int)$personTypes['CONTACT'];
}
elseif (isset($personTypes['COMPANY']) && isset($dstFields['UF_COMPANY_ID']) && (int)$dstFields['UF_COMPANY_ID'] > 0)
{
$dstFields['PERSON_TYPE_ID'] = (int)$personTypes['COMPANY'];
}
//endregion
//region Pay System
if($dstFields['PERSON_TYPE_ID'] > 0)
{
$paySystemList = \CCrmPaySystem::GetPaySystemsListItems($dstFields['PERSON_TYPE_ID']);
if(is_array($paySystemList) && !empty($paySystemList))
{
reset($paySystemList);
$dstFields['PAY_SYSTEM_ID'] = key($paySystemList);
}
}
//endregion Pay System
//region Prepare Invoice Properties
$dstFields['INVOICE_PROPERTIES'] = array();
$invoiceEntity = new \CCrmInvoice(false);
$companyID = isset($dstFields['UF_COMPANY_ID']) ? (int)$dstFields['UF_COMPANY_ID'] : 0;
$contactID = isset($dstFields['UF_CONTACT_ID']) ? (int)$dstFields['UF_CONTACT_ID'] : 0;
$personTypeID = 0;
$personTypes = \CCrmPaySystem::getPersonTypeIDs();
if ($companyID > 0 && isset($personTypes['COMPANY']))
{
$personTypeID = $personTypes['COMPANY'];
}
elseif(isset($personTypes['CONTACT']))
{
$personTypeID = $personTypes['CONTACT'];
}
// requisite link
$requisiteEntityList = array();
$requisite = new EntityRequisite();
if ($this->srcEntityID > 0)
$requisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Quote, 'ENTITY_ID' => $this->srcEntityID);
if (isset($dstFields['UF_DEAL_ID']) && $dstFields['UF_DEAL_ID'] > 0)
$requisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Deal, 'ENTITY_ID' => $dstFields['UF_DEAL_ID']);
if (isset($dstFields['UF_COMPANY_ID']) && $dstFields['UF_COMPANY_ID'] > 0)
$requisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Company, 'ENTITY_ID' => $dstFields['UF_COMPANY_ID']);
if (isset($dstFields['UF_CONTACT_ID']) && $dstFields['UF_CONTACT_ID'] > 0)
$requisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Contact, 'ENTITY_ID' => $dstFields['UF_CONTACT_ID']);
$requisiteIdLinked = 0;
$requisiteInfoLinked = $requisite->getDefaultRequisiteInfoLinked($requisiteEntityList);
if (is_array($requisiteInfoLinked))
{
if (isset($requisiteInfoLinked['REQUISITE_ID']))
$requisiteIdLinked = (int)$requisiteInfoLinked['REQUISITE_ID'];
}
unset($requisiteEntityList, $requisite, $requisiteInfoLinked);
$properties = $invoiceEntity->GetProperties(0, $personTypeID);
$bTaxMode = \CCrmTax::isTaxMode();
$locationPropertyId = 0;
if ($bTaxMode && isset($srcFields['LOCATION_ID']))
{
$locationValue = \CSaleLocation::getLocationIDbyCODE($srcFields['LOCATION_ID']);
$dstFields['PR_LOCATION'] = $locationValue;
}
if ($bTaxMode && isset($properties['PR_LOCATION']['FIELDS']['ID']))
{
$locationPropertyId = (int)$properties['PR_LOCATION']['FIELDS']['ID'];
}
if(is_array($properties))
{
\CCrmInvoice::__RewritePayerInfo($companyID, $contactID, $properties);
if ($dstFields['PERSON_TYPE_ID'] > 0 && $requisiteIdLinked > 0)
\CCrmInvoice::rewritePropsFromRequisite(
$dstFields['PERSON_TYPE_ID'],
$requisiteIdLinked,
$properties
);
foreach($properties as $property)
{
if ($bTaxMode && $locationPropertyId === (int)$property['FIELDS']['ID']
&& isset($srcFields['LOCATION_ID']))
{
$dstFields['INVOICE_PROPERTIES'][$property['FIELDS']['ID']] = $locationValue;
}
else
{
$dstFields['INVOICE_PROPERTIES'][$property['FIELDS']['ID']] = $property['VALUE'];
}
}
}
unset($locationValue);
//endregion
$dstFields['UF_QUOTE_ID'] = $this->srcEntityID;
}
elseif($dstEntityTypeID === \CCrmOwnerType::Deal)
{
$dstFields['QUOTE_ID'] = $this->srcEntityID;
if(isset($dstFields['PRODUCT_ROWS'])
&& is_array($dstFields['PRODUCT_ROWS'])
&& !empty($dstFields['PRODUCT_ROWS']))
{
$totalInfo = \CCrmProductRow::CalculateTotalInfo('D', 0, false, $dstFields, $dstFields['PRODUCT_ROWS']);
$dstFields['OPPORTUNITY'] = isset($totalInfo['OPPORTUNITY']) ? $totalInfo['OPPORTUNITY'] : 1.0;
$dstFields['TAX_VALUE'] = isset($totalInfo['TAX_VALUE']) ? $totalInfo['TAX_VALUE'] : 0.0;
}
if(isset($options['INIT_DATA']) && is_array($options['INIT_DATA']))
{
$initData = $options['INIT_DATA'];
if(isset($initData['categoryId']) && $initData['categoryId'] > 0)
{
$dstFields['CATEGORY_ID'] = (int)$initData['categoryId'];
}
}
}
if(!(isset($options['DISABLE_USER_FIELD_INIT']) && $options['DISABLE_USER_FIELD_INIT'] === true))
{
self::initializeUserFields($dstEntityTypeID, $dstFields);
}
}
return $dstFields;
}