public function executePhase()
{
if (parent::executePhase())
{
return true;
}
if($this->currentPhase === QuoteConversionPhase::DEAL_CREATION
|| $this->currentPhase === QuoteConversionPhase::INVOICE_CREATION)
{
Main\Localization\Loc::loadMessages(__FILE__);
if($this->currentPhase === QuoteConversionPhase::DEAL_CREATION)
{
$entityTypeID = \CCrmOwnerType::Deal;
}
else//if($this->currentPhase === QuoteConversionPhase::INVOICE_CREATION)
{
$entityTypeID = \CCrmOwnerType::Invoice;
}
$entityTypeName = \CCrmOwnerType::ResolveName($entityTypeID);
$config = $this->config->getItem($entityTypeID);
if(!$config || !$config->isActive())
{
return false;
}
/** @var \CCrmPerms $permissions */
$permissions = $this->getUserPermissions();
$entityID = isset($this->contextData[$entityTypeName]) ? $this->contextData[$entityTypeName] : 0;
if($entityID > 0)
{
if($entityTypeID === \CCrmOwnerType::Deal)
{
if(!\CCrmDeal::Exists($entityID))
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
\CCrmOwnerType::Deal,
EntityConversionException::TARG_DST,
EntityConversionException::NOT_FOUND
);
}
$entity = new \CCrmDeal(false);
$fields = array('QUOTE_ID' => $this->entityID);
$entity->Update(
$entityID,
$fields,
false,
false,
$this->getUpdateOptions()
);
$this->resultData[$entityTypeName] = $entityID;
}
else//if($entityTypeID === \CCrmOwnerType::Invoice)
{
if(!\CCrmInvoice::Exists($entityID))
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
\CCrmOwnerType::Invoice,
EntityConversionException::TARG_DST,
EntityConversionException::NOT_FOUND
);
}
$entity = new \CCrmInvoice(false);
$fields = array('UF_QUOTE_ID' => $this->entityID);
try
{
$entity->Update($entityID, $fields, $this->getUpdateOptions());
}
catch(Main\DB\SqlQueryException $e)
{
}
$this->resultData[$entityTypeName] = $entityID;
}
return true;
}
if(!\CCrmAuthorizationHelper::CheckCreatePermission($entityTypeName , $permissions))
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
$entityTypeID,
EntityConversionException::TARG_DST,
EntityConversionException::CREATE_DENIED
);
}
if(UserFieldSynchronizer::needForSynchronization(\CCrmOwnerType::Quote, $entityTypeID))
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
$entityTypeID,
EntityConversionException::TARG_DST,
EntityConversionException::NOT_SYNCHRONIZED
);
}
if(!ConversionSettings::getCurrent()->isAutocreationEnabled())
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
$entityTypeID,
EntityConversionException::TARG_DST,
EntityConversionException::AUTOCREATION_DISABLED
);
}
if($entityTypeID === \CCrmOwnerType::Deal
&& $this->isBizProcCheckEnabled()
&& \CCrmBizProcHelper::HasParameterizedAutoWorkflows($entityTypeID, \CCrmBizProcEventType::Create))
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
$entityTypeID,
EntityConversionException::TARG_DST,
EntityConversionException::HAS_WORKFLOWS
);
}
/** @var QuoteConversionMapper $mapper */
$mapper = $this->getMapper();
//We can't create deal from quote that created from deal
if($entityTypeID === \CCrmOwnerType::Deal
&& $mapper->getSourceFieldValue('DEAL_ID', 0) > 0)
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
$entityTypeID,
EntityConversionException::TARG_SRC,
EntityConversionException::INVALID_OPERATION,
GetMessage('CRM_QUOTE_CONVERTER_DEAL_PROHIBITED_MSGVER_1')
);
}
$map = self::prepareMap($entityTypeID);
$fields = $mapper->map($map, array('INIT_DATA' => $config->getInitData()));
if(empty($fields))
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
$entityTypeID,
EntityConversionException::TARG_DST,
EntityConversionException::EMPTY_FIELDS
);
}
if($entityTypeID === \CCrmOwnerType::Deal)
{
$entity = new \CCrmDeal(false);
if(!$entity->CheckFields($fields, false, $this->getAddOptions()))
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
\CCrmOwnerType::Deal,
EntityConversionException::TARG_DST,
EntityConversionException::INVALID_FIELDS,
$entity->LAST_ERROR
);
}
$entityID = $entity->Add($fields, true, $this->getAddOptions());
if($entityID <= 0)
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
\CCrmOwnerType::Deal,
EntityConversionException::TARG_DST,
EntityConversionException::CREATE_FAILED,
$entity->LAST_ERROR
);
}
if(isset($fields['PRODUCT_ROWS'])
&& is_array($fields['PRODUCT_ROWS'])
&& !empty($fields['PRODUCT_ROWS']))
{
\CCrmDeal::SaveProductRows($entityID, $fields['PRODUCT_ROWS'], false, false, false);
}
// requisite link
$requisiteEntityList = array();
$mcRequisiteEntityList = array();
$requisite = new EntityRequisite();
if (isset($fields['QUOTE_ID']) && $fields['QUOTE_ID'] > 0)
{
$mcRequisiteEntityList[] = $requisiteEntityList[] =
array('ENTITY_TYPE_ID' => \CCrmOwnerType::Quote, 'ENTITY_ID' => $fields['QUOTE_ID']);
}
if (isset($fields['COMPANY_ID']) && $fields['COMPANY_ID'] > 0)
{
$requisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Company, 'ENTITY_ID' => $fields['COMPANY_ID']);
}
if (isset($fields['CONTACT_BINDINGS']) && is_array($fields['CONTACT_BINDINGS']))
{
$primaryContactID = EntityBinding::getPrimaryEntityID(
\CCrmOwnerType::Contact,
$fields['CONTACT_BINDINGS']
);
if($primaryContactID > 0)
{
$requisiteEntityList[] = array(
'ENTITY_TYPE_ID' => \CCrmOwnerType::Contact,
'ENTITY_ID' => $primaryContactID
);
}
}
if (isset($fields['MYCOMPANY_ID']) && $fields['MYCOMPANY_ID'] > 0)
$mcRequisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Company, 'ENTITY_ID' => $fields['MYCOMPANY_ID']);
$requisiteIdLinked = 0;
$bankDetailIdLinked = 0;
$mcRequisiteIdLinked = 0;
$mcBankDetailIdLinked = 0;
$requisiteInfoLinked = $requisite->getDefaultRequisiteInfoLinked($requisiteEntityList);
if (is_array($requisiteInfoLinked))
{
if (isset($requisiteInfoLinked['REQUISITE_ID']))
$requisiteIdLinked = (int)$requisiteInfoLinked['REQUISITE_ID'];
if (isset($requisiteInfoLinked['BANK_DETAIL_ID']))
$bankDetailIdLinked = (int)$requisiteInfoLinked['BANK_DETAIL_ID'];
}
$mcRequisiteInfoLinked = $requisite->getDefaultMyCompanyRequisiteInfoLinked($mcRequisiteEntityList);
if (is_array($mcRequisiteInfoLinked))
{
if (isset($mcRequisiteInfoLinked['MC_REQUISITE_ID']))
$mcRequisiteIdLinked = (int)$mcRequisiteInfoLinked['MC_REQUISITE_ID'];
if (isset($mcRequisiteInfoLinked['MC_BANK_DETAIL_ID']))
$mcBankDetailIdLinked = (int)$mcRequisiteInfoLinked['MC_BANK_DETAIL_ID'];
}
unset($requisite, $requisiteEntityList, $mcRequisiteEntityList, $requisiteInfoLinked, $mcRequisiteInfoLinked);
if ($requisiteIdLinked > 0 || $mcRequisiteIdLinked > 0)
{
EntityLink::register(
\CCrmOwnerType::Deal, $entityID,
$requisiteIdLinked, $bankDetailIdLinked,
$mcRequisiteIdLinked, $mcBankDetailIdLinked
);
}
unset($requisiteIdLinked, $bankDetailIdLinked, $mcRequisiteIdLinked, $mcBankDetailIdLinked);
//region BizProcess
$arErrors = array();
\CCrmBizProcHelper::AutoStartWorkflows(
\CCrmOwnerType::Deal,
$entityID,
\CCrmBizProcEventType::Create,
$arErrors
);
$starter = new Crm\Automation\Starter(\CCrmOwnerType::Deal, $entityID);
$starter->runOnAdd();
//endregion
$this->resultData[\CCrmOwnerType::DealName] = $entityID;
}
else//if($entityTypeID === \CCrmOwnerType::Invoice)
{
// requisite link 1 of 2
$requisiteEntityList = array();
$mcRequisiteEntityList = array();
$requisite = new EntityRequisite();
if (isset($fields['UF_QUOTE_ID']) && $fields['UF_QUOTE_ID'] > 0)
{
$mcRequisiteEntityList[] = $requisiteEntityList[] =
array('ENTITY_TYPE_ID' => \CCrmOwnerType::Quote, 'ENTITY_ID' => $fields['UF_QUOTE_ID']);
}
if (isset($fields['UF_DEAL_ID']) && $fields['UF_DEAL_ID'] > 0)
{
$mcRequisiteEntityList[] = $requisiteEntityList[] =
array('ENTITY_TYPE_ID' => \CCrmOwnerType::Deal, 'ENTITY_ID' => $fields['UF_DEAL_ID']);
}
if (isset($fields['UF_COMPANY_ID']) && $fields['UF_COMPANY_ID'] > 0)
$requisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Company, 'ENTITY_ID' => $fields['UF_COMPANY_ID']);
if (isset($fields['UF_CONTACT_ID']) && $fields['UF_CONTACT_ID'] > 0)
$requisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Contact, 'ENTITY_ID' => $fields['UF_CONTACT_ID']);
if (isset($fields['UF_MYCOMPANY_ID']) && $fields['UF_MYCOMPANY_ID'] > 0)
$mcRequisiteEntityList[] = array('ENTITY_TYPE_ID' => \CCrmOwnerType::Company, 'ENTITY_ID' => $fields['UF_MYCOMPANY_ID']);
$requisiteIdLinked = 0;
$bankDetailIdLinked = 0;
$mcRequisiteIdLinked = 0;
$mcBankDetailIdLinked = 0;
$requisiteInfoLinked = $requisite->getDefaultRequisiteInfoLinked($requisiteEntityList);
if (is_array($requisiteInfoLinked))
{
if (isset($requisiteInfoLinked['REQUISITE_ID']))
$requisiteIdLinked = (int)$requisiteInfoLinked['REQUISITE_ID'];
if (isset($requisiteInfoLinked['BANK_DETAIL_ID']))
$bankDetailIdLinked = (int)$requisiteInfoLinked['BANK_DETAIL_ID'];
}
$mcRequisiteInfoLinked = $requisite->getDefaultMyCompanyRequisiteInfoLinked($mcRequisiteEntityList);
if (is_array($mcRequisiteInfoLinked))
{
if (isset($mcRequisiteInfoLinked['MC_REQUISITE_ID']))
$mcRequisiteIdLinked = (int)$mcRequisiteInfoLinked['MC_REQUISITE_ID'];
if (isset($mcRequisiteInfoLinked['MC_BANK_DETAIL_ID']))
$mcBankDetailIdLinked = (int)$mcRequisiteInfoLinked['MC_BANK_DETAIL_ID'];
}
unset($requisite, $requisiteEntityList, $mcRequisiteEntityList, $requisiteInfoLinked, $mcRequisiteInfoLinked);
if (!isset($fields['UF_MYCOMPANY_ID']) || $fields['UF_MYCOMPANY_ID'] <= 0)
{
$defLink = EntityLink::getDefaultMyCompanyRequisiteLink();
if (is_array($defLink))
{
$fields['UF_MYCOMPANY_ID'] = isset($defLink['MYCOMPANY_ID']) ? (int)$defLink['MYCOMPANY_ID'] : 0;
$mcRequisiteIdLinked = isset($defLink['MC_REQUISITE_ID']) ? (int)$defLink['MC_REQUISITE_ID'] : 0;
$mcBankDetailIdLinked = isset($defLink['MC_BANK_DETAIL_ID']) ? (int)$defLink['MC_BANK_DETAIL_ID'] : 0;
}
unset($defLink);
}
$entity = new \CCrmInvoice(false);
$isSuccessful = \CCrmStatusInvoice::isStatusSuccess($fields['STATUS_ID']);
$isFailed = !$isSuccessful && \CCrmStatusInvoice::isStatusFailed($fields['STATUS_ID']);
if(!$entity->CheckFields($fields, false, $isSuccessful, $isFailed, $this->getAddOptions()))
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
\CCrmOwnerType::Invoice,
EntityConversionException::TARG_DST,
EntityConversionException::INVALID_FIELDS,
$entity->LAST_ERROR
);
}
$recalculated = false;
$entityID = $entity->Add($fields, $recalculated, SITE_ID, $this->getAddOptions());
if($entityID <= 0)
{
throw new EntityConversionException(
\CCrmOwnerType::Quote,
\CCrmOwnerType::Invoice,
EntityConversionException::TARG_DST,
EntityConversionException::CREATE_FAILED,
$entity->LAST_ERROR
);
}
// requisite link 2 of 2
if ($requisiteIdLinked > 0 || $mcRequisiteIdLinked > 0)
{
EntityLink::register(
\CCrmOwnerType::Invoice, $entityID,
$requisiteIdLinked, $bankDetailIdLinked,
$mcRequisiteIdLinked, $mcBankDetailIdLinked
);
}
unset($requisiteIdLinked, $bankDetailIdLinked, $mcRequisiteIdLinked, $mcBankDetailIdLinked);
$this->resultData[\CCrmOwnerType::InvoiceName] = $entityID;
}
return true;
}
elseif($this->currentPhase === QuoteConversionPhase::FINALIZATION)
{
$this->onFinalizationPhase();
//Do not update DEAL_ID field here. This field is used, then quote is created from deal.
return true;
}
return false;
}