- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/sale_helper.php
- Класс: \CCrmSaleHelper
- Вызов: CCrmSaleHelper::divideInvoiceOrderPersonTypeAgent
static function divideInvoiceOrderPersonTypeAgent(): string
{
if (!\Bitrix\Main\Loader::includeModule('sale'))
{
return '';
}
$dbRes = Invoice\PersonType::getList([
'filter' => [
'@CODE' => ['CRM_CONTACT', 'CRM_COMPANY']
]
]);
if ($dbRes->fetch())
{
return '';
}
global $DB;
$DB->Query("
UPDATE
b_sale_person_type
SET
ENTITY_REGISTRY_TYPE=NULL
WHERE
CODE='CRM_CONTACT'
OR CODE='CRM_COMPANY'
");
$DB->Query("
UPDATE
b_sale_person_type
SET
ENTITY_REGISTRY_TYPE='CRM_INVOICE'
WHERE (
CODE='CRM_CONTACT'
OR CODE='CRM_COMPANY'
)
AND ENTITY_REGISTRY_TYPE IS NULL
");
$dbRes = $DB->Query("SELECT id FROM b_sale_person_type WHERE CODE='CRM_CONTACT' OR CODE='CRM_COMPANY'");
if ($dbRes->Fetch())
{
$dbRes = $DB->Query("SELECT id FROM b_sale_person_type WHERE ENTITY_REGISTRY_TYPE='ORDER'");
if (!$dbRes->Fetch())
{
$DB->Query("
INSERT INTO
b_sale_person_type (LID, NAME, SORT, ACTIVE, CODE, ENTITY_REGISTRY_TYPE)
SELECT
bspt.LID, bspt.NAME, bspt.SORT, bspt.ACTIVE, bspt.CODE, 'ORDER'
FROM
b_sale_person_type bspt
WHERE
bspt.CODE='CRM_CONTACT' OR bspt.CODE='CRM_COMPANY'
");
$DB->Query("
INSERT INTO
b_sale_person_type_site (PERSON_TYPE_ID, SITE_ID)
SELECT
bspt2.ID, bspts.SITE_ID
FROM
b_sale_person_type_site bspts
INNER JOIN b_sale_person_type bspt ON bspt.ID=bspts.PERSON_TYPE_ID
INNER JOIN b_sale_person_type bspt2 ON bspt.CODE=bspt2.CODE AND bspt2.ENTITY_REGISTRY_TYPE='ORDER'
WHERE(
bspt.CODE='CRM_CONTACT'
OR bspt.CODE='CRM_COMPANY'
)
AND bspt.ENTITY_REGISTRY_TYPE='CRM_INVOICE'
");
}
}
$DB->Query("
UPDATE
b_sale_person_type
SET
ENTITY_REGISTRY_TYPE='ORDER'
WHERE
ENTITY_REGISTRY_TYPE IS NULL
");
$DB->Query("
UPDATE
b_sale_order bso
INNER JOIN b_sale_person_type bspt ON bso.PERSON_TYPE_ID=bspt.ID
INNER JOIN b_sale_person_type bspt2 ON bspt.CODE=bspt2.CODE AND bspt2.ENTITY_REGISTRY_TYPE='ORDER'
SET
bso.PERSON_TYPE_ID=bspt2.ID
WHERE(
bspt.CODE='CRM_CONTACT'
OR bspt.CODE='CRM_COMPANY'
)
AND bspt.ENTITY_REGISTRY_TYPE='CRM_INVOICE'
");
$DB->Query("
UPDATE
b_sale_order_props bsop
INNER JOIN b_sale_person_type bspt ON bsop.PERSON_TYPE_ID=bspt.ID
INNER JOIN b_sale_person_type bspt2 ON bspt.CODE=bspt2.CODE AND bspt2.ENTITY_REGISTRY_TYPE='ORDER'
SET
bsop.PERSON_TYPE_ID=bspt2.ID
WHERE(
bspt.CODE='CRM_CONTACT'
OR bspt.CODE='CRM_COMPANY'
)
AND bsop.ENTITY_REGISTRY_TYPE='ORDER'
");
$dbRes = $DB->Query("SELECT * FROM b_sale_bizval_persondomain bsbp LEFT JOIN b_sale_person_type bspt ON bspt.ID=bsbp.PERSON_TYPE_ID WHERE bspt.ENTITY_REGISTRY_TYPE='CRM_INVOICE'");
if (!$dbRes->Fetch())
{
$DB->Query("
INSERT INTO
b_sale_bizval_persondomain (PERSON_TYPE_ID, DOMAIN)
SELECT
bspt2.ID, bspts.DOMAIN
FROM
b_sale_bizval_persondomain bspts
INNER JOIN b_sale_person_type bspt ON bspt.ID=bspts.PERSON_TYPE_ID
INNER JOIN b_sale_person_type bspt2 ON bspt.CODE=bspt2.CODE AND bspt2.ENTITY_REGISTRY_TYPE='ORDER'
WHERE (
bspt.CODE = 'CRM_CONTACT'
OR bspt.CODE = 'CRM_COMPANY'
)
AND bspt.ENTITY_REGISTRY_TYPE='CRM_INVOICE'
");
}
$DB->Query("
UPDATE
b_crm_order_props_form bcopf
INNER JOIN b_sale_person_type bspt ON bcopf.PERSON_TYPE_ID=bspt.ID
INNER JOIN b_sale_person_type bspt2 ON bspt.CODE=bspt2.CODE AND bspt2.ENTITY_REGISTRY_TYPE='ORDER'
SET
bcopf.PERSON_TYPE_ID=bspt2.ID
WHERE(
bspt.CODE='CRM_CONTACT'
OR bspt.CODE='CRM_COMPANY'
)
AND bspt.ENTITY_REGISTRY_TYPE='CRM_INVOICE'
");
$DB->Query("
UPDATE
b_crm_order_props_form_queue bcopfq
INNER JOIN b_sale_person_type bspt ON bcopfq.PERSON_TYPE_ID=bspt.ID
INNER JOIN b_sale_person_type bspt2 ON bspt.CODE=bspt2.CODE AND bspt2.ENTITY_REGISTRY_TYPE='ORDER'
SET
bcopfq.PERSON_TYPE_ID=bspt2.ID
WHERE(
bspt.CODE='CRM_CONTACT'
OR bspt.CODE='CRM_COMPANY'
)
AND bspt.ENTITY_REGISTRY_TYPE='CRM_INVOICE'
");
$dbRes = $DB->Query("SELECT bsopg.ID FROM b_sale_order_props_group bsopg
LEFT JOIN b_sale_person_type bspt ON bsopg.PERSON_TYPE_ID=bspt.ID
WHERE bspt.ENTITY_REGISTRY_TYPE='ORDER'
");
if (!$dbRes->Fetch())
{
$DB->Query("
INSERT INTO b_sale_order_props_group(PERSON_TYPE_ID, SORT, NAME)
SELECT bspt2.ID, bsopg.SORT, bsopg.NAME FROM b_sale_order_props_group bsopg
LEFT JOIN b_sale_person_type bspt ON bspt.ID=bsopg.PERSON_TYPE_ID AND bspt.ENTITY_REGISTRY_TYPE='CRM_INVOICE'
LEFT JOIN b_sale_person_type bspt2 ON bspt2.CODE=bspt.CODE AND bspt2.ENTITY_REGISTRY_TYPE='ORDER'
WHERE bspt.CODE='CRM_CONTACT' OR bspt.CODE='CRM_COMPANY'
");
$DB->Query("
UPDATE b_sale_order_props bsop
INNER JOIN b_sale_order_props_group bsopg ON bsopg.ID=bsop.PROPS_GROUP_ID
INNER JOIN b_sale_order_props_group bsopg2 ON bsopg2.NAME=bsopg.NAME AND bsopg2.PERSON_TYPE_ID=bsop.PERSON_TYPE_ID
SET bsop.PROPS_GROUP_ID=bsopg2.ID
WHERE bsop.ENTITY_REGISTRY_TYPE='ORDER'
");
}
$map = [];
$dbRes = $DB->Query("
SELECT
bspt.ID as INVOICE_PT_ID, bspt2.ID as ORDER_PT_ID
FROM
b_sale_person_type bspt
INNER JOIN b_sale_person_type bspt2 ON bspt.CODE=bspt2.CODE AND bspt2.ENTITY_REGISTRY_TYPE='ORDER'
WHERE
(
bspt.CODE='CRM_CONTACT'
OR bspt.CODE='CRM_COMPANY'
)
AND
bspt.ENTITY_REGISTRY_TYPE='CRM_INVOICE'
");
while ($data = $dbRes->Fetch())
{
$map[$data['INVOICE_PT_ID']] = $data['ORDER_PT_ID'];
}
$classList = [
'\\Bitrix\\Sale\\Services\\PaySystem\\Restrictions\\PersonType',
'\\Bitrix\\Sale\\Delivery\\Restrictions\\PersonType'
];
foreach ($classList as $class)
{
$dbRes = $DB->Query("
SELECT
bssr.ID AS SR_ID, bssr.PARAMS AS SR_PARAMS
FROM
b_sale_service_rstr bssr
INNER JOIN b_sale_pay_system_action bspsa ON bssr.SERVICE_ID=bspsa.ID AND bssr.SERVICE_TYPE=1
WHERE
bssr.CLASS_NAME='".$DB->ForSql($class)."'
AND bspsa.ENTITY_REGISTRY_TYPE='ORDER'"
);
while ($data = $dbRes->Fetch())
{
$params = unserialize($data['SR_PARAMS'], ['allowed_classes' => false]);
foreach ($params['PERSON_TYPE_ID'] as $key => $id)
{
if (isset($map[$id]))
{
$params['PERSON_TYPE_ID'][$key] = $map[$id];
}
}
$DB->Query("UPDATE b_sale_service_rstr SET PARAMS='".serialize($params)."' WHERE ID=".$data['SR_ID']);
}
}
return '';
}