- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/restservice_invoice.php
- Класс: \CCrmInvoiceRestService
- Вызов: CCrmInvoiceRestService::add
static function add($params)
{
/** @global CMain $APPLICATION*/
global $APPLICATION, $DB;
$invoice = new CCrmInvoice();
if(!CCrmInvoice::CheckCreatePermission())
throw new RestException('Access denied.');
$fields = CCrmInvoiceRestUtil::getParamArray($params, 'fields');
$fields = self::filterFields($fields, 'add');
self::internalizeUserFields($fields, array());
if (!is_array($fields) || count($fields) === 0)
throw new RestException('Invalid parameters.');
// sanitize
$comments = isset($fields['COMMENTS']) ? trim($fields['COMMENTS']) : '';
$userDescription = isset($fields['USER_DESCRIPTION']) ? trim($fields['USER_DESCRIPTION']) : '';
$bSanitizeComments = ($comments !== '' && mb_strpos($comments, '<') !== false);
$bSanitizeUserDescription = ($userDescription !== '' && mb_strpos($userDescription, '<') !== false);
if ($bSanitizeComments || $bSanitizeUserDescription)
{
$sanitizer = new CBXSanitizer();
$sanitizer->ApplyDoubleEncode(false);
$sanitizer->SetLevel(CBXSanitizer::SECURE_LEVEL_MIDDLE);
//Crutch for for Chrome line break behaviour in HTML editor.
$sanitizer->AddTags(array('div' => array()));
if ($bSanitizeComments)
$fields['COMMENTS'] = $sanitizer->SanitizeHtml($fields['COMMENTS']);
if ($bSanitizeUserDescription)
$fields['USER_DESCRIPTION'] = $sanitizer->SanitizeHtml($fields['USER_DESCRIPTION']);
unset($sanitizer);
}
unset($bSanitizeComments, $bSanitizeUserDescription);
$fields['COMMENTS'] = $comments;
$fields['USER_DESCRIPTION'] = $userDescription;
unset($comments, $userDescription);
$bStatusSuccess = CCrmStatusInvoice::isStatusSuccess($fields['STATUS_ID']);
if ($bStatusSuccess)
$bStatusFailed = false;
else
$bStatusFailed = CCrmStatusInvoice::isStatusFailed($fields['STATUS_ID']);
$options = array();
if(!self::isRequiredUserFieldCheckEnabled())
{
$options['DISABLE_REQUIRED_USER_FIELD_CHECK'] = true;
}
if (!$invoice->CheckFields($fields, false, $bStatusSuccess, $bStatusFailed, $options))
{
if (!empty($invoice->LAST_ERROR))
throw new RestException($invoice->LAST_ERROR);
else
throw new RestException('Error on check fields.');
}
// person type
$arPersonTypes = CCrmPaySystem::getPersonTypeIDs();
if (!isset($arPersonTypes['COMPANY']) || !isset($arPersonTypes['CONTACT']))
throw new RestException('Incorrect values in the peson type settings.');
$personTypeId = isset($fields['PERSON_TYPE_ID']) ? (int)$fields['PERSON_TYPE_ID'] : 0;
if (isset($fields['UF_COMPANY_ID']) && intval($fields['UF_COMPANY_ID']) > 0)
$personTypeId = (int)$arPersonTypes['COMPANY'];
else if (isset($fields['UF_CONTACT_ID']) && intval($fields['UF_CONTACT_ID']) > 0)
$personTypeId = (int)$arPersonTypes['CONTACT'];
if ($personTypeId !== intval($arPersonTypes['COMPANY']) && $personTypeId !== intval($arPersonTypes['CONTACT']))
{
throw new RestException('Incorrect value of PERSON_TYPE_ID field ('.
$arPersonTypes['CONTACT'].' - Contact, '.$arPersonTypes['CONTACT'].' - Company)');
}
$fields['PERSON_TYPE_ID'] = $personTypeId;
if (!is_array($fields['INVOICE_PROPERTIES']))
{
$fields['INVOICE_PROPERTIES'] = array();
}
if (isset($fields['PR_LOCATION']))
{
$fields['INVOICE_PROPERTIES']['LOCATION'] = $fields['PR_LOCATION'];
}
$propsInfo = CCrmInvoice::GetPropertiesInfo($fields['PERSON_TYPE_ID']);
$propsInfo = is_array($propsInfo[$fields['PERSON_TYPE_ID']]) ? $propsInfo[$fields['PERSON_TYPE_ID']] : array();
$invoiceProperties = array();
foreach ($fields['INVOICE_PROPERTIES'] as $code => $value)
{
if (array_key_exists($code, $propsInfo))
{
$invoiceProperties[$propsInfo[$code]['ID']] = $value;
}
else if ($code === 'COMPANY' && array_key_exists('COMPANY_NAME', $propsInfo)) // ua company name hack
{
$invoiceProperties[$propsInfo['COMPANY_NAME']['ID']] = $value;
}
}
$fields['INVOICE_PROPERTIES'] = $invoiceProperties;
unset($propsInfo, $invoiceProperties, $code, $value);
$defRqLinkParams = Requisite\EntityLink::determineRequisiteLinkBeforeSave(
CCrmOwnerType::Invoice, 0, Requisite\EntityLink::ENTITY_OPERATION_ADD, $fields
);
//region Autocomplete property values
$companyId = 0;
$contactId = 0;
$requisiteIdLinked = 0;
if (isset($defRqLinkParams['CLIENT_ENTITY_TYPE_ID']) && isset($defRqLinkParams['CLIENT_ENTITY_ID'])
&& $defRqLinkParams['CLIENT_ENTITY_ID'] > 0)
{
if ($defRqLinkParams['CLIENT_ENTITY_TYPE_ID'] === CCrmOwnerType::Company)
{
$companyId = (int)$defRqLinkParams['CLIENT_ENTITY_ID'];
}
else if ($defRqLinkParams['CLIENT_ENTITY_TYPE_ID'] === CCrmOwnerType::Contact)
{
$contactId = (int)$defRqLinkParams['CLIENT_ENTITY_ID'];
}
}
if ($contactId <= 0 && isset($fields['UF_CONTACT_ID']) && $fields['UF_CONTACT_ID'] > 0)
{
$contactId = (int)$fields['UF_CONTACT_ID'];
}
if (isset($defRqLinkParams['REQUISITE_ID']) && $defRqLinkParams['REQUISITE_ID'] > 0)
{
$requisiteIdLinked = $defRqLinkParams['REQUISITE_ID'];
}
$props = $invoice->GetProperties(0, $personTypeId);
CCrmInvoice::__RewritePayerInfo($companyId, $contactId, $props);
CCrmInvoice::rewritePropsFromRequisite($personTypeId, $requisiteIdLinked, $props);
$formProps = array();
$propsValues = $invoice->ParsePropertiesValuesFromPost($personTypeId, $formProps, $props);
if (isset($propsValues['PROPS_VALUES']) && is_array($propsValues['PROPS_VALUES']))
{
foreach($propsValues['PROPS_VALUES'] as $propertyId => $propertyValue)
{
if (!isset($fields['INVOICE_PROPERTIES'][$propertyId])
|| $fields['INVOICE_PROPERTIES'][$propertyId] === '')
{
$fields['INVOICE_PROPERTIES'][$propertyId] = $propertyValue;
}
}
unset($propertyId, $propertyValue);
}
unset($companyId, $contactId, $requisiteIdLinked, $props, $propsValues, $formProps);
//endregion Autocomplete property values
$DB->StartTransaction();
$recalculate = false;
$ID = $invoice->Add($fields, $recalculate, SITE_ID, array('UPDATE_SEARCH' => true));
if(!is_int($ID) || $ID <= 0)
{
$DB->Rollback();
$errMsg = '';
if (!empty($invoice->LAST_ERROR))
{
$errMsg = $invoice->LAST_ERROR;
}
else
{
$ex = $APPLICATION->GetException();
if ($ex)
{
$APPLICATION->ResetException();
if ($errMsg == '')
$errMsg = $ex->GetString();
}
}
throw new RestException((!empty($errMsg) ? $errMsg : 'Unknown error during invoice creation.')."
\n");
}
else
{
Requisite\EntityLink::register(
CCrmOwnerType::Invoice, $ID,
$defRqLinkParams['REQUISITE_ID'],
$defRqLinkParams['BANK_DETAIL_ID'],
$defRqLinkParams['MC_REQUISITE_ID'],
$defRqLinkParams['MC_BANK_DETAIL_ID']
);
$DB->Commit();
}
return $ID;
}