external:pro_bonus:98_dop:25_rk_crm

Импорт из RK CRM

Для создания файла со списком счетов при импорте из r_keeper CRM 7 можно воспользоваться SQL-скриптом.
Важно: скрипт не обрабатывает ситуацию, когда у одного счёта в CRM сразу несколько карт. Такие карты не будут обработаны.

/*
Выгрузка из CRM для PROBONUS. (в пробонусе надо убрать требование заполнения полей анкеты)
 @allow_blocked_cards - выгружать ли заблокированные карты
 @allow_persons_wo_cards - выгружать ли владельцев без карт после фильтрации @allow_blocked_cards
PEOPLE_ID - id владельца в CRM
NAME,FULL_NAME - полное имя из карточки владельца
CARD, CARD2, CARD3 карты владельца
RESTSUM сумма всех активных бонусных счетов
из бонусных счетов для выгрузки выбирается последний по алфавиту:
BONUSNAME - имя счета 
BONUSNO - код бонуса для RK
для скидок аналогично
личные данные держателя карты не учитываются, только данные владельца
*/
declare @allow_blocked_cards int = 0;
declare @allow_persons_wo_cards int = 0;

WITH ACCOUNTS_table AS (
select RTRIM(LTRIM(cp.FULL_NAME)) AS FULL_NAME, cp.PEOPLE_ID, cat.ACCOUNT_TYPE_ID, cat.ACCOUNT_CLASS, cat.NAME AS BONUS_NAME, cpa.BALANCE 
from CARD_PEOPLES cp
  left join CARD_PEOPLE_ACCOUNTS cpa ON cpa.PEOPLE_ID=cp.PEOPLE_ID and cpa.DELETED=0 and cpa.BLOCKED=0
  left join CARD_ACCOUNT_TYPES cat ON cpa.ACCOUNT_TYPE_ID=cat.ACCOUNT_TYPE_ID and cat.DELETED=0 and cat.IS_ACTIVE=1
  --left join CARD_CARDS cc ON cc.PEOPLE_ID=cp.PEOPLE_ID and cc.DELETED=0 and cc.STATUS=1 -- csActive = 1; csInactive = 2; csDisabled = 3; csBlocked = 4; csIssue = 5; // физическая выдача владельцу 
where cp.deleted=0 and cpa.DELETED=0 and cat.IS_ACTIVE=1 --and cc.STATUS=1
),
ACCOUNTS_PEOPLES AS (
select distinct(PEOPLE_ID), FULL_NAME from  ACCOUNTS_table
),
RESULT_TABLE AS (
SELECT 
 ap.PEOPLE_ID AS PEOPLE_ID
 ,ap.FULL_NAME AS NAME
 ,(SELECT TOP (1) cc.CARD_CODE FROM CARD_CARDS cc WHERE cc.PEOPLE_ID=ap.PEOPLE_ID and cc.DELETED=0 and (cc.STATUS=1 OR (@allow_blocked_cards=1))) AS CARD
 ,(SELECT cc.CARD_CODE FROM CARD_CARDS cc WHERE cc.PEOPLE_ID=ap.PEOPLE_ID and cc.DELETED=0 and (cc.STATUS=1 OR (@allow_blocked_cards=1)) ORDER BY CARD_CODE OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY) AS CARD2
 ,(SELECT cc.CARD_CODE FROM CARD_CARDS cc WHERE cc.PEOPLE_ID=ap.PEOPLE_ID and cc.DELETED=0 and (cc.STATUS=1 OR (@allow_blocked_cards=1)) ORDER BY CARD_CODE OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY) AS CARD3
 --,(SELECT cc.CARD_CODE FROM CARD_CARDS cc WHERE cc.PEOPLE_ID=ap.PEOPLE_ID and cc.DELETED=0 and cc.STATUS=1 ORDER BY CARD_CODE OFFSET 3 ROWS FETCH NEXT 1 ROWS ONLY) AS CARD4
 ,(SELECT SUM(BALANCE) from ACCOUNTS_table at1 WHERE at1.PEOPLE_ID=ap.PEOPLE_ID and at1.ACCOUNT_CLASS=1) AS RESTSUM
 --,(select TOP(1) ACCOUNT_TYPE_ID FROM ACCOUNTS_table at_1 where at_1.PEOPLE_ID=ap.PEOPLE_ID and ACCOUNT_CLASS=1 and BONUS_NAME like 'Бонус%' ORDER BY BONUS_NAME DESC) as BONUS_ACC_TYPE_ID 
 --бонусы
 ,(select EXTERNAL_ID FROM CARD_SCHEMES where CARD_SCHEMES.DELETED=0 AND CARD_SCHEMES.SCHEME_ID =
      (select top(1) SCHEME_ID from CARD_ACCOUNT_LEVELS where CARD_ACCOUNT_LEVELS.DELETED=0 and CARD_ACCOUNT_LEVELS.BLOCKED=0
	  AND  ACCOUNT_TYPE_ID = 
      (select TOP(1) ACCOUNT_TYPE_ID FROM ACCOUNTS_table at_1 
	  where at_1.PEOPLE_ID=ap.PEOPLE_ID and ACCOUNT_CLASS=1 and BONUS_NAME like 'Бонус%' ORDER BY BONUS_NAME))
  ) AS BONUSNO 
 ,(select TOP(1) BONUS_NAME FROM ACCOUNTS_table at_1 where at_1.PEOPLE_ID=ap.PEOPLE_ID and ACCOUNT_CLASS=1 and BONUS_NAME like 'Бонус%' ORDER BY BONUS_NAME) as BONUS_NAME
--скидка
  ,(select EXTERNAL_ID FROM CARD_SCHEMES where CARD_SCHEMES.DELETED=0 AND CARD_SCHEMES.SCHEME_ID =
      (select top(1) SCHEME_ID from CARD_ACCOUNT_LEVELS where CARD_ACCOUNT_LEVELS.DELETED=0 and CARD_ACCOUNT_LEVELS.BLOCKED=0
	  AND  ACCOUNT_TYPE_ID = 
      (select TOP(1) ACCOUNT_TYPE_ID FROM ACCOUNTS_table at_1 
	  where at_1.PEOPLE_ID=ap.PEOPLE_ID and ACCOUNT_CLASS=2 ORDER BY BONUS_NAME))
  ) AS DISCOUNTNO
 ,(select TOP(1) BONUS_NAME FROM ACCOUNTS_table at_1 where at_1.PEOPLE_ID=ap.PEOPLE_ID and ACCOUNT_CLASS=2 ORDER BY BONUS_NAME) as DISCOUNT_NAME

 --контакты
 ,(select top(1) contact_value FROM CARD_CONTACTS cc1 WHERE cc1.PEOPLE_ID=ap.PEOPLE_ID 
     and cc1.CONTACT_TYPE IN (select CONTACT_TYPE_ID from CARD_CONTACT_TYPES where FLAGS=6)) AS TEL1
 ,(select contact_value FROM CARD_CONTACTS cc1 WHERE cc1.PEOPLE_ID=ap.PEOPLE_ID 
     and cc1.CONTACT_TYPE IN (select CONTACT_TYPE_ID from CARD_CONTACT_TYPES where FLAGS=6) ORDER BY contact_value OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY) AS TEL2
 ,(select TOP(1) contact_value FROM CARD_CONTACTS cc1 WHERE cc1.PEOPLE_ID=ap.PEOPLE_ID 
     and cc1.CONTACT_TYPE IN (select CONTACT_TYPE_ID from CARD_CONTACT_TYPES where FLAGS=5)) AS EMAIL
 --допданные
 ,(select NOTES from CARD_PEOPLES cp2 where cp2.PEOPLE_ID=ap.PEOPLE_ID) AS EXTINFO
 ,CONVERT(NVARCHAR,(select BIRTHDAY from CARD_PEOPLES cp2 where cp2.PEOPLE_ID=ap.PEOPLE_ID),104) AS BIRTHDAY 
 ,(select SEX from CARD_PEOPLES cp2 where cp2.PEOPLE_ID=ap.PEOPLE_ID) AS SEX
 from ACCOUNTS_PEOPLES AS ap
)
--select * from RESULT_TABLE 
select 
NAME,
ISNULL(CAST(CARD as nvarchar),'') AS CARD,
ISNULL(CAST(CARD2 as nvarchar),'') AS CARD2,
ISNULL(CAST(CARD3 as nvarchar),'') AS CARD3,
--ISNULL(CAST(CARD4 as nvarchar),'') AS CARD4,
ISNULL(RESTSUM,0) AS RESTSUM,
ISNULL(BONUSNO,'') AS BONUSNO,
ISNULL(BONUS_NAME,'') AS BONUS_NAME,
ISNULL(DISCOUNTNO,'') AS DISCOUNTNO,
ISNULL(DISCOUNT_NAME,'') AS DISCOUNT_NAME,
ISNULL(TEL1,'') AS TEL1,
ISNULL(TEL2,'') AS TEL2,
ISNULL(EXTINFO,'') AS EXTINFO,
ISNULL(BIRTHDAY,'') AS BIRTHDAY,
ISNULL(SEX,'') AS SEX

from RESULT_TABLE 
where /*not bonus_NAME is null*/
(not card is null
OR not card2 is null
OR not card3 is null
--and not card4 is null
OR (@allow_persons_wo_cards=1))
 order by NAME

  • external/pro_bonus/98_dop/25_rk_crm.txt
  • Последнее изменение: 2025/10/20 13:26
  • Алексей Коробов