Advertisement
Guest User

Untitled

a guest
Nov 13th, 2017
410
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 843.85 KB | None | 0 0
  1. IF OBJECT_ID('udf_Import_StripNonAlpha') IS NOT NULL
  2. DROP FUNCTION [dbo].[udf_Import_StripNonAlpha]
  3. GO
  4.  
  5. CREATE FUNCTION [dbo].[udf_Import_StripNonAlpha]
  6. (
  7. @Str VARCHAR(8000)
  8. ,@Pattern VARCHAR(100)
  9. )
  10. RETURNS TABLE WITH SCHEMABINDING AS
  11. RETURN
  12. WITH Tally (n) AS
  13. (
  14. SELECT TOP (LEN(@Str)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
  15. FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
  16. CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
  17. CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
  18. CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0)) d(n)
  19. ),
  20. SplitString AS
  21. (
  22. SELECT code=@Str, n, s=SUBSTRING(@Str, n, 1)
  23. FROM Tally
  24. WHERE PATINDEX(@Pattern, SUBSTRING(@Str COLLATE Latin1_General_BIN, n, 1)) <> 0
  25. )
  26. SELECT ReducedString=
  27. (
  28. SELECT s + ''
  29. FROM SplitString b
  30. ORDER BY n
  31. FOR XML PATH('')
  32. );
  33.  
  34.  
  35. GO
  36.  
  37. -- Create table to hold legacy_id's
  38. IF OBJECT_ID('Import_Legacy_ID_Custom') IS NULL
  39. BEGIN
  40. CREATE TABLE dbo.Import_Legacy_ID_Custom
  41. (
  42. Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  43. CW_RecID INT,
  44. Record_Type NVARCHAR(255) COLLATE DATABASE_DEFAULT
  45. )
  46.  
  47. CREATE INDEX IX_Legacy_ID ON Import_Legacy_ID_Custom(Legacy_ID)
  48. CREATE INDEX IX_Legacy_Cover ON Import_Legacy_ID_Custom(Legacy_ID, Record_Type)
  49. END
  50. GO
  51.  
  52. IF NOT EXISTS(SELECT 1 FROM sys.procedures WHERE name = 'usp_Import_UDF')
  53. BEGIN
  54. EXEC('CREATE PROCEDURE usp_Import_UDF AS BEGIN SELECT 1 END')
  55. END
  56. GO
  57.  
  58. ALTER PROCEDURE usp_Import_UDF
  59. @Source_Table_Name NVARCHAR(100),
  60. @RunType VARCHAR(20)
  61. AS
  62. BEGIN
  63.  
  64. DECLARE
  65. @DSQL NVARCHAR(MAX),
  66. @curr_CF NVARCHAR(100),
  67. @curr_udf_name NVARCHAR(150)
  68.  
  69.  
  70. IF OBJECT_ID('tempdb..#Cols_To_Process') IS NOT NULL
  71. DROP TABLE #Cols_To_Process
  72.  
  73. SELECT ROW_NUMBER() OVER (ORDER BY Column_ID ASC) AS RowNum, QUOTENAME(cols.name) AS ColumnName, REPLACE(REPLACE(cols.name, 'CF:', ''), 'DT:', '') AS udf_name
  74. INTO #Cols_To_Process
  75. FROM tempdb.sys.columns cols
  76. CROSS APPLY(SELECT TOP 1 * FROM tempdb.sys.tables tabs WHERE tabs.object_id = cols.object_id)tabs
  77. WHERE tabs.name = @Source_Table_Name
  78. AND (cols.Name LIKE('CF:%') OR cols.Name LIKE('DT:%'))
  79. ORDER BY Column_ID ASC
  80.  
  81. IF NOT EXISTS(SELECT 1 FROM #Cols_To_Process)
  82. BEGIN
  83. RETURN
  84. END
  85.  
  86. IF OBJECT_ID('tempdb..##UDF_Staging') IS NOT NULL
  87. DROP TABLE ##UDF_Staging
  88.  
  89. CREATE TABLE ##UDF_Staging
  90. (
  91. ExcelRowNumber INT,
  92. User_Defined_Field_RecID INT,
  93. Caption VARCHAR(100),
  94. Answer NVARCHAR(1000),
  95. RecID INT,
  96. MAXLEN INT,
  97. FieldType VARCHAR(50),
  98. SF_Field_Type_ID VARCHAR(10),
  99. ColumnName VARCHAR(100)
  100. )
  101.  
  102. WHILE EXISTS(SELECT 1 FROM #Cols_To_Process)
  103. BEGIN
  104.  
  105. SELECT TOP 1 @curr_cf = ColumnName FROM #Cols_To_Process ORDER BY RowNum ASC
  106. SELECT @curr_udf_name = udf_name FROM #Cols_To_Process WHERE ColumnName = @curr_cf
  107.  
  108.  
  109. SELECT @DSQL =
  110. 'INSERT INTO ##UDF_Staging
  111. (
  112. ExcelRowNumber,
  113. Answer,
  114. Caption,
  115. MAXLEN,
  116. FieldType,
  117. ColumnName
  118. )
  119. SELECT
  120. [Excel Row Number],
  121. LEFT(' + @curr_cf + ', 1000),' + '
  122. ' + CHAR(39) + @curr_udf_name + CHAR(39) + ',
  123. NULL,
  124. ' + CHAR(39) + CASE WHEN @curr_cf LIKE('[[]DT:%') THEN 'Date' ELSE 'Text' END + CHAR(39) + ',
  125. ' + CHAR(39) + @curr_cf + CHAR(39) + '
  126. FROM tempdb.dbo.' + @Source_Table_Name + '
  127. WHERE ' + @curr_cf + ' <> ' + CHAR(39) + CHAR(39) + ' AND ' + @curr_cf + ' IS NOT NULL
  128.  
  129. --SELECT
  130. -- [Excel Row Number],
  131. -- LEFT(' + @curr_cf + ', 1000),' + '
  132. -- ' + CHAR(39) + @curr_udf_name + CHAR(39) + ',
  133. -- NULL,
  134. -- ' + CHAR(39) + CASE WHEN @curr_cf LIKE('[[]DT:%') THEN 'Date' ELSE 'Text' END + CHAR(39) + ',
  135. -- ' + CHAR(39) + @curr_cf + CHAR(39) + '
  136. --FROM tempdb.dbo.' + @Source_Table_Name + '
  137. --WHERE ' + @curr_cf + ' <> ' + CHAR(39) + CHAR(39) + ' AND ' + @curr_cf + ' IS NOT NULL
  138.  
  139. '
  140.  
  141. EXEC(@DSQL)
  142. DELETE FROM #Cols_To_Process WHERE ColumnName = @curr_cf
  143. END
  144.  
  145. ;WITH UDFLEN AS
  146. (
  147. SELECT
  148. Caption,
  149. MAX(LEN(ANSWER)) AS ML
  150. FROM ##UDF_Staging
  151. GROUP BY Caption
  152. )
  153.  
  154. UPDATE udf
  155. SET udf.MAXLEN = udfl.ML
  156. FROM ##UDF_Staging udf
  157. CROSS APPLY(SELECT TOP 1 * FROM UDFLEN udfl WHERE udfl.Caption = udf.Caption)udfl
  158.  
  159. UPDATE udf
  160. SET udf.SF_Field_Type_ID = 'T'
  161. FROM ##UDF_Staging udf
  162. WHERE FieldType = 'Text'
  163. AND MAXLEN < 100
  164.  
  165. UPDATE udf
  166. SET udf.SF_Field_Type_ID = 'A'
  167. FROM ##UDF_Staging udf
  168. WHERE FieldType = 'Text'
  169. AND (MAXLEN IS NULL OR MAXLEN > 100)
  170.  
  171. UPDATE udf
  172. SET udf.SF_Field_Type_ID = 'D'
  173. FROM ##UDF_Staging udf
  174. WHERE FieldType = 'Date'
  175.  
  176. DELETE FROM ##UDF_Staging
  177. WHERE FieldType = 'Date' AND (Answer IS NULL OR ISDATE(Answer) = 0)
  178.  
  179. SELECT * FROM ##UDF_Staging WHERE FieldType = 'Date'
  180.  
  181. UPDATE ##UDF_Staging
  182. SET Answer = CONVERT(NVARCHAR, DATEPART(YYYY, CONVERT(DATETIME, Answer))) + RIGHT('00' + CONVERT(NVARCHAR, DATEPART(MM, CONVERT(DATETIME, ANSWER))), 2) + RIGHT('00' + CONVERT(NVARCHAR, DATEPART(DD, CONVERT(DATETIME, ANSWER))), 2)
  183. WHERE FieldType = 'Date'
  184.  
  185. UPDATE ##UDF_Staging
  186. SET Caption = LEFT(Caption, 25)
  187. WHERE LEN(Caption) > 25
  188. -- TODO ADD ADDITIONAL VALIDATION
  189.  
  190. -- BEGIN Company Records
  191. IF @RunType = 'Company'
  192. BEGIN
  193.  
  194. UPDATE stag
  195. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  196. FROM ##UDF_Staging stag
  197. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'cm120')udf
  198. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('company_overview', 'company_details', 'company_overview_new')))
  199.  
  200. -- Update user-defined fields to text area if they are not already defined as such
  201. --UPDATE udf
  202. -- SET udf.SF_Field_Type_ID = 'A',
  203. -- udf.SF_Entry_Type_ID = 'E',
  204. -- udf.Nbr_Decimals = 0,
  205. -- udf.Required_Flag = 0,
  206. -- udf.Inactive_Flag = 0,
  207. -- udf.Read_Only_Flag = 0
  208. --FROM User_Defined_Field udf
  209. --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
  210.  
  211. -- Create user-defined fields which do not already exists
  212. INSERT INTO User_Defined_Field
  213. (
  214. SF_Field_Type_ID,
  215. SF_Entry_Type_ID,
  216. Field_ID,
  217. Nbr_Decimals,
  218. Caption,
  219. Required_Flag,
  220. Pod_RecID,
  221. ScreenID,
  222. Full_View_Sort_Order,
  223. Full_View_Visible_Flag,
  224. Inactive_Flag,
  225. Read_Only_Flag,
  226. Multiline_Flag,
  227. Multiline_Order,
  228. Created_UTC,
  229. Created_By,
  230. Last_Update_UTC,
  231. Updated_By,
  232. Tooltip,
  233. Button_Url
  234. )
  235.  
  236. SELECT DISTINCT
  237. stag.SF_Field_Type_ID, --SF_Field_Type_ID,
  238. 'E', --SF_Entry_Type_ID,
  239. NULL, --Field_ID,
  240. 0, --Nbr_Decimals,
  241. stag.Caption, --Caption,
  242. 0, --Required_Flag,
  243. pod.Pod_RecID, --Pod_RecID,
  244. 'cm120', --ScreenID,
  245. 0,--Full_View_Sort_Order,
  246. 1, --Full_View_Visible_Flag,
  247. 0, --Inactive_Flag,
  248. 0,--Read_Only_Flag,
  249. 0,--Multiline_Flag,
  250. NULL, --Multiline_Order,
  251. GETUTCDATE(),--Created_UTC,
  252. 'Migration', --Created_By,
  253. GETUTCDATE(), --Last_Update_UTC,
  254. 'Migration', --Updated_By,
  255. 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
  256. NULL--Button_Url
  257. FROM ##UDF_Staging stag
  258. CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'cm120' AND PodID = 'Company_Details')pod
  259. WHERE stag.User_Defined_Field_RecID IS NULL
  260.  
  261. -- Get RecID for user-defined fields
  262. UPDATE stag
  263. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  264. FROM ##UDF_Staging stag
  265. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'cm120')udf
  266. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('company_overview', 'company_details', 'company_overview_new')))
  267.  
  268. -- Get Company_RecID for imported records
  269. UPDATE stag
  270. SET stag.RecID = imp.Company_RecID
  271. FROM ##UDF_Staging stag
  272. CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
  273.  
  274. -- Eliminate duplicates on combination of company + udf (issue when multiple sites imported with separate custom questions)
  275. DELETE dup
  276. FROM ##UDF_Staging dup
  277. WHERE EXISTS(SELECT 1 FROM ##UDF_Staging pri WHERE pri.RecID = dup.RecID AND pri.User_Defined_Field_RecID = dup.User_Defined_Field_RecID AND dup.ExcelRowNumber > pri.ExcelRowNumber)
  278.  
  279. -- delete invalid rows (TODO: add validation)
  280. DELETE stag
  281. FROM ##UDF_Staging stag
  282. WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
  283.  
  284. -- Update existing UDF values
  285. UPDATE udfv
  286. SET udfv.User_Defined_Field_Value = stag.Answer
  287. FROM Company_User_Defined_Field_Value udfv
  288. CROSS APPLY(SELECT TOP 1 * FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udfv.User_Defined_Field_RecID AND stag.RecID = udfv.Company_RecID)stag
  289.  
  290. INSERT INTO Company_User_Defined_Field_Value
  291. (
  292. Company_RecID,
  293. User_Defined_Field_RecID,
  294. User_Defined_Field_Value,
  295. Last_Update_UTC,
  296. Updated_By
  297. )
  298.  
  299. SELECT
  300. RecID, --Company_RecID,
  301. User_Defined_Field_RecID, --User_Defined_Field_RecID,
  302. Answer, --User_Defined_Field_Value,
  303. GETUTCDATE(), --Last_Update_UTC,
  304. 'Migration'--Updated_By
  305. FROM ##UDF_Staging stag
  306. WHERE NOT EXISTS(SELECT 1 FROM Company_User_Defined_Field_Value udfv WHERE udfv.Company_RecID = stag.RecID AND udfv.User_Defined_Field_RecID = stag.User_Defined_Field_RecID)
  307.  
  308. END
  309.  
  310. -- BEGIN Contact Records
  311. IF @RunType = 'Contact'
  312. BEGIN
  313.  
  314. UPDATE stag
  315. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  316. FROM ##UDF_Staging stag
  317. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'ct300')udf
  318. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('Contact_Detail', 'Contact_Overview')))
  319.  
  320. -- Update user-defined fields to text area if they are not already defined as such
  321. --UPDATE udf
  322. -- SET udf.SF_Field_Type_ID = 'A',
  323. -- udf.SF_Entry_Type_ID = 'E',
  324. -- udf.Nbr_Decimals = 0,
  325. -- udf.Required_Flag = 0,
  326. -- udf.Inactive_Flag = 0,
  327. -- udf.Read_Only_Flag = 0
  328. --FROM User_Defined_Field udf
  329. --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
  330.  
  331. -- Create user-defined fields which do not already exists
  332. INSERT INTO User_Defined_Field
  333. (
  334. SF_Field_Type_ID,
  335. SF_Entry_Type_ID,
  336. Field_ID,
  337. Nbr_Decimals,
  338. Caption,
  339. Required_Flag,
  340. Pod_RecID,
  341. ScreenID,
  342. Full_View_Sort_Order,
  343. Full_View_Visible_Flag,
  344. Inactive_Flag,
  345. Read_Only_Flag,
  346. Multiline_Flag,
  347. Multiline_Order,
  348. Created_UTC,
  349. Created_By,
  350. Last_Update_UTC,
  351. Updated_By,
  352. Tooltip,
  353. Button_Url
  354. )
  355.  
  356. SELECT DISTINCT
  357. stag.SF_Field_Type_ID, --SF_Field_Type_ID,
  358. 'E', --SF_Entry_Type_ID,
  359. NULL, --Field_ID,
  360. 0, --Nbr_Decimals,
  361. stag.Caption, --Caption,
  362. 0, --Required_Flag,
  363. pod.Pod_RecID, --Pod_RecID,
  364. 'ct300', --ScreenID,
  365. 0,--Full_View_Sort_Order,
  366. 1, --Full_View_Visible_Flag,
  367. 0, --Inactive_Flag,
  368. 0,--Read_Only_Flag,
  369. 0,--Multiline_Flag,
  370. NULL, --Multiline_Order,
  371. GETUTCDATE(),--Created_UTC,
  372. 'Migration', --Created_By,
  373. GETUTCDATE(), --Last_Update_UTC,
  374. 'Migration', --Updated_By,
  375. 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
  376. NULL--Button_Url
  377. FROM ##UDF_Staging stag
  378. CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'ct300' AND PodID = 'Contact_Detail')pod
  379. WHERE stag.User_Defined_Field_RecID IS NULL
  380.  
  381. UPDATE stag
  382. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  383. FROM ##UDF_Staging stag
  384. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'ct300')udf
  385. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('Contact_Detail', 'Contact_Overview')))
  386.  
  387. -- Get Contact_RecID for imported records
  388.  
  389. UPDATE stag
  390. SET stag.RecID = imp.New_Identity
  391. FROM ##UDF_Staging stag
  392. CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
  393.  
  394. -- delete invalid rows (TODO: add validation)
  395. DELETE stag
  396. FROM ##UDF_Staging stag
  397. WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
  398.  
  399. -- Update existing UDF values
  400. UPDATE udfv
  401. SET udfv.User_Defined_Field_Value = stag.Answer
  402. FROM Contact_User_Defined_Field_Value udfv
  403. CROSS APPLY(SELECT TOP 1 * FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udfv.User_Defined_Field_RecID AND stag.RecID = udfv.Contact_RecID)stag
  404.  
  405. INSERT INTO Contact_User_Defined_Field_Value
  406. (
  407. Contact_RecID,
  408. User_Defined_Field_RecID,
  409. User_Defined_Field_Value,
  410. Last_Update_UTC,
  411. Updated_By
  412. )
  413.  
  414. SELECT
  415. RecID, --Contact_RecID,
  416. User_Defined_Field_RecID, --User_Defined_Field_RecID,
  417. Answer, --User_Defined_Field_Value,
  418. GETUTCDATE(), --Last_Update_UTC,
  419. 'Migration'--Updated_By
  420. FROM ##UDF_Staging stag
  421. WHERE NOT EXISTS(SELECT 1 FROM Company_User_Defined_Field_Value udfv WHERE udfv.Company_RecID = stag.RecID AND udfv.User_Defined_Field_RecID = stag.User_Defined_Field_RecID)
  422.  
  423. END
  424.  
  425. -- BEGIN Activity Records
  426. IF @RunType = 'Activity'
  427. BEGIN
  428.  
  429. UPDATE stag
  430. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  431. FROM ##UDF_Staging stag
  432. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'my_activities')udf
  433. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('activity_overview', 'activity_schedule')))
  434.  
  435.  
  436. ---- Update user-defined fields to text area if they are not already defined as such
  437. --UPDATE udf
  438. -- SET udf.SF_Field_Type_ID = 'A',
  439. -- udf.SF_Entry_Type_ID = 'E',
  440. -- udf.Nbr_Decimals = 0,
  441. -- udf.Required_Flag = 0,
  442. -- udf.Inactive_Flag = 0,
  443. -- udf.Read_Only_Flag = 0
  444. --FROM User_Defined_Field udf
  445. --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
  446.  
  447. -- Create user-defined fields which do not already exists
  448. INSERT INTO User_Defined_Field
  449. (
  450. SF_Field_Type_ID,
  451. SF_Entry_Type_ID,
  452. Field_ID,
  453. Nbr_Decimals,
  454. Caption,
  455. Required_Flag,
  456. Pod_RecID,
  457. ScreenID,
  458. Full_View_Sort_Order,
  459. Full_View_Visible_Flag,
  460. Inactive_Flag,
  461. Read_Only_Flag,
  462. Multiline_Flag,
  463. Multiline_Order,
  464. Created_UTC,
  465. Created_By,
  466. Last_Update_UTC,
  467. Updated_By,
  468. Tooltip,
  469. Button_Url
  470. )
  471.  
  472. SELECT DISTINCT
  473. stag.SF_Field_Type_ID, --SF_Field_Type_ID,
  474. 'E', --SF_Entry_Type_ID,
  475. NULL, --Field_ID,
  476. 0, --Nbr_Decimals,
  477. stag.Caption, --Caption,
  478. 0, --Required_Flag,
  479. pod.Pod_RecID, --Pod_RecID,
  480. 'my_activities', --ScreenID,
  481. 0,--Full_View_Sort_Order,
  482. 1, --Full_View_Visible_Flag,
  483. 0, --Inactive_Flag,
  484. 0,--Read_Only_Flag,
  485. 0,--Multiline_Flag,
  486. NULL, --Multiline_Order,
  487. GETUTCDATE(),--Created_UTC,
  488. 'Migration', --Created_By,
  489. GETUTCDATE(), --Last_Update_UTC,
  490. 'Migration', --Updated_By,
  491. 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
  492. NULL--Button_Url
  493. FROM ##UDF_Staging stag
  494. CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'my_activities' AND PodID = 'Activity_Overview')pod
  495. WHERE stag.User_Defined_Field_RecID IS NULL
  496.  
  497. UPDATE stag
  498. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  499. FROM ##UDF_Staging stag
  500. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'my_activities')udf
  501. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('activity_overview', 'activity_schedule')))
  502.  
  503. -- Get SO_Activity_RecID for imported records
  504. UPDATE stag
  505. SET stag.RecID = imp.New_Identity
  506. FROM ##UDF_Staging stag
  507. CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
  508.  
  509. -- delete invalid rows (TODO: add validation)
  510. DELETE stag
  511. FROM ##UDF_Staging stag
  512. WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
  513.  
  514. -- Update existing UDF values
  515. UPDATE udfv
  516. SET udfv.User_Defined_Field_Value = stag.Answer
  517. FROM SO_Activity_User_Defined_Field_Value udfv
  518. CROSS APPLY(SELECT TOP 1 * FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udfv.User_Defined_Field_RecID AND stag.RecID = udfv.SO_Activity_RecID)stag
  519.  
  520. INSERT INTO SO_Activity_User_Defined_Field_Value
  521. (
  522. SO_Activity_RecID,
  523. User_Defined_Field_RecID,
  524. User_Defined_Field_Value,
  525. Last_Update_UTC,
  526. Updated_By
  527. )
  528.  
  529. SELECT
  530. RecID, --SO_Activity_RecID,
  531. User_Defined_Field_RecID, --User_Defined_Field_RecID,
  532. Answer, --User_Defined_Field_Value,
  533. GETUTCDATE(), --Last_Update_UTC,
  534. 'Migration'--Updated_By
  535. FROM ##UDF_Staging stag
  536. WHERE NOT EXISTS(SELECT 1 FROM Company_User_Defined_Field_Value udfv WHERE udfv.Company_RecID = stag.RecID AND udfv.User_Defined_Field_RecID = stag.User_Defined_Field_RecID)
  537.  
  538. END
  539.  
  540. -- BEGIN Ticket Records
  541. IF @RunType = 'Ticket'
  542. BEGIN
  543.  
  544. UPDATE stag
  545. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  546. FROM ##UDF_Staging stag
  547. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'sr100')udf
  548. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('service_ticket_ticket', 'service_ticket_company', 'service_ticket_ticket')))
  549.  
  550. ---- Update user-defined fields to text area if they are not already defined as such
  551. --UPDATE udf
  552. -- SET udf.SF_Field_Type_ID = 'A',
  553. -- udf.SF_Entry_Type_ID = 'E',
  554. -- udf.Nbr_Decimals = 0,
  555. -- udf.Required_Flag = 0,
  556. -- udf.Inactive_Flag = 0,
  557. -- udf.Read_Only_Flag = 0
  558. --FROM User_Defined_Field udf
  559. --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
  560.  
  561. -- Create user-defined fields which do not already exists
  562. INSERT INTO User_Defined_Field
  563. (
  564. SF_Field_Type_ID,
  565. SF_Entry_Type_ID,
  566. Field_ID,
  567. Nbr_Decimals,
  568. Caption,
  569. Required_Flag,
  570. Pod_RecID,
  571. ScreenID,
  572. Full_View_Sort_Order,
  573. Full_View_Visible_Flag,
  574. Inactive_Flag,
  575. Read_Only_Flag,
  576. Multiline_Flag,
  577. Multiline_Order,
  578. Created_UTC,
  579. Created_By,
  580. Last_Update_UTC,
  581. Updated_By,
  582. Tooltip,
  583. Button_Url
  584. )
  585.  
  586. SELECT DISTINCT
  587. stag.SF_Field_Type_ID, --SF_Field_Type_ID,
  588. 'E', --SF_Entry_Type_ID,
  589. NULL, --Field_ID,
  590. 0, --Nbr_Decimals,
  591. stag.Caption, --Caption,
  592. 0, --Required_Flag,
  593. pod.Pod_RecID, --Pod_RecID,
  594. 'sr100', --ScreenID,
  595. 0,--Full_View_Sort_Order,
  596. 1, --Full_View_Visible_Flag,
  597. 0, --Inactive_Flag,
  598. 0,--Read_Only_Flag,
  599. 0,--Multiline_Flag,
  600. NULL, --Multiline_Order,
  601. GETUTCDATE(),--Created_UTC,
  602. 'Migration', --Created_By,
  603. GETUTCDATE(), --Last_Update_UTC,
  604. 'Migration', --Updated_By,
  605. 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
  606. NULL--Button_Url
  607. FROM ##UDF_Staging stag
  608. CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'sr100' AND PodID = 'service_ticket_ticket')pod
  609. WHERE stag.User_Defined_Field_RecID IS NULL
  610.  
  611. UPDATE stag
  612. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  613. FROM ##UDF_Staging stag
  614. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'sr100')udf
  615. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('service_ticket_ticket', 'service_ticket_company', 'service_ticket_ticket')))
  616.  
  617.  
  618. -- Get SR_Service for imported records
  619. UPDATE stag
  620. SET stag.RecID = imp.New_Identity
  621. FROM ##UDF_Staging stag
  622. CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
  623.  
  624. -- delete invalid rows (TODO: add validation)
  625. DELETE stag
  626. FROM ##UDF_Staging stag
  627. WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
  628.  
  629. -- Update existing UDF values
  630. UPDATE udfv
  631. SET udfv.User_Defined_Field_Value = stag.Answer
  632. FROM SR_Service_User_Defined_Field_Value udfv
  633. CROSS APPLY(SELECT TOP 1 * FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udfv.User_Defined_Field_RecID AND stag.RecID = udfv.SR_Service_RecID)stag
  634.  
  635. INSERT INTO SR_Service_User_Defined_Field_Value
  636. (
  637. SR_Service_RecID,
  638. User_Defined_Field_RecID,
  639. User_Defined_Field_Value,
  640. Last_Update_UTC,
  641. Updated_By
  642. )
  643.  
  644. SELECT
  645. RecID, --SR_Service,
  646. User_Defined_Field_RecID, --User_Defined_Field_RecID,
  647. Answer, --User_Defined_Field_Value,
  648. GETUTCDATE(), --Last_Update_UTC,
  649. 'Migration'--Updated_By
  650. FROM ##UDF_Staging stag
  651. WHERE NOT EXISTS(SELECT 1 FROM Company_User_Defined_Field_Value udfv WHERE udfv.Company_RecID = stag.RecID AND udfv.User_Defined_Field_RecID = stag.User_Defined_Field_RecID)
  652.  
  653. END
  654.  
  655. -- BEGIN Opportunity Records
  656. IF @RunType = 'Opportunity'
  657. BEGIN
  658.  
  659. UPDATE stag
  660. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  661. FROM ##UDF_Staging stag
  662. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'my_opportunities')udf
  663. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('opportunities_opportunity')))
  664.  
  665.  
  666. -- Update user-defined fields to text area if they are not already defined as such
  667. --UPDATE udf
  668. -- SET udf.SF_Field_Type_ID = 'A',
  669. -- udf.SF_Entry_Type_ID = 'E',
  670. -- udf.Nbr_Decimals = 0,
  671. -- udf.Required_Flag = 0,
  672. -- udf.Inactive_Flag = 0,
  673. -- udf.Read_Only_Flag = 0
  674. --FROM User_Defined_Field udf
  675. --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
  676.  
  677. -- Create user-defined fields which do not already exists
  678. INSERT INTO User_Defined_Field
  679. (
  680. SF_Field_Type_ID,
  681. SF_Entry_Type_ID,
  682. Field_ID,
  683. Nbr_Decimals,
  684. Caption,
  685. Required_Flag,
  686. Pod_RecID,
  687. ScreenID,
  688. Full_View_Sort_Order,
  689. Full_View_Visible_Flag,
  690. Inactive_Flag,
  691. Read_Only_Flag,
  692. Multiline_Flag,
  693. Multiline_Order,
  694. Created_UTC,
  695. Created_By,
  696. Last_Update_UTC,
  697. Updated_By,
  698. Tooltip,
  699. Button_Url
  700. )
  701.  
  702. SELECT DISTINCT
  703. stag.SF_Field_Type_ID, --SF_Field_Type_ID,
  704. 'E', --SF_Entry_Type_ID,
  705. NULL, --Field_ID,
  706. 0, --Nbr_Decimals,
  707. stag.Caption, --Caption,
  708. 0, --Required_Flag,
  709. pod.Pod_RecID, --Pod_RecID,
  710. 'my_opportunities', --ScreenID,
  711. 0,--Full_View_Sort_Order,
  712. 1, --Full_View_Visible_Flag,
  713. 0, --Inactive_Flag,
  714. 0,--Read_Only_Flag,
  715. 0,--Multiline_Flag,
  716. NULL, --Multiline_Order,
  717. GETUTCDATE(),--Created_UTC,
  718. 'Migration', --Created_By,
  719. GETUTCDATE(), --Last_Update_UTC,
  720. 'Migration', --Updated_By,
  721. 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
  722. NULL--Button_Url
  723. FROM ##UDF_Staging stag
  724. CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'my_opportunities' AND PodID = 'opportunities_opportunity')pod
  725. WHERE stag.User_Defined_Field_RecID IS NULL
  726.  
  727. UPDATE stag
  728. SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
  729. FROM ##UDF_Staging stag
  730. CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'my_opportunities')udf
  731. WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('opportunities_opportunity')))
  732.  
  733. -- Get SO_Activity_RecID for imported records
  734. UPDATE stag
  735. SET stag.RecID = imp.New_Identity
  736. FROM ##UDF_Staging stag
  737. CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
  738.  
  739. -- delete invalid rows (TODO: add validation)
  740. DELETE stag
  741. FROM ##UDF_Staging stag
  742. WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
  743.  
  744. -- Update existing UDF values
  745. UPDATE udfv
  746. SET udfv.User_Defined_Field_Value = stag.Answer
  747. FROM SO_Activity_User_Defined_Field_Value udfv
  748. CROSS APPLY(SELECT TOP 1 * FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udfv.User_Defined_Field_RecID AND stag.RecID = udfv.SO_Activity_RecID)stag
  749.  
  750. INSERT INTO SO_Activity_User_Defined_Field_Value
  751. (
  752. SO_Activity_RecID,
  753. User_Defined_Field_RecID,
  754. User_Defined_Field_Value,
  755. Last_Update_UTC,
  756. Updated_By
  757. )
  758.  
  759. SELECT
  760. RecID, --SO_Activity_RecID,
  761. User_Defined_Field_RecID, --User_Defined_Field_RecID,
  762. Answer, --User_Defined_Field_Value,
  763. GETUTCDATE(), --Last_Update_UTC,
  764. 'Migration'--Updated_By
  765. FROM ##UDF_Staging stag
  766. WHERE NOT EXISTS(SELECT 1 FROM Company_User_Defined_Field_Value udfv WHERE udfv.Company_RecID = stag.RecID AND udfv.User_Defined_Field_RecID = stag.User_Defined_Field_RecID)
  767.  
  768. END
  769.  
  770. END
  771. GO
  772.  
  773.  
  774.  
  775. IF EXISTS(SELECT TOP 1 * FROM sys.tables WHERE name = '#TMP_Time_Staging')
  776. BEGIN
  777. DROP TABLE #TMP_Time_Staging
  778. END
  779. GO
  780.  
  781. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Import_Record_Validation')
  782. BEGIN
  783. EXEC('CREATE PROCEDURE [dbo].[usp_Import_Record_Validation] AS SELECT 1')
  784. END
  785. GO
  786. -- =============================================
  787. -- Author: m.gray
  788. -- Create date: 04/14/2015
  789. -- Description: Matches migrated records based on Legacy_ID
  790. -- =============================================
  791.  
  792. ALTER PROCEDURE [dbo].usp_Import_Record_Validation
  793. @TableName NVARCHAR(200)
  794. AS
  795. BEGIN
  796. IF OBJECT_ID('tempdb..TMP_Validation') IS NOT NULL
  797. DROP TABLE tempdb.dbo.TMP_Validation
  798.  
  799. SELECT @TableName AS TableName INTO tempdb.dbo.TMP_Validation
  800.  
  801. END
  802. GO
  803.  
  804. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Import_Match_Legacy')
  805. BEGIN
  806. EXEC('CREATE PROCEDURE [dbo].[usp_Import_Match_Legacy] AS SELECT 1')
  807. END
  808. GO
  809.  
  810. -- =============================================
  811. -- Author: m.gray
  812. -- Create date: 04/14/2015
  813. -- Description: Matches migrated records based on Legacy_ID
  814. -- =============================================
  815.  
  816. ALTER PROCEDURE [dbo].[usp_Import_Match_Legacy]
  817. @TempTableName NVARCHAR(200),
  818. @Record_Type NVARCHAR(50)
  819. AS
  820. BEGIN
  821.  
  822. SET NOCOUNT ON
  823.  
  824. DECLARE @CurrColumn NVARCHAR(100),
  825. @Curr_RecID INT,
  826. @TempTableObjectID INT,
  827. @StagingTableObjectID INT,
  828. @DSQL NVARCHAR(MAX)
  829.  
  830. SELECT
  831. @TempTableObjectID = (SELECT Object_ID FROM tempdb.sys.Tables WHERE Name = @TempTableName),
  832. @StagingTableObjectID = (SELECT OBJECT_ID('tempdb..#Import_Staging'))
  833.  
  834. DECLARE @ColumnsToAdd TABLE
  835. (
  836. RecID INT IDENTITY,
  837. ColumnName NVARCHAR(50)
  838. )
  839.  
  840. INSERT INTO @ColumnsToAdd
  841. (
  842. ColumnName
  843. )
  844. SELECT 'Legacy_Company_ID' UNION ALL
  845. SELECT 'Legacy_Contact_ID' UNION ALL
  846. SELECT 'Legacy_Site_ID'
  847.  
  848. -- Add Legacy Columns to tempdb table and staging table if needed
  849. WHILE EXISTS(SELECT TOP 1 * FROM @ColumnsToAdd)
  850. BEGIN
  851. SELECT @Curr_RecID = (SELECT TOP 1 RecID FROM @ColumnsToAdd)
  852. SELECT @CurrColumn = (SELECT ColumnName FROM @ColumnsToAdd WHERE RecID = @Curr_RecID)
  853. DECLARE @StagingTableName NVARCHAR(100) = 'TestTable'
  854.  
  855. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE Name = @CurrColumn AND Object_ID = @TempTableObjectID)
  856. BEGIN
  857. SELECT @DSQL = 'ALTER TABLE tempdb.dbo.' + @TempTableName + ' ADD ' + @CurrColumn + ' NVARCHAR(MAX) COLLATE DATABASE_DEFAULT'
  858. EXEC(@DSQL)
  859. SELECT @DSQL = ''
  860. END
  861.  
  862. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE Name = @CurrColumn AND Object_ID = @StagingTableObjectID)
  863. BEGIN
  864. SELECT @DSQL = 'ALTER TABLE #Import_Staging ADD ' + @CurrColumn + ' NVARCHAR(MAX) COLLATE DATABASE_DEFAULT'
  865. EXEC(@DSQL)
  866. SELECT @DSQL = ''
  867. END
  868.  
  869. DELETE FROM @ColumnsToAdd WHERE RecID = @Curr_RecID
  870.  
  871. END
  872.  
  873. IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Site_ID' AND OBJECT_ID = @TempTableObjectID)
  874. BEGIN
  875. SELECT @DSQL = '
  876. UPDATE tmp
  877. SET tmp.Legacy_Site_ID = src.Legacy_Site_ID
  878. FROM #Import_Staging tmp
  879. INNER JOIN tempdb.dbo.' + @TempTableName + ' src
  880. ON src.[Excel Row Number] = tmp.ExcelRowNumber
  881. WHERE tmp.Legacy_Site_ID IS NULL
  882. AND EXISTS(SELECT 1 FROM tempdb.dbo.' + @TempTableName + ' src WHERE src.Legacy_Site_ID IS NOT NULL)'
  883.  
  884. EXEC(@DSQL)
  885. END
  886.  
  887. IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Company_ID' AND OBJECT_ID = @TempTableObjectID)
  888. BEGIN
  889. SELECT @DSQL = '
  890. UPDATE tmp
  891. SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
  892. FROM #Import_Staging tmp
  893. INNER JOIN tempdb.dbo.' + @TempTableName + ' src
  894. ON src.[Excel Row Number] = tmp.ExcelRowNumber
  895. WHERE tmp.Legacy_Company_ID IS NULL
  896. AND EXISTS(SELECT 1 FROM tempdb.dbo.' + @TempTableName + ' src WHERE src.Legacy_Company_ID IS NOT NULL)'
  897.  
  898. EXEC(@DSQL)
  899. END
  900.  
  901. IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Contact_ID' AND OBJECT_ID = @TempTableObjectID)
  902. BEGIN
  903. SELECT @DSQL = '
  904. UPDATE tmp
  905. SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
  906. FROM #Import_Staging tmp
  907. INNER JOIN tempdb.dbo.' + @TempTableName + ' src
  908. ON src.[Excel Row Number] = tmp.ExcelRowNumber
  909. WHERE tmp.Legacy_Contact_ID IS NULL
  910. AND EXISTS(SELECT 1 FROM tempdb.dbo.' + @TempTableName + ' src WHERE src.Legacy_Contact_ID IS NOT NULL)'
  911.  
  912. EXEC(@DSQL)
  913.  
  914. END
  915.  
  916. -- Exclude records previously imported
  917. -- Non-Company records
  918. IF @Record_Type NOT IN('Company', 'Site')
  919. BEGIN
  920. UPDATE stag
  921. SET stag.Diff_Exclude_Flag = 1
  922. FROM #Import_Staging stag
  923. WHERE EXISTS(SELECT 1 FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_ID AND leg.Record_Type = @Record_Type)
  924. END
  925.  
  926. IF @Record_Type = 'Company'
  927. BEGIN
  928. -- Company records
  929. UPDATE stag
  930. SET stag.Diff_Exclude_Flag = 1
  931. FROM #Import_Staging stag
  932. WHERE EXISTS(SELECT 1 FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_ID AND leg.Record_Type = @Record_Type)
  933. AND EXISTS(SELECT 1 FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Site_ID AND leg.Record_Type = 'Site')
  934. end
  935.  
  936. DELETE FROM #Import_Staging WHERE Diff_Exclude_Flag = 1
  937.  
  938. UPDATE #Import_Staging SET Legacy_Contact_ID = NULL WHERE Legacy_Contact_ID = ''
  939.  
  940. -- Update #Import_Staging to pull company RecID
  941. -- Non-company records
  942. IF @Record_Type NOT IN('Company', 'Site')
  943. BEGIN
  944. UPDATE stag
  945. SET stag.Company_RecID = leg.CW_RecID
  946. FROM #Import_Staging stag
  947. CROSS APPLY(SELECT TOP 1 * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Company_ID AND leg.Record_Type = 'Company')leg
  948. WHERE EXISTS(SELECT 1 FROM dbo.Company comp WHERE comp.Company_RecID = leg.CW_RecID)
  949. END
  950.  
  951. -- Company records
  952. IF @Record_Type = 'Company'
  953. BEGIN
  954. UPDATE stag
  955. SET stag.Company_RecID = leg.CW_RecID
  956. FROM #Import_Staging stag
  957. CROSS APPLY(SELECT TOP 1 * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_ID and leg.Record_Type = 'Company')leg
  958. END
  959.  
  960. -- Pull company RecID for merged companies
  961. UPDATE stag
  962. SET stag.Company_RecID = mrg.To_RecID
  963. FROM #Import_Staging stag
  964. CROSS APPLY(SELECT TOP 1 * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Company_ID AND leg.Record_Type = 'Company')leg
  965. CROSS APPLY(SELECT TOP 1 * FROM dbo.Contact_Merge_Audit mrg WHERE mrg.From_RecID = leg.CW_RecID AND mrg.Audit_Source = 'M')mrg
  966. WHERE NOT EXISTS(SELECT 1 FROM dbo.Company comp WHERE comp.Company_RecID = leg.CW_RecID)
  967.  
  968. -- Update #Import_Staging to pull Site RecID
  969. UPDATE stag
  970. SET stag.Company_Address_RecID = leg.CW_RecID
  971. FROM #Import_Staging stag
  972. CROSS APPLY(SELECT TOP 1 * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Site_ID AND leg.Record_Type = 'Site')leg
  973.  
  974. -- Update #Import_Staging to pull Contact RecID
  975. IF @Record_Type NOT IN('Company', 'Site')
  976. BEGIN
  977. UPDATE stag
  978. SET stag.Contact_RecID = leg.CW_RecID
  979. FROM #Import_Staging stag
  980. CROSS APPLY(SELECT TOP 1 * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Contact_ID AND leg.Record_Type = 'Contact')leg
  981. WHERE EXISTS(SELECT TOP 1 * FROM dbo.Contact cont WHERE cont.Contact_RecID = leg.CW_RecID)
  982. END
  983.  
  984. -- Perform validation on matched records
  985. IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
  986. BEGIN
  987. INSERT INTO #tblResults
  988. (
  989. RowNumber,
  990. ValMsg,
  991. Warning_Flag
  992. )
  993.  
  994. --SELECT
  995. -- stag.ExcelRowNumber,
  996. -- 'Legacy Site: ' + Legacy_Site_ID + ' did not match to legacy company ' + Legacy_Company_ID,
  997. -- 1
  998. --FROM #Import_Staging stag
  999. -- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_Address_RecID = stag.Company_Address_RecID) cad
  1000. -- --OUTER APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = cad.Company_RecID AND comp.Company_RecID = stag.Company_RecID)comp
  1001. --WHERE cad.Company_RecID <> stag.Company_RecID
  1002.  
  1003. --UNION ALL
  1004.  
  1005. --SELECT
  1006. -- stag.ExcelRowNumber,
  1007. -- 'Legacy contact: ' + Legacy_Contact_ID + ' did not match to legacy company ' + Legacy_Company_ID,
  1008. -- 1
  1009. --FROM #Import_Staging stag
  1010. -- CROSS APPLY(SELECT TOP 1 * FROM dbo.Contact cont WHERE cont.Contact_RecID = stag.Contact_RecID) cont
  1011. -- OUTER APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = cont.Company_RecID AND comp.Company_RecID = stag.Company_RecID)comp
  1012. --WHERE cont.Contact_RecID IS NOT NULL
  1013. -- AND comp.Company_RecID IS NULL
  1014.  
  1015. --UNION ALL
  1016.  
  1017. SELECT
  1018. ExcelRowNumber,
  1019. 'Record will be excluded from import - did not map to a company based on Legacy_Company_ID',
  1020. 1
  1021. FROM #Import_Staging stag
  1022. WHERE Company_RecID IS NULL
  1023. AND Legacy_Company_ID IS NOT NULL
  1024. AND @Record_Type NOT IN('Company', 'Site')
  1025.  
  1026. UNION ALL
  1027.  
  1028. SELECT
  1029. stag.ExcelRowNumber,
  1030. 'Legacy_ID ' + Legacy_ID + ' appears more than once. Cannot be duplicate',
  1031. 0
  1032. FROM #Import_Staging stag
  1033. WHERE @Record_Type NOT IN('Company', 'Site')
  1034. AND EXISTS(SELECT 1 FROM #Import_Staging dup WHERE dup.Legacy_ID = stag.Legacy_ID AND dup.ExcelRowNumber <> stag.ExcelRowNumber)
  1035.  
  1036. UNION ALL
  1037.  
  1038. SELECT
  1039. stag.ExcelRowNumber,
  1040. 'Legacy_ID ' + stag.Legacy_ID + ' appears more than once. Cannot be duplicate',
  1041. 0
  1042. FROM #Import_Staging stag
  1043. WHERE EXISTS(SELECT TOP 1 * FROM #Import_Staging stag2 WHERE stag2.ExcelRowNumber <> stag.ExcelRowNumber AND stag2.Legacy_Site_ID = stag.Legacy_Site_ID AND stag2.Legacy_ID = stag.Legacy_ID)
  1044. AND @Record_Type = 'Company'
  1045.  
  1046. END
  1047.  
  1048.  
  1049.  
  1050. -- Auto-differential
  1051. -- Exclude records which were not mapped to a company (Company deleted by partner)
  1052. DELETE stag
  1053. FROM #Import_Staging stag
  1054. WHERE Company_RecID IS NULL
  1055. AND Legacy_Company_ID IS NOT NULL
  1056. AND @Record_Type NOT IN('Company', 'Site')
  1057.  
  1058. -- Exclude sites already imported
  1059. DELETE stag
  1060. FROM #Import_Staging stag
  1061. WHERE Company_Address_RecID IS NOT NULL
  1062. AND @Record_Type = 'Site'
  1063.  
  1064. -- If contact not specified, map to default contact (or oldest contact, if no default exists)
  1065. UPDATE stag
  1066. SET stag.Contact_RecID = cont.Contact_RecID
  1067. FROM #Import_Staging stag
  1068. CROSS APPLY(SELECT TOP 1 * FROM dbo.Contact cont WHERE cont.Company_RecID = stag.Company_RecID ORDER BY Default_Flag DESC, Contact_RecID ASC)cont
  1069. WHERE stag.Contact_RecID IS NULL
  1070. AND @Record_Type NOT IN('Contact', 'Company', 'Site')
  1071.  
  1072. -- If no contact specified, and none exists, create a contact
  1073. INSERT INTO dbo.Contact
  1074. (
  1075. Owner_ID,
  1076. Company_RecID,
  1077. Seq_Nbr,
  1078. First_Name,
  1079. Last_Name,
  1080. Last_Update,
  1081. Updated_By,
  1082. Default_Flag
  1083. )
  1084.  
  1085. SELECT DISTINCT
  1086. 1,
  1087. stag.Company_RecID,
  1088. 0,
  1089. 'Imported',
  1090. 'Contact',
  1091. GETDATE(),
  1092. 'Import',
  1093. 0
  1094. FROM #Import_Staging stag
  1095. WHERE Company_RecID IS NOT NULL
  1096. AND Contact_RecID IS NULL
  1097. AND @Record_Type NOT IN('Contact', 'Company', 'Site')
  1098.  
  1099. UPDATE stag
  1100. SET stag.Contact_RecID = cont.Contact_RecID
  1101. FROM #Import_Staging stag
  1102. CROSS APPLY(SELECT TOP 1 * FROM dbo.Contact cont WHERE cont.Company_RecID = stag.Company_RecID ORDER BY Default_Flag DESC, Contact_RecID ASC)cont
  1103. WHERE stag.Legacy_Contact_ID IS NULL
  1104. AND @Record_Type NOT IN('Contact', 'Company', 'Site')
  1105.  
  1106.  
  1107. END
  1108.  
  1109.  
  1110. GO
  1111.  
  1112.  
  1113.  
  1114.  
  1115.  
  1116. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Import_Legacy_IDs')
  1117. BEGIN
  1118. EXEC('CREATE PROCEDURE [dbo].[usp_Import_Legacy_IDs] AS SELECT 1')
  1119. END
  1120. GO
  1121.  
  1122. -- =============================================
  1123. -- Author: m.gray
  1124. -- Create date: 07/30/2014
  1125. -- Description: Insert legacy_id's for imported
  1126. -- records, creates table for this purposes if needed
  1127. -- Sample call: exec usp_Import_Legacy_IDs 'Ticket'
  1128. -- =============================================
  1129.  
  1130. ALTER PROCEDURE [dbo].[usp_Import_Legacy_IDs]
  1131. AS
  1132. BEGIN
  1133.  
  1134. -- Create table to hold legacy_id's
  1135. IF OBJECT_ID('Import_Legacy_ID_Custom') IS NULL
  1136. BEGIN
  1137. CREATE TABLE dbo.Import_Legacy_ID_Custom
  1138. (
  1139. Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  1140. CW_RecID INT,
  1141. Record_Type NVARCHAR(255) COLLATE DATABASE_DEFAULT
  1142. )
  1143. END
  1144.  
  1145.  
  1146. -- Insert Legacy_ID's from #Legacy_IDs
  1147. INSERT INTO dbo.Import_Legacy_ID_Custom
  1148. (
  1149. Legacy_ID,
  1150. CW_RecID,
  1151. Record_Type
  1152. )
  1153. SELECT DISTINCT
  1154. Legacy_ID,
  1155. CW_RecID,
  1156. Record_Type
  1157. FROM #Legacy_IDs
  1158.  
  1159. END
  1160. GO
  1161.  
  1162. IF OBJECT_ID('ufn_Prepare_Company_Name') IS NOT NULL
  1163. BEGIN
  1164. DROP FUNCTION ufn_Prepare_Company_Name
  1165. END
  1166. GO
  1167.  
  1168. -- Function to strip company names of certain strings and symbols
  1169. -- Allows for fuzzy matching to solve common errors with partner data entry (i.e. "ABC Company" vs. "ABC Company, Inc.")
  1170. -- Fuzzy matching displays as a warning message for common sense check, and is only attempted if primary validation fails
  1171. CREATE FUNCTION dbo.ufn_Prepare_Company_Name
  1172. (
  1173. @CompanyName NVARCHAR(100)
  1174. )
  1175. RETURNS NVARCHAR(100)
  1176. AS
  1177. BEGIN
  1178. DECLARE @RetVal NVARCHAR(100)
  1179. SELECT @RetVal = @CompanyName
  1180. SELECT @RetVal = REPLACE(@RetVal, 'Incorporated', '')
  1181. SELECT @RetVal = REPLACE(@RetVal, 'p/l', '')
  1182. SELECT @RetVal = REPLACE(@RetVal, 'Corporation', '')
  1183. SELECT @RetVal = REPLACE(@RetVal, '& Co', '')
  1184. SELECT @RetVal = REPLACE(@RetVal, ', LP', '')
  1185. SELECT @RetVal = REPLACE(@RetVal, 'l.p.', '')
  1186. SELECT @RetVal = REPLACE(@RetVal, ' AND ', '')
  1187. SELECT @RetVal = REPLACE(@RetVal, '&', '')
  1188. SELECT @RetVal = REPLACE(@RetVal, '.', '')
  1189. SELECT @RetVal = REPLACE(@RetVal, ' Inc', '')
  1190. SELECT @RetVal = REPLACE(@RetVal, 'LLC', '')
  1191. SELECT @RetVal = REPLACE(@RetVal, 'Corp', '')
  1192. SELECT @RetVal = REPLACE(@RetVal, '-', '')
  1193. SELECT @RetVal = REPLACE(@RetVal, ',', '')
  1194. SELECT @RetVal = REPLACE(@RetVal, ' ', '')
  1195. RETURN @RetVal
  1196. END
  1197. GO
  1198.  
  1199.  
  1200. IF NOT EXISTS(SELECT TOP 1 * FROM sys.objects WHERE name = 'ufn_Import_Trim')
  1201. BEGIN
  1202. EXEC('CREATE FUNCTION dbo.ufn_Import_Trim() RETURNS INT BEGIN RETURN 1 END')
  1203. END
  1204. GO
  1205.  
  1206. -- Function to trim spaces from referenced columns in CW, to correspond with trimmed values from spreadsheet
  1207. ALTER FUNCTION dbo.ufn_Import_Trim(@string VARCHAR(MAX))
  1208. RETURNS VARCHAR(MAX)
  1209. BEGIN
  1210. RETURN LTRIM(RTRIM(@string))
  1211. END
  1212. GO
  1213.  
  1214. IF NOT EXISTS(SELECT TOP 1 * FROM sys.objects WHERE name = 'ufn_Import_Decode')
  1215. BEGIN
  1216. EXEC('CREATE FUNCTION dbo.ufn_Import_Decode() RETURNS INT BEGIN RETURN 1 END')
  1217. END
  1218. GO
  1219.  
  1220. -- Function to decode delimiters in question/answer strings for configuration import
  1221. ALTER FUNCTION dbo.ufn_Import_Decode(@string nvarchar(max))
  1222. RETURNS nvarchar(max)
  1223. AS
  1224. BEGIN
  1225. DECLARE @count int, @c char(1), @cenc char(2), @i int, @stringReturn nvarchar(max)
  1226. SET @count = Len(@string)
  1227. SET @i = 1
  1228. SET @stringReturn = ''
  1229. WHILE (@i <= @count)
  1230. BEGIN
  1231. SET @c = substring(@string, @i, 1)
  1232. IF @c LIKE '[!%]' ESCAPE '!'
  1233. BEGIN
  1234. SET @cenc = substring(@string, @i + 1, 2)
  1235. SET @c = CHAR(CASE WHEN SUBSTRING(@cenc, 1, 1) LIKE '[0-9]'
  1236. THEN CAST(SUBSTRING(@cenc, 1, 1) as int)
  1237. ELSE CAST(ASCII(UPPER(SUBSTRING(@cenc, 1, 1)))-55 as int)
  1238. END * 16 +
  1239. CASE WHEN SUBSTRING(@cenc, 2, 1) LIKE '[0-9]'
  1240. THEN CAST(SUBSTRING(@cenc, 2, 1) as int)
  1241. ELSE CAST(ASCII(UPPER(SUBSTRING(@cenc, 2, 1)))-55 as int)
  1242. END)
  1243. SET @stringReturn = @stringReturn + @c
  1244. SET @i = @i + 2
  1245. END
  1246. ELSE
  1247. BEGIN
  1248. SET @stringReturn = @stringReturn + @c
  1249. END
  1250. SET @i = @i +1
  1251. END
  1252. RETURN @stringReturn
  1253. END
  1254. GO
  1255.  
  1256. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Import_Match_Companies')
  1257. BEGIN
  1258. EXEC('CREATE PROCEDURE [dbo].[usp_Import_Match_Companies] AS SELECT 1')
  1259. END
  1260. GO
  1261. -- =============================================
  1262. -- Author: m.gray
  1263. -- Create date: 01/24/2014
  1264. -- Description: Matches companies and contacts to values provided in import spreadsheet. Inserts contacts as necessary if force mode enabled
  1265. -- Used for all imports to eliminate redundant logic.
  1266. -- =============================================
  1267.  
  1268. ALTER PROCEDURE [dbo].[usp_Import_Match_Companies]
  1269. @ForceMode BIT = 0,
  1270. @ImportBatchUser VARCHAR(15)
  1271. AS
  1272. BEGIN
  1273.  
  1274. SET NOCOUNT ON
  1275.  
  1276. -- PSA does not allow spaces at beginning or end when saving a company or contact name or company id
  1277. -- Trim any that exist (just in case) to make sure it is safe to ignore spaces throughout import
  1278. IF EXISTS(SELECT TOP 1 * FROM dbo.Company WHERE Company_Name LIKE('% ') OR Company_Name LIKE(' %'))
  1279. BEGIN
  1280. UPDATE comp
  1281. SET Company_Name = dbo.ufn_import_trim(Company_Name)
  1282. FROM dbo.Company comp
  1283. WHERE Company_Name LIKE('% ') OR Company_Name LIKE(' %')
  1284. END
  1285.  
  1286. IF EXISTS(SELECT TOP 1 * FROM dbo.Contact WHERE First_Name LIKE('% ') OR First_name LIKE(' %'))
  1287. BEGIN
  1288. UPDATE cont
  1289. SET First_Name = dbo.ufn_import_trim(First_Name)
  1290. FROM dbo.Contact cont
  1291. WHERE First_Name LIKE('% ') OR First_Name LIKE(' %')
  1292.  
  1293. END
  1294. IF EXISTS(SELECT TOP 1 * FROM dbo.Contact WHERE Last_Name LIKE('% ') OR Last_name LIKE(' %'))
  1295. BEGIN
  1296. UPDATE cont
  1297. SET Last_Name = dbo.ufn_import_trim(Last_Name)
  1298. FROM dbo.Contact cont
  1299. WHERE Last_Name LIKE('% ') OR Last_Name LIKE(' %')
  1300. END
  1301.  
  1302. -- Flag duplicate company names in company table
  1303. UPDATE comp
  1304. SET comp.Duplicate_Flag = 1
  1305. FROM #Company comp
  1306. WHERE comp.Company_Name IN
  1307. (
  1308. SELECT Company_Name
  1309. FROM #Company
  1310. GROUP BY Company_Name
  1311. HAVING COUNT(*) > 1
  1312. )
  1313.  
  1314. -- Initialize duplicate flag to 0
  1315. UPDATE #Import_Staging
  1316. SET Company_Duplicate_Flag = 0
  1317.  
  1318. -- Point any rows where Company_Name = '<Internal Company>' to the company specified in dbo.Owner
  1319. UPDATE stag
  1320. SET stag.Company_Name = comp.Company_Name
  1321. FROM #Import_Staging stag
  1322. CROSS APPLY(SELECT TOP 1 Company_RecID FROM dbo.Owner) own
  1323. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = own.Company_RecID)comp
  1324. WHERE stag.Company_Name = '<Internal Company>'
  1325.  
  1326. IF OBJECT_ID('Import_Legacy_ID_Custom') IS NOT NULL
  1327. BEGIN
  1328. -- Use Legacy_Company_ID to grab Company_RecID
  1329. UPDATE stag
  1330. SET stag.Company_RecID = leg.CW_RecID,
  1331. stag.Duplicate_Flag = 0
  1332. FROM #Import_Staging stag
  1333. CROSS APPLY(SELECT * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Company_ID AND leg.Record_Type = 'Company') leg
  1334.  
  1335. -- Remove any rows where company has been deleted
  1336. DELETE stag
  1337. FROM #Import_Staging stag
  1338. OUTER APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = stag.Company_RecID AND comp.Delete_Flag = 0)comp
  1339. WHERE stag.Company_RecID IS NOT NULL
  1340. AND stag.Company_RecID <> ''
  1341. AND comp.Company_RecID IS NULL
  1342.  
  1343. END
  1344.  
  1345. -- Use company_name to grab Company_RecID
  1346. UPDATE tmp
  1347. SET tmp.Company_RecID = comp.Company_RecID,
  1348. tmp.Company_Duplicate_Flag = comp.Duplicate_Flag
  1349. FROM #Import_Staging tmp
  1350. INNER JOIN #Company comp
  1351. ON tmp.Company_Name = comp.Company_Name
  1352. WHERE tmp.Company_RecID IS NULL
  1353.  
  1354. -- If unique company not found on name, attempt to find by Company_ID
  1355. UPDATE tmp
  1356. SET tmp.Company_RecID = comp.Company_RecID,
  1357. tmp.Company_Duplicate_Flag = 0
  1358. FROM #Import_Staging tmp
  1359. INNER JOIN #Company comp
  1360. ON tmp.Company_Name = comp.Company_ID
  1361. WHERE tmp.Company_RecID IS NULL
  1362. OR tmp.Company_Duplicate_Flag = 1
  1363.  
  1364. IF OBJECT_ID('tempdb..#DuplicateContacts') IS NOT NULL
  1365. BEGIN
  1366. DROP TABLE #DuplicateContacts
  1367. END
  1368.  
  1369. -- Table to hold duplicate contacts
  1370. SELECT
  1371. ContactName,
  1372. comp.Company_Name
  1373. INTO #DuplicateContacts
  1374. FROM #Contact cont
  1375. INNER JOIN #Company comp
  1376. ON cont.Company_RecID = comp.Company_RecID
  1377. GROUP BY Company_Name, ContactName, cont.Company_RecID
  1378. HAVING COUNT(*) > 1
  1379.  
  1380. -- Update Contact Name to null if single space or empty string
  1381. UPDATE #Import_Staging
  1382. SET ContactName = NULL
  1383. WHERE LTRIM(RTRIM(ContactName)) = ''
  1384.  
  1385. -- For duplicate companies, see if we can uniquely identify the company on combination of Company + Contact names
  1386. UPDATE tmp
  1387. SET tmp.Company_RecID = comp.Company_RecID,
  1388. tmp.Contact_RecID = cont.Contact_RecID,
  1389. tmp.Company_Duplicate_Flag = 0
  1390. FROM #Import_Staging tmp
  1391. INNER JOIN #Company comp
  1392. ON comp.Company_Name = tmp.Company_Name
  1393. INNER JOIN #Contact cont
  1394. ON cont.ContactName = tmp.ContactName
  1395. AND cont.Company_RecID = comp.Company_RecID
  1396. LEFT OUTER JOIN #DuplicateContacts dups
  1397. ON dups.ContactName = tmp.ContactName
  1398. AND dups.Company_Name = tmp.Company_Name
  1399. WHERE tmp.Company_Duplicate_Flag = 1
  1400. AND dups.Company_Name IS NULL
  1401.  
  1402. -- If company still not found, strip company names
  1403. -- From staging table
  1404. UPDATE tmp
  1405. SET tmp.Company_Name_Stripped = dbo.ufn_Prepare_Company_Name(tmp.Company_Name)
  1406. FROM #Import_Staging tmp
  1407. INNER JOIN #Company comp
  1408. ON comp.Company_Match_Val = tmp.Company_Match_Val
  1409. WHERE tmp.Company_RecID IS NULL
  1410. AND tmp.Company_Duplicate_Flag = 0
  1411.  
  1412. -- And company Table
  1413. UPDATE comp
  1414. SET comp.Company_Name_Stripped = dbo.ufn_Prepare_Company_Name(comp.Company_Name)
  1415. FROM #Company comp
  1416. INNER JOIN #Import_Staging tmp
  1417. ON comp.Company_Match_Val = tmp.Company_Match_Val
  1418. AND tmp.Company_RecID IS NULL
  1419. AND tmp.Company_Name_Stripped IS NOT NULL
  1420.  
  1421. -- Attempt fuzzy match to locate any remaining companies
  1422. UPDATE tmp
  1423. SET tmp.Company_RecID = comp.Company_RecID,
  1424. tmp.Company_Name_Fuzzy = comp.Company_Name
  1425. FROM #Import_Staging tmp
  1426. INNER JOIN #Company comp
  1427. ON tmp.Company_Name_Stripped = comp.Company_Name_Stripped
  1428. AND comp.Company_Name <> tmp.Company_Name
  1429. AND comp.Duplicate_Flag = 0
  1430. WHERE tmp.Company_RecID IS NULL
  1431. AND tmp.Company_Duplicate_Flag = 0
  1432.  
  1433. -- Get Contact_RecID if contact specified
  1434. UPDATE tmp
  1435. SET tmp.Contact_RecID = cont.Contact_RecID
  1436. FROM #Import_Staging tmp
  1437. INNER JOIN #Contact cont
  1438. ON cont.Company_RecID = tmp.Company_RecID
  1439. AND tmp.ContactName = cont.ContactName
  1440. WHERE tmp.Contact_RecID IS NULL
  1441.  
  1442. -- Get primary Contact_RecID if no contact specified
  1443. UPDATE tmp
  1444. SET tmp.Contact_RecID = cont.Contact_RecID
  1445. FROM #Import_Staging tmp
  1446. INNER JOIN #Contact cont
  1447. ON cont.Company_RecID = tmp.Company_RecID
  1448. AND cont.Default_Flag = 1
  1449. WHERE tmp.ContactName IS NULL
  1450.  
  1451. -- Update Contact Duplicate flag as necessary
  1452. UPDATE tmp
  1453. SET tmp.Contact_Duplicate_Flag = 1
  1454. FROM #Import_Staging tmp
  1455. INNER JOIN #Contact cont
  1456. ON cont.Company_RecID = tmp.Company_RecID
  1457. AND cont.ContactName = tmp.ContactName
  1458. AND cont.Contact_RecID <> tmp.Contact_RecID
  1459. WHERE tmp.Contact_RecID IS NOT NULL
  1460.  
  1461. -- If contact is specified, but not found, try to fuzzy match on last name
  1462. UPDATE tmp
  1463. SET tmp.Contact_RecID = cont.Contact_RecID,
  1464. tmp.Contact_Name_Fuzzy = cont.ContactName
  1465. FROM #Import_Staging tmp
  1466. INNER JOIN #Contact cont
  1467. ON tmp.Company_RecID = cont.Company_RecID
  1468. AND tmp.ContactName LIKE('%' + cont.Last_Name + '%')
  1469. WHERE tmp.ContactName IS NOT NULL
  1470. AND cont.Last_Name <> ''
  1471. AND LEN(cont.Last_Name) > 3
  1472. AND tmp.Contact_RecID IS NULL
  1473.  
  1474. -- Company/Contact force mode
  1475. IF @ForceMode = 1
  1476. BEGIN
  1477.  
  1478. -- If company or contact is duplicate, use first instance of company and tick duplicate flag to 0 to bypass validation
  1479. UPDATE tmp
  1480. SET tmp.Company_Duplicate_Flag = 0,
  1481. tmp.Contact_Duplicate_Flag = 0
  1482. FROM #Import_Staging tmp
  1483.  
  1484. -- If no contact specified, and no default exists - attempt to assign to any contact
  1485. UPDATE tmp
  1486. SET tmp.Contact_RecID = cont.Contact_RecID
  1487. FROM #Import_Staging tmp
  1488. INNER JOIN #Contact cont
  1489. ON cont.Company_RecID = tmp.Company_RecID
  1490. WHERE tmp.Contact_RecID IS NULL
  1491. AND (tmp.ContactName IS NULL OR tmp.ContactName = '')
  1492.  
  1493. -- If no contact specified, and no contact exists for company, update contact to 'Imported Contact'
  1494. UPDATE tmp
  1495. SET tmp.ContactName = 'Imported Contact'
  1496. FROM #Import_Staging tmp
  1497. WHERE tmp.ContactName IS NULL
  1498. AND tmp.Contact_recID IS NULL
  1499. AND ISNULL(tmp.Company_Duplicate_Flag, 0) = 0
  1500. AND tmp.Company_RecID IS NOT NULL
  1501.  
  1502.  
  1503. -- Create contacts as necessary
  1504. INSERT INTO dbo.Contact
  1505. (
  1506. Owner_ID,
  1507. Company_RecID,
  1508. Seq_Nbr,
  1509. First_Name,
  1510. Last_Name,
  1511. Last_Update,
  1512. Updated_By,
  1513. Default_Flag
  1514. )
  1515.  
  1516. SELECT DISTINCT
  1517. 1,
  1518. comp.Company_RecID,
  1519. 0,
  1520. LEFT(LTRIM(RTRIM(CASE WHEN tmp.ContactName LIKE('% %') THEN SUBSTRING(tmp.ContactName, 1, CHARINDEX(' ', tmp.ContactName,3)-1) ELSE tmp.ContactName END)), 30) AS First_Name,
  1521. LEFT(LTRIM(RTRIM(CASE WHEN tmp.ContactName LIKE('% %') THEN SUBSTRING(tmp.ContactName, CHARINDEX(' ', tmp.ContactName,1)+1, 30) ELSE '' END)), 30) AS Last_Name,
  1522. GETDATE(),
  1523. @ImportBatchUser,
  1524. 0
  1525. FROM #Import_Staging tmp
  1526. INNER JOIN #Company comp
  1527. ON comp.Company_RecID = tmp.Company_RecID
  1528. WHERE tmp.Contact_RecID IS NULL
  1529. AND tmp.ContactName IS NOT NULL
  1530. AND tmp.ContactName NOT LIKE('_ %')
  1531.  
  1532. INSERT INTO dbo.Contact
  1533. (
  1534. Owner_ID,
  1535. Company_RecID,
  1536. Seq_Nbr,
  1537. First_Name,
  1538. Last_Name,
  1539. Last_Update,
  1540. Updated_By,
  1541. Default_Flag
  1542. )
  1543.  
  1544. SELECT DISTINCT
  1545. 1,
  1546. comp.Company_RecID,
  1547. 0,
  1548. LEFT(ContactName, 1) AS First_Name,
  1549. SUBSTRING(ContactName, 3, 30) AS Last_Name,
  1550. GETDATE(),
  1551. @ImportBatchUser,
  1552. 0
  1553. FROM #Import_Staging tmp
  1554. INNER JOIN #Company comp
  1555. ON comp.Company_RecID = tmp.Company_RecID
  1556. WHERE tmp.Contact_RecID IS NULL
  1557. AND tmp.ContactName IS NOT NULL
  1558. AND tmp.ContactName LIKE('_ %')
  1559.  
  1560.  
  1561.  
  1562. -- Add newly inserted contacts to #Contact
  1563. INSERT INTO #Contact
  1564. (
  1565. Contact_RecID,
  1566. ContactName,
  1567. First_Name,
  1568. Last_Name,
  1569. Company_RecID,
  1570. Default_Flag
  1571. )
  1572. SELECT
  1573. cont.Contact_RecID,
  1574. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  1575. First_Name,
  1576. Last_Name,
  1577. cont.Company_RecID,
  1578. Default_Flag
  1579. FROM dbo.Contact cont
  1580. WHERE Updated_By = @ImportBatchUser
  1581.  
  1582. -- Update staging table with RecID of newly inserted contacts
  1583. UPDATE tmp
  1584. SET tmp.Contact_RecID = cont.Contact_RecID
  1585. FROM #Import_Staging tmp
  1586. INNER JOIN #Contact cont
  1587. ON tmp.ContactName = cont.ContactName
  1588. AND tmp.Company_RecID = cont.Company_RecID
  1589. WHERE tmp.Contact_RecID IS NULL
  1590. END
  1591. END
  1592.  
  1593. GO
  1594.  
  1595.  
  1596. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Condense_Validation_Results')
  1597. BEGIN
  1598. EXEC('CREATE PROCEDURE [dbo].[usp_Condense_Validation_Results] AS SELECT 1')
  1599. END
  1600. GO
  1601. ALTER PROCEDURE [dbo].[usp_Condense_Validation_Results]
  1602. AS
  1603. BEGIN
  1604.  
  1605. IF OBJECT_ID('tempdb..#Results_Staging') IS NOT NULL
  1606. DROP TABLE #Results_Staging
  1607.  
  1608. SELECT ValMsg, RowNumber, RowNumber+1 AS Next_Row, RowNumber-1 AS Prev_Row, ReferenceType
  1609. INTO #Results_Staging
  1610. FROM #tblResults
  1611.  
  1612. CREATE INDEX IX_Next ON #Results_Staging(ValMsg, Next_Row)
  1613. CREATE INDEX IX_Curr ON #Results_Staging(ValMsg, RowNumber)
  1614. CREATE INDEX IX_Prev ON #Results_Staging(ValMsg, Prev_Row)
  1615.  
  1616. IF OBJECT_ID('tempdb..#StartEnd') IS NOT NULL
  1617. BEGIN
  1618. DROP TABLE #StartEnd
  1619. END
  1620.  
  1621. IF OBJECT_ID('tempdb..#StartEnd') IS NOT NULL
  1622. BEGIN
  1623. DROP TABLE #StartEnd
  1624. END
  1625.  
  1626. SELECT
  1627. RowNumber,
  1628. 1 AS StartRange,
  1629. 1 AS EndRange,
  1630. ValMsg
  1631. INTO #StartEnd
  1632. FROM #Results_Staging curr
  1633. WHERE NOT EXISTS(SELECT TOP 1 * FROM #Results_Staging prev WHERE prev.RowNumber = curr.Prev_Row AND prev.ValMsg = curr.ValMsg)
  1634. AND NOT EXISTS(SELECT TOP 1 * FROM #Results_Staging nxt WHERE nxt.RowNumber = curr.Next_Row AND nxt.ValMsg = curr.ValMsg)
  1635. AND curr.ReferenceType IS NULL
  1636.  
  1637. UNION ALL
  1638.  
  1639. SELECT
  1640. RowNumber,
  1641. 0 AS StartRange,
  1642. 1 AS EndRange,
  1643. ValMsg
  1644. FROM #Results_Staging curr
  1645. WHERE EXISTS(SELECT TOP 1 * FROM #Results_Staging prev WHERE prev.RowNumber = curr.Prev_Row AND prev.ValMsg = curr.ValMsg)
  1646. AND NOT EXISTS(SELECT TOP 1 * FROM #Results_Staging nxt WHERE nxt.RowNumber = curr.Next_Row AND nxt.ValMsg = curr.ValMsg)
  1647. AND curr.ReferenceType IS NULL
  1648.  
  1649. UNION ALL
  1650.  
  1651. SELECT
  1652. RowNumber,
  1653. 1 AS StartRange,
  1654. 0 AS EndRange,
  1655. ValMsg
  1656. FROM #Results_Staging curr
  1657. WHERE NOT EXISTS(SELECT TOP 1 * FROM #Results_Staging prev WHERE prev.RowNumber = curr.Prev_Row AND prev.ValMsg = curr.ValMsg)
  1658. AND EXISTS(SELECT TOP 1 * FROM #Results_Staging nxt WHERE nxt.RowNumber = curr.Next_Row AND nxt.ValMsg = curr.ValMsg)
  1659. AND curr.ReferenceType IS NULL
  1660.  
  1661. UNION ALL
  1662.  
  1663. SELECT
  1664. RowNumber,
  1665. 0 AS StartRange,
  1666. 0 AS EndRange,
  1667. ValMsg
  1668. FROM #Results_Staging curr
  1669. WHERE EXISTS(SELECT TOP 1 * FROM #Results_Staging prev WHERE prev.RowNumber = curr.Prev_Row AND prev.ValMsg = curr.ValMsg)
  1670. AND EXISTS(SELECT TOP 1 * FROM #Results_Staging nxt WHERE nxt.RowNumber = curr.Next_Row AND nxt.ValMsg = curr.ValMsg)
  1671. AND curr.ReferenceType IS NULL
  1672.  
  1673. CREATE INDEX IX_Cover ON #StartEnd(RowNumber, ValMsg, EndRange)
  1674.  
  1675. IF OBJECT_ID('tempdb..#Ranges') IS NOT NULL
  1676. BEGIN
  1677. DROP TABLE #Ranges
  1678. END
  1679.  
  1680. SELECT CASE WHEN MIN(r1.RowNumber) = er.EndNum THEN CONVERT(NVARCHAR,MIN(r1.RowNumber)) ELSE CONVERT(NVARCHAR, MIN(r1.RowNumber)) + '-' + CONVERT(NVARCHAR, er.EndNum) END AS RowRange, r1.ValMsg, MIN(r1.RowNumber) AS StartRow
  1681. INTO #Ranges
  1682. FROM #StartEnd r1
  1683. CROSS APPLY(SELECT TOP 1 er.RowNumber AS EndNum FROM #StartEnd er WHERE er.RowNumber >= r1.RowNumber AND EndRange = 1 AND ValMsg = r1.ValMsg ORDER BY er.RowNumber ASC)er
  1684. GROUP BY er.EndNum, r1.ValMsg
  1685. ORDER BY MIN(r1.RowNumber) ASC
  1686.  
  1687. INSERT INTO #ResultsCondensed
  1688. (
  1689. RowNumber,
  1690. ValMsg
  1691. )
  1692.  
  1693. SELECT
  1694. 0,
  1695. [ValMsg] + ' on row(s): ' +
  1696. STUFF((
  1697. SELECT ', ' + CAST(RowRange AS NVARCHAR(MAX))
  1698. FROM #Ranges WHERE (ValMsg = Results.ValMsg) ORDER BY StartRow ASC
  1699. FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
  1700. ,1,2,'') AS NameValues
  1701. FROM #Ranges Results
  1702. GROUP BY ValMsg
  1703.  
  1704. END
  1705.  
  1706. GO
  1707.  
  1708.  
  1709.  
  1710. -- Service ticket
  1711. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_SR_ImportValidate')
  1712. BEGIN
  1713. EXEC('CREATE PROCEDURE [dbo].[usp_SR_ImportValidate] AS SELECT 1')
  1714. END
  1715. GO
  1716.  
  1717. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_SR_ImportPush')
  1718. BEGIN
  1719. EXEC('CREATE PROCEDURE [dbo].[usp_SR_ImportPush] AS SELECT 1')
  1720. END
  1721. GO
  1722.  
  1723.  
  1724.  
  1725. -- =============================================
  1726. -- Author: m.gray
  1727. -- Create date: 03/14/2013
  1728. -- Description: Validates data in temp table
  1729. -- tempdb.dbo.TMP_SR_Conversion - for Service
  1730. -- Ticket Import
  1731. -- Sample call: EXEC usp_SR_ImportValidate 'TMP_Import_d87ef5f6d26a43a0aff96bfca8882ad2', 'TMP_Time_d87ef5f6d26a43a0aff96bfca8882ad2', 1
  1732. -- =============================================
  1733.  
  1734. ALTER PROCEDURE [dbo].[usp_SR_ImportValidate]
  1735. @TableName VARCHAR(255),
  1736. @TETableName VARCHAR(255) = NULL,
  1737. @ForceMode BIT = 0
  1738. AS
  1739. BEGIN TRY
  1740.  
  1741. SET NOCOUNT ON
  1742.  
  1743. -- Handle instance where front end passes string 'Null' for @TETableName
  1744. IF @TETableName = 'NULL'
  1745. BEGIN
  1746. SET @TETableName = NULL
  1747. END
  1748.  
  1749. -- Variable declaration
  1750. -- Dynamic statement to insert to staging table
  1751. DECLARE @DSQL VARCHAR(MAX)
  1752.  
  1753. -- Fully qualified name of source tables
  1754. DECLARE @SourceTable VARCHAR(300)
  1755. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  1756.  
  1757. DECLARE @TESourceTable VARCHAR(300)
  1758. SELECT @TESourceTable = 'tempdb.dbo.' + @TETableName
  1759.  
  1760. -- Object_ID of source table
  1761. DECLARE @Source_Object_ID INT
  1762. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  1763.  
  1764. DECLARE
  1765. @ImportBatchUser VARCHAR(15), -- Unique value to identify records created by this import
  1766. @Billing_Unit_Loc_RecID INT, -- RecID from Billing_Unit_Loc to associate with Archive service boards created in force mode
  1767. @Migration_Flag BIT -- Indicates a canned data migration (i.e. Autotask/Tigerpaw)
  1768.  
  1769. SELECT @Migration_Flag = 0
  1770.  
  1771. -- Flag to indicate migration being matched on Legacy_ID
  1772. DECLARE @Legacy_Flag BIT = 0
  1773.  
  1774. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  1775. SELECT @ImportBatchUser =
  1776. 'CONV_'
  1777. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  1778. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  1779. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  1780. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  1781.  
  1782. IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
  1783. BEGIN
  1784. DROP TABLE #tblResults
  1785. END
  1786.  
  1787. -- Table to hold results of procedure
  1788. CREATE TABLE #tblResults
  1789. (
  1790. RowNumber INT,
  1791. ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
  1792. InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  1793. ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  1794. Warning_Flag BIT DEFAULT 0
  1795. )
  1796.  
  1797. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  1798.  
  1799. -- Table to hold condensed summary results
  1800. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  1801. BEGIN
  1802. DROP TABLE #ResultsCondensed
  1803. END
  1804.  
  1805. CREATE TABLE #ResultsCondensed
  1806. (
  1807. RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  1808. ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  1809. )
  1810.  
  1811. -- Table to hold source data for this batch from temp table
  1812. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  1813. BEGIN
  1814. DROP TABLE #Import_Staging
  1815. END
  1816.  
  1817. CREATE TABLE #Import_Staging
  1818. (
  1819. ExcelRowNumber INT NOT NULL,
  1820. BoardName nvarchar(50) COLLATE DATABASE_DEFAULT NULL,
  1821. Company_Name nvarchar(50) COLLATE DATABASE_DEFAULT NULL,
  1822. ContactName varchar(100) COLLATE DATABASE_DEFAULT NULL,
  1823. SR_Board_RecID int NULL,
  1824. SrStatus varchar(50) COLLATE DATABASE_DEFAULT NULL,
  1825. SrType varchar(50) COLLATE DATABASE_DEFAULT NULL,
  1826. SrSubType varchar(50) COLLATE DATABASE_DEFAULT NULL,
  1827. SrItem varchar(50) COLLATE DATABASE_DEFAULT NULL,
  1828. SrSource varchar(50) COLLATE DATABASE_DEFAULT NULL,
  1829. SrLocation varchar(50) COLLATE DATABASE_DEFAULT NULL,
  1830. SrPriority varchar(50) COLLATE DATABASE_DEFAULT NULL,
  1831. Summary varchar(100) COLLATE DATABASE_DEFAULT NULL,
  1832. DetailDescription nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  1833. InternalAnalysis nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  1834. Resolution nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  1835. AssignedBy varchar(100) COLLATE DATABASE_DEFAULT NULL,
  1836. DateEntered VARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  1837. DateCompleted VARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  1838. ConfigName varchar(100) COLLATE DATABASE_DEFAULT NULL,
  1839. ResourceMember varchar(100) COLLATE DATABASE_DEFAULT NULL,
  1840. NewSrRecid int NULL,
  1841. ConvertMessage varchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  1842. Config_RecID INT NULL,
  1843. Legacy_ID VARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  1844. Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  1845. Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  1846. Legacy_Site_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  1847. Company_RecID INT NULL,
  1848. Company_Name_Stripped NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  1849. Company_Name_Fuzzy NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  1850. Company_Duplicate_Flag BIT NULL,
  1851. Contact_RecID INT NULL,
  1852. Contact_Duplicate_Flag BIT NULL,
  1853. Contact_Name_Fuzzy NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  1854. Company_Match_Val NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  1855. SR_Type_RecID INT,
  1856. SR_SubType_RecID INT,
  1857. SR_SubtypeItem_RecID INT,
  1858. Diff_Exclude_Flag BIT,
  1859. Company_Address_RecID INT,
  1860. Legacy_Ticket_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  1861. SR_Service_RecID INT,
  1862. Legacy_Opp_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  1863. SO_Opportunity_RecID INT,
  1864. Duplicate_Flag BIT DEFAULT 0
  1865. )
  1866.  
  1867. CREATE INDEX IX_BoardName ON #Import_Staging(BoardName)
  1868. CREATE INDEX IX_SrStatus ON #Import_Staging(SrStatus)
  1869. CREATE INDEX IX_SrType ON #Import_Staging(SrType)
  1870. CREATE INDEX IX_SrSubType ON #Import_Staging(SrSubtype)
  1871. CREATE INDEX IX_SrItem ON #Import_Staging(SrItem)
  1872. CREATE INDEX IX_SrSource ON #Import_Staging(SrSource)
  1873. CREATE INDEX IX_SrLocation ON #Import_Staging(SrLocation)
  1874. CREATE INDEX IX_SrPriority ON #Import_Staging(SrPriority)
  1875. CREATE INDEX IX_AssignedBy ON #Import_Staging(AssignedBy)
  1876. CREATE INDEX IX_ConfigName ON #Import_Staging(ConfigName)
  1877. CREATE INDEX IX_ResourceMember ON #Import_Staging(ResourceMember)
  1878. CREATE INDEX IX_Comp_Leg ON #Import_Staging(Legacy_Company_ID)
  1879. CREATE INDEX IX_Cont_Leg ON #Import_Staging(Legacy_Contact_ID)
  1880.  
  1881. -- Add Legacy_ID field to staging table to avoid any compilation errors based on structure
  1882. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_ID')
  1883. BEGIN
  1884. SELECT @DSQL =
  1885. '
  1886. ALTER TABLE ' + @SourceTable + '
  1887. ADD Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT
  1888. '
  1889.  
  1890. EXEC(@DSQL)
  1891.  
  1892. END
  1893.  
  1894. -- Add Legacy_Company_ID field to staging table to avoid any compilation errors based on structure
  1895. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Company_ID')
  1896. BEGIN
  1897. SELECT @DSQL =
  1898. '
  1899. ALTER TABLE ' + @SourceTable + '
  1900. ADD Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT
  1901. '
  1902.  
  1903. EXEC(@DSQL)
  1904.  
  1905. END
  1906.  
  1907. -- Add Legacy_Contact_ID field to staging table to avoid any compilation errors based on structure
  1908. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Contact_ID')
  1909. BEGIN
  1910. SELECT @DSQL =
  1911. '
  1912. ALTER TABLE ' + @SourceTable + '
  1913. ADD Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT
  1914. '
  1915.  
  1916. EXEC(@DSQL)
  1917.  
  1918. END
  1919.  
  1920.  
  1921. -- Create & populate table variable with list of required columns
  1922. DECLARE @RequiredColumns TABLE
  1923. (
  1924. ColumnName VARCHAR(255)
  1925. )
  1926.  
  1927. INSERT INTO @RequiredColumns
  1928. (
  1929. ColumnName
  1930. )
  1931. SELECT 'Service Board'
  1932. UNION ALL
  1933. SELECT 'Company Name'
  1934. UNION ALL
  1935. SELECT 'Contact Name'
  1936. UNION ALL
  1937. SELECT 'Service Status'
  1938. UNION ALL
  1939. SELECT 'Service Type'
  1940. UNION ALL
  1941. SELECT 'Service Subtype'
  1942. UNION ALL
  1943. SELECT 'Service Item'
  1944. UNION ALL
  1945. SELECT 'Service Source'
  1946. UNION ALL
  1947. SELECT 'Service Location'
  1948. UNION ALL
  1949. SELECT 'Service Priority'
  1950. UNION ALL
  1951. SELECT 'Summary'
  1952. UNION ALL
  1953. SELECT 'Detail Description'
  1954. UNION ALL
  1955. SELECT 'Internal Analysis'
  1956. UNION ALL
  1957. SELECT 'Resolution'
  1958. UNION ALL
  1959. SELECT 'Assigned By'
  1960. UNION ALL
  1961. SELECT 'Date Entered'
  1962. UNION ALL
  1963. SELECT 'Date Completed'
  1964. UNION ALL
  1965. SELECT 'Configuration Name'
  1966. UNION ALL
  1967. SELECT 'Resource Member'
  1968. UNION ALL
  1969. SELECT 'Legacy_ID'
  1970. UNION ALL
  1971. SELECT 'Legacy_Company_ID'
  1972. UNION ALL
  1973. SELECT 'Legacy_Contact_ID'
  1974.  
  1975. -- Table variable to hold column names from source table
  1976. DECLARE @SourceColumns TABLE
  1977. (
  1978. ColumnName VARCHAR(255)
  1979. )
  1980.  
  1981. -- Populate @SourceColumns
  1982. INSERT INTO @SourceColumns
  1983. (
  1984. ColumnName
  1985. )
  1986.  
  1987. SELECT
  1988. name
  1989. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  1990.  
  1991. -- Check that all required columns exist in @SourceColumns
  1992. INSERT INTO #tblResults
  1993. (
  1994. RowNumber,
  1995. ValMsg
  1996. )
  1997.  
  1998. SELECT
  1999. 0,
  2000. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  2001. FROM @RequiredColumns rq
  2002.  
  2003. EXCEPT
  2004.  
  2005. SELECT
  2006. 0,
  2007. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  2008. FROM @SourceColumns sc
  2009.  
  2010. -- If a column is missing, stop here and return results
  2011. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  2012. BEGIN
  2013. SELECT
  2014. 0 AS ValPassed,
  2015. RowNumber,
  2016. ValMsg
  2017. FROM #tblResults
  2018. ORDER BY RowNumber, ValMsg
  2019.  
  2020. RETURN
  2021. END
  2022.  
  2023. -- Build statement to populate validation temp table
  2024. SELECT @DSQL = '
  2025. INSERT INTO #Import_Staging WITH(TABLOCK)
  2026. (
  2027. ExcelRowNumber,
  2028. BoardName,
  2029. Company_Name,
  2030. ContactName,
  2031. SrStatus,
  2032. SrType,
  2033. SrSubType,
  2034. SrItem,
  2035. SrSource,
  2036. SrLocation,
  2037. SrPriority,
  2038. Summary,
  2039. DetailDescription,
  2040. InternalAnalysis,
  2041. Resolution,
  2042. AssignedBy,
  2043. DateEntered,
  2044. DateCompleted,
  2045. ConfigName,
  2046. ResourceMember,
  2047. Company_Match_Val,
  2048. Legacy_ID,
  2049. Legacy_Company_ID,
  2050. Legacy_Contact_ID
  2051. )
  2052. SELECT
  2053. [Excel Row Number],
  2054. LEFT([Service Board], 50),
  2055. LEFT([Company Name], 50),
  2056. LEFT([Contact Name], 100),
  2057. LEFT([Service Status], 50),
  2058. LEFT([Service Type], 50),
  2059. LEFT([Service Subtype], 50),
  2060. LEFT([Service Item], 50),
  2061. LEFT([Service Source], 50),
  2062. LEFT([Service Location], 50),
  2063. LEFT([Service Priority], 50),
  2064. LEFT([Summary], 100),
  2065. [Detail Description],
  2066. [Internal Analysis],
  2067. [Resolution],
  2068. LEFT([Assigned By], 100),
  2069. LEFT([Date Entered], 100),
  2070. LEFT([Date Completed], 100),
  2071. LEFT([Configuration Name], 100),
  2072. LEFT([Resource Member], 100),
  2073. LEFT([Company Name], 3),
  2074. Legacy_ID,
  2075. Legacy_Company_ID,
  2076. Legacy_Contact_ID
  2077. FROM ' + @SourceTable
  2078.  
  2079. -- Pull data into validation temp table
  2080. EXEC(@DSQL)
  2081.  
  2082. BEGIN TRANSACTION SR_Validate
  2083.  
  2084. -- Table to hold time entries for insert
  2085. IF OBJECT_ID('tempdb..#TMP_Time_Staging') IS NOT NULL
  2086. BEGIN
  2087. DROP TABLE #TMP_Time_Staging
  2088. END
  2089.  
  2090. CREATE TABLE #TMP_Time_Staging
  2091. (
  2092. Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  2093. Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  2094. ExcelRowNumber INT,
  2095. First_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  2096. Last_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  2097. Num_Hours FLOAT,
  2098. Hours_Bill FLOAT,
  2099. Date_Start NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  2100. Date_End NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  2101. Billable INT,
  2102. Notes NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  2103. Note_Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  2104. Member_RecID INT,
  2105. Member_ID VARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  2106. Created_By NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  2107. RecID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  2108. Time_RecID INT,
  2109. SR_Detail_RecID INT,
  2110. Company_RecID INT,
  2111. SR_Service_RecID INT,
  2112. Member_ID_Calculated VARCHAR(100) COLLATE DATABASE_DEFAULT
  2113. )
  2114.  
  2115. IF @TETableName IS NOT NULL
  2116. BEGIN
  2117. SELECT @DSQL =
  2118. '
  2119. INSERT INTO #TMP_Time_Staging WITH(TABLOCK)
  2120. (
  2121. Legacy_Ticket_ID,
  2122. ExcelRowNumber,
  2123. First_Name,
  2124. Last_Name,
  2125. Date_Start,
  2126. Date_End,
  2127. Billable,
  2128. Notes,
  2129. Num_Hours,
  2130. Hours_Bill,
  2131. Note_Type
  2132. )
  2133.  
  2134. SELECT
  2135. [Legacy_Ticket_ID],
  2136. [Excel Row Number],
  2137. [Resource First Name],
  2138. [Resource Last Name],
  2139. [Date Start],
  2140. [Date End],
  2141. [Billable Flag],
  2142. NULL,
  2143. [Total Hours],
  2144. [Hours Bill],
  2145. [Note Type]
  2146. FROM ' + @TESourceTable + '
  2147. WHERE [Hours Bill] NOT LIKE ''CONNECTWISE%'''
  2148.  
  2149. EXEC (@DSQL)
  2150.  
  2151. END
  2152. -- Convert empty string and single space to null in temp table
  2153. -- So that nulls may be properly handled throughout procedure
  2154. UPDATE #Import_Staging
  2155. SET
  2156. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  2157. BoardName = CASE WHEN BoardName IN('', ' ') THEN NULL ELSE BoardName END,
  2158. Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
  2159. ContactName = CASE WHEN ContactName IN('', ' ') THEN NULL ELSE ContactName END,
  2160. SR_Board_RecID = CASE WHEN SR_Board_RecID IN('', ' ') THEN NULL ELSE SR_Board_RecID END,
  2161. SrStatus = CASE WHEN SrStatus IN('', ' ') THEN NULL ELSE SrStatus END,
  2162. SrType = CASE WHEN SrType IN('', ' ') THEN NULL ELSE SrType END,
  2163. SrSubType = CASE WHEN SrSubType IN('', ' ') THEN NULL ELSE SrSubType END,
  2164. SrItem = CASE WHEN SrItem IN('', ' ') THEN NULL ELSE SrItem END,
  2165. SrSource = CASE WHEN SrSource IN('', ' ') THEN NULL ELSE SrSource END,
  2166. SrLocation = CASE WHEN SrLocation IN('', ' ') THEN NULL ELSE SrLocation END,
  2167. SrPriority = CASE WHEN SrPriority IN('', ' ') THEN NULL ELSE SrPriority END,
  2168. Summary = CASE WHEN Summary IN('', ' ') THEN NULL ELSE Summary END,
  2169. DetailDescription = CASE WHEN DetailDescription IN('', ' ') THEN NULL ELSE DetailDescription END,
  2170. InternalAnalysis = CASE WHEN InternalAnalysis IN('', ' ') THEN NULL ELSE InternalAnalysis END,
  2171. Resolution = CASE WHEN Resolution IN('', ' ') THEN NULL ELSE Resolution END,
  2172. AssignedBy = CASE WHEN AssignedBy IN('', ' ') THEN NULL ELSE AssignedBy END,
  2173. DateEntered = CASE WHEN DateEntered IN('', ' ') THEN NULL ELSE DateEntered END,
  2174. DateCompleted = CASE WHEN DateCompleted IN('', ' ', '01/01/1900', '1900-01-01') THEN NULL ELSE DateCompleted END,
  2175. ConfigName = CASE WHEN ConfigName IN('', ' ') THEN NULL ELSE ConfigName END,
  2176. ResourceMember = CASE WHEN ResourceMember IN('', ' ') THEN NULL ELSE ResourceMember END,
  2177. NewSrRecid = CASE WHEN NewSrRecid IN('', ' ') THEN NULL ELSE NewSrRecid END,
  2178. ConvertMessage = CASE WHEN ConvertMessage IN('', ' ') THEN NULL ELSE ConvertMessage END,
  2179. Config_RecID = CASE WHEN Config_RecID IN('', ' ') THEN NULL ELSE Config_RecID END,
  2180. Company_RecID = CASE WHEN Company_RecID IN('', ' ') THEN NULL ELSE Company_RecID END,
  2181. Legacy_ID = CASE WHEN Legacy_ID IN('', ' ') THEN NULL ELSE Legacy_ID END
  2182.  
  2183. -- Update Source table to AssignedBy = zAdmin for records where it does not exist
  2184. UPDATE #Import_Staging
  2185. SET AssignedBy = 'zAdmin'
  2186. WHERE AssignedBy IS NULL
  2187.  
  2188. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  2189. BEGIN
  2190. SELECT @Legacy_Flag = 1
  2191. EXEC usp_Import_Match_Legacy @TableName, 'Ticket'
  2192. END
  2193. ELSE
  2194. BEGIN
  2195.  
  2196. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  2197. IF Object_ID('tempdb..#Company') IS NOT NULL
  2198. BEGIN
  2199. DROP TABLE #Company
  2200. END
  2201.  
  2202. SELECT DISTINCT
  2203. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  2204. comp.Company_ID,
  2205. comp.Company_Name,
  2206. Delete_Flag,
  2207. LEFT(Company_Name, 3) AS Company_Match_Val,
  2208. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  2209. 0 AS Duplicate_Flag
  2210. INTO #Company
  2211. FROM dbo.Company comp
  2212. WHERE Delete_Flag = 0
  2213.  
  2214. -- Table to hold contact information
  2215. IF Object_ID('tempdb..#Contact') IS NOT NULL
  2216. BEGIN
  2217. DROP TABLE #Contact
  2218. END
  2219.  
  2220. SELECT
  2221. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  2222. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  2223. First_Name,
  2224. Last_Name,
  2225. cont.Company_RecID,
  2226. Default_Flag
  2227. INTO #Contact
  2228. FROM dbo.Contact cont
  2229. INNER JOIN #Company comp
  2230. ON comp.Company_RecID = cont.Company_RecID
  2231.  
  2232. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  2233. END
  2234.  
  2235. -- Update each record with SR_Board_RecID
  2236. UPDATE tmp
  2237. SET tmp.SR_Board_RecID = srb.SR_Board_RecID
  2238. FROM SR_Board srb
  2239. INNER JOIN #Import_Staging tmp
  2240. ON tmp.BoardName = srb.Board_Name
  2241.  
  2242. UPDATE stag
  2243. SET stag.Member_ID_Calculated = SUBSTRING(ISNULL(stag.First_Name, ''), 1, 1) + ISNULL(stag.Last_Name, '')
  2244. FROM #TMP_Time_Staging stag
  2245.  
  2246. -- Get Member_RecID, Member_ID for records in #TMP_Time_Staging
  2247. UPDATE ti
  2248. SET ti.Member_RecID = mem.Member_RecID,
  2249. ti.Member_ID = mem.Member_ID
  2250. FROM #TMP_Time_Staging ti
  2251. INNER JOIN dbo.Member mem
  2252. ON (mem.First_Name = ti.First_Name AND mem.Last_Name = ti.Last_Name)
  2253. OR ti.Member_ID_Calculated = mem.Member_ID
  2254.  
  2255. -- If member not found, update time entries to map to zAdmin
  2256. UPDATE ti
  2257. SET ti.Member_RecID = mem.Member_RecID,
  2258. ti.Member_ID = mem.Member_ID
  2259. FROM #TMP_Time_Staging ti
  2260. INNER JOIN dbo.Member mem
  2261. ON mem.Member_ID = 'zAdmin'
  2262. WHERE ti.Member_ID IS NULL
  2263.  
  2264. -- Format dates as mm/dd/yyyy
  2265. UPDATE tmp
  2266. SET DateCompleted = CONVERT(VARCHAR, CAST(DateCompleted AS DATETIME), 101)
  2267. FROM #Import_Staging tmp
  2268. WHERE ISDATE(DateCompleted) = 1
  2269.  
  2270. UPDATE tmp
  2271. SET DateEntered = CONVERT(VARCHAR, CAST(DateEntered AS DATETIME), 101)
  2272. FROM #Import_Staging tmp
  2273. WHERE ISDATE(DateEntered) = 1
  2274.  
  2275. -- Update Date fields to NULL if 1900-01-01
  2276. UPDATE #Import_Staging
  2277. SET DateCompleted = NULL
  2278. WHERE DateCompleted = '1/1/1900'
  2279.  
  2280. UPDATE #Import_Staging
  2281. SET DateEntered = NULL
  2282. WHERE DateEntered IN ('1/1/1900', '1900-01-01')
  2283.  
  2284. -- Grab defaults for optional fields (Location, Source, Priority)
  2285. UPDATE tmp
  2286. SET tmp.SrLocation = srl.DefaultLocation
  2287. FROM #Import_Staging tmp
  2288. CROSS APPLY(SELECT TOP 1 [Description] AS DefaultLocation FROM SR_Location WHERE Default_Flag = 1) srl
  2289. WHERE tmp.SrLocation IS NULL
  2290.  
  2291. UPDATE tmp
  2292. SET tmp.SrSource = src.DefaultSource
  2293. FROM #Import_Staging tmp
  2294. CROSS APPLY(SELECT TOP 1 [Description] AS DefaultSource FROM SR_Source WHERE Default_Flag = 1) src
  2295. WHERE tmp.SrSource IS NULL
  2296.  
  2297. UPDATE tmp
  2298. SET tmp.SrPriority = pri.DefaultPriority
  2299. FROM #Import_Staging tmp
  2300. CROSS APPLY(SELECT TOP 1 [Description] AS DefaultPriority FROM SR_Urgency WHERE Default_Flag = 1) pri
  2301. WHERE tmp.SrPriority IS NULL
  2302.  
  2303. -- Get SR_Type_RecID
  2304. UPDATE tmp
  2305. SET tmp.SR_Type_RecID = srt.SR_Type_RecID
  2306. FROM #Import_Staging tmp
  2307. INNER JOIN SR_Type srt
  2308. ON srt.Inactive_Flag = 0
  2309. AND srt.[Description] = tmp.SrType
  2310. AND srt.SR_Board_RecID = tmp.SR_Board_RecID
  2311.  
  2312. -- Get SR_Subtype_RecID
  2313. UPDATE tmp
  2314. SET tmp.SR_Subtype_RecID = srs.SR_Subtype_RecID
  2315. FROM #Import_Staging tmp
  2316. CROSS APPLY(SELECT TOP 1 * FROM dbo.SR_SubType srs WHERE srs.[Description] = tmp.SrSubType AND srs.SR_Board_RecID = tmp.SR_Board_RecID)srs
  2317. WHERE tmp.SrSubType IS NOT NULL
  2318. AND tmp.SrSubType <> ''
  2319.  
  2320. -- Get SR_SubtypeItem_RecID
  2321. UPDATE tmp
  2322. SET tmp.SR_SubtypeItem_RecID = sti.SR_SubtypeItem_RecID
  2323. FROM #Import_Staging tmp
  2324. CROSS APPLY(SELECT TOP 1 * FROM dbo.SR_SubTypeItem sti WHERE sti.[Description] = tmp.SrItem AND sti.SR_Board_RecID = tmp.SR_Board_RecID)sti
  2325.  
  2326. -- If force enabled, create references that don't match up
  2327. IF @ForceMode = 1
  2328. BEGIN
  2329.  
  2330. -- Eliminate header row
  2331. DELETE FROM #Import_Staging
  2332. WHERE SrSource = 'CONNECTWISE' AND SrPriority = 'CONNECTWISE'
  2333.  
  2334. -- Set data migration mode to 1
  2335. SET @Migration_Flag = 1
  2336.  
  2337.  
  2338. -- Find an appropriate location & billing unit for archive board
  2339. ;WITH BU_LOC_FIND AS
  2340. (
  2341. SELECT bul.Billing_Unit_Loc_RecID, Board_Name, Autoclose_Status_RecID, EC_ReOpen_Status, bu.[Description] AS Billing_Unit, ol.[Description] AS Owner_Level
  2342. FROM Billing_Unit_Loc bul
  2343. LEFT OUTER JOIN SR_Board board
  2344. ON board.Billing_Unit_RecID = bul.Billing_Unit_RecID
  2345. AND board.Owner_Level_RecID = bul.Owner_Level_RecID
  2346. INNER JOIN Owner_Level ol
  2347. ON bul.Owner_Level_RecID = ol.Owner_Level_RecID
  2348. INNER JOIN Billing_Unit bu
  2349. ON bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
  2350. )
  2351.  
  2352. SELECT @Billing_Unit_Loc_RecID =
  2353. CASE
  2354. WHEN EXISTS(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Owner_Level = 'CW_Migration')
  2355. THEN (SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Owner_Level = 'CW_Migration')
  2356. WHEN EXISTS(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Board_Name IN('Service Desk', 'Help Desk', 'Support', 'Professional Services', 'Support Desk'))
  2357. THEN (SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_Loc_Find WHERE Board_Name IN('Service Desk', 'Help Desk', 'Support', 'Professional Services', 'Support Desk'))
  2358. WHEN EXISTS(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE EC_ReOpen_Status IS NOT NULL)
  2359. THEN(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE EC_ReOpen_Status IS NOT NULL)
  2360. ELSE
  2361. (SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Board_Name IS NOT NULL)
  2362. END
  2363.  
  2364. -- Insert service board
  2365. INSERT INTO SR_Board
  2366. (
  2367. Board_Name,
  2368. Owner_Level_Recid,
  2369. Billing_Unit_Recid,
  2370. Board_Icon,
  2371. Billcomplete_Flag,
  2372. Billsr_Flag,
  2373. Billunapp_Flag,
  2374. Override_Flag,
  2375. Dispatch,
  2376. Servicemanager,
  2377. Dutymanager,
  2378. Activity_Class_Recid,
  2379. Activity_Type_Recid,
  2380. Timebillable_Flag,
  2381. Expbillable_Flag,
  2382. Prodbillable_Flag,
  2383. Timeinvoice_Flag,
  2384. Expinvoice_Flag,
  2385. Prodinvoice_Flag,
  2386. Updated_By,
  2387. Last_Update,
  2388. Autoclose_Status_Recid,
  2389. Autoassignnew_Flag,
  2390. Autoassignec_Flag,
  2391. Autoassignportal_Flag,
  2392. Sr_Signoff_Recid,
  2393. Ec_Reopen_Status,
  2394. Project_Flag,
  2395. Emailcontact_Flag,
  2396. Emailresource_Flag,
  2397. Lockdesc_Flag,
  2398. Sr_Problem_Flag,
  2399. Additionslocktime_Flag,
  2400. Oncall,
  2401. Default_Notify_From,
  2402. Sr_Resolution_Flag,
  2403. Sr_Internalanalysis_Flag,
  2404. Te_Problem_Flag,
  2405. Te_Resolution_Flag,
  2406. Te_Internalanalysis_Flag,
  2407. Problem_Sort,
  2408. Resolution_Sort,
  2409. Internalanalysis_Sort,
  2410. Emailcontact_Template_Recid,
  2411. Emailresource_Template_Recid,
  2412. Inactive_Flag,
  2413. Display_Name,
  2414. Ec_Reopen_Resources_Flag,
  2415. Ec_Company_Match_Flag,
  2416. Ec_Reopen_Days_Flag,
  2417. Ec_Reopen_Days,
  2418. Member_Display_Name_Flag
  2419. )
  2420.  
  2421. SELECT DISTINCT
  2422. tmp.BoardName,
  2423. bul.Owner_Level_RecID,
  2424. bul.Billing_Unit_RecID,
  2425. '',
  2426. 0,
  2427. 0,
  2428. 0,
  2429. 0,
  2430. 0,
  2431. 0,
  2432. 0,
  2433. ISNULL(srb.Activity_Class_RecID, ac.Activity_Class_RecID),
  2434. aty.Activity_Type_RecID,
  2435. 1,
  2436. 0,
  2437. 0,
  2438. 0,
  2439. 0,
  2440. 0,
  2441. @ImportBatchUser,
  2442. GETDATE(),
  2443. 0,
  2444. 0,
  2445. 0,
  2446. 0,
  2447. 0,
  2448. NULL,
  2449. 0,
  2450. 0,
  2451. 0,
  2452. 0,
  2453. 0,
  2454. 0,
  2455. 0,
  2456. 0,
  2457. 0,
  2458. 0,
  2459. 0,
  2460. 0,
  2461. 0,
  2462. 'A',
  2463. 'A',
  2464. 'A',
  2465. 0,
  2466. 0,
  2467. 0,
  2468. '',
  2469. 0,
  2470. 0,
  2471. 0,
  2472. 0,
  2473. 0
  2474. FROM #Import_Staging tmp
  2475. OUTER APPLY(SELECT TOP 1 * FROM Billing_Unit_Loc bul WHERE bul.Billing_Unit_Loc_RecID = @Billing_Unit_Loc_RecID) bul
  2476. OUTER APPLY(SELECT TOP 1 Activity_Class_RecID FROM dbo.SR_Board srb WHERE srb.Activity_Class_RecID > 0)srb
  2477. OUTER APPLY(SELECT TOP 1 Activity_Class_RecID FROM Activity_Class)ac
  2478. OUTER APPLY(SELECT TOP 1 Activity_Type_RecID FROM dbo.Activity_Type aty ORDER BY aty.Default_Flag DESC)aty
  2479. WHERE tmp.SR_Board_RecID IS NULL
  2480.  
  2481.  
  2482. -- Create default service teams for inserted boards boards
  2483. INSERT INTO SR_Team
  2484. (
  2485. Owner_ID,
  2486. [Description],
  2487. Member_RecID,
  2488. Owner_Level_RecID,
  2489. Billing_Unit_RecID,
  2490. Default_Flag,
  2491. Updated_By,
  2492. Last_Update,
  2493. SR_Board_RecID,
  2494. DeleteNotify_Flag
  2495. )
  2496.  
  2497. SELECT DISTINCT
  2498. 1,
  2499. LEFT(tmp.BoardName + ' Team', 30),
  2500. mem.Member_RecID,
  2501. bul.Owner_Level_RecID,
  2502. bul.Billing_Unit_RecID,
  2503. 1,
  2504. @ImportBatchUser,
  2505. GETDATE(),
  2506. srb.SR_Board_RecID,
  2507. 0
  2508. FROM #Import_Staging tmp
  2509. INNER JOIN dbo.Billing_Unit_Loc bul
  2510. ON bul.Billing_Unit_Loc_RecID = @Billing_Unit_Loc_RecID
  2511. INNER JOIN dbo.Member mem
  2512. ON mem.Member_ID = 'zAdmin'
  2513. INNER JOIN SR_Board srb
  2514. ON srb.Board_Name = tmp.BoardName
  2515. AND srb.Updated_By = @ImportBatchUser
  2516.  
  2517. -- Update each record with SR_Board_RecID
  2518. UPDATE tmp
  2519. SET tmp.SR_Board_RecID = srb.SR_Board_RecID
  2520. FROM SR_Board srb
  2521. INNER JOIN #Import_Staging tmp
  2522. ON tmp.BoardName = srb.Board_Name
  2523. WHERE dbo.ufn_Import_Trim(srb.Board_Name) = tmp.BoardName
  2524.  
  2525. -- Service Priority
  2526. INSERT INTO dbo.SR_Urgency WITH(TABLOCK)
  2527. (
  2528. Owner_ID,
  2529. Color,
  2530. Image_Link,
  2531. [Description],
  2532. Sort_Order,
  2533. Default_Flag,
  2534. Updated_By,
  2535. Response_Hours
  2536. )
  2537.  
  2538. SELECT DISTINCT
  2539. 1,
  2540. 'White',
  2541. '.../../common/images/infoIcons/urgencyColors/White.gif',
  2542. tmp.SrPriority,
  2543. 0,
  2544. 0,
  2545. @ImportBatchUser,
  2546. 0
  2547. FROM #Import_Staging tmp
  2548. LEFT OUTER JOIN dbo.SR_Urgency sru
  2549. ON sru.[Description] = tmp.SrPriority
  2550. WHERE tmp.SrPriority IS NOT NULL
  2551. AND sru.SR_Urgency_RecID IS NULL
  2552. AND tmp.SrPriority NOT IN('', ' ')
  2553.  
  2554. -- table to Force compilation regardless of structure
  2555. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  2556. DROP TABLE #Force_Compile
  2557.  
  2558. CREATE TABLE #Force_Compile
  2559. (
  2560. Column_Name VARCHAR(20)
  2561. )
  2562.  
  2563. IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_by' AND OBJECT_NAME(OBJECT_ID) = 'SR_Source')
  2564. BEGIN
  2565.  
  2566. -- Service Source
  2567. INSERT INTO SR_Source
  2568. (
  2569. Owner_ID,
  2570. [Description],
  2571. Updated_By,
  2572. Last_Update,
  2573. Default_Flag,
  2574. Entered_By
  2575. )
  2576.  
  2577. SELECT DISTINCT
  2578. 1,
  2579. tmp.SrSource,
  2580. @ImportBatchUser,
  2581. GETDATE(),
  2582. 0,
  2583. 'zAdmin'
  2584. FROM #Import_Staging tmp
  2585. OUTER APPLY(SELECT TOP 1 * FROM SR_Source srs WHERE srs.[Description] = tmp.SrSource)srs
  2586. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  2587. WHERE tmp.SrSource IS NOT NULL
  2588. AND srs.SR_Source_RecID IS NULL
  2589. AND tmp.SrSource NOT IN('', ' ')
  2590.  
  2591. END
  2592.  
  2593. IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_by' AND OBJECT_NAME(OBJECT_ID) = 'SR_Source')
  2594. BEGIN
  2595.  
  2596. -- Service Source
  2597. INSERT INTO SR_Source
  2598. (
  2599. Owner_ID,
  2600. [Description],
  2601. Updated_By,
  2602. Last_Update,
  2603. Default_Flag
  2604. )
  2605.  
  2606. SELECT DISTINCT
  2607. 1,
  2608. tmp.SrSource,
  2609. @ImportBatchUser,
  2610. GETDATE(),
  2611. 0
  2612. FROM #Import_Staging tmp
  2613. OUTER APPLY(SELECT TOP 1 * FROM SR_Source srs WHERE srs.[Description] = tmp.SrSource)srs
  2614. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  2615. WHERE tmp.SrSource IS NOT NULL
  2616. AND srs.SR_Source_RecID IS NULL
  2617. AND tmp.SrSource NOT IN('', ' ')
  2618.  
  2619. END
  2620.  
  2621. -- Service Status
  2622. INSERT INTO dbo.SR_Status
  2623. (
  2624. Owner_ID,
  2625. Owner_Level_RecID,
  2626. Billing_Unit_RecID,
  2627. [Description],
  2628. Default_Flag,
  2629. Sort_Order,
  2630. Board_Flag,
  2631. Closed_Flag,
  2632. No_Time_Flag,
  2633. Updated_By,
  2634. Resolved_Flag,
  2635. NoEscalation_Flag,
  2636. Escalation_Level,
  2637. SR_Board_RecID,
  2638. Customer_Portal_Flag,
  2639. Inactive_Flag,
  2640. Long_Description
  2641. )
  2642.  
  2643. SELECT DISTINCT
  2644. 1,
  2645. srb.Owner_Level_RecID,
  2646. srb.Billing_Unit_RecID,
  2647. REPLACE(tmp.SrStatus, '<x>', ''),
  2648. 0,
  2649. 0,
  2650. 1,
  2651. CASE WHEN SrStatus LIKE('<x>%') THEN 1 ELSE 0 END,
  2652. 0,
  2653. @ImportBatchUser,
  2654. 0,
  2655. 1,
  2656. 0,
  2657. tmp.SR_Board_RecID,
  2658. 0,
  2659. 0,
  2660. 'Status ' + tmp.SrStatus + ' created by import utility with default values. Adjust as necessary.'
  2661. FROM #Import_Staging tmp
  2662. LEFT OUTER JOIN SR_Status srs
  2663. ON srs.[Description] = REPLACE(tmp.SrStatus, '<x>', '')
  2664. AND srs.SR_Board_RecID = tmp.SR_Board_RecID
  2665. INNER JOIN SR_Board srb
  2666. ON srb.SR_Board_RecID = tmp.SR_Board_RecID
  2667. WHERE tmp.SrStatus IS NOT NULL
  2668. AND srs.SR_Status_RecID IS NULL
  2669. -- Exclude records where board not specified
  2670. AND tmp.SR_Board_RecID IS NOT NULL
  2671. AND tmp.SrStatus NOT IN('', ' ')
  2672.  
  2673. UPDATE tmp
  2674. SET tmp.SrStatus = REPLACE(tmp.SrStatus, '<x>', '')
  2675. FROM #Import_Staging tmp
  2676.  
  2677. -- If generated status is '>Archived' - make it a 'Closed' status (for custom migrations)
  2678. UPDATE SR_Status
  2679. SET Closed_Flag = 1,
  2680. No_Time_Flag = 1
  2681. WHERE [Description] = '>Archived'
  2682. AND Updated_By = @ImportBatchUser
  2683.  
  2684. -- Service Type
  2685. INSERT INTO dbo.SR_Type
  2686. (
  2687. Owner_ID,
  2688. Owner_Level_RecID,
  2689. Billing_Unit_RecID,
  2690. [Description],
  2691. Updated_By,
  2692. Default_Flag,
  2693. ActiveType,
  2694. SR_Board_RecID,
  2695. Inactive_Flag,
  2696. RFC_Flag
  2697. )
  2698.  
  2699. SELECT DISTINCT
  2700. 1,
  2701. srb.Owner_Level_RecID,
  2702. srb.Billing_Unit_RecID,
  2703. tmp.SrType,
  2704. @ImportBatchUser,
  2705. 0,
  2706. 'R',
  2707. tmp.SR_Board_RecID,
  2708. 0,
  2709. 0
  2710. FROM #Import_Staging tmp
  2711. LEFT OUTER JOIN SR_Type srt
  2712. ON srt.[Description] = tmp.SrType
  2713. AND srt.SR_Board_RecID = tmp.SR_Board_RecID
  2714. INNER JOIN SR_Board srb
  2715. ON srb.SR_Board_RecID = tmp.SR_Board_RecID
  2716. WHERE srt.SR_Type_RecID IS NULL
  2717. AND tmp.SrType IS NOT NULL
  2718. AND tmp.SR_Board_RecID IS NOT NULL
  2719. AND tmp.SrType NOT IN('', ' ')
  2720.  
  2721. UPDATE stag
  2722. SET stag.SR_Type_RecID = srt.SR_Type_RecID
  2723. FROM #Import_Staging stag
  2724. CROSS APPLY(SELECT TOP 1 * FROM dbo.SR_Type srt WHERE srt.[Description] = stag.SrType AND srt.SR_Board_RecID = stag.SR_Board_RecID)srt
  2725. WHERE stag.SR_Type_RecID IS NULL
  2726.  
  2727. -- Service Subtype
  2728. -- Insert new subtype only if not duplicate on Description and SR_Board_RecID
  2729. INSERT INTO dbo.SR_SubType
  2730. (
  2731. [Description],
  2732. SR_Board_RecID,
  2733. Updated_By,
  2734. Last_Update,
  2735. Inactive_Flag
  2736. )
  2737.  
  2738. SELECT DISTINCT
  2739. tmp.SRSubtype,
  2740. tmp.SR_Board_RecID,
  2741. @ImportBatchUser,
  2742. GETDATE(),
  2743. 0
  2744. FROM #Import_Staging tmp
  2745. LEFT OUTER JOIN dbo.SR_Subtype srst
  2746. ON srst.SR_Board_RecID = tmp.SR_Board_RecID
  2747. AND tmp.SRSubtype = srst.[Description]
  2748. WHERE srst.SR_SubType_RecID IS NULL
  2749. AND tmp.SRSubtype NOT IN('', ' ')
  2750. AND tmp.SRSubtype IS NOT NULL
  2751. AND tmp.SR_Board_RecID IS NOT NULL
  2752. AND tmp.SrType IS NOT NULL
  2753.  
  2754. UPDATE stag
  2755. SET stag.SR_SubType_RecID = srs.SR_SubType_RecID
  2756. FROM #Import_Staging stag
  2757. CROSS APPLY(SELECT TOP 1 * FROM dbo.SR_SubType srs WHERE srs.[Description] = stag.SrSubType AND srs.SR_Board_RecID = stag.SR_Board_RecID)srs
  2758. WHERE stag.SR_SubType_RecID IS NULL
  2759.  
  2760. -- Insert new Subtype Item only if not duplicate on Description and SR_Board_RecID
  2761. INSERT INTO dbo.SR_SubtypeItem
  2762. (
  2763. [Description],
  2764. SR_Board_RecID,
  2765. Updated_By,
  2766. Last_Update,
  2767. Inactive_Flag
  2768. )
  2769.  
  2770. SELECT DISTINCT
  2771. tmp.SrItem,
  2772. tmp.SR_Board_RecID,
  2773. @ImportBatchUser,
  2774. GETDATE(),
  2775. 0
  2776. FROM #Import_Staging tmp
  2777. LEFT OUTER JOIN SR_SubtypeItem sti
  2778. ON tmp.SrItem = sti.[Description]
  2779. AND tmp.SR_Board_RecID = sti.SR_Board_RecID
  2780. WHERE sti.SR_SubtypeItem_RecID IS NULL
  2781. AND tmp.SrItem NOT IN('', ' ')
  2782. AND tmp.SRSubtype IS NOT NULL
  2783. AND tmp.SR_Board_RecID IS NOT NULL
  2784. AND tmp.SrType IS NOT NULL
  2785.  
  2786. -- Get SR_SubtypeItem_RecID
  2787. UPDATE tmp
  2788. SET tmp.SR_SubtypeItem_RecID = sti.SR_SubtypeItem_RecID
  2789. FROM #Import_Staging tmp
  2790. CROSS APPLY(SELECT TOP 1 * FROM dbo.SR_SubTypeItem sti WHERE sti.[Description] = tmp.SrItem AND sti.SR_Board_RecID = tmp.SR_Board_RecID)sti
  2791.  
  2792. -- All types/subtypes/items should now exist
  2793. -- Insert to SR_Type_Subtype_SubTypeItem_Template to create necessary relationships
  2794. INSERT INTO dbo.SR_Type_SubType_SubTypeItem_Template
  2795. (
  2796. SR_Type_RecID,
  2797. SR_SubType_RecID,
  2798. Auto_Apply,
  2799. Updated_By,
  2800. SR_SubTypeItem_RecID,
  2801. Last_Update
  2802. )
  2803.  
  2804. SELECT DISTINCT
  2805. srt.SR_Type_RecID,
  2806. srs.SR_Subtype_RecID,
  2807. 0,
  2808. @ImportBatchUser,
  2809. sri.SR_SubTypeItem_RecID,
  2810. GETDATE()
  2811. FROM #Import_Staging tmp
  2812. INNER JOIN SR_Board srb
  2813. ON tmp.SR_Board_RecID = srb.SR_Board_RecID
  2814. INNER JOIN SR_Type srt
  2815. ON srt.SR_Board_RecID = srb.SR_Board_RecID
  2816. AND srt.[Description] = tmp.SrType
  2817. INNER JOIN SR_Subtype srs
  2818. ON srb.SR_Board_RecID = srs.SR_Board_RecID
  2819. AND srs.[Description] = tmp.SrSubType
  2820. LEFT OUTER JOIN SR_SubTypeItem sri
  2821. ON sri.SR_Board_RecID = srb.SR_Board_RecID
  2822. AND tmp.SrItem = sri.[Description]
  2823. LEFT OUTER JOIN SR_Type_Subtype_SubTypeItem_Template sst
  2824. ON sst.SR_Type_RecID = srt.SR_Type_RecID
  2825. AND sst.SR_Subtype_RecID = srs.SR_Subtype_RecID
  2826. AND ISNULL(sst.SR_SubTypeItem_RecID, 0) = ISNULL(sri.SR_SubTypeItem_RecID, 0)
  2827. WHERE sst.SR_Type_Subtype_SubTypeItem_Template_RecID IS NULL
  2828. AND tmp.SrItem NOT IN('', ' ')
  2829. AND tmp.SRSubtype IS NOT NULL
  2830. AND tmp.SR_Board_RecID IS NOT NULL
  2831. AND tmp.SrType IS NOT NULL
  2832.  
  2833. -- Insert Service location
  2834. INSERT INTO SR_Location
  2835. (
  2836. Owner_ID,
  2837. Description,
  2838. Default_Flag,
  2839. Updated_By,
  2840. Last_Update
  2841. )
  2842. SELECT DISTINCT
  2843. 1,
  2844. [SRLocation],
  2845. 0,
  2846. @ImportBatchUser,
  2847. GETDATE()
  2848. FROM #Import_Staging stag
  2849. OUTER APPLY(SELECT TOP 1 * FROM SR_Location srl WHERE srl.[Description] = stag.[SRLocation]) srl
  2850. WHERE srl.SR_Location_RecID IS NULL
  2851. AND LEN(stag.[SRLocation]) < 30
  2852.  
  2853. END
  2854.  
  2855. -- Begin validations
  2856. INSERT INTO #tblResults
  2857. (
  2858. RowNumber,
  2859. ValMsg,
  2860. InvalidReason
  2861. )
  2862.  
  2863. -- Check that service board is entered
  2864. SELECT
  2865. tmp.ExcelRowNumber,
  2866. 'Service board is required',
  2867. 'No service board'
  2868. FROM #Import_Staging tmp
  2869. WHERE BoardName IS NULL
  2870.  
  2871. UNION ALL
  2872.  
  2873. -- Check that service board is valid
  2874. SELECT
  2875. tmp.ExcelRowNumber,
  2876. 'Invalid service board: "' + ISNULL(tmp.BoardName, '') + '"',
  2877. 'Invalid service board'
  2878. FROM #Import_Staging tmp
  2879. WHERE tmp.BoardName IS NOT NULL
  2880. AND tmp.SR_Board_RecID IS NULL
  2881.  
  2882. UNION ALL
  2883.  
  2884. -- Check that each service board has a default team
  2885. SELECT
  2886. tmp.ExcelRowNumber,
  2887. 'Service board: "' + ISNULL(tmp.BoardName, '') + '" does not have a default Service Team',
  2888. 'No default service team'
  2889. FROM #Import_Staging tmp
  2890. LEFT OUTER JOIN SR_Team srt
  2891. ON tmp.SR_Board_RecID = srt.SR_Board_RecID
  2892. AND srt.Default_Flag = 1
  2893. WHERE srt.SR_Board_RecID IS NULL
  2894. AND tmp.SR_Board_RecID IS NOT NULL
  2895.  
  2896. UNION ALL
  2897.  
  2898. -- Company Name is required
  2899. SELECT
  2900. tmp.ExcelRowNumber,
  2901. 'Company name cannot be blank',
  2902. 'NULL Company'
  2903. FROM #Import_Staging tmp
  2904. WHERE Company_Name IS NULL
  2905. AND @Legacy_Flag = 0
  2906.  
  2907. UNION ALL
  2908.  
  2909. -- Check that company names are valid
  2910. SELECT
  2911. tmp.ExcelRowNumber,
  2912. 'Company not found: "' + ISNULL(tmp.Company_Name, '') + '"',
  2913. 'Invalid company'
  2914. FROM #Import_Staging tmp
  2915. WHERE Company_Name IS NOT NULL
  2916. AND Company_RecID IS NULL
  2917.  
  2918. UNION ALL
  2919.  
  2920. -- Check for more than one company with the same name
  2921. SELECT
  2922. tmp.ExcelRowNumber,
  2923. 'There are more than one companies named "' + ISNULL(Company_Name, '') + '" - company name must be unique in order to associate it to an imported ticket',
  2924. 'Duplicate company'
  2925. FROM #Import_Staging tmp
  2926. WHERE Company_Duplicate_Flag = 1
  2927.  
  2928. UNION ALL
  2929.  
  2930. SELECT
  2931. tmp.ExcelRowNumber,
  2932. 'Unable to locate contact: "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '') + '"',
  2933. 'Invalid contact name'
  2934. FROM #Import_Staging tmp
  2935. WHERE Contact_RecID IS NULL
  2936. AND tmp.ContactName IS NOT NULL
  2937. AND tmp.Company_Duplicate_Flag = 0
  2938. AND tmp.Company_RecID IS NOT NULL
  2939.  
  2940. UNION ALL
  2941.  
  2942. -- Check for duplicate contacts within company
  2943. SELECT
  2944. tmp.ExcelRowNumber,
  2945. 'There are more than one contacts named "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"',
  2946. 'Duplicate contact name'
  2947. FROM #Import_Staging tmp
  2948. WHERE tmp.Contact_Duplicate_Flag = 1
  2949. AND tmp.Company_Duplicate_Flag = 0
  2950.  
  2951. UNION ALL
  2952.  
  2953. -- Check that a default contact for company exists if contact is null
  2954. SELECT
  2955. tmp.ExcelRowNumber,
  2956. 'Contact must be specified for company: "' + ISNULL(tmp.Company_Name, '') + '" because no default contact exists for this company',
  2957. 'No contact/No default'
  2958. FROM #Import_Staging tmp
  2959. WHERE tmp.Contact_RecID IS NULL
  2960. AND tmp.ContactName IS NULL
  2961. AND tmp.Company_Name IS NOT NULL
  2962. AND tmp.Company_RecID IS NOT NULL
  2963. AND tmp.Company_Duplicate_Flag = 0
  2964.  
  2965. -- Check that configuration is assigned to company
  2966. INSERT INTO #tblResults
  2967. (
  2968. RowNumber,
  2969. ValMsg,
  2970. InvalidReason
  2971. )
  2972.  
  2973. SELECT DISTINCT
  2974. tmp.ExcelRowNumber,
  2975. 'No configurations named "' + ISNULL(tmp.ConfigName, '') + '" are assigned to company "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"',
  2976. 'Configuration not assigned to company'
  2977. FROM #Import_Staging tmp
  2978. LEFT OUTER JOIN dbo.Config conf
  2979. ON conf.Config_Name = tmp.ConfigName
  2980. AND tmp.Company_RecID = conf.Company_RecID
  2981. WHERE tmp.ConfigName IS NOT NULL
  2982. AND conf.Config_RecID IS NULL
  2983. AND tmp.Company_RecID IS NOT NULL
  2984.  
  2985. UNION ALL
  2986.  
  2987. -- Check for duplicate configuration names assigned to this company
  2988. SELECT
  2989. tmp.ExcelRowNumber,
  2990. 'There are more than one configurations named "' + ISNULL(conf.Config_Name, '') + '" for company "' + ISNULL(tmp.Company_Name, '') + '"',
  2991. 'Duplicate configuration'
  2992. FROM Config conf
  2993. INNER JOIN #Import_Staging tmp
  2994. ON conf.Config_Name = tmp.ConfigName
  2995. AND conf.Company_RecID = tmp.Company_RecID
  2996. WHERE tmp.ConfigName IS NOT NULL
  2997. AND tmp.Company_Name IS NOT NULL
  2998. AND tmp.Company_RecID IS NOT NULL
  2999. GROUP BY tmp.ExcelRowNumber, conf.Config_Name, tmp.Company_Name
  3000. HAVING COUNT(*) > 1
  3001.  
  3002. -- Check that configuration is assigned to company
  3003. INSERT INTO #tblResults
  3004. (
  3005. RowNumber,
  3006. ValMsg,
  3007. InvalidReason
  3008. )
  3009.  
  3010.  
  3011. -- Check that service statuses are entered
  3012. SELECT
  3013. tmp.ExcelRowNumber,
  3014. 'Service status is required',
  3015. 'No service status'
  3016. FROM #Import_Staging tmp
  3017. WHERE tmp.SrStatus IS NULL
  3018.  
  3019. UNION ALL
  3020.  
  3021. -- Check that entered service statuses are valid
  3022. SELECT
  3023. tmp.ExcelRowNumber,
  3024. 'Service status: "' + ISNULL(tmp.SrStatus, '') + '" does not exist for service board "' + ISNULL(tmp.BoardName, '') + '"',
  3025. 'Invalid service status'
  3026. FROM #Import_Staging tmp
  3027. LEFT OUTER JOIN SR_Status srs
  3028. ON srs.[Description] = tmp.SrStatus
  3029. AND srs.SR_Board_RecID = tmp.SR_Board_RecID
  3030. WHERE tmp.SrStatus IS NOT NULL
  3031. AND srs.SR_Status_RecID IS NULL
  3032. -- Exclude records where board not specified
  3033. AND tmp.SR_Board_RecID IS NOT NULL
  3034.  
  3035. UNION ALL
  3036.  
  3037. -- Check that entered service types are valid
  3038. SELECT
  3039. tmp.ExcelRowNumber,
  3040. 'No Active service type named "' + ISNULL(tmp.SrType, '[Not entered]') + '" exists for service board "' + ISNULL(tmp.BoardName, '') + '"',
  3041. 'Invalid Service Type'
  3042. FROM #Import_Staging tmp
  3043. LEFT OUTER JOIN SR_Type srt
  3044. ON srt.[Description] = tmp.SrType
  3045. AND srt.SR_Board_RecID = tmp.SR_Board_RecID
  3046. WHERE srt.SR_Type_RecID IS NULL
  3047. AND tmp.SrType IS NOT NULL
  3048. AND tmp.SR_Board_RecID IS NOT NULL
  3049.  
  3050. INSERT INTO #tblResults
  3051. (
  3052. RowNumber,
  3053. ValMsg,
  3054. InvalidReason
  3055. )
  3056.  
  3057. SELECT DISTINCT
  3058. tmp.ExcelRowNumber,
  3059. 'No active service subtype named "' + ISNULL(tmp.SrSubType, '[No subtype entered]') + '" Exists for service type: "' + ISNULL(tmp.SrType, '') + '" for service board "' + ISNULL(tmp.BoardName, '') + '"',
  3060. 'Invalid Subtype'
  3061. FROM #Import_Staging tmp
  3062. WHERE tmp.SR_Type_RecID IS NOT NULL
  3063. AND tmp.SR_SubType_RecID IS NULL
  3064. AND tmp.SrSubType IS NOT NULL
  3065.  
  3066. INSERT INTO #tblResults
  3067. (
  3068. RowNumber,
  3069. ValMsg,
  3070. InvalidReason
  3071. )
  3072.  
  3073. -- Check that Item is a valid reference for Subtype, Type, and Board
  3074. -- Get all records where item is entered
  3075. SELECT DISTINCT
  3076. tmp.ExcelRowNumber,
  3077. 'Service Subtype Item: "' + ISNULL(tmp.SrItem, '') + '" - is not valid for Service SubType: "' + ISNULL(tmp.SrSubType, '') + '" for Service Type: "' + ISNULL(tmp.SrType, '') + '" on service board "' + ISNULL(tmp.BoardName, '') + '"',
  3078. 'Invalid Subtype'
  3079. FROM #Import_Staging tmp
  3080. WHERE tmp.SrItem IS NOT NULL
  3081. AND tmp.SR_Board_RecID IS NOT NULL
  3082. AND tmp.SR_Type_RecID IS NOT NULL
  3083. AND tmp.SR_SubType_RecID IS NOT NULL
  3084. AND tmp.SrType IS NOT NULL
  3085. AND tmp.SrSubType IS NOT NULL
  3086.  
  3087. -- Except records where item is a valid reference
  3088. EXCEPT
  3089.  
  3090. SELECT DISTINCT
  3091. tmp.ExcelRowNumber,
  3092. 'Service Subtype Item: "' + ISNULL(tmp.SrItem, '') + '" - is not valid for Service SubType: "' + ISNULL(tmp.SrSubType, '[No SubType Specified]') + '" for Service Type: "' + ISNULL(tmp.SrType, '[No Type Specified') + '" on service board "' + ISNULL(tmp.BoardName, '') + '"',
  3093. 'Invalid Subtype'
  3094. FROM #Import_Staging tmp
  3095. INNER JOIN SR_SubTypeItem sti
  3096. ON sti.[Description] = tmp.SrItem
  3097. AND sti.SR_Board_RecID = tmp.SR_Board_RecID
  3098. INNER JOIN SR_Type_SubType_SubTypeItem_Template tmpl
  3099. ON tmpl.SR_SubTypeItem_RecID = sti.SR_SubTypeItem_RecID
  3100. -- Join on temp table subtype & type to prevent duplicate message if subtype didn't line up in previous check
  3101. AND tmpl.SR_SubType_RecID IN (SELECT SR_SubType_RecID FROM SR_SubType srs WHERE [Description] = tmp.SrSubType AND srs.SR_Board_RecID = tmp.SR_Board_RecID)
  3102. AND tmpl.SR_Type_RecID IN (SELECT SR_Type_RecID FROM SR_Type srt WHERE srt.[Description] = tmp.SrType AND srt.SR_Board_RecID = tmp.SR_Board_RecID)
  3103. WHERE tmp.SrItem IS NOT NULL
  3104. AND tmp.SR_SubType_RecID IS NOT NULL
  3105. AND tmp.SR_Type_RecID IS NOT NULL
  3106. AND tmp.SrType IS NOT NULL
  3107. AND tmp.SrSubType IS NOT NULL
  3108.  
  3109. UNION ALL
  3110.  
  3111. -- Check that type is entered if Subtype/item is entered
  3112. SELECT
  3113. tmp.ExcelRowNumber,
  3114. 'Service Type is required if a subtype or item is entered',
  3115. 'Null type with subtype/item'
  3116. FROM #Import_Staging tmp
  3117. WHERE SrType IS NULL
  3118. AND (SrSubType IS NOT NULL OR SrItem IS NOT NULL)
  3119.  
  3120. UNION ALL
  3121.  
  3122. -- Check that subtype is entered if item is entered
  3123. SELECT
  3124. tmp.ExcelRowNumber,
  3125. 'Service SubType is required if a item is entered',
  3126. 'Null Subtype with item'
  3127. FROM #Import_Staging tmp
  3128. WHERE SrItem IS NOT NULL
  3129. AND SrType IS NULL
  3130.  
  3131. UNION ALL
  3132.  
  3133. -- Check that source is entered
  3134. SELECT
  3135. tmp.ExcelRowNumber,
  3136. 'Source must be entered',
  3137. 'No Source'
  3138. FROM #Import_Staging tmp
  3139. WHERE tmp.SrSource IS NULL
  3140.  
  3141. UNION ALL
  3142.  
  3143. -- Check that source is valid reference
  3144. SELECT
  3145. tmp.ExcelRowNumber,
  3146. 'Source: ' + ISNULL(tmp.SrSource, '') + ' is not a valid source',
  3147. 'Invalid source'
  3148. FROM #Import_Staging tmp
  3149. LEFT OUTER JOIN SR_Source srs
  3150. ON srs.[Description] = tmp.SrSource
  3151. WHERE tmp.SrSource IS NOT NULL
  3152. AND srs.SR_Source_RecID IS NULL
  3153.  
  3154. UNION ALL
  3155.  
  3156. -- Check that service location is entered
  3157. SELECT
  3158. tmp.ExcelRowNumber,
  3159. 'Service Location must be entered',
  3160. 'No location'
  3161. FROM #Import_Staging tmp
  3162. WHERE tmp.SrLocation IS NULL
  3163.  
  3164. UNION ALL
  3165.  
  3166. -- Check that date entered is a valid date
  3167. SELECT
  3168. tmp.ExcelRowNumber,
  3169. 'Date entered is invalid - please use MM/DD/YYYY format',
  3170. 'Invalid Date Entered'
  3171. FROM #Import_Staging tmp
  3172. WHERE DateEntered IS NOT NULL
  3173. AND ISDATE(DateEntered) = 0
  3174.  
  3175. UNION ALL
  3176.  
  3177. -- Check that date completed is a valid date
  3178. SELECT
  3179. tmp.ExcelRowNumber,
  3180. 'Date completed is invalid - please use MM/DD/YYYY format',
  3181. 'Invalid Date Completed'
  3182. FROM #Import_Staging tmp
  3183. WHERE DateCompleted IS NOT NULL
  3184. AND ISDATE(DateCompleted) = 0
  3185.  
  3186. UNION ALL
  3187.  
  3188. -- Check that service location is valid
  3189. SELECT
  3190. tmp.ExcelRowNumber,
  3191. 'Service location: "' + ISNULL(tmp.SrLocation, '') + '" is not valid',
  3192. 'Invalid location'
  3193. FROM #Import_Staging tmp
  3194. LEFT OUTER JOIN SR_Location srl
  3195. ON srl.[Description] = tmp.SrLocation
  3196. WHERE tmp.SrLocation IS NOT NULL
  3197. AND srl.SR_Location_RecID IS NULL
  3198.  
  3199. UNION ALL
  3200.  
  3201. -- Check that summary is entered
  3202. SELECT
  3203. tmp.ExcelRowNumber,
  3204. 'Summary is required',
  3205. 'No summary'
  3206. FROM #Import_Staging tmp
  3207. WHERE tmp.Summary IS NULL
  3208.  
  3209. UNION ALL
  3210.  
  3211. -- Check that summary <= 100 characters
  3212. SELECT
  3213. tmp.ExcelRowNumber,
  3214. 'Summary cannot exceed 100 characters',
  3215. 'Summary cannot exceed 100 characters'
  3216. FROM #Import_Staging tmp
  3217. WHERE LEN(tmp.Summary) > 100
  3218. AND tmp.Summary IS NOT NULL
  3219.  
  3220. UNION ALL
  3221.  
  3222. -- Check that service priority entered
  3223. SELECT
  3224. tmp.ExcelRowNumber,
  3225. 'Service priority is required',
  3226. 'No priority'
  3227. FROM #Import_Staging tmp
  3228. WHERE tmp.SrPriority IS NULL
  3229.  
  3230. UNION ALL
  3231.  
  3232. -- Check that service priority is a valid reference
  3233. SELECT
  3234. tmp.ExcelRowNumber,
  3235. 'Service priority: ' + ISNULL(SrPriority, '') + ' is invalid',
  3236. 'Invalid priority'
  3237. FROM #Import_Staging tmp
  3238. LEFT OUTER JOIN dbo.SR_Urgency sru
  3239. ON sru.[Description] = tmp.SrPriority
  3240. WHERE tmp.SrPriority IS NOT NULL
  3241. AND sru.SR_Urgency_RecID IS NULL
  3242.  
  3243. UNION ALL
  3244.  
  3245. -- Check that Assigned by is entered
  3246. SELECT
  3247. tmp.ExcelRowNumber,
  3248. 'Assigned by is required',
  3249. 'Assigned By missing'
  3250. FROM #Import_Staging tmp
  3251. WHERE tmp.AssignedBy IS NULL
  3252. AND @ForceMode <> 1
  3253.  
  3254. UNION ALL
  3255.  
  3256. -- Check that Assigned by members are valid
  3257. SELECT
  3258. tmp.ExcelRowNumber,
  3259. 'Unable to locate assigned by member: ' + ISNULL(AssignedBy, ''),
  3260. 'Invalid assigned by resource'
  3261. FROM #Import_Staging tmp
  3262. LEFT OUTER JOIN Member mem
  3263. ON tmp.AssignedBy = LTRIM(ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, ''))
  3264. OR tmp.AssignedBy = mem.Member_ID
  3265. WHERE mem.Member_RecID IS NULL
  3266. AND tmp.AssignedBy IS NOT NULL
  3267. AND tmp.AssignedBy <> 'zAdmin'
  3268. AND @Migration_Flag = 0
  3269.  
  3270. UNION ALL
  3271.  
  3272. -- Check that Resource members are valid
  3273. SELECT
  3274. tmp.ExcelRowNumber,
  3275. 'Unable to locate resource member: ' + ISNULL(ResourceMember, ''),
  3276. 'Invalid resource member'
  3277. FROM #Import_Staging tmp
  3278. LEFT OUTER JOIN Member mem
  3279. ON tmp.ResourceMember = ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + dbo.ufn_Import_Trim(mem.Last_Name)
  3280. OR tmp.ResourceMember = mem.Member_ID
  3281. WHERE mem.Member_RecID IS NULL
  3282. AND tmp.ResourceMember IS NOT NULL
  3283. AND @ForceMode = 0
  3284.  
  3285. UNION ALL
  3286.  
  3287. -- Check that all time entries have a valid dates
  3288. SELECT
  3289. ti.ExcelRowNumber,
  3290. 'Invalid time entry start date: ' + ISNULL(Date_Start, '[NULL]'),
  3291. 'Invalid start date'
  3292. FROM #TMP_Time_Staging ti
  3293. WHERE ISDATE(Date_Start) = 0
  3294. OR ti.Date_Start IS NULL
  3295.  
  3296. UNION ALL
  3297.  
  3298. SELECT
  3299. ti.ExcelRowNumber,
  3300. 'Invalid time entry end date: ' + ISNULL(Date_End, '[NULL]'),
  3301. 'Invalid end date'
  3302. FROM #TMP_Time_Staging ti
  3303. WHERE ISDATE(Date_End) = 0
  3304. OR ti.Date_End IS NULL
  3305.  
  3306. UNION ALL
  3307.  
  3308. -- Check that Note Type is 'Internal', 'Detail', 'Resolution', or blank
  3309. SELECT
  3310. ti.ExcelRowNumber,
  3311. 'Invalid note type: ' + ISNULL(Note_Type, '[NULL]'),
  3312. 'Invalid Time entry note type'
  3313. FROM #TMP_Time_Staging ti
  3314. WHERE ti.Note_Type NOT IN('Internal', 'Detail', 'Resolution', '', 'ResolutionNote', 'InternalNote', 'DetailNote', 'ExtNote')
  3315.  
  3316. UNION ALL
  3317.  
  3318. -- Check that all time entries link back to a ticket
  3319. SELECT
  3320. ti.Legacy_Ticket_ID,
  3321. 'Time entry did not link back to a ticket for legacy id: ' + ti.Legacy_Ticket_ID,
  3322. ''
  3323. FROM #TMP_Time_Staging ti
  3324. WHERE ti.ExcelRowNumber IS NULL
  3325.  
  3326. -- If date completed is entered - must be >= date entered
  3327. IF NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging tmp WHERE ISDATE(tmp.DateEntered) = 0 OR ISDATE(tmp.DateCompleted) = 0)
  3328. BEGIN
  3329.  
  3330. INSERT INTO #tblResults
  3331. (
  3332. RowNumber,
  3333. ValMsg,
  3334. InvalidReason
  3335. )
  3336. SELECT
  3337. tmp.ExcelRowNumber,
  3338. 'Date completed cannot be earlier than date entered',
  3339. NULL
  3340. FROM #Import_Staging tmp
  3341. WHERE CONVERT(DATETIME, tmp.DateCompleted) < CONVERT(DATETIME, tmp.DateEntered)
  3342. AND tmp.DateCompleted IS NOT NULL
  3343. END
  3344.  
  3345. -- Insert notification messages for any created references
  3346. INSERT INTO #tblResults
  3347. (
  3348. RowNumber,
  3349. ValMsg,
  3350. Warning_Flag,
  3351. ReferenceType
  3352. )
  3353.  
  3354. SELECT
  3355. 0,
  3356. '"' + Board_Name + '" for Billing Unit: "' + bu.[Description] + '" at Location: "' + ol.[Description] + '"',
  3357. 1,
  3358. 'Service Board(s)'
  3359. FROM dbo.SR_Board srb
  3360. INNER JOIN Owner_Level ol
  3361. ON ol.Owner_Level_RecID = srb.Owner_Level_RecID
  3362. INNER JOIN Billing_Unit bu
  3363. ON bu.Billing_Unit_RecID = srb.Billing_Unit_RecID
  3364. WHERE srb.Updated_By = @ImportBatchUser
  3365.  
  3366. UNION ALL
  3367.  
  3368. SELECT
  3369. 0,
  3370. [Description],
  3371. 1,
  3372. 'Service Team(s)'
  3373. FROM dbo.SR_Team
  3374. WHERE Updated_By = @ImportBatchUser
  3375.  
  3376. UNION ALL
  3377.  
  3378. SELECT
  3379. 0,
  3380. [Description],
  3381. 1,
  3382. 'Service Prioritie(s)'
  3383. FROM dbo.SR_Urgency
  3384. WHERE Updated_By = @ImportBatchUser
  3385.  
  3386. UNION ALL
  3387.  
  3388. SELECT
  3389. 0,
  3390. [Description],
  3391. 1,
  3392. 'Service Source(s)'
  3393. FROM dbo.SR_Source
  3394. WHERE Updated_By = @ImportBatchUser
  3395.  
  3396. UNION ALL
  3397.  
  3398. SELECT
  3399. 0,
  3400. [Description],
  3401. 1,
  3402. 'Service Status(es)'
  3403. FROM dbo.SR_Status
  3404. WHERE Updated_By = @ImportBatchUser
  3405.  
  3406. UNION ALL
  3407.  
  3408. SELECT
  3409. 0,
  3410. [Description],
  3411. 1,
  3412. 'Service type(s)'
  3413. FROM dbo.SR_Type
  3414. WHERE Updated_By = @ImportBatchUser
  3415.  
  3416. UNION ALL
  3417.  
  3418. SELECT
  3419. 0,
  3420. [Description],
  3421. 1,
  3422. 'Service Subtype(s)'
  3423. FROM dbo.SR_SubType
  3424. WHERE Updated_By = @ImportBatchUser
  3425.  
  3426. UNION ALL
  3427.  
  3428. SELECT
  3429. 0,
  3430. [Description],
  3431. 1,
  3432. 'Subtype Item(s)'
  3433. FROM dbo.SR_SubTypeItem
  3434. WHERE Updated_By = @ImportBatchUser
  3435.  
  3436. UNION ALL
  3437.  
  3438. SELECT
  3439. 0,
  3440. ty.[Description] + ISNULL(' -> ' + sty.[Description], '') + ISNULL(' -> ' + sitem.[Description], ''),
  3441. 1,
  3442. 'Service Type -> Subtype -> Item Relationship(s)'
  3443. FROM dbo.SR_Type_Subtype_SubtypeItem_Template tmpl
  3444. INNER JOIN SR_Type ty
  3445. ON ty.SR_Type_RecID = tmpl.SR_Type_RecID
  3446. INNER JOIN SR_Subtype sty
  3447. ON sty.SR_Subtype_RecID = tmpl.SR_Subtype_RecID
  3448. LEFT OUTER JOIN SR_SubtypeItem sitem
  3449. ON sitem.SR_SubTypeItem_RecID = tmpl.SR_SubTypeItem_RecID
  3450. WHERE tmpl.Updated_By = @ImportBatchUser
  3451.  
  3452. UNION ALL
  3453.  
  3454. SELECT
  3455. 0,
  3456. ISNULL(cont.First_Name, '') + ' ' + ISNULL(cont.Last_Name, ''),
  3457. 1,
  3458. 'Contact(s)'
  3459. FROM dbo.Contact cont
  3460. WHERE cont.Updated_By = @ImportBatchUser
  3461.  
  3462. UNION ALL
  3463.  
  3464. SELECT DISTINCT
  3465. ExcelRowNumber,
  3466. 'Company: "' + tmp.Company_Name + '" fuzzy matched to Company: ' + tmp.Company_Name_Fuzzy,
  3467. 1,
  3468. NULL
  3469. FROM #Import_Staging tmp
  3470. WHERE Company_Name_Fuzzy IS NOT NULL
  3471.  
  3472. UNION ALL
  3473.  
  3474. SELECT DISTINCT
  3475. ExcelRowNumber,
  3476. 'Contact "' + tmp.ContactName + '" fuzzy matched to Contact: ' + tmp.Contact_Name_Fuzzy,
  3477. 1,
  3478. NULL
  3479. FROM #Import_Staging tmp
  3480. WHERE Contact_Name_Fuzzy IS NOT NULL
  3481.  
  3482. UNION ALL
  3483.  
  3484. SELECT
  3485. 0,
  3486. [Description],
  3487. 1,
  3488. 'Service Location(s)'
  3489. FROM dbo.SR_Location
  3490. WHERE Updated_By = @ImportBatchUser
  3491.  
  3492. -- Return results
  3493. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  3494. BEGIN
  3495.  
  3496. exec dbo.usp_Condense_Validation_Results
  3497.  
  3498. SELECT
  3499. 0 AS ValPassed,
  3500. 0 AS RowNumber,
  3501. ValMsg
  3502. FROM #ResultsCondensed
  3503.  
  3504. IF XACT_STATE() IN(1, -1)
  3505. BEGIN
  3506. ROLLBACK TRANSACTION
  3507. END
  3508.  
  3509. RETURN 0
  3510.  
  3511. END
  3512. ELSE
  3513. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
  3514. BEGIN
  3515.  
  3516. exec dbo.usp_Condense_Validation_Results
  3517.  
  3518. SELECT
  3519. 2 AS ValPassed,
  3520. 0 AS RowNumber,
  3521. ValMsg
  3522. FROM #ResultsCondensed res
  3523.  
  3524.  
  3525. UNION ALL
  3526.  
  3527. SELECT
  3528. 2 AS ValPassed,
  3529. 0 AS RowNumber,
  3530. 'The following ' + ReferenceType + ' will be created: '+
  3531. STUFF(
  3532. (SELECT ', ' + ValMsg
  3533. FROM #tblResults
  3534. WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
  3535. FOR XML PATH (''))
  3536. , 1, 1, '') AS ValMsg
  3537. FROM #tblResults res
  3538. WHERE ReferenceType IS NOT NULL
  3539. GROUP BY ReferenceType
  3540.  
  3541. IF XACT_STATE() IN(1, -1)
  3542. BEGIN
  3543. ROLLBACK TRANSACTION
  3544. END
  3545.  
  3546. EXEC usp_Import_Record_Validation @TableName
  3547. RETURN 1
  3548.  
  3549. END
  3550. ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  3551. BEGIN
  3552. SELECT
  3553. 1 AS ValPassed,
  3554. NULL AS RowNumber,
  3555. NULL AS ValMsg
  3556.  
  3557. IF XACT_STATE() IN(1, -1)
  3558. BEGIN
  3559. ROLLBACK TRANSACTION
  3560. END
  3561.  
  3562. EXEC usp_Import_Record_Validation @TableName
  3563. RETURN 1
  3564.  
  3565. END
  3566.  
  3567.  
  3568.  
  3569. END TRY
  3570.  
  3571. BEGIN CATCH
  3572. -- Return error information and rollback transaction
  3573. SELECT
  3574. 0 AS ValPassed,
  3575. ERROR_LINE() AS ExcelRowNumber,
  3576. ERROR_MESSAGE() AS ErrorDetails
  3577.  
  3578. IF XACT_STATE() IN(1, -1)
  3579. BEGIN
  3580. ROLLBACK TRANSACTION
  3581. END
  3582. RETURN 0
  3583.  
  3584. END CATCH
  3585.  
  3586. GO
  3587.  
  3588.  
  3589.  
  3590. -- =============================================
  3591. -- Author: m.gray
  3592. -- Create date: 03/15/2013
  3593. -- Description: Performs final validation
  3594. -- and inserts for Service Ticket import
  3595. -- Sample call: exec usp_SR_ImportPush 'TMP_Import_4306c256637a4540a14d5db36e8aa1f9', 'TMP_Time_4306c256637a4540a14d5db36e8aa1f9', 0, 1
  3596. -- =============================================
  3597. ALTER PROCEDURE [dbo].[usp_SR_ImportPush]
  3598. @TableName VARCHAR(255),
  3599. @TETableName VARCHAR(255),
  3600. @DebugMode INT = 0,
  3601. @ForceMode BIT = 0
  3602. AS
  3603. BEGIN TRY
  3604.  
  3605.  
  3606. SET NOCOUNT ON
  3607.  
  3608. -- Handle instance where front end passes string 'Null' for @TETableName
  3609. IF @TETableName = 'NULL'
  3610. BEGIN
  3611. SET @TETableName = NULL
  3612. END
  3613.  
  3614.  
  3615. -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
  3616. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  3617. BEGIN
  3618. DROP TABLE #Import_Staging
  3619. END
  3620.  
  3621. CREATE TABLE #Import_Staging
  3622. (
  3623. ExcelRowNumber int NULL,
  3624. BoardName VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3625. Company_Name VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3626. ContactName VARCHAR(60) COLLATE DATABASE_DEFAULT NULL,
  3627. SR_Board_RecID int NULL,
  3628. SrStatus VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3629. SrType VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3630. SrSubType VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3631. SrItem VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3632. SrSource VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3633. SrLocation VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3634. SrPriority VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3635. Summary VARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  3636. DetailDescription nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  3637. InternalAnalysis nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  3638. Resolution nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  3639. AssignedBy VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3640. DateEntered datetime NULL,
  3641. DateCompleted datetime NULL,
  3642. ConfigName VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3643. ResourceMember VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3644. NewSrRecid int NULL,
  3645. ConvertMessage varchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  3646. BatchID UNIQUEIDENTIFIER NULL,
  3647. Phone VARCHAR(50) COLLATE DATABASE_DEFAULT,
  3648. Ext VARCHAR(50) COLLATE DATABASE_DEFAULT,
  3649. Email VARCHAR(255) COLLATE DATABASE_DEFAULT,
  3650. Company_Address_RecID INT,
  3651. SiteName VARCHAR(80) COLLATE DATABASE_DEFAULT,
  3652. Address_Line1 VARCHAR(150) COLLATE DATABASE_DEFAULT,
  3653. Address_Line2 VARCHAR(150) COLLATE DATABASE_DEFAULT,
  3654. City VARCHAR(150) COLLATE DATABASE_DEFAULT,
  3655. State_ID VARCHAR(50) COLLATE DATABASE_DEFAULT,
  3656. Zip VARCHAR(20) COLLATE DATABASE_DEFAULT,
  3657. SR_Type_RecID INT,
  3658. SR_SubType_RecID INT,
  3659. SR_SubTypeItem_RecID INT,
  3660. SR_Location_RecID INT,
  3661. SR_Status_RecID INT,
  3662. SR_Source_RecID INT,
  3663. SR_Urgency_RecID INT,
  3664. Sr_Team_RecID INT,
  3665. Config_RecID INT,
  3666. FinalRecID INT,
  3667. New_Identity INT,
  3668. Schedule_Desc VARCHAR(200) COLLATE DATABASE_DEFAULT,
  3669. Resource_Member_RecID INT,
  3670. EnteredOffset INT,
  3671. EnteredUTC DATETIME,
  3672. CompletedOffset INT,
  3673. CompletedUTC DATETIME,
  3674. Legacy_Ticket_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  3675. Company_RecID INT NULL,
  3676. Company_Name_Stripped VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3677. Company_Name_Fuzzy VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3678. Company_Duplicate_Flag BIT NULL,
  3679. Contact_RecID INT NULL,
  3680. Contact_Duplicate_Flag BIT NULL,
  3681. Contact_Name_Fuzzy VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  3682. Company_Match_Val VARCHAR(3) COLLATE DATABASE_DEFAULT NULL,
  3683. Template_RecID INT,
  3684. Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  3685. Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  3686. Legacy_Site_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  3687. SR_Service_RecID INT,
  3688. SO_Opportunity_RecID INT,
  3689. Diff_Exclude_Flag BIT,
  3690. Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  3691. Duplicate_Flag BIT,
  3692. Legacy_Opp_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  3693. Country_RecID INT,
  3694. Tax_Code_RecID INT
  3695. )
  3696.  
  3697. CREATE INDEX IX_SR_Import_CompName ON #Import_Staging(Company_Name)
  3698. CREATE CLUSTERED INDEX IX_SR_Import_Excel ON #Import_Staging(ExcelRowNumber)
  3699. CREATE INDEX IX_SR_Import_Board ON #Import_Staging(BoardName)
  3700. CREATE INDEX IX_SR_Import_Status ON #Import_Staging(SrStatus)
  3701. CREATE INDEX IX_SR_Import_Type ON #Import_Staging(SrType)
  3702. CREATE INDEX IX_SR_Import_SubType ON #Import_Staging(SrSubtype)
  3703. CREATE INDEX IX_SR_Import_Item ON #Import_Staging(SrItem)
  3704. CREATE INDEX IX_SR_Import_Loc ON #Import_Staging(SrLocation)
  3705. CREATE INDEX IX_SR_Import_Pri ON #Import_Staging(SrPriority)
  3706. CREATE INDEX IX_SR_Import_Legacy ON #Import_Staging(Legacy_ID)
  3707. CREATE INDEX IX_SR_Import_Tix ON #Import_Staging(Legacy_Ticket_ID)
  3708. CREATE INDEX IX_SR_Import_Mat ON #Import_Staging(Company_Match_Val)
  3709. CREATE INDEX IX_SR_Import_legcomp ON #Import_Staging(Legacy_Company_ID)
  3710. CREATE INDEX IX_SR_Import_legcont ON #Import_Staging(Legacy_Contact_ID)
  3711. CREATE INDEX IX_SR_Import_opp ON #Import_Staging(Legacy_Opp_ID)
  3712. CREATE INDEX IX_SR_Import_Site ON #Import_Staging(Legacy_Site_ID)
  3713.  
  3714. -- Variable declaration
  3715. -- Dynamic statement to insert to staging table
  3716. DECLARE @DSQL VARCHAR(MAX)
  3717.  
  3718. -- Fully qualified name of source tables
  3719. DECLARE @SourceTable VARCHAR(300)
  3720. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  3721.  
  3722. DECLARE @TESourceTable VARCHAR(300)
  3723. SELECT @TESourceTable = 'tempdb.dbo.' + @TETableName
  3724.  
  3725. -- Get first zAdmin Time_Sheet_RecID to link to time entries
  3726. DECLARE @Time_Sheet_RecID INT = (SELECT TOP 1 Time_Sheet_RecID FROM dbo.Time_Sheet ts CROSS APPLY(SELECT TOP 1 * FROM dbo.Member mem WHERE mem.Member_RecID = ts.Member_RecID AND mem.Member_ID = 'zAdmin') mem)
  3727.  
  3728. -- Get TE_Status_ID for 'Written off' to apply to time entries/sheet
  3729. DECLARE @TE_Status_ID INT = (SELECT TOP 1 TE_Status_ID FROM dbo.TE_Status stat WHERE stat.[Description] = 'Written off')
  3730.  
  3731. -- Flag to indicate migration being matched on Legacy_ID
  3732. DECLARE @Legacy_Flag BIT = 0
  3733.  
  3734. -- Object_ID of source table
  3735. DECLARE @Source_Object_ID INT
  3736. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  3737.  
  3738. DECLARE
  3739. @ExpRowCount INT, -- Expected rowcount inserts - Used for validation
  3740. @ErrorMsg VARCHAR(1000), -- Variable to hold custom error message
  3741. @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
  3742. @ImportBatchUser VARCHAR(15), -- Unique value to identify records created by this import
  3743. @Time_Zone_RecID INT, -- Default time zone from setup tables
  3744. @Migration_Flag BIT, -- Indicates that this is a canned data migration (Autotask/Tigerpaw)
  3745. @Time_Zone_Name_RecID INT,
  3746. @MAX_SR_Service_RecID INT, -- Max recid from SR_Service prior to import (Performance - helps with slow join on this table)
  3747. @MAX_Time_Entry_RecID INT -- Max recid from SR_Service prior to import (Performance - helps with slow join on this table)
  3748.  
  3749. SET @Time_Zone_Name_RecID = (SELECT TOP 1 Time_Zone_Name_RecID FROM Time_Zone WHERE Default_Flag = 1)
  3750.  
  3751.  
  3752. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  3753. SELECT @ImportBatchUser =
  3754. 'CONV_'
  3755. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  3756. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  3757. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  3758. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  3759.  
  3760. -- Determine default time zone
  3761. SET @Time_Zone_RecID = (SELECT TOP 1 Time_Zone_RecID FROM dbo.Time_Zone WHERE Default_Flag = 1)
  3762.  
  3763. -- Table variable to hold column names from source table
  3764. DECLARE @SourceColumns TABLE
  3765. (
  3766. ColumnName VARCHAR(255)
  3767. )
  3768.  
  3769. -- Populate @SourceColumns
  3770. INSERT INTO @SourceColumns
  3771. (
  3772. ColumnName
  3773. )
  3774.  
  3775. SELECT
  3776. name
  3777. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  3778.  
  3779. -- Build statement to populate staging table
  3780. SELECT @DSQL = '
  3781. INSERT INTO #Import_Staging
  3782. (
  3783. ExcelRowNumber,
  3784. BoardName,
  3785. Company_Name,
  3786. ContactName,
  3787. SrStatus,
  3788. SrType,
  3789. SrSubType,
  3790. SrItem,
  3791. SrSource,
  3792. SrLocation,
  3793. SrPriority,
  3794. Summary,
  3795. DetailDescription,
  3796. InternalAnalysis,
  3797. Resolution,
  3798. AssignedBy,
  3799. DateEntered,
  3800. DateCompleted,
  3801. ConfigName,
  3802. ResourceMember,
  3803. Company_Match_Val,
  3804. Legacy_ID,
  3805. Legacy_Company_ID,
  3806. Legacy_Contact_ID
  3807. )
  3808.  
  3809. SELECT
  3810. [Excel Row Number],
  3811. LEFT([Service Board], 50),
  3812. LEFT([Company Name], 50),
  3813. LEFT([Contact Name], 60),
  3814. LEFT([Service Status], 50),
  3815. LEFT([Service Type], 50),
  3816. LEFT([Service Subtype], 50),
  3817. LEFT([Service Item], 50),
  3818. LEFT([Service Source], 50),
  3819. LEFT([Service Location], 50),
  3820. LEFT([Service Priority], 50),
  3821. LEFT([Summary], 100),
  3822. [Detail Description],
  3823. [Internal Analysis],
  3824. [Resolution],
  3825. LEFT([Assigned By], 50),
  3826. LEFT([Date Entered], 50),
  3827. LEFT([Date Completed], 50),
  3828. LEFT([Configuration Name], 50),
  3829. LEFT([Resource Member], 50),
  3830. LEFT([Company Name], 3),
  3831. Legacy_ID,
  3832. Legacy_Company_ID,
  3833. Legacy_Contact_ID
  3834. FROM ' + @SourceTable
  3835.  
  3836. -- Pull data into staging table
  3837. EXEC(@DSQL)
  3838.  
  3839. IF OBJECT_ID('tempdb..#TMP_Time_Staging') IS NOT NULL
  3840. BEGIN
  3841. DROP TABLE #TMP_Time_Staging
  3842. END
  3843.  
  3844.  
  3845. -- Table to hold time entries for insert
  3846. CREATE TABLE #TMP_Time_Staging
  3847. (
  3848. RecID INT IDENTITY,
  3849. Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  3850. Legacy_Ticket_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  3851. ExcelRowNumber INT,
  3852. First_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  3853. Last_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  3854. Num_Hours FLOAT,
  3855. Hours_Bill FLOAT,
  3856. Date_Start NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  3857. Date_End NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  3858. Billable INT,
  3859. Notes NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  3860. Note_Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  3861. Member_RecID INT,
  3862. Member_ID VARCHAR(15) COLLATE DATABASE_DEFAULT NULL,
  3863. Time_RecID INT,
  3864. SR_Detail_RecID INT,
  3865. Created_By NVARCHAR(150) COLLATE DATABASE_DEFAULT NULL,
  3866. TicketRowNumber INT,
  3867. Company_RecID INT,
  3868. SR_Service_RecID INT,
  3869. Owner_Level_RecID INT,
  3870. Billing_Unit_RecID INT,
  3871. Activity_Type_RecID INT,
  3872. Activity_Class_RecID INT,
  3873. Member_ID_Calculated VARCHAR(100) COLLATE DATABASE_DEFAULT
  3874. )
  3875.  
  3876. CREATE INDEX IX_Tix ON #TMP_Time_Staging(Legacy_Ticket_ID)
  3877. CREATE INDEX IX_TE_Excel ON #TMP_Time_Staging(RecID)
  3878. CREATE INDEX IX_TE_SRS ON #TMP_Time_Staging(SR_Service_RecID)
  3879.  
  3880. IF @TETableName IS NOT NULL
  3881. BEGIN
  3882. SELECT @DSQL =
  3883. '
  3884. INSERT INTO #TMP_Time_Staging
  3885. (
  3886. Legacy_Ticket_ID,
  3887. First_Name,
  3888. Last_Name,
  3889. Date_Start,
  3890. Date_End,
  3891. Billable,
  3892. Notes,
  3893. Num_Hours,
  3894. Hours_Bill,
  3895. Note_Type,
  3896. ExcelRowNumber
  3897. )
  3898.  
  3899. SELECT
  3900. [Legacy_Ticket_ID],
  3901. [Resource First Name],
  3902. [Resource Last Name],
  3903. [Date Start],
  3904. [Date End],
  3905. [Billable Flag],
  3906. Notes,
  3907. [Total Hours],
  3908. [Hours Bill],
  3909. [Note Type],
  3910. [Excel Row Number]
  3911. FROM ' + @TESourceTable + '
  3912. WHERE [Hours Bill] NOT LIKE ''CONNECTWISE%'''
  3913.  
  3914. EXEC (@DSQL)
  3915.  
  3916. UPDATE te
  3917. SET TicketRowNumber = stag.ExcelRowNumber
  3918. FROM #TMP_Time_Staging te
  3919. CROSS APPLY(SELECT TOP 1 ExcelRowNumber FROM #Import_Staging stag WHERE stag.Legacy_ID = te.Legacy_Ticket_ID)stag
  3920.  
  3921. UPDATE te
  3922. SET Created_By = LTRIM(RTRIM(LEFT(ISNULL(First_Name + ' ', '') + ISNULL(Last_Name, ''), 150)))
  3923. FROM #TMP_Time_Staging te
  3924.  
  3925. UPDATE #TMP_Time_Staging
  3926. SET Created_By = 'zAdmin'
  3927. WHERE Created_By = ''
  3928.  
  3929. END
  3930.  
  3931. BEGIN TRANSACTION SR_Import
  3932.  
  3933. -- If no zAdmin timesheet, solve by creating one
  3934. IF @Time_Sheet_RecID IS NULL AND @TETableName IS NOT NULL
  3935. BEGIN
  3936. -- Create table to force compile regardless of data structure
  3937. CREATE TABLE #TS_Hack(ColumnName NVARCHAR(50))
  3938.  
  3939. IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_id) = 'Time_Sheet')
  3940. BEGIN
  3941. INSERT INTO dbo.Time_Sheet
  3942. (
  3943. Owner_ID,
  3944. TE_Period_RecID,
  3945. Member_RecID,
  3946. TE_Status_ID,
  3947. Entered_By
  3948. )
  3949.  
  3950. SELECT TOP 1
  3951. 1,
  3952. per.TE_Period_RecID,
  3953. mem.Member_RecID,
  3954. tes.TE_Status_ID,
  3955. 'zAdmin'
  3956. FROM dbo.Member mem
  3957. CROSS APPLY(SELECT TOP 1 * FROM TE_Status tes WHERE tes.[Description] = 'Written off')tes
  3958. CROSS APPLY(SELECT TOP 1 * FROM TE_Period per) per
  3959. CROSS APPLY(SELECT 1 AS hack FROM #TS_Hack)hack
  3960. WHERE mem.Member_ID = 'zAdmin'
  3961.  
  3962. SELECT @Time_Sheet_RecID = SCOPE_IDENTITY()
  3963. END
  3964.  
  3965. IF NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_id) = 'Time_Sheet')
  3966. BEGIN
  3967. INSERT INTO dbo.Time_Sheet
  3968. (
  3969. Owner_ID,
  3970. TE_Period_RecID,
  3971. Member_RecID,
  3972. TE_Status_ID
  3973. )
  3974.  
  3975. SELECT TOP 1
  3976. 1,
  3977. per.TE_Period_RecID,
  3978. mem.Member_RecID,
  3979. tes.TE_Status_ID
  3980. FROM dbo.Member mem
  3981. CROSS APPLY(SELECT TOP 1 * FROM TE_Status tes WHERE tes.[Description] = 'Written off')tes
  3982. CROSS APPLY(SELECT TOP 1 * FROM TE_Period per) per
  3983. WHERE mem.Member_ID = 'zAdmin'
  3984.  
  3985. SELECT @Time_Sheet_RecID = SCOPE_IDENTITY()
  3986. END
  3987.  
  3988. DROP TABLE #TS_Hack
  3989.  
  3990. END
  3991.  
  3992. -- Update AssignedBy and Resource member in staging table to use Member_ID
  3993. UPDATE stag
  3994. SET AssignedBy = mem.Member_ID
  3995. FROM Member mem
  3996. INNER JOIN #Import_Staging stag
  3997. ON stag.AssignedBy = ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, '')
  3998. OR stag.AssignedBy = mem.Member_ID
  3999.  
  4000. UPDATE stag
  4001. SET ResourceMember = mem.Member_ID
  4002. FROM Member mem
  4003. INNER JOIN #Import_Staging stag
  4004. ON stag.ResourceMember = ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, '')
  4005. OR stag.ResourceMember = mem.Member_ID
  4006.  
  4007. -- Update Source table to AssignedBy = zAdmin where null
  4008. UPDATE #Import_Staging
  4009. SET AssignedBy = 'zAdmin'
  4010. WHERE AssignedBy IS NULL
  4011.  
  4012.  
  4013.  
  4014. -- For optional fields, update blank string & single space to NULL
  4015. -- so that NULL/NOT NULL can be properly handled throughout procedure
  4016. UPDATE #Import_Staging
  4017. SET
  4018. ContactName = CASE WHEN ContactName IN('', ' ') THEN NULL ELSE ContactName END,
  4019. SrType = CASE WHEN SrType IN('', ' ') THEN NULL ELSE SrType END,
  4020. SrSubType = CASE WHEN SrSubType IN('', ' ') THEN NULL ELSE SrSubType END,
  4021. SrItem = CASE WHEN SrItem IN('', ' ') THEN NULL ELSE SrItem END,
  4022. Summary = CASE WHEN Summary IN('', ' ') THEN NULL ELSE Summary END,
  4023. DetailDescription = CASE WHEN DetailDescription IN('', ' ') THEN NULL ELSE DetailDescription END,
  4024. InternalAnalysis = CASE WHEN InternalAnalysis IN('', ' ') THEN NULL ELSE InternalAnalysis END,
  4025. Resolution = CASE WHEN Resolution IN('', ' ') THEN NULL ELSE Resolution END,
  4026. DateEntered = CASE WHEN DateEntered IN('', ' ') THEN NULL ELSE DateEntered END,
  4027. DateCompleted = CASE WHEN DateCompleted IN('', ' ', '01/01/1900', '1900-01-01') THEN NULL ELSE DateCompleted END,
  4028. ConfigName = CASE WHEN ConfigName IN('', ' ') THEN NULL ELSE ConfigName END,
  4029. ResourceMember = CASE WHEN ResourceMember IN('', ' ') THEN NULL ELSE ResourceMember END,
  4030. SrSource = CASE WHEN SrSource IN('', ' ') THEN NULL ELSE SrSource END,
  4031. SrLocation = CASE WHEN SrLocation IN('', ' ') THEN NULL ELSE SrLocation END,
  4032. SrPriority = CASE WHEN SrPriority IN('', ' ') THEN NULL ELSE SrPriority END
  4033.  
  4034. -- Update each record with SR_Board_RecID
  4035. UPDATE stag
  4036. SET stag.SR_Board_RecID = srb.SR_Board_RecID
  4037. FROM SR_Board srb
  4038. INNER JOIN #Import_Staging stag
  4039. ON stag.BoardName = srb.Board_Name
  4040.  
  4041. -- Format dates as mm/dd/yyyy
  4042. UPDATE stag
  4043. SET DateCompleted = CONVERT(VARCHAR, CAST(DateCompleted AS DATETIME), 101)
  4044. FROM #Import_Staging stag
  4045. WHERE ISDATE(DateCompleted) = 1
  4046.  
  4047. UPDATE stag
  4048. SET DateEntered = CONVERT(VARCHAR, CAST(DateEntered AS DATETIME), 101)
  4049. FROM #Import_Staging stag
  4050. WHERE ISDATE(DateEntered) = 1
  4051.  
  4052. -- Update Date fields to NULL if 1900-01-01
  4053. UPDATE #Import_Staging
  4054. SET DateCompleted = NULL
  4055. WHERE DateCompleted = '1900-01-01'
  4056.  
  4057. UPDATE #Import_Staging
  4058. SET DateEntered = NULL
  4059. WHERE DateEntered = '1900-01-01'
  4060.  
  4061. -- If running in force mode, truncate Summary to 100 characters
  4062. UPDATE stag
  4063. SET stag.Summary = SUBSTRING(stag.Summary, 1, 100)
  4064. FROM #Import_Staging stag
  4065. WHERE @ForceMode = 1
  4066. AND LEN(stag.Summary) > 100
  4067.  
  4068. -- Exclude tickets previously imported
  4069. UPDATE stag
  4070. SET stag.Diff_Exclude_Flag = 1
  4071. FROM #Import_Staging stag
  4072. WHERE EXISTS(SELECT 1 FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_ID AND leg.Record_Type = 'Ticket')
  4073.  
  4074. DELETE FROM #Import_Staging WHERE Diff_Exclude_Flag = 1
  4075.  
  4076. UPDATE #Import_Staging SET Legacy_Contact_ID = NULL WHERE Legacy_Contact_ID = ''
  4077.  
  4078. -- Get Company_RecID
  4079. UPDATE stag
  4080. SET stag.Company_RecID = leg.CW_RecID
  4081. FROM #Import_Staging stag
  4082. CROSS APPLY(SELECT TOP 1 * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Company_ID AND leg.Record_Type = 'Company')leg
  4083. WHERE EXISTS(SELECT 1 FROM dbo.Company comp WHERE comp.Company_RecID = leg.CW_RecID)
  4084.  
  4085. -- Pull company RecID for merged companies
  4086. UPDATE stag
  4087. SET stag.Company_RecID = mrg.To_RecID
  4088. FROM #Import_Staging stag
  4089. CROSS APPLY(SELECT TOP 1 * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Company_ID AND leg.Record_Type = 'Company')leg
  4090. CROSS APPLY(SELECT TOP 1 To_RecID FROM dbo.Contact_Merge_Audit mrg WHERE mrg.From_RecID = leg.CW_RecID AND mrg.Audit_Source = 'M')mrg
  4091. WHERE stag.Company_RecID IS NULL
  4092.  
  4093. -- Pull Contact RecID
  4094. UPDATE stag
  4095. SET stag.Contact_RecID = leg.CW_RecID
  4096. FROM #Import_Staging stag
  4097. CROSS APPLY(SELECT TOP 1 * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Contact_ID AND leg.Record_Type = 'Contact')leg
  4098. WHERE EXISTS(SELECT 1 FROM dbo.Contact cont WHERE cont.Contact_RecID = leg.CW_RecID)
  4099.  
  4100. DELETE stag
  4101. FROM #Import_Staging stag
  4102. WHERE Company_RecID IS NULL
  4103. AND Legacy_Company_ID IS NOT NULL
  4104.  
  4105. IF NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging stag WHERE stag.Legacy_Company_ID IS NOT NULL)
  4106. BEGIN
  4107.  
  4108. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  4109. IF Object_ID('tempdb..#Company') IS NOT NULL
  4110. BEGIN
  4111. DROP TABLE #Company
  4112. END
  4113.  
  4114. SELECT DISTINCT
  4115. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  4116. comp.Company_ID,
  4117. comp.Company_Name,
  4118. Delete_Flag,
  4119. LEFT(Company_Name, 3) AS Company_Match_Val,
  4120. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  4121. 0 AS Duplicate_Flag
  4122. INTO #Company
  4123. FROM dbo.Company comp
  4124. WHERE Delete_Flag = 0
  4125.  
  4126. -- Table to hold contact information
  4127. IF Object_ID('tempdb..#Contact') IS NOT NULL
  4128. BEGIN
  4129. DROP TABLE #Contact
  4130. END
  4131.  
  4132. SELECT
  4133. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  4134. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  4135. First_Name,
  4136. Last_Name,
  4137. cont.Company_RecID,
  4138. Default_Flag
  4139. INTO #Contact
  4140. FROM dbo.Contact cont
  4141. INNER JOIN #Company comp
  4142. ON comp.Company_RecID = cont.Company_RecID
  4143.  
  4144. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  4145. END
  4146.  
  4147. -- If contact not specified, map to default contact (or oldest contact, if no default exists)
  4148. UPDATE stag
  4149. SET stag.Contact_RecID = cont.Contact_RecID
  4150. FROM #Import_Staging stag
  4151. CROSS APPLY(SELECT TOP 1 Contact_RecID FROM dbo.Contact cont WHERE cont.Company_RecID = stag.Company_RecID ORDER BY Default_Flag DESC, Contact_RecID ASC)cont
  4152. WHERE stag.Contact_RecID IS NULL
  4153.  
  4154. -- If no contact specified, and none exists, create a contact
  4155. INSERT INTO dbo.Contact
  4156. (
  4157. Owner_ID,
  4158. Company_RecID,
  4159. Seq_Nbr,
  4160. First_Name,
  4161. Last_Name,
  4162. Last_Update,
  4163. Updated_By,
  4164. Default_Flag
  4165. )
  4166.  
  4167. SELECT DISTINCT
  4168. 1,
  4169. stag.Company_RecID,
  4170. 0,
  4171. 'Imported',
  4172. 'Contact',
  4173. GETDATE(),
  4174. 'Import',
  4175. 0
  4176. FROM #Import_Staging stag
  4177. WHERE Company_RecID IS NOT NULL
  4178. AND Contact_RecID IS NULL
  4179.  
  4180. UPDATE stag
  4181. SET stag.Contact_RecID = cont.Contact_RecID
  4182. FROM #Import_Staging stag
  4183. CROSS APPLY(SELECT TOP 1 * FROM dbo.Contact cont WHERE cont.Company_RecID = stag.Company_RecID ORDER BY Default_Flag DESC, Contact_RecID ASC)cont
  4184. WHERE stag.Contact_RecID IS NULL
  4185.  
  4186. -- Grab defaults for optional fields (Location, Source, Priority)
  4187. UPDATE tmp
  4188. SET tmp.SrLocation = srl.DefaultLocation
  4189. FROM #Import_Staging tmp
  4190. CROSS APPLY(SELECT TOP 1 [Description] AS DefaultLocation FROM SR_Location WHERE Default_Flag = 1) srl
  4191. WHERE tmp.SrLocation IS NULL
  4192.  
  4193. UPDATE tmp
  4194. SET tmp.SrSource = src.DefaultSource
  4195. FROM #Import_Staging tmp
  4196. CROSS APPLY(SELECT TOP 1 [Description] AS DefaultSource FROM SR_Source WHERE Default_Flag = 1) src
  4197. WHERE tmp.SrSource IS NULL
  4198.  
  4199. UPDATE tmp
  4200. SET tmp.SrPriority = pri.DefaultPriority
  4201. FROM #Import_Staging tmp
  4202. CROSS APPLY(SELECT TOP 1 [Description] AS DefaultPriority FROM SR_Urgency WHERE Default_Flag = 1) pri
  4203. WHERE tmp.SrPriority IS NULL
  4204.  
  4205. IF @ForceMode = 1
  4206. BEGIN
  4207.  
  4208. -- If this is a custom migration, create Archive service board (if needed)
  4209. IF @ForceMode = 1
  4210. BEGIN
  4211.  
  4212. -- Eliminate header row
  4213. DELETE FROM #Import_Staging
  4214. WHERE SrSource = 'CONNECTWISE' AND SrPriority = 'CONNECTWISE'
  4215.  
  4216. SET @Migration_Flag = 1
  4217.  
  4218. -- Determine the best location and billing unit to place the board under
  4219. DECLARE @Billing_Unit_Loc_RecID INT
  4220.  
  4221. ;WITH BU_LOC_FIND AS
  4222. (
  4223. SELECT bul.Billing_Unit_Loc_RecID, Board_Name, Autoclose_Status_RecID, EC_ReOpen_Status, bu.[Description] AS Billing_Unit, ol.[Description] AS Owner_Level
  4224. FROM Billing_Unit_Loc bul
  4225. LEFT OUTER JOIN SR_Board board
  4226. ON board.Billing_Unit_RecID = bul.Billing_Unit_RecID
  4227. AND board.Owner_Level_RecID = bul.Owner_Level_RecID
  4228. INNER JOIN Owner_Level ol
  4229. ON bul.Owner_Level_RecID = ol.Owner_Level_RecID
  4230. INNER JOIN Billing_Unit bu
  4231. ON bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
  4232. )
  4233.  
  4234. SELECT @Billing_Unit_Loc_RecID =
  4235. CASE
  4236. WHEN EXISTS(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Board_Name IN('Service Desk', 'Help Desk', 'Support', 'Professional Services', 'Support Desk'))
  4237. THEN (SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_Loc_Find WHERE Board_Name IN('Service Desk', 'Help Desk', 'Support', 'Professional Services', 'Support Desk'))
  4238. WHEN EXISTS(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE EC_ReOpen_Status IS NOT NULL)
  4239. THEN(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE EC_ReOpen_Status IS NOT NULL)
  4240. ELSE
  4241. (SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Board_Name IS NOT NULL)
  4242. END
  4243. END
  4244.  
  4245.  
  4246. -- Insert service board
  4247. INSERT INTO SR_Board
  4248. (
  4249. Board_Name,
  4250. Owner_Level_Recid,
  4251. Billing_Unit_Recid,
  4252. Board_Icon,
  4253. Billcomplete_Flag,
  4254. Billsr_Flag,
  4255. Billunapp_Flag,
  4256. Override_Flag,
  4257. Dispatch,
  4258. Servicemanager,
  4259. Dutymanager,
  4260. Activity_Class_Recid,
  4261. Activity_Type_Recid,
  4262. Timebillable_Flag,
  4263. Expbillable_Flag,
  4264. Prodbillable_Flag,
  4265. Timeinvoice_Flag,
  4266. Expinvoice_Flag,
  4267. Prodinvoice_Flag,
  4268. Updated_By,
  4269. Last_Update,
  4270. Autoclose_Status_Recid,
  4271. Autoassignnew_Flag,
  4272. Autoassignec_Flag,
  4273. Autoassignportal_Flag,
  4274. Sr_Signoff_Recid,
  4275. Ec_Reopen_Status,
  4276. Project_Flag,
  4277. Emailcontact_Flag,
  4278. Emailresource_Flag,
  4279. Lockdesc_Flag,
  4280. Sr_Problem_Flag,
  4281. Additionslocktime_Flag,
  4282. Oncall,
  4283. Default_Notify_From,
  4284. Sr_Resolution_Flag,
  4285. Sr_Internalanalysis_Flag,
  4286. Te_Problem_Flag,
  4287. Te_Resolution_Flag,
  4288. Te_Internalanalysis_Flag,
  4289. Problem_Sort,
  4290. Resolution_Sort,
  4291. Internalanalysis_Sort,
  4292. Emailcontact_Template_Recid,
  4293. Emailresource_Template_Recid,
  4294. Inactive_Flag,
  4295. Display_Name,
  4296. Ec_Reopen_Resources_Flag,
  4297. Ec_Company_Match_Flag,
  4298. Ec_Reopen_Days_Flag,
  4299. Ec_Reopen_Days,
  4300. Member_Display_Name_Flag
  4301. )
  4302.  
  4303. SELECT DISTINCT
  4304. tmp.BoardName,
  4305. bul.Owner_Level_RecID,
  4306. bul.Billing_Unit_RecID,
  4307. '',
  4308. 0,
  4309. 0,
  4310. 0,
  4311. 0,
  4312. 0,
  4313. 0,
  4314. 0,
  4315. ISNULL(srb.Activity_Class_RecID, ac.Activity_Class_RecID),
  4316. at.Activity_Type_RecID,
  4317. 1,
  4318. 1,
  4319. 0,
  4320. 0,
  4321. 0,
  4322. 0,
  4323. @ImportBatchUser,
  4324. GETDATE(),
  4325. 0,
  4326. 0,
  4327. 0,
  4328. 0,
  4329. 0,
  4330. NULL,
  4331. 0,
  4332. 0,
  4333. 0,
  4334. 0,
  4335. 0,
  4336. 0,
  4337. 0,
  4338. 0,
  4339. 0,
  4340. 0,
  4341. 0,
  4342. 0,
  4343. 0,
  4344. 'A',
  4345. 'A',
  4346. 'A',
  4347. 0,
  4348. 0,
  4349. 0,
  4350. '',
  4351. 0,
  4352. 0,
  4353. 0,
  4354. 0,
  4355. 0
  4356. FROM #Import_Staging tmp
  4357. OUTER APPLY(SELECT TOP 1 * FROM Billing_Unit_Loc bul WHERE bul.Billing_Unit_Loc_RecID = @Billing_Unit_Loc_RecID) bul
  4358. OUTER APPLY(SELECT TOP 1 Activity_Class_RecID FROM SR_Board srb WHERE srb.Activity_Class_RecID > 0)srb
  4359. OUTER APPLY(SELECT TOP 1 Activity_Class_RecID FROM Activity_Class)ac
  4360. OUTER APPLY(SELECT TOP 1 * FROM Activity_Type ORDER BY Default_Flag DESC)at
  4361. WHERE tmp.SR_Board_RecID IS NULL
  4362.  
  4363. -- Create default service teams for Tigerpaw/AutoTask Archive boards
  4364. INSERT INTO SR_Team
  4365. (
  4366. Owner_ID,
  4367. [Description],
  4368. Member_RecID,
  4369. Owner_Level_RecID,
  4370. Billing_Unit_RecID,
  4371. Default_Flag,
  4372. Updated_By,
  4373. Last_Update,
  4374. SR_Board_RecID,
  4375. DeleteNotify_Flag
  4376. )
  4377.  
  4378. SELECT DISTINCT
  4379. 1,
  4380. LEFT(tmp.BoardName + ' Team', 30),
  4381. mem.Member_RecID,
  4382. bul.Owner_Level_RecID,
  4383. bul.Billing_Unit_RecID,
  4384. 1,
  4385. @ImportBatchUser,
  4386. GETDATE(),
  4387. srb.SR_Board_RecID,
  4388. 0
  4389. FROM #Import_Staging tmp
  4390. INNER JOIN dbo.Billing_Unit_Loc bul
  4391. ON bul.Billing_Unit_Loc_RecID = @Billing_Unit_Loc_RecID
  4392. INNER JOIN Member mem
  4393. ON mem.Member_ID = 'zAdmin'
  4394. INNER JOIN SR_Board srb
  4395. ON srb.Board_Name = tmp.BoardName
  4396. AND srb.Updated_By = @ImportBatchUser
  4397.  
  4398. -- Update each record with SR_Board_RecID
  4399. UPDATE tmp
  4400. SET tmp.SR_Board_RecID = srb.SR_Board_RecID
  4401. FROM SR_Board srb
  4402. INNER JOIN #Import_Staging tmp
  4403. ON tmp.BoardName = srb.Board_Name
  4404.  
  4405. -- Service Priority
  4406. INSERT INTO dbo.SR_Urgency WITH(TABLOCK)
  4407. (
  4408. Owner_ID,
  4409. Color,
  4410. Image_Link,
  4411. [Description],
  4412. Sort_Order,
  4413. Default_Flag,
  4414. Updated_By,
  4415. Response_Hours
  4416. )
  4417.  
  4418. SELECT DISTINCT
  4419. 1,
  4420. 'White',
  4421. '.../../common/images/infoIcons/urgencyColors/White.gif',
  4422. tmp.SrPriority,
  4423. 0,
  4424. 0,
  4425. @ImportBatchUser,
  4426. 0
  4427. FROM #Import_Staging tmp
  4428. LEFT OUTER JOIN SR_Urgency sru
  4429. ON sru.[Description] = tmp.SrPriority
  4430. WHERE tmp.SrPriority IS NOT NULL
  4431. AND sru.SR_Urgency_RecID IS NULL
  4432. AND tmp.SrPriority NOT IN('', ' ')
  4433.  
  4434. -- table to Force compilation regardless of structure
  4435. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  4436. DROP TABLE #Force_Compile
  4437.  
  4438. CREATE TABLE #Force_Compile
  4439. (
  4440. Column_Name VARCHAR(20)
  4441. )
  4442.  
  4443. IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_by' AND OBJECT_NAME(OBJECT_ID) = 'SR_Source')
  4444. BEGIN
  4445.  
  4446. -- Service Source
  4447. INSERT INTO SR_Source
  4448. (
  4449. Owner_ID,
  4450. [Description],
  4451. Updated_By,
  4452. Last_Update,
  4453. Default_Flag,
  4454. Entered_By
  4455. )
  4456.  
  4457. SELECT DISTINCT
  4458. 1,
  4459. tmp.SrSource,
  4460. @ImportBatchUser,
  4461. GETDATE(),
  4462. 0,
  4463. 'zAdmin'
  4464. FROM #Import_Staging tmp
  4465. OUTER APPLY(SELECT TOP 1 * FROM SR_Source srs WHERE srs.[Description] = tmp.SrSource)srs
  4466. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  4467. WHERE tmp.SrSource IS NOT NULL
  4468. AND srs.SR_Source_RecID IS NULL
  4469. AND tmp.SrSource NOT IN('', ' ')
  4470.  
  4471. END
  4472.  
  4473. IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_by' AND OBJECT_NAME(OBJECT_ID) = 'SR_Source')
  4474. BEGIN
  4475.  
  4476. -- Service Source
  4477. INSERT INTO SR_Source
  4478. (
  4479. Owner_ID,
  4480. [Description],
  4481. Updated_By,
  4482. Last_Update,
  4483. Default_Flag
  4484. )
  4485.  
  4486. SELECT DISTINCT
  4487. 1,
  4488. tmp.SrSource,
  4489. @ImportBatchUser,
  4490. GETDATE(),
  4491. 0
  4492. FROM #Import_Staging tmp
  4493. OUTER APPLY(SELECT TOP 1 * FROM SR_Source srs WHERE srs.[Description] = tmp.SrSource)srs
  4494. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  4495. WHERE tmp.SrSource IS NOT NULL
  4496. AND srs.SR_Source_RecID IS NULL
  4497. AND tmp.SrSource NOT IN('', ' ')
  4498.  
  4499. END
  4500.  
  4501.  
  4502.  
  4503.  
  4504. -- Service Status
  4505. INSERT INTO dbo.SR_Status
  4506. (
  4507. Owner_ID,
  4508. Owner_Level_RecID,
  4509. Billing_Unit_RecID,
  4510. [Description],
  4511. Default_Flag,
  4512. Sort_Order,
  4513. Board_Flag,
  4514. Closed_Flag,
  4515. No_Time_Flag,
  4516. Updated_By,
  4517. Resolved_Flag,
  4518. NoEscalation_Flag,
  4519. Escalation_Level,
  4520. SR_Board_RecID,
  4521. Customer_Portal_Flag,
  4522. Inactive_Flag,
  4523. Long_Description
  4524. )
  4525.  
  4526. SELECT DISTINCT
  4527. 1,
  4528. srb.Owner_Level_RecID,
  4529. srb.Billing_Unit_RecID,
  4530. REPLACE(tmp.SrStatus, '<x>', ''),
  4531. 0,
  4532. 0,
  4533. 1,
  4534. CASE WHEN tmp.SrStatus LIKE('<x>%') THEN 1 ELSE 0 END,
  4535. 0,
  4536. @ImportBatchUser,
  4537. 0,
  4538. 1,
  4539. 0,
  4540. tmp.SR_Board_RecID,
  4541. 0,
  4542. 0,
  4543. 'Status ' + tmp.SrStatus + ' created by import utility with default values. Adjust as necessary.'
  4544. FROM #Import_Staging tmp
  4545. LEFT OUTER JOIN SR_Status srs
  4546. ON srs.[Description] = REPLACE(tmp.SrStatus, '<x>', '')
  4547. AND srs.SR_Board_RecID = tmp.SR_Board_RecID
  4548. INNER JOIN SR_Board srb
  4549. ON srb.SR_Board_RecID = tmp.SR_Board_RecID
  4550. WHERE tmp.SrStatus IS NOT NULL
  4551. AND srs.SR_Status_RecID IS NULL
  4552. -- Exclude records where board not specified
  4553. AND tmp.SR_Board_RecID IS NOT NULL
  4554. AND tmp.SrStatus NOT IN('', ' ')
  4555.  
  4556. UPDATE tmp
  4557. SET tmp.SrStatus = REPLACE(tmp.SrStatus, '<x>', '')
  4558. FROM #Import_Staging tmp
  4559.  
  4560. -- If generated status is '>Archived' - make it a 'Closed' status (for custom migrations)
  4561. UPDATE SR_Status
  4562. SET Closed_Flag = 1,
  4563. No_Time_Flag = 1
  4564. WHERE [Description] = '>Archived'
  4565. AND Updated_By = @ImportBatchUser
  4566.  
  4567. -- Service Type
  4568. INSERT INTO dbo.SR_Type
  4569. (
  4570. Owner_ID,
  4571. Owner_Level_RecID,
  4572. Billing_Unit_RecID,
  4573. [Description],
  4574. Updated_By,
  4575. Default_Flag,
  4576. ActiveType,
  4577. SR_Board_RecID,
  4578. Inactive_Flag,
  4579. RFC_Flag
  4580. )
  4581.  
  4582. SELECT DISTINCT
  4583. 1,
  4584. srb.Owner_Level_RecID,
  4585. srb.Billing_Unit_RecID,
  4586. tmp.SrType,
  4587. @ImportBatchUser,
  4588. 0,
  4589. 'R',
  4590. tmp.SR_Board_RecID,
  4591. 0,
  4592. 0
  4593. FROM #Import_Staging tmp
  4594. LEFT OUTER JOIN SR_Type srt
  4595. ON srt.[Description] = tmp.SrType
  4596. AND srt.SR_Board_RecID = tmp.SR_Board_RecID
  4597. INNER JOIN SR_Board srb
  4598. ON srb.SR_Board_RecID = tmp.SR_Board_RecID
  4599. WHERE srt.SR_Type_RecID IS NULL
  4600. AND tmp.SrType IS NOT NULL
  4601. AND tmp.SR_Board_RecID IS NOT NULL
  4602. AND tmp.SrType NOT IN('', ' ')
  4603.  
  4604. -- Service Subtype
  4605. -- Insert new subtype only if not duplicate on Description and SR_Board_RecID
  4606. INSERT INTO dbo.SR_SubType
  4607. (
  4608. [Description],
  4609. SR_Board_RecID,
  4610. Updated_By,
  4611. Last_Update,
  4612. Inactive_Flag
  4613. )
  4614.  
  4615. SELECT DISTINCT
  4616. tmp.SRSubtype,
  4617. tmp.SR_Board_RecID,
  4618. @ImportBatchUser,
  4619. GETDATE(),
  4620. 0
  4621. FROM #Import_Staging tmp
  4622. LEFT OUTER JOIN dbo.SR_Subtype srst
  4623. ON srst.SR_Board_RecID = tmp.SR_Board_RecID
  4624. AND tmp.SRSubtype = srst.[Description]
  4625. WHERE srst.SR_SubType_RecID IS NULL
  4626. AND tmp.SRSubtype NOT IN('', ' ')
  4627. AND tmp.SRSubtype IS NOT NULL
  4628. AND tmp.SR_Board_RecID IS NOT NULL
  4629. AND tmp.SrType IS NOT NULL
  4630.  
  4631. UPDATE tmp
  4632. SET tmp.SR_Subtype_RecID = sti.SR_Subtype_RecID
  4633. FROM #Import_Staging tmp
  4634. CROSS APPLY(SELECT TOP 1 * FROM dbo.SR_SubType sti WHERE sti.[Description] = tmp.SrSubtype AND sti.SR_Board_RecID = tmp.SR_Board_RecID)sti
  4635.  
  4636. -- Insert new Subtype Item only if not duplicate on Description and SR_Board_RecID
  4637. INSERT INTO dbo.SR_SubtypeItem
  4638. (
  4639. [Description],
  4640. SR_Board_RecID,
  4641. Updated_By,
  4642. Last_Update,
  4643. Inactive_Flag
  4644. )
  4645.  
  4646. SELECT DISTINCT
  4647. tmp.SrItem,
  4648. tmp.SR_Board_RecID,
  4649. @ImportBatchUser,
  4650. GETDATE(),
  4651. 0
  4652. FROM #Import_Staging tmp
  4653. LEFT OUTER JOIN SR_SubtypeItem sti
  4654. ON tmp.SrItem = sti.[Description]
  4655. AND tmp.SR_Board_RecID = sti.SR_Board_RecID
  4656. WHERE sti.SR_SubtypeItem_RecID IS NULL
  4657. AND tmp.SrItem NOT IN('', ' ')
  4658. AND tmp.SRSubtype IS NOT NULL
  4659. AND tmp.SR_Board_RecID IS NOT NULL
  4660. AND tmp.SrType IS NOT NULL
  4661.  
  4662. UPDATE tmp
  4663. SET tmp.SR_SubtypeItem_RecID = sti.SR_SubtypeItem_RecID
  4664. FROM #Import_Staging tmp
  4665. CROSS APPLY(SELECT TOP 1 * FROM dbo.SR_SubTypeItem sti WHERE sti.[Description] = tmp.SrItem AND sti.SR_Board_RecID = tmp.SR_Board_RecID)sti
  4666.  
  4667. -- All types/subtypes/items should now exist
  4668. -- Insert to SR_Type_Subtype_SubTypeItem_Template to create necessary relationships
  4669. INSERT INTO dbo.SR_Type_SubType_SubTypeItem_Template
  4670. (
  4671. SR_Type_RecID,
  4672. SR_SubType_RecID,
  4673. Auto_Apply,
  4674. Updated_By,
  4675. SR_SubTypeItem_RecID,
  4676. Last_Update
  4677. )
  4678.  
  4679. SELECT DISTINCT
  4680. srt.SR_Type_RecID,
  4681. srs.SR_Subtype_RecID,
  4682. 0,
  4683. @ImportBatchUser,
  4684. sri.SR_SubTypeItem_RecID,
  4685. GETDATE()
  4686. FROM #Import_Staging tmp
  4687. INNER JOIN SR_Board srb
  4688. ON tmp.SR_Board_RecID = srb.SR_Board_RecID
  4689. INNER JOIN SR_Type srt
  4690. ON srt.SR_Board_RecID = srb.SR_Board_RecID
  4691. AND srt.[Description] = tmp.SrType
  4692. INNER JOIN SR_Subtype srs
  4693. ON srb.SR_Board_RecID = srs.SR_Board_RecID
  4694. AND srs.[Description] = tmp.SrSubType
  4695. LEFT OUTER JOIN SR_SubTypeItem sri
  4696. ON sri.SR_Board_RecID = srb.SR_Board_RecID
  4697. AND tmp.SrItem = sri.[Description]
  4698. LEFT OUTER JOIN SR_Type_Subtype_SubTypeItem_Template sst
  4699. ON sst.SR_Type_RecID = srt.SR_Type_RecID
  4700. AND sst.SR_Subtype_RecID = srs.SR_Subtype_RecID
  4701. AND ISNULL(sst.SR_SubTypeItem_RecID, 0) = ISNULL(sri.SR_SubTypeItem_RecID, 0)
  4702. WHERE sst.SR_Type_Subtype_SubTypeItem_Template_RecID IS NULL
  4703. AND tmp.SRSubtype IS NOT NULL
  4704. AND tmp.SR_Board_RecID IS NOT NULL
  4705. AND tmp.SrType IS NOT NULL
  4706.  
  4707. -- Insert Service location
  4708. INSERT INTO SR_Location
  4709. (
  4710. Owner_ID,
  4711. [Description],
  4712. Default_Flag,
  4713. Updated_By,
  4714. Last_Update
  4715. )
  4716. SELECT DISTINCT
  4717. 1,
  4718. [SRLocation],
  4719. 0,
  4720. @ImportBatchUser,
  4721. GETDATE()
  4722. FROM #Import_Staging stag
  4723. OUTER APPLY(SELECT TOP 1 * FROM SR_Location srl WHERE srl.[Description] = stag.[SRLocation])srl
  4724. WHERE srl.SR_Location_RecID IS NULL
  4725. AND LEN(stag.[SRLocation]) < 30
  4726.  
  4727. END -- End force mode
  4728.  
  4729. -- Grab RecIDs & fields needed to start import
  4730. -- Get contact details
  4731. -- Phone
  4732. UPDATE stag
  4733. SET stag.Phone = SUBSTRING(cntc.[Description], 1, 20),
  4734. stag.Ext = cntc.Extension
  4735. FROM Contact_Communication cntc
  4736. INNER JOIN #Import_Staging stag
  4737. ON stag.Contact_RecID = cntc.Contact_RecID
  4738. INNER JOIN Communication_Type cct
  4739. ON cct.Communication_Type_RecID = cntc.Communication_Type_RecID
  4740. WHERE cct.Phone_Flag = 1
  4741. AND cntc.Default_Flag = 1
  4742.  
  4743. -- If phone still null, grab default for company
  4744. UPDATE stag
  4745. SET stag.Phone = SUBSTRING(comp.PhoneNbr, 1, 20)
  4746. FROM dbo.Company comp
  4747. INNER JOIN #Import_Staging stag
  4748. ON stag.Company_RecID = comp.Company_RecID
  4749. WHERE stag.Phone IS NULL
  4750.  
  4751. -- Get email
  4752. UPDATE stag
  4753. SET stag.Email = cntc.[Description]
  4754. FROM Contact_Communication cntc
  4755. INNER JOIN #Import_Staging stag
  4756. ON stag.Contact_RecID = cntc.Contact_RecID
  4757. INNER JOIN Communication_Type cct
  4758. ON cct.Communication_Type_RecID = cntc.Communication_Type_RecID
  4759. WHERE cct.Email_Flag = 1
  4760. AND cntc.default_flag = 1
  4761.  
  4762. -- Get default company address
  4763. UPDATE stag
  4764. SET stag.Company_Address_RecID = cad.Company_Address_RecID,
  4765. stag.Address_Line1 = cad.Address_Line1,
  4766. stag.Address_Line2 = cad.Address_Line2,
  4767. stag.City = cad.City,
  4768. stag.State_ID = cad.State_ID,
  4769. stag.Zip = cad.Zip,
  4770. stag.SiteName = cad.[Description],
  4771. stag.Country_RecID = cad.Country_RecID
  4772. FROM Company_Address cad
  4773. INNER JOIN #Import_Staging stag
  4774. ON stag.Company_RecID = cad.Company_RecID
  4775. AND cad.Default_Flag = 1
  4776.  
  4777. -- Get Tax_Code_RecID
  4778. UPDATE stag
  4779. SET stag.Tax_Code_RecID = ISNULL(comp.Tax_Code_RecID, def.Tax_Code_RecID)
  4780. FROM #Import_Staging stag
  4781. OUTER APPLY(SELECT TOP 1 Tax_Code_RecID FROM dbo.Company comp WHERE comp.Company_RecID = stag.Company_RecID)comp
  4782. OUTER APPLY(SELECT TOP 1 * FROM dbo.Tax_Code def ORDER BY def.Default_Flag DESC)def
  4783.  
  4784.  
  4785. -- Populate Country_RecID in instances where it was NULL on site
  4786. -- Prefer default but can't be NULL due to FK on SR_Service
  4787. UPDATE stag
  4788. SET stag.Country_RecID = cn.Country_RecID
  4789. FROM #Import_Staging stag
  4790. CROSS APPLY(SELECT TOP 1 Country_RecID FROM dbo.Country cn ORDER BY Default_Flag DESC)cn
  4791. WHERE stag.Country_RecID IS NULL
  4792.  
  4793. -- Get RecIDs for Service Type/Subtype/Item/Location etc
  4794. -- Grab valid types/subtypes/items
  4795. IF OBJECT_ID('tempdb..#Type_SubType_Item') IS NOT NULL
  4796. BEGIN
  4797. DROP TABLE #Type_SubType_Item
  4798. END
  4799.  
  4800. SELECT
  4801. SR_Type_SubType_SubTypeItem_Template_RecID AS Template_RecID,
  4802. srt.[Description] AS [Type],
  4803. ISNULL(sst.[Description], '') AS [SubType],
  4804. ISNULL(sti.[Description], '') AS [Item],
  4805. srt.SR_Board_RecID,
  4806. srt.SR_Type_RecID,
  4807. tmpl.SR_SubType_RecID,
  4808. tmpl.SR_SubTypeItem_RecID
  4809. INTO #Type_Subtype_Item
  4810. FROM SR_Type srt
  4811. LEFT OUTER JOIN SR_Type_SubType_SubTypeItem_Template tmpl
  4812. ON tmpl.SR_Type_RecID = srt.SR_Type_RecID
  4813. AND srt.Inactive_Flag = 0
  4814. LEFT OUTER JOIN SR_SubType sst
  4815. ON sst.SR_SubType_RecID = tmpl.SR_SubType_RecID
  4816. AND sst.Inactive_Flag = 0
  4817. LEFT OUTER JOIN SR_SubTypeItem sti
  4818. ON sti.SR_SubTypeItem_RecID = tmpl.SR_SubTypeItem_RecID
  4819. AND sti.Inactive_Flag = 0
  4820.  
  4821. -- Service Type
  4822. UPDATE stag
  4823. SET stag.SR_Type_RecID = sti.SR_Type_RecID
  4824. FROM #Import_Staging stag
  4825. INNER JOIN #Type_Subtype_Item sti
  4826. ON stag.SRType = sti.[Type]
  4827. AND stag.SR_Board_RecID = sti.SR_Board_RecID
  4828.  
  4829. -- Service Subtype
  4830. UPDATE stag
  4831. SET stag.SR_Subtype_RecID = sti.SR_Subtype_RecID
  4832. FROM #Import_Staging stag
  4833. INNER JOIN #Type_Subtype_Item sti
  4834. ON sti.SR_Type_RecID = stag.SR_Type_RecID
  4835. AND stag.SrSubType = sti.SubType
  4836.  
  4837. -- Service item
  4838. UPDATE stag
  4839. SET stag.SR_SubTypeItem_RecID = sti.SR_SubTypeItem_RecID
  4840. FROM #Import_Staging stag
  4841. CROSS APPLY(SELECT TOP 1 * FROM dbo.SR_SubTypeItem sti WHERE sti.[Description] = stag.SrItem AND sti.SR_Board_RecID = stag.SR_Board_RecID)sti
  4842.  
  4843. -- Service location
  4844. UPDATE stag
  4845. SET stag.SR_Location_RecID = srl.SR_Location_RecID
  4846. FROM #Import_Staging stag
  4847. INNER JOIN SR_Location srl
  4848. ON srl.[Description] = stag.SrLocation
  4849.  
  4850. -- Service Status
  4851. UPDATE stag
  4852. SET stag.SR_Status_RecID = srs.SR_Status_RecID
  4853. FROM SR_Status srs
  4854. INNER JOIN #Import_Staging stag
  4855. ON stag.SrStatus = srs.[Description]
  4856. AND stag.SR_Board_RecID = srs.SR_Board_RecID
  4857.  
  4858. -- Source
  4859. UPDATE stag
  4860. SET stag.SR_Source_RecID = srso.SR_Source_RecID
  4861. FROM #Import_Staging stag
  4862. INNER JOIN SR_Source srso
  4863. ON stag.SRSource = srso.[Description]
  4864.  
  4865. -- Urgency
  4866. UPDATE stag
  4867. SET stag.SR_Urgency_RecID = sru.SR_Urgency_RecID
  4868. FROM #Import_Staging stag
  4869. INNER JOIN SR_Urgency sru
  4870. ON stag.SrPriority = sru.[Description]
  4871.  
  4872. -- Team
  4873. UPDATE stag
  4874. SET stag.Sr_Team_RecID = srt.SR_Team_RecID
  4875. FROM #Import_Staging stag
  4876. INNER JOIN SR_Team srt
  4877. ON stag.SR_Board_RecID = srt.SR_Board_RecID
  4878. WHERE srt.Default_Flag = 1
  4879.  
  4880. -- Get RecID for Resource Member - if specified
  4881. UPDATE stag
  4882. SET stag.Resource_Member_RecID = mem.Member_RecID
  4883. FROM #Import_Staging stag
  4884. INNER JOIN Member mem
  4885. ON stag.ResourceMember = mem.Member_ID
  4886. WHERE stag.ResourceMember IS NOT NULL
  4887.  
  4888. -- Get zAdmin RecID
  4889. SELECT @zAdmin_Member_RecID = Member_RecID
  4890. FROM Member
  4891. WHERE Member_ID = 'zadmin'
  4892.  
  4893. -- Error if no zAdmin user
  4894. IF @zAdmin_Member_RecID IS NULL
  4895. BEGIN
  4896. RAISERROR('zAdmin user not found for this implementation - required for import', 16, 2)
  4897. END
  4898.  
  4899.  
  4900. UPDATE stag
  4901. SET stag.Member_ID_Calculated = SUBSTRING(ISNULL(stag.First_Name, ''), 1, 1) + ISNULL(stag.Last_Name, '')
  4902. FROM #TMP_Time_Staging stag
  4903.  
  4904. -- Get Member_RecID, Member_ID for records in #TMP_Time_Staging
  4905. UPDATE ti
  4906. SET ti.Member_RecID = mem.Member_RecID,
  4907. ti.Member_ID = mem.Member_ID
  4908. FROM #TMP_Time_Staging ti
  4909. INNER JOIN dbo.Member mem
  4910. ON (mem.First_Name = ti.First_Name AND mem.Last_Name = ti.Last_Name)
  4911. OR ti.Member_ID_Calculated = mem.Member_ID
  4912.  
  4913. -- Set Member_ID and Member_RecID to correspond to zAdmin if time entry did not map back to a member
  4914. UPDATE te
  4915. SET te.Member_ID = mem.Member_ID,
  4916. te.Member_RecID = mem.Member_RecID,
  4917. te.Notes = 'Resource: ' + ISNULL(te.First_Name, '') + ' ' + ISNULL(te.Last_Name, '') + '
  4918.  
  4919. ' + te.Notes
  4920. FROM #TMP_Time_Staging te
  4921. INNER JOIN dbo.Member mem
  4922. ON mem.Member_ID = 'zAdmin'
  4923. WHERE te.Member_ID IS NULL
  4924. AND te.Note_Type <> 'ExtNote'
  4925.  
  4926. -- If this is a data migration (Autotask/Tigerpaw) strip invalid Assigned By and Resource members
  4927. UPDATE stag
  4928. SET stag.AssignedBy = 'zAdmin'
  4929. FROM #Import_Staging stag
  4930. WHERE @Migration_Flag = 1
  4931. OR @ForceMode = 1
  4932. AND AssignedBy = ''
  4933. OR AssignedBy IS NULL
  4934.  
  4935. UPDATE stag
  4936. SET stag.ResourceMember = NULL
  4937. FROM #Import_Staging stag
  4938. WHERE stag.ResourceMember IS NOT NULL
  4939. AND stag.Resource_Member_RecID IS NULL
  4940. AND @Migration_Flag = 1
  4941.  
  4942. -- Check required fields
  4943. UPDATE #Import_Staging
  4944. SET ConvertMessage =
  4945. CASE
  4946. WHEN SR_Board_RecID IS NULL THEN 'Invalid Service board: ' + BoardName
  4947. WHEN SR_Type_RecID IS NULL AND SrType IS NOT NULL THEN 'Invalid service type: ' + SrType
  4948. WHEN SR_SubType_RecID IS NULL AND SrSubtype IS NOT NULL THEN 'Invalid SubType: ' + SrSubType
  4949. WHEN SR_SubTypeItem_RecID IS NULL AND SrItem IS NOT NULL THEN 'Invalid Service Item: ' + SrItem
  4950. WHEN SR_Source_RecID IS NULL THEN 'Invalid Source: ' + SrSource
  4951. WHEN SR_Location_RecID IS NULL THEN 'Invalid Location: ' + SrLocation
  4952. WHEN SR_Urgency_RecID IS NULL THEN 'Invalid Priority: ' + SrPriority
  4953. WHEN SR_Status_RecID IS NULL THEN 'Invalid Status: ' + SrStatus
  4954. WHEN Company_RecID IS NULL THEN 'Invalid Company: ' + Company_Name
  4955. WHEN Contact_RecID IS NULL THEN 'Contact not found and no default contact exists for Company: ' + Company_Name
  4956. WHEN Config_RecID IS NULL AND ConfigName IS NOT NULL THEN 'Configuration not found: ' + ConfigName + ' for company ' + CAST(Company_RecID AS VARCHAR(10))
  4957. WHEN Resource_Member_RecID IS NULL AND ResourceMember IS NOT NULL THEN 'Resource Member not found: ' + ResourceMember
  4958. END
  4959.  
  4960. -- If a required field is null, return failure message
  4961. IF EXISTS(SELECT * FROM #Import_Staging WHERE ConvertMessage IS NOT NULL)
  4962. BEGIN
  4963. -- Raise error w/ 16 severity to jump to catch
  4964. RAISERROR('Validation Error', 16, 2)
  4965. END
  4966.  
  4967. ELSE
  4968.  
  4969. -- Validation suceeded - begin push
  4970. -- Get expected rowcount for insert to SR_Service
  4971. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging
  4972.  
  4973. -- Grab maximum identity from SR_Service prior to insert
  4974. SELECT @MAX_SR_Service_RecID = ISNULL(MAX(SR_Service_RecID), 0) FROM dbo.SR_Service
  4975.  
  4976. -- Retrieve UTC offset for Entered & Completed dates
  4977. UPDATE stag
  4978. SET EnteredOffset = tzo.OffsetFromUTC
  4979. FROM #Import_Staging stag
  4980. INNER JOIN Time_Zone_Offsets tzo
  4981. ON tzo.Time_Zone_Name_RecID = @Time_Zone_Name_RecID
  4982. AND DateEntered BETWEEN tzo.StartDate and tzo.EndDate
  4983.  
  4984. UPDATE stag
  4985. SET CompletedOffset = tzo.OffsetFromUTC
  4986. FROM #Import_Staging stag
  4987. INNER JOIN Time_Zone_Offsets tzo
  4988. ON tzo.Time_Zone_Name_RecID = @Time_Zone_Name_RecID
  4989. AND DateCompleted BETWEEN tzo.StartDate and tzo.EndDate
  4990.  
  4991. -- Convert Entered/Completed dates to UTC
  4992. UPDATE stag
  4993. SET CompletedUTC = DATEADD(HOUR, CompletedOffset * -1, DateCompleted),
  4994. EnteredUTC = DATEADD(HOUR, EnteredOffset * -1, DateEntered)
  4995. FROM #Import_Staging stag
  4996.  
  4997. -- Perform insert to dbo.SR_Service, catching new identity values in temp table
  4998. -- Temporarily repurpose Owner_ID to catch RecID from source table in order to join back
  4999. -- repurpose Reference to catch Legacy_ID
  5000.  
  5001. -- Pre-2017.5 insert
  5002. IF NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'SR_Service')
  5003. BEGIN
  5004. INSERT INTO dbo.SR_Service WITH(TABLOCK)
  5005. (
  5006. Owner_ID,
  5007. SR_Type_RecID,
  5008. SR_Location_RecID,
  5009. SR_Status_RecID,
  5010. SR_Source_RecID,
  5011. SR_Urgency_RecID,
  5012. SR_Team_RecID,
  5013. SR_Board_RecID,
  5014. Owner_Level_RecID,
  5015. Billing_Unit_RecID,
  5016. SR_Severity_RecID,
  5017. SR_Impact_RecID,
  5018. SR_Billing_Method_ID,
  5019. Company_RecID,
  5020. Contact_RecID,
  5021. Contact_Name,
  5022. PhoneNbr,
  5023. Extension,
  5024. Email_Address,
  5025. Company_Address_RecID,
  5026. Site_Name,
  5027. Address_Line1,
  5028. Address_Line2,
  5029. City,
  5030. State_ID,
  5031. Zip,
  5032. Summary,
  5033. SR_SubType_RecID,
  5034. SR_SubTypeItem_RecID,
  5035. EmailContact_Flag,
  5036. EmailResource_Flag,
  5037. Entered_By,
  5038. Date_Entered,
  5039. Assigned_By_RecID,
  5040. Closed_By,
  5041. Date_Closed,
  5042. Updated_By,
  5043. Last_Update,
  5044. BillSR_Flag,
  5045. BillComplete_Flag,
  5046. BillUnapp_Flag,
  5047. Activity_Class_RecID,
  5048. Activity_Type_RecID,
  5049. Date_Entered_UTC,
  5050. Date_Closed_UTC,
  5051. Reference,
  5052. Country_RecID,
  5053. Tax_Code_RecID
  5054. )
  5055. OUTPUT INSERTED.Reference, INSERTED.SR_Service_RecID, 'Ticket' INTO Import_Legacy_ID_Custom
  5056. SELECT
  5057. stag.ExcelRowNumber,
  5058. stag.SR_Type_RecID,
  5059. stag.SR_Location_RecID,
  5060. stag.SR_Status_RecID,
  5061. stag.SR_Source_RecID,
  5062. stag.SR_Urgency_RecID,
  5063. stag.SR_Team_RecID,
  5064. stag.SR_Board_RecID,
  5065. srb.Owner_Level_RecID,
  5066. srb.Billing_Unit_RecID,
  5067. (SELECT TOP 1 SR_Severity_RecID FROM SR_Severity WHERE Default_Flag = 1) AS SR_Severity_RecID,
  5068. (SELECT TOP 1 SR_Impact_RecID FROM SR_Impact WHERE Default_Flag = 1) AS SR_Impact_RecID,
  5069. 'A' AS SR_Billing_Method_ID,
  5070. stag.Company_RecID,
  5071. stag.Contact_RecID,
  5072. stag.ContactName AS Contact_Name,
  5073. stag.Phone AS PhoneNbr,
  5074. stag.Ext AS Extension,
  5075. stag.Email AS Email_Address,
  5076. stag.Company_Address_RecID,
  5077. stag.SiteName AS Site_Name,
  5078. stag.Address_Line1,
  5079. stag.Address_Line2,
  5080. stag.City,
  5081. stag.State_ID,
  5082. stag.Zip,
  5083. stag.Summary,
  5084. stag.SR_SubType_RecID,
  5085. stag.SR_SubTypeItem_RecID,
  5086. ISNULL(srb.EmailContact_Flag, 0) AS EmailContact_Flag,
  5087. ISNULL(srb.EmailResource_Flag, 0) AS EmailResource_Flag,
  5088. @ImportBatchUser AS Entered_By,
  5089. ISNULL(stag.DateEntered, GETDATE()) AS Date_Entered,
  5090. ISNULL(mem.Member_RecID, @zAdmin_Member_RecID) AS Assigned_By_RecID,
  5091. CASE WHEN stag.DateCompleted IS NULL THEN NULL ELSE 'zadmin' END AS Closed_By,
  5092. ISNULL(stag.DateCompleted, GETDATE()) AS Date_Closed,
  5093. @ImportBatchUser AS Updated_By,
  5094. GETDATE() AS Last_Update,
  5095. ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillSR_Flag ELSE NULL END, bsu.BillSR_Flag) AS BillSR_Flag,
  5096. ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillComplete_Flag ELSE NULL END, bsu.BillComplete_Flag) AS BillComplete_Flag,
  5097. ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillUnapp_Flag ELSE NULL END, bsu.BillUnapp_Flag) AS BillUnapp_Flag,
  5098. CASE WHEN srb.Activity_Class_RecID IS NOT NULL AND srb.Activity_Class_RecID <> 0 THEN srb.Activity_Class_RecID ELSE ac.Activity_Class_RecID END AS Activity_Class_RecID,
  5099. CASE WHEN srb.Activity_Type_RecID IS NOT NULL AND srb.Activity_Type_RecID <> 0 THEN srb.Activity_Type_RecID ELSE aty.Activity_Type_RecID END AS Activity_Type_RecID,
  5100. stag.DateEntered,
  5101. stag.DateCompleted,
  5102. Legacy_ID,
  5103. stag.Country_RecID,
  5104. stag.Tax_Code_RecID
  5105. FROM #Import_Staging stag
  5106. CROSS APPLY(SELECT TOP 1 * FROM SR_Board srb WHERE srb.SR_Board_RecID = stag.SR_Board_RecID)srb
  5107. OUTER APPLY(SELECT TOP 1 * FROM dbo.Member mem WHERE mem.Member_ID = stag.AssignedBy)mem
  5108. OUTER APPLY(SELECT TOP 1 * FROM Billing_Setup bsu WHERE bsu.Owner_Level_RecID = srb.Owner_Level_RecID)bsu
  5109. OUTER APPLY(SELECT TOP 1 * FROM dbo.Country ORDER BY Default_Flag DESC)cnt
  5110. OUTER APPLY(SELECT TOP 1 * FROM dbo.Currency curr WHERE curr.Currency_ID = cnt.Currency_ID)curr
  5111. OUTER APPLY(SELECT TOP 1 * FROM Activity_Class ac)ac
  5112. OUTER APPLY(SELECT TOP 1 * FROM Activity_Type aty ORDER BY aty.Default_Flag DESC)aty
  5113. ORDER BY stag.ExcelRowNumber ASC
  5114. END
  5115.  
  5116.  
  5117. -- Post-2017.5 insert
  5118. IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'SR_Service')
  5119. BEGIN
  5120. INSERT INTO dbo.SR_Service WITH(TABLOCK)
  5121. (
  5122. Owner_ID,
  5123. SR_Type_RecID,
  5124. SR_Location_RecID,
  5125. SR_Status_RecID,
  5126. SR_Source_RecID,
  5127. SR_Urgency_RecID,
  5128. SR_Team_RecID,
  5129. SR_Board_RecID,
  5130. Owner_Level_RecID,
  5131. Billing_Unit_RecID,
  5132. SR_Severity_RecID,
  5133. SR_Impact_RecID,
  5134. SR_Billing_Method_ID,
  5135. Company_RecID,
  5136. Contact_RecID,
  5137. Contact_Name,
  5138. PhoneNbr,
  5139. Extension,
  5140. Email_Address,
  5141. Company_Address_RecID,
  5142. Site_Name,
  5143. Address_Line1,
  5144. Address_Line2,
  5145. City,
  5146. State_ID,
  5147. Zip,
  5148. Summary,
  5149. SR_SubType_RecID,
  5150. SR_SubTypeItem_RecID,
  5151. EmailContact_Flag,
  5152. EmailResource_Flag,
  5153. Entered_By,
  5154. Date_Entered,
  5155. Assigned_By_RecID,
  5156. Closed_By,
  5157. Date_Closed,
  5158. Updated_By,
  5159. Last_Update,
  5160. BillSR_Flag,
  5161. BillComplete_Flag,
  5162. BillUnapp_Flag,
  5163. Activity_Class_RecID,
  5164. Activity_Type_RecID,
  5165. Date_Entered_UTC,
  5166. Date_Closed_UTC,
  5167. Reference,
  5168. Country_RecID,
  5169. Currency_RecID,
  5170. Tax_Code_RecID
  5171. )
  5172. OUTPUT INSERTED.Reference, INSERTED.SR_Service_RecID, 'Ticket' INTO Import_Legacy_ID_Custom
  5173. SELECT
  5174. stag.ExcelRowNumber,
  5175. stag.SR_Type_RecID,
  5176. stag.SR_Location_RecID,
  5177. stag.SR_Status_RecID,
  5178. stag.SR_Source_RecID,
  5179. stag.SR_Urgency_RecID,
  5180. stag.SR_Team_RecID,
  5181. stag.SR_Board_RecID,
  5182. srb.Owner_Level_RecID,
  5183. srb.Billing_Unit_RecID,
  5184. (SELECT TOP 1 SR_Severity_RecID FROM SR_Severity WHERE Default_Flag = 1) AS SR_Severity_RecID,
  5185. (SELECT TOP 1 SR_Impact_RecID FROM SR_Impact WHERE Default_Flag = 1) AS SR_Impact_RecID,
  5186. 'A' AS SR_Billing_Method_ID,
  5187. stag.Company_RecID,
  5188. stag.Contact_RecID,
  5189. stag.ContactName AS Contact_Name,
  5190. stag.Phone AS PhoneNbr,
  5191. stag.Ext AS Extension,
  5192. stag.Email AS Email_Address,
  5193. stag.Company_Address_RecID,
  5194. stag.SiteName AS Site_Name,
  5195. stag.Address_Line1,
  5196. stag.Address_Line2,
  5197. stag.City,
  5198. stag.State_ID,
  5199. stag.Zip,
  5200. stag.Summary,
  5201. stag.SR_SubType_RecID,
  5202. stag.SR_SubTypeItem_RecID,
  5203. ISNULL(srb.EmailContact_Flag, 0) AS EmailContact_Flag,
  5204. ISNULL(srb.EmailResource_Flag, 0) AS EmailResource_Flag,
  5205. @ImportBatchUser AS Entered_By,
  5206. ISNULL(stag.DateEntered, GETDATE()) AS Date_Entered,
  5207. ISNULL(mem.Member_RecID, @zAdmin_Member_RecID) AS Assigned_By_RecID,
  5208. CASE WHEN stag.DateCompleted IS NULL THEN NULL ELSE 'zadmin' END AS Closed_By,
  5209. ISNULL(stag.DateCompleted, GETDATE()) AS Date_Closed,
  5210. @ImportBatchUser AS Updated_By,
  5211. GETDATE() AS Last_Update,
  5212. ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillSR_Flag ELSE NULL END, bsu.BillSR_Flag) AS BillSR_Flag,
  5213. ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillComplete_Flag ELSE NULL END, bsu.BillComplete_Flag) AS BillComplete_Flag,
  5214. ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillUnapp_Flag ELSE NULL END, bsu.BillUnapp_Flag) AS BillUnapp_Flag,
  5215. CASE WHEN srb.Activity_Class_RecID IS NOT NULL AND srb.Activity_Class_RecID <> 0 THEN srb.Activity_Class_RecID ELSE ac.Activity_Class_RecID END AS Activity_Class_RecID,
  5216. CASE WHEN srb.Activity_Type_RecID IS NOT NULL AND srb.Activity_Type_RecID <> 0 THEN srb.Activity_Type_RecID ELSE aty.Activity_Type_RecID END AS Activity_Type_RecID,
  5217. stag.DateEntered,
  5218. stag.DateCompleted,
  5219. Legacy_ID,
  5220. stag.Country_RecID,
  5221. curr.Currency_RecID,
  5222. stag.Tax_Code_RecID
  5223. FROM #Import_Staging stag
  5224. CROSS APPLY(SELECT TOP 1 * FROM SR_Board srb WHERE srb.SR_Board_RecID = stag.SR_Board_RecID)srb
  5225. OUTER APPLY(SELECT TOP 1 * FROM dbo.Member mem WHERE mem.Member_ID = stag.AssignedBy)mem
  5226. OUTER APPLY(SELECT TOP 1 * FROM Billing_Setup bsu WHERE bsu.Owner_Level_RecID = srb.Owner_Level_RecID)bsu
  5227. OUTER APPLY(SELECT TOP 1 * FROM dbo.Country ORDER BY Default_Flag DESC)cnt
  5228. OUTER APPLY(SELECT TOP 1 * FROM dbo.Currency curr WHERE curr.Currency_ID = cnt.Currency_ID)curr
  5229. OUTER APPLY(SELECT TOP 1 * FROM Activity_Class ac)ac
  5230. OUTER APPLY(SELECT TOP 1 * FROM Activity_Type aty ORDER BY aty.Default_Flag DESC)aty
  5231. ORDER BY stag.ExcelRowNumber ASC
  5232. END
  5233.  
  5234. -- Join final table back to staging to capture new identity
  5235. UPDATE stag
  5236. SET stag.New_Identity = srs.SR_Service_RecID
  5237. FROM #Import_Staging stag
  5238. INNER JOIN dbo.SR_Service srs
  5239. ON srs.Owner_ID = stag.ExcelRowNumber
  5240. AND Entered_By = @ImportBatchUser
  5241. AND srs.SR_Service_RecID > @MAX_SR_Service_RecID
  5242.  
  5243. -- Update Owner_ID in final table to appropriate value
  5244. UPDATE srs
  5245. SET srs.Owner_ID = 1,
  5246. srs.Reference = NULL
  5247. FROM dbo.SR_Service srs
  5248. WHERE Entered_By = @ImportBatchUser
  5249. AND SR_Service_RecID > @MAX_SR_Service_RecID
  5250.  
  5251. -- Insert Problem detail to SR_Detail
  5252. INSERT INTO SR_Detail WITH(TABLOCK)
  5253. (
  5254. SR_Service_RecID,
  5255. SR_Detail_Notes,
  5256. Problem_Flag,
  5257. Resolution_Flag,
  5258. InternalAnalysis_Flag,
  5259. Document_Flag,
  5260. Internal_Member_Flag,
  5261. External_Source_Flag,
  5262. Date_Format,
  5263. Date_Created,
  5264. Created_By,
  5265. Last_Update,
  5266. Updated_By,
  5267. Member_RecID,
  5268. Date_Created_UTC
  5269. )
  5270. SELECT
  5271. stag.New_Identity,
  5272. stag.DetailDescription,
  5273. 1,
  5274. 0,
  5275. 0,
  5276. 0,
  5277. 1,
  5278. 0,
  5279. 111,
  5280. ISNULL(stag.DateEntered, GETDATE()),
  5281. @ImportBatchUser,
  5282. GETDATE(),
  5283. @ImportBatchUser,
  5284. mem.Member_RecID,
  5285. stag.EnteredUTC
  5286. FROM #Import_Staging stag
  5287. CROSS APPLY(SELECT TOP 1 Member_RecID FROM dbo.Member mem WHERE mem.Member_ID = 'zAdmin')mem
  5288. WHERE stag.DetailDescription IS NOT NULL
  5289.  
  5290.  
  5291. -- Insert Internal Analysis to SR_Detail
  5292. INSERT INTO SR_Detail WITH(TABLOCK)
  5293. (
  5294. SR_Service_RecID,
  5295. SR_Detail_Notes,
  5296. Problem_Flag,
  5297. Resolution_Flag,
  5298. InternalAnalysis_Flag,
  5299. Document_Flag,
  5300. Internal_Member_Flag,
  5301. External_Source_Flag,
  5302. Date_Format,
  5303. Date_Created,
  5304. Created_By,
  5305. Last_Update,
  5306. Updated_By,
  5307. Date_Created_UTC
  5308. )
  5309. SELECT
  5310. stag.New_Identity,
  5311. stag.InternalAnalysis,
  5312. 0,
  5313. 0,
  5314. 1,
  5315. 0,
  5316. 1,
  5317. 0,
  5318. 111,
  5319. ISNULL(stag.DateEntered, GETDATE()),
  5320. @ImportBatchUser,
  5321. GETDATE(),
  5322. @ImportBatchUser,
  5323. stag.EnteredUTC
  5324. FROM #Import_Staging stag
  5325. CROSS APPLY(SELECT TOP 1 Member_RecID FROM dbo.Member mem WHERE mem.Member_ID = 'zAdmin')mem
  5326. WHERE stag.InternalAnalysis IS NOT NULL
  5327.  
  5328. -- Insert Resolution detail to SR_Detail
  5329. INSERT INTO SR_Detail WITH(TABLOCK)
  5330. (
  5331. SR_Service_RecID,
  5332. SR_Detail_Notes,
  5333. Problem_Flag,
  5334. Resolution_Flag,
  5335. InternalAnalysis_Flag,
  5336. Document_Flag,
  5337. Internal_Member_Flag,
  5338. External_Source_Flag,
  5339. Date_Format,
  5340. Date_Created,
  5341. Created_By,
  5342. Last_Update,
  5343. Updated_By,
  5344. Date_Created_UTC
  5345. )
  5346. SELECT
  5347. stag.New_Identity,
  5348. stag.Resolution,
  5349. 0,
  5350. 1,
  5351. 0,
  5352. 0,
  5353. 1,
  5354. 0,
  5355. 111,
  5356. ISNULL(stag.DateEntered, GETDATE()),
  5357. @ImportBatchUser,
  5358. GETDATE(),
  5359. @ImportBatchUser,
  5360. stag.EnteredUTC
  5361. FROM #Import_Staging stag
  5362. CROSS APPLY(SELECT TOP 1 Member_RecID FROM dbo.Member mem WHERE mem.Member_ID = 'zAdmin')mem
  5363. WHERE stag.Resolution IS NOT NULL
  5364.  
  5365. -- Add audit trail
  5366. -- Pre-2017.1 - insert to SR_Audit
  5367. IF OBJECT_ID('SR_Service_Audit') IS NULL
  5368. BEGIN
  5369. INSERT INTO dbo.SR_Audit
  5370. (
  5371. SR_Service_RecID,
  5372. Audit_Text,
  5373. Updated_By,
  5374. Last_Update
  5375. )
  5376. SELECT
  5377. stag.New_Identity,
  5378. 'Service ticket has been created by import utility.',
  5379. @ImportBatchUser,
  5380. GETDATE()
  5381. FROM #Import_Staging stag
  5382. END
  5383.  
  5384. -- 2017.1 and later - Insert to SR_Service_Audit
  5385. IF OBJECT_ID('SR_Service_Audit') IS NOT NULL
  5386. BEGIN
  5387. INSERT INTO SR_Service_Audit
  5388. (
  5389. SR_Service_RecID,
  5390. Locale_Key_RecID,
  5391. Audit_Source_RecID,
  5392. Audit_Type_RecID,
  5393. Audit_SubType_RecID,
  5394. Audit_Data_Type_Format_RecID,
  5395. OldValue_Text,
  5396. NewValue_Text,
  5397. Affected_Record,
  5398. DM_Document_RecID,
  5399. Created_By,
  5400. Date_Entered_UTC
  5401. )
  5402. SELECT
  5403. stag.New_Identity, --SR_Service_RecID,
  5404. lk.Locale_Key_RecID, --Locale_Key_RecID,
  5405. src.Audit_Source_RecId, --Audit_Source_RecID,
  5406. aty.Audit_Type_RecId, --Audit_Type_RecID,
  5407. ast.Audit_SubType_RecID, --Audit_SubType_RecID,
  5408. dtf.Audit_Data_Type_Format_RecID, --Audit_Data_Type_Format_RecID,
  5409. NULL, --OldValue_Text,
  5410. stag.New_Identity,--NewValue_Text,
  5411. NULL, --Affected_Record,
  5412. NULL, --DM_Document_RecID,
  5413. 'Import',--Created_By
  5414. GETUTCDATE()--Date_Entered_UTC
  5415. FROM #Import_Staging stag
  5416. CROSS APPLY(SELECT TOP 1 Locale_Key_RecID FROM dbo.Locale_Key lk WHERE lk.Locale_Text_key = 'ticket_created')lk
  5417. CROSS APPLY(SELECT TOP 1 Audit_Source_RecID FROM dbo.Audit_Source src WHERE src.Audit_Source_ID = 'Application')src
  5418. CROSS APPLY(SELECT TOP 1 Audit_Type_RecID FROM dbo.Audit_Type aty WHERE aty.Audit_Type_ID = 'Record')aty
  5419. CROSS APPLY(SELECT TOP 1 Audit_SubType_RecID FROM dbo.Audit_SubType ast WHERE ast.Audit_SubType_ID = 'RecordCreated')ast
  5420. CROSS APPLY(SELECT TOP 1 Audit_Data_Type_Format_RecID FROM Audit_Data_Type_Format dtf WHERE dtf.Data_Type = 'TEXT')dtf
  5421. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  5422. END
  5423.  
  5424. -- Add configuration if specified
  5425. INSERT INTO SR_Config
  5426. (
  5427. Config_RecID,
  5428. SR_Service_RecID,
  5429. Last_Update,
  5430. Updated_By
  5431. )
  5432. SELECT
  5433. stag.Config_RecID,
  5434. stag.New_Identity,
  5435. GETDATE(),
  5436. @ImportBatchUser
  5437. FROM #Import_Staging stag
  5438. WHERE stag.Config_RecID IS NOT NULL
  5439.  
  5440. -- Calculate Schedule_Desc field for Schedule insert
  5441. UPDATE stag
  5442. SET Schedule_Desc = SUBSTRING(ISNULL(Company_Name, '') + ' / ' + CONVERT(VARCHAR(50), New_Identity) + ' - ' + ISNULL(Summary, '(No summary description)'), 1, 200)
  5443. FROM #Import_Staging stag
  5444. WHERE stag.ResourceMember IS NOT NULL
  5445.  
  5446. -- Insert to dbo.Schedule
  5447. INSERT INTO dbo.Schedule WITH(TABLOCK)
  5448. (
  5449. RecID,
  5450. Schedule_Type_RecID,
  5451. close_flag,
  5452. Hours_Estimated,
  5453. Schedule_Desc,
  5454. Last_Update,
  5455. Updated_By,
  5456. Syncable,
  5457. Reminder_Flag,
  5458. Reminder_Minutes,
  5459. All_Day_Flag,
  5460. Duration,
  5461. Entered_By_RecID,
  5462. Xref_Mbr_RecID,
  5463. Hours_Sched,
  5464. Schedule_Status_RecID,
  5465. Hours_per_Day,
  5466. Ack_Flag,
  5467. Date_Entered,
  5468. SR_Location_RecID
  5469. )
  5470. SELECT
  5471. stag.New_Identity,
  5472. 4,
  5473. 0,
  5474. 0,
  5475. stag.Schedule_Desc,
  5476. GETDATE(),
  5477. @ImportBatchUser,
  5478. 0,
  5479. 0,
  5480. 0,
  5481. 0,
  5482. 0,
  5483. @zAdmin_Member_RecID,
  5484. stag.Resource_Member_RecID,
  5485. 0,
  5486. 2,
  5487. 0,
  5488. 0,
  5489. GETDATE(),
  5490. stag.SR_Location_RecID
  5491. FROM #Import_Staging stag
  5492. WHERE stag.ResourceMember IS NOT NULL
  5493.  
  5494. -- Insert to SR_Service_SLA_Workflow
  5495. INSERT INTO dbo.SR_Service_SLA_Workflow
  5496. (
  5497. SR_Service_RecID,
  5498. Date_Resolved_UTC,
  5499. Escalation_Start_Date_UTC,
  5500. Notification_History,
  5501. Overall_Start_Date_UTC
  5502. )
  5503. SELECT
  5504. stag.New_Identity,
  5505. CompletedUTC,
  5506. EnteredUTC,
  5507. ',',
  5508. EnteredUTC
  5509. FROM #Import_Staging stag
  5510.  
  5511. IF @TESourceTable IS NOT NULL AND EXISTS(SELECT TOP 1 * FROM #TMP_Time_Staging)
  5512. BEGIN
  5513. -- Capture maximum identity from dbo.Time_Entry prior to insert (optimization)
  5514. SELECT @MAX_Time_Entry_RecID = ISNULL(MAX(Time_RecID), 0) FROM dbo.Time_Entry
  5515.  
  5516. -- Table to capture identities of inserted detail entries
  5517. IF OBJECT_ID('tempdb..#ID_Map') IS NOT NULL
  5518. DROP TABLE #ID_Map
  5519.  
  5520. CREATE TABLE #ID_Map
  5521. (
  5522. Source_RecID INT,
  5523. Destination_RecID INT
  5524. )
  5525.  
  5526. IF OBJECT_ID('tempdb..#TE_Map') IS NOT NULL
  5527. DROP TABLE #TE_Map
  5528.  
  5529. CREATE TABLE #TE_Map
  5530. (
  5531. RecID INT,
  5532. Time_RecID INT
  5533. )
  5534.  
  5535. CREATE INDEX IX_RecID ON #TE_Map(RecID)
  5536. CREATE INDEX IX_Time_RecID ON #TE_Map(Time_RecID)
  5537.  
  5538. -- Pull necessary data from #Import_Staging to TMP_Time_Staging
  5539. UPDATE ti
  5540. SET ti.Company_RecID = stag.Company_RecID,
  5541. ti.SR_Service_RecID = stag.New_Identity
  5542. FROM #TMP_Time_Staging ti
  5543. CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging stag WHERE stag.Legacy_ID = ti.Legacy_Ticket_ID)stag
  5544.  
  5545. UPDATE ti
  5546. SET ti.Owner_Level_RecID = srs.Owner_Level_RecID,
  5547. ti.Billing_Unit_RecID = srs.Billing_Unit_RecID,
  5548. ti.Activity_Type_RecID = srs.Activity_Type_RecID,
  5549. ti.Activity_Class_RecID = srs.Activity_Class_RecID
  5550. FROM #TMP_Time_Staging ti
  5551. CROSS APPLY(SELECT TOP 1 Owner_Level_RecID, Billing_Unit_RecID, Activity_Type_RecID, Activity_Class_RecID FROM dbo.SR_Service srs WHERE srs.SR_Service_RecID = ti.SR_Service_RecID)srs
  5552.  
  5553. -- Eliminate time entries for any ticket which was excluded from import
  5554. DELETE FROM #TMP_Time_Staging WHERE SR_Service_RecID IS NULL
  5555.  
  5556. -- Insert time entries
  5557. INSERT INTO Time_Entry WITH(TABLOCK)
  5558. (
  5559. Owner_ID,
  5560. Company_RecID,
  5561. Entered_By,
  5562. Notes,
  5563. Member_ID,
  5564. Date_Start,
  5565. Time_Start,
  5566. Time_End,
  5567. Hours_Actual,
  5568. Hours_Bill,
  5569. Billable_Flag,
  5570. SR_Service_RecID,
  5571. Member_RecID,
  5572. TE_Problem_Flag,
  5573. TE_Resolution_Flag,
  5574. TE_InternalAnalysis_Flag,
  5575. Invoice_Flag,
  5576. TE_Status_ID,
  5577. Updated_By,
  5578. Time_Sheet_RecID,
  5579. Time_Start_UTC,
  5580. Time_End_UTC,
  5581. Owner_Level_RecID,
  5582. Billing_Unit_RecID,
  5583. Activity_Type_RecID,
  5584. Activity_Class_RecID
  5585. )
  5586. OUTPUT INSERTED.Owner_ID, INSERTED.Time_RecID INTO #TE_Map
  5587. SELECT
  5588. ti.RecID,
  5589. ti.Company_RecID,
  5590. @ImportBatchUser,
  5591. ti.Notes,
  5592. LEFT(ti.Created_By, 15),
  5593. ti.Date_Start,
  5594. '1/1/1900 ' + CONVERT(VARCHAR(8), CAST(ti.Date_Start as time)),
  5595. '1/1/1900 ' + CONVERT(VARCHAR(8), CAST(ti.Date_End AS time)),
  5596. ti.Num_Hours,
  5597. ti.Hours_Bill,
  5598. ti.Billable,
  5599. ti.SR_Service_RecID,
  5600. ti.Member_RecID,
  5601. CASE WHEN ti.Note_Type = 'Detail' THEN 1 ELSE 0 END,
  5602. CASE WHEN ti.Note_Type = 'Resolution' THEN 1 ELSE 0 END,
  5603. CASE WHEN ti.Note_Type = 'Internal' THEN 1 ELSE 0 END,
  5604. ti.Billable,
  5605. @TE_Status_ID,
  5606. @ImportBatchUser,
  5607. @Time_Sheet_RecID,
  5608. Date_Start,
  5609. Date_End,
  5610. Owner_Level_RecID,
  5611. Billing_Unit_RecID,
  5612. Activity_Type_RecID,
  5613. Activity_Class_RecID
  5614. FROM #TMP_Time_Staging ti
  5615. WHERE ti.Note_Type IN('Detail', 'Internal', 'Resolution')
  5616.  
  5617. -- Insert internal (non-time entry) into SR_Detail
  5618. MERGE SR_Detail AS dest
  5619. USING (SELECT * FROM #TMP_Time_Staging WHERE Note_Type IN('InternalNote', 'DetailNote', 'ResolutionNote', 'ExtNote')) AS src
  5620. ON 1=0
  5621.  
  5622. WHEN NOT MATCHED THEN
  5623. INSERT
  5624. (
  5625. SR_Service_RecID,
  5626. SR_Detail_Notes,
  5627. Problem_Flag,
  5628. Resolution_Flag,
  5629. InternalAnalysis_Flag,
  5630. Document_Flag,
  5631. Internal_Member_Flag,
  5632. External_Source_Flag,
  5633. Date_Format,
  5634. Date_Created,
  5635. Created_By,
  5636. Last_Update,
  5637. Updated_By
  5638. )
  5639. VALUES
  5640. (
  5641. src.SR_Service_RecID,
  5642. src.Notes,
  5643. CASE WHEN src.Note_Type IN('DetailNote', 'ExtNote') THEN 1 ELSE 0 END,
  5644. CASE WHEN src.Note_Type = 'ResolutionNote' THEN 1 ELSE 0 END,
  5645. CASE WHEN src.Note_Type = 'InternalNote' THEN 1 ELSE 0 END,
  5646. 0,
  5647. CASE WHEN src.Note_Type = 'ExtNote' THEN 0 ELSE 1 END,
  5648. CASE WHEN src.Note_Type = 'ExtNote' THEN 1 ELSE 0 END,
  5649. 111,
  5650. ISNULL(src.Date_Start, GETDATE()),
  5651. src.Created_By,
  5652. GETDATE(),
  5653. @ImportBatchUser
  5654. )
  5655. OUTPUT src.RecID, inserted.SR_Detail_RecID INTO #ID_Map;
  5656.  
  5657. -- Join back to TMP_Time_Staging to capture identities from dbo.Time_Entry
  5658. UPDATE ti
  5659. SET ti.Time_RecID = map.Time_RecID
  5660. FROM #TMP_Time_Staging ti
  5661. CROSS APPLY(SELECT TOP 1 Time_RecID FROM #TE_Map map WHERE map.RecID = ti.RecID)map
  5662.  
  5663. UPDATE te
  5664. SET Owner_ID = 1
  5665. FROM Time_Entry te
  5666. WHERE EXISTS(SELECT 1 FROM #TMP_Time_Staging stag WHERE stag.Time_RecID = te.Time_RecID)
  5667.  
  5668. -- Join back to #ID_Map to capture identities from SR_Detail
  5669. UPDATE ti
  5670. SET ti.SR_Detail_RecID = map.Destination_RecID
  5671. FROM #TMP_Time_Staging ti
  5672. CROSS APPLY(SELECT TOP 1 Destination_RecID FROM #ID_Map map WHERE map.Source_RecID = ti.RecID)map
  5673.  
  5674. -- Update zAdmin time sheet to 'Written off'
  5675. UPDATE ts
  5676. SET TE_Status_ID = @TE_Status_ID
  5677. FROM dbo.Time_Sheet ts
  5678. WHERE Time_Sheet_RecID = @Time_Sheet_RecID
  5679.  
  5680. -- Insert to dbo.Time_Audit
  5681. INSERT INTO Time_Audit
  5682. (
  5683. Time_RecID,
  5684. Member_RecID,
  5685. Date_Audit,
  5686. TE_Status_ID
  5687. )
  5688.  
  5689. SELECT
  5690. ti.Time_RecID,
  5691. ti.Member_RecID,
  5692. GETDATE(),
  5693. 10
  5694. FROM #TMP_Time_Staging ti
  5695. WHERE ti.Time_RecID IS NOT NULL
  5696.  
  5697. END
  5698.  
  5699. -- Insert to SR_Service_Calculated
  5700. INSERT INTO SR_Service_Calculated
  5701. (
  5702. SR_Service_RecID,
  5703. --ResourceGIF,
  5704. SR_SLA_RecID,
  5705. ResourceList
  5706. )
  5707.  
  5708. SELECT
  5709. stag.New_Identity,
  5710. --CASE WHEN stag.Resource_Member_RecID IS NULL THEN 'common/images/infoIcons/SR0-noperson.gif' ELSE 'common/images/infoIcons/SR9-checkmark.gif' END,
  5711. NULL,
  5712. mem.Member_ID
  5713. FROM #Import_Staging stag
  5714. OUTER APPLY(SELECT TOP 1 * FROM dbo.Member mem WHERE mem.Member_RecID = stag.Resource_Member_RecID) mem
  5715. WHERE New_Identity NOT IN(SELECT SR_Service_RecID FROM dbo.SR_Service_Calculated)
  5716.  
  5717. -- If debug mode and successful, select the rows that were inserted
  5718. -- and rollback transaction
  5719. IF @DebugMode = 1 AND @@ERROR = 0
  5720. BEGIN
  5721. SELECT * FROM dbo.SR_Service WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
  5722. SELECT * FROM dbo.SR_Detail WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
  5723. SELECT * FROM dbo.SR_Audit WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
  5724. SELECT * FROM dbo.SR_Config WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
  5725. SELECT * FROM dbo.Schedule WHERE RecID IN(SELECT New_Identity FROM #Import_Staging) AND Schedule_Type_RecID = 4
  5726. SELECT * FROM dbo.SR_Service_SLA_Workflow WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
  5727. SELECT * FROM dbo.Time_Entry WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
  5728. ROLLBACK TRANSACTION SR_Import
  5729. RETURN 0
  5730. END
  5731.  
  5732. IF @DebugMode = 2 AND @@ERROR = 0
  5733. BEGIN
  5734. SELECT
  5735. 1 AS Success,
  5736. NULL AS ExcelRowNumber,
  5737. NULL AS ErrorDetails
  5738. ROLLBACK TRANSACTION SR_Import
  5739. RETURN 1
  5740. END
  5741.  
  5742. EXEC usp_Import_UDF @TableName, 'Ticket'
  5743.  
  5744. IF @DebugMode = 0 AND @@Error = 0
  5745. BEGIN
  5746.  
  5747. -- Import successful - Save legacy_id's if necessary, commit and return results
  5748. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  5749. BEGIN
  5750.  
  5751. IF OBJECT_ID('tempdb..#TMP_Time_Staging') IS NOT NULL
  5752. BEGIN
  5753.  
  5754. IF OBJECT_ID('tempdb..#Legacy_IDs') IS NOT NULL
  5755. DROP TABLE #Legacy_IDs
  5756.  
  5757. SELECT
  5758. Legacy_ID AS Legacy_ID,
  5759. Time_RecID AS CW_RecID,
  5760. CASE WHEN Note_Type IN('InternalNote', 'DetailNote', 'ResolutionNote', 'ExtNote') THEN 'SR_Detail' ELSE 'Time_Entry' END AS Record_Type
  5761. INTO #Legacy_IDs
  5762. FROM #TMP_Time_Staging
  5763.  
  5764. DROP TABLE #TMP_Time_Staging
  5765.  
  5766. END
  5767.  
  5768. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  5769. BEGIN
  5770. DROP TABLE #Import_Staging
  5771. END
  5772.  
  5773. EXEC dbo.usp_Import_Legacy_IDs
  5774.  
  5775. END
  5776.  
  5777. COMMIT TRANSACTION SR_Import
  5778.  
  5779. SELECT
  5780. 1 AS Success,
  5781. NULL AS ExcelRowNumber,
  5782. NULL AS ErrorDetails
  5783.  
  5784. RETURN 1
  5785. END
  5786.  
  5787. END TRY
  5788.  
  5789. BEGIN CATCH
  5790.  
  5791. -- An error has occured - determine if validation error
  5792. IF ERROR_MESSAGE() = 'Validation Error'
  5793. BEGIN
  5794. -- Return details of error from staging table
  5795. SELECT
  5796. 0 AS Success,
  5797. stag.ExcelRowNumber,
  5798. stag.ConvertMessage AS ErrorDetails
  5799. FROM #Import_Staging stag
  5800. WHERE ConvertMessage IS NOT NULL
  5801.  
  5802. -- Rollback transaction
  5803. IF @@TRANCOUNT > 0
  5804. ROLLBACK TRANSACTION SR_Import
  5805.  
  5806. RETURN 0
  5807.  
  5808.  
  5809. END
  5810. ELSE
  5811. -- Not a validation error - return SQL error message encountered
  5812. SELECT
  5813. 0 AS Success,
  5814. 'Unknown' AS ExcelRowNumber,
  5815. ERROR_MESSAGE() + ' Line: ' + CONVERT(VARCHAR(20), Error_Line()) AS ErrorDetails
  5816.  
  5817. -- Rollback transaction
  5818. IF @@TRANCOUNT > 0
  5819. ROLLBACK TRANSACTION SR_Import
  5820. RETURN 0
  5821.  
  5822. END CATCH
  5823.  
  5824.  
  5825.  
  5826.  
  5827.  
  5828. GO
  5829.  
  5830.  
  5831.  
  5832.  
  5833.  
  5834.  
  5835.  
  5836. -- Tax codes
  5837. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_TC_ImportValidate')
  5838. BEGIN
  5839. EXEC('CREATE PROCEDURE [dbo].[usp_TC_ImportValidate] AS SELECT 1')
  5840. END
  5841.  
  5842.  
  5843. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_TC_ImportPush')
  5844. BEGIN
  5845. EXEC('CREATE PROCEDURE [dbo].[usp_TC_ImportPush] AS SELECT 1')
  5846. END
  5847.  
  5848. SET ANSI_NULLS ON
  5849. GO
  5850.  
  5851. SET QUOTED_IDENTIFIER ON
  5852. GO
  5853.  
  5854.  
  5855.  
  5856. -- =============================================
  5857. -- Author: m.gray
  5858. -- Create date: 03/22/2013
  5859. -- Description: Validates data in temp table
  5860. -- tempdb.dbo.TMP_TaxCode_Import - for Tax Code
  5861. -- Import
  5862. -- Sample call: exec usp_TC_ImportValidate 'TMP_Import_261224d61b564661b74188391fe9345a'
  5863. -- =============================================
  5864.  
  5865. ALTER PROCEDURE [dbo].[usp_TC_ImportValidate]
  5866. @TableName VARCHAR(255),
  5867. @ForceMode BIT = 0
  5868. AS
  5869. BEGIN
  5870.  
  5871. SET NOCOUNT ON
  5872.  
  5873. -- Set date format to MDY to validate dates from excel
  5874. SET DATEFORMAT MDY
  5875.  
  5876. -- Variable declaration
  5877. -- Dynamic statement to insert to staging table
  5878. DECLARE @DSQL VARCHAR(MAX)
  5879.  
  5880. -- Fully qualified name of source table
  5881. DECLARE @SourceTable VARCHAR(300)
  5882. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  5883.  
  5884. -- Object_ID of source table
  5885. DECLARE @Source_Object_ID INT
  5886. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  5887.  
  5888. -- Pre-validation
  5889. -- Create & populate table variable with list of required columns
  5890. DECLARE @RequiredColumns TABLE
  5891. (
  5892. ColumnName VARCHAR(255)
  5893. )
  5894.  
  5895. INSERT INTO @RequiredColumns
  5896. (
  5897. ColumnName
  5898. )
  5899. SELECT 'TaxCodeID'UNION ALL
  5900. SELECT 'Description'UNION ALL
  5901. SELECT 'Caption On Invoice' UNION ALL
  5902. SELECT 'Country' UNION ALL
  5903. SELECT 'Effective Date'UNION ALL
  5904. SELECT 'Cancel Date'UNION ALL
  5905. SELECT 'Display Each Level On Invoice'UNION ALL
  5906. SELECT 'Level 1 Rate'UNION ALL
  5907. SELECT 'Level 1 Rate Type'UNION ALL
  5908. SELECT 'Level 1 Max'UNION ALL
  5909. SELECT 'Level 1 Caption'UNION ALL
  5910. SELECT 'Level 1 Tax Code'UNION ALL
  5911. SELECT 'Level 1 Agency'UNION ALL
  5912. SELECT 'Level 1 Services'UNION ALL
  5913. SELECT 'Level 1 Expenses'UNION ALL
  5914. SELECT 'Level 1 Products'UNION ALL
  5915. SELECT 'Level 2 Rate'UNION ALL
  5916. SELECT 'Level 2 Rate Type'UNION ALL
  5917. SELECT 'Level 2 Max'UNION ALL
  5918. SELECT 'Level 2 Caption'UNION ALL
  5919. SELECT 'Level 2 Tax Code'UNION ALL
  5920. SELECT 'Level 2 Agency'UNION ALL
  5921. SELECT 'Level 2 Services'UNION ALL
  5922. SELECT 'Level 2 Expenses'UNION ALL
  5923. SELECT 'Level 2 Products'UNION ALL
  5924. SELECT 'Level 3 Rate'UNION ALL
  5925. SELECT 'Level 3 Rate Type'UNION ALL
  5926. SELECT 'Level 3 Max'UNION ALL
  5927. SELECT 'Level 3 Caption'UNION ALL
  5928. SELECT 'Level 3 Tax Code'UNION ALL
  5929. SELECT 'Level 3 Agency'UNION ALL
  5930. SELECT 'Level 3 Services'UNION ALL
  5931. SELECT 'Level 3 Expenses'UNION ALL
  5932. SELECT 'Level 3 Products'UNION ALL
  5933. SELECT 'Level 4 Rate'UNION ALL
  5934. SELECT 'Level 4 Rate Type'UNION ALL
  5935. SELECT 'Level 4 Max'UNION ALL
  5936. SELECT 'Level 4 Caption'UNION ALL
  5937. SELECT 'Level 4 Tax Code'UNION ALL
  5938. SELECT 'Level 4 Agency'UNION ALL
  5939. SELECT 'Level 4 Services'UNION ALL
  5940. SELECT 'Level 4 Expenses'UNION ALL
  5941. SELECT 'Level 4 Products'UNION ALL
  5942. SELECT 'Level 5 Rate'UNION ALL
  5943. SELECT 'Level 5 Rate Type'UNION ALL
  5944. SELECT 'Level 5 Max'UNION ALL
  5945. SELECT 'Level 5 Caption'UNION ALL
  5946. SELECT 'Level 5 Tax Code'UNION ALL
  5947. SELECT 'Level 5 Agency'UNION ALL
  5948. SELECT 'Level 5 Services'UNION ALL
  5949. SELECT 'Level 5 Expenses'UNION ALL
  5950. SELECT 'Level 5 Products'
  5951.  
  5952. -- Table variable to hold column names from source table
  5953. DECLARE @SourceColumns TABLE
  5954. (
  5955. ColumnName VARCHAR(255)
  5956. )
  5957.  
  5958. -- Populate @SourceColumns
  5959. INSERT INTO @SourceColumns
  5960. (
  5961. ColumnName
  5962. )
  5963.  
  5964. SELECT
  5965. name
  5966. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  5967.  
  5968. IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
  5969. BEGIN
  5970. DROP TABLE #tblResults
  5971. END
  5972.  
  5973. -- Table to hold results of procedure
  5974. CREATE TABLE #tblResults
  5975. (
  5976. RowNumber INT,
  5977. ValMsg VARCHAR(750),
  5978. InvalidReason VARCHAR(MAX),
  5979. ReferenceType VARCHAR(MAX),
  5980. Warning_Flag BIT DEFAULT 0
  5981. )
  5982.  
  5983. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  5984.  
  5985. -- Table to hold condensed summary results
  5986. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  5987. BEGIN
  5988. DROP TABLE #ResultsCondensed
  5989. END
  5990.  
  5991. CREATE TABLE #ResultsCondensed
  5992. (
  5993. RowNumber NVARCHAR(MAX),
  5994. ValMsg NVARCHAR(MAX)
  5995. )
  5996.  
  5997. -- Check that all required columns exist in @SourceColumns
  5998. INSERT INTO #tblResults
  5999. (
  6000. RowNumber,
  6001. ValMsg
  6002. )
  6003.  
  6004. SELECT
  6005. 0,
  6006. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  6007. FROM @RequiredColumns rq
  6008.  
  6009. EXCEPT
  6010.  
  6011. SELECT
  6012. 0,
  6013. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  6014. FROM @SourceColumns sc
  6015.  
  6016. -- If a column is missing, stop here and return results
  6017. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  6018. BEGIN
  6019. SELECT
  6020. 0 AS ValPassed,
  6021. RowNumber,
  6022. ValMsg
  6023. FROM #tblResults
  6024. ORDER BY RowNumber, ValMsg
  6025.  
  6026. RETURN
  6027. END
  6028.  
  6029. -- Pre-validation complete - proceed with normal validation
  6030. -- Table to hold source data for this batch from temp table
  6031. IF EXISTS(SELECT * FROM tempdb.sys.tables WHERE Name LIKE('%TC_Import_Val_Temp%'))
  6032. BEGIN
  6033. DROP TABLE #TC_Import_Val_Temp
  6034. END
  6035.  
  6036. CREATE TABLE #TC_Import_Val_Temp
  6037. (
  6038. ExcelRowNum INT,
  6039. TaxCodeID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6040. [Description] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6041. Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6042. Country NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6043. EffectiveDt NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6044. CancelDt NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6045. DispEachLvl NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6046. Lvl1Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6047. Lvl1RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6048. Lvl1Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6049. Lvl1Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6050. Lvl1TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6051. Lvl1Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6052. Lvl1Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6053. Lvl1Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6054. Lvl1Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6055. Lvl2Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6056. Lvl2RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6057. Lvl2Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6058. Lvl2Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6059. Lvl2TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6060. Lvl2Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6061. Lvl2Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6062. Lvl2Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6063. Lvl2Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6064. Lvl3Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6065. Lvl3RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6066. Lvl3Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6067. Lvl3Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6068. Lvl3TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6069. Lvl3Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6070. Lvl3Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6071. Lvl3Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6072. Lvl3Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6073. Lvl4Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6074. Lvl4RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6075. Lvl4Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6076. Lvl4Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6077. Lvl4TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6078. Lvl4Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6079. Lvl4Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6080. Lvl4Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6081. Lvl4Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6082. Lvl5Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6083. Lvl5RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6084. Lvl5Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6085. Lvl5Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6086. Lvl5TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6087. Lvl5Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6088. Lvl5Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6089. Lvl5Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6090. Lvl5Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  6091. BatchID UNIQUEIDENTIFIER,
  6092. Lvl1RateDec DECIMAL,
  6093. Lvl2RateDec DECIMAL,
  6094. Lvl3RateDec DECIMAL,
  6095. Lvl4RateDec DECIMAL,
  6096. Lvl5RateDec DECIMAL,
  6097. Lvl1MaxDec DECIMAL,
  6098. Lvl2MaxDec DECIMAL,
  6099. Lvl3MaxDec DECIMAL,
  6100. Lvl4MaxDec DECIMAL,
  6101. Lvl5MaxDec DECIMAL
  6102.  
  6103. )
  6104. -- Build statement to populate validation temp table
  6105. SELECT @DSQL = '
  6106. INSERT INTO #TC_Import_Val_Temp
  6107. (
  6108. ExcelRowNum,
  6109. TaxCodeID,
  6110. [Description],
  6111. Caption,
  6112. Country,
  6113. EffectiveDt,
  6114. CancelDt,
  6115. DispEachLvl,
  6116. Lvl1Rate,
  6117. Lvl1RateType,
  6118. Lvl1Max,
  6119. Lvl1Caption,
  6120. Lvl1TaxCode,
  6121. Lvl1Agency,
  6122. Lvl1Services,
  6123. Lvl1Expenses,
  6124. Lvl1Products,
  6125. Lvl2Rate,
  6126. Lvl2RateType,
  6127. Lvl2Max,
  6128. Lvl2Caption,
  6129. Lvl2TaxCode,
  6130. Lvl2Agency,
  6131. Lvl2Services,
  6132. Lvl2Expenses,
  6133. Lvl2Products,
  6134. Lvl3Rate,
  6135. Lvl3RateType,
  6136. Lvl3Max,
  6137. Lvl3Caption,
  6138. Lvl3TaxCode,
  6139. Lvl3Agency,
  6140. Lvl3Services,
  6141. Lvl3Expenses,
  6142. Lvl3Products,
  6143. Lvl4Rate,
  6144. Lvl4RateType,
  6145. Lvl4Max,
  6146. Lvl4Caption,
  6147. Lvl4TaxCode,
  6148. Lvl4Agency,
  6149. Lvl4Services,
  6150. Lvl4Expenses,
  6151. Lvl4Products,
  6152. Lvl5Rate,
  6153. Lvl5RateType,
  6154. Lvl5Max,
  6155. Lvl5Caption,
  6156. Lvl5TaxCode,
  6157. Lvl5Agency,
  6158. Lvl5Services,
  6159. Lvl5Expenses,
  6160. Lvl5Products
  6161. )
  6162. SELECT
  6163. [Excel Row Number],
  6164. [TaxCodeID],
  6165. [Description],
  6166. [Caption On Invoice],
  6167. [Country],
  6168. [Effective Date],
  6169. [Cancel Date],
  6170. [Display Each Level On Invoice],
  6171. [Level 1 Rate],
  6172. [Level 1 Rate Type],
  6173. [Level 1 Max],
  6174. [Level 1 Caption],
  6175. [Level 1 Tax Code],
  6176. [Level 1 Agency],
  6177. [Level 1 Services],
  6178. [Level 1 Expenses],
  6179. [Level 1 Products],
  6180. [Level 2 Rate],
  6181. [Level 2 Rate Type],
  6182. [Level 2 Max],
  6183. [Level 2 Caption],
  6184. [Level 2 Tax Code],
  6185. [Level 2 Agency],
  6186. [Level 2 Services],
  6187. [Level 2 Expenses],
  6188. [Level 2 Products],
  6189. [Level 3 Rate],
  6190. [Level 3 Rate Type],
  6191. [Level 3 Max],
  6192. [Level 3 Caption],
  6193. [Level 3 Tax Code],
  6194. [Level 3 Agency],
  6195. [Level 3 Services],
  6196. [Level 3 Expenses],
  6197. [Level 3 Products],
  6198. [Level 4 Rate],
  6199. [Level 4 Rate Type],
  6200. [Level 4 Max],
  6201. [Level 4 Caption],
  6202. [Level 4 Tax Code],
  6203. [Level 4 Agency],
  6204. [Level 4 Services],
  6205. [Level 4 Expenses],
  6206. [Level 4 Products],
  6207. [Level 5 Rate],
  6208. [Level 5 Rate Type],
  6209. [Level 5 Max],
  6210. [Level 5 Caption],
  6211. [Level 5 Tax Code],
  6212. [Level 5 Agency],
  6213. [Level 5 Services],
  6214. [Level 5 Expenses],
  6215. [Level 5 Products]
  6216.  
  6217. FROM ' + @SourceTable
  6218.  
  6219. -- Pull data into validation temp table
  6220. EXEC(@DSQL)
  6221.  
  6222. -- For all fields, update empty string or single space to null
  6223. UPDATE #TC_Import_Val_Temp
  6224. SET
  6225. TaxCodeID = CASE WHEN TaxCodeID IN ('', ' ') THEN NULL ELSE TaxCodeID END,
  6226. [Description] = CASE WHEN [Description] IN ('', ' ') THEN NULL ELSE [Description] END,
  6227. Caption = CASE WHEN Caption IN ('', ' ') THEN NULL ELSE Caption END,
  6228. Country = CASE WHEN Country IN ('', ' ') THEN NULL ELSE Country END,
  6229. EffectiveDt = CASE WHEN EffectiveDt IN ('', ' ') THEN NULL ELSE EffectiveDt END,
  6230. CancelDt = CASE WHEN CancelDt IN ('', ' ') THEN NULL ELSE CancelDt END,
  6231. DispEachLvl = CASE WHEN DispEachLvl IN ('', ' ') THEN NULL ELSE DispEachLvl END,
  6232. Lvl1Rate = CASE WHEN Lvl1Rate IN ('', ' ') THEN NULL ELSE Lvl1Rate END,
  6233. Lvl1RateType = CASE WHEN Lvl1RateType IN ('', ' ') THEN NULL ELSE Lvl1RateType END,
  6234. Lvl1Max = CASE WHEN Lvl1Max IN ('', ' ') THEN NULL ELSE Lvl1Max END,
  6235. Lvl1Caption = CASE WHEN Lvl1Caption IN ('', ' ') THEN NULL ELSE Lvl1Caption END,
  6236. Lvl1TaxCode = CASE WHEN Lvl1TaxCode IN ('', ' ') THEN NULL ELSE Lvl1TaxCode END,
  6237. Lvl1Agency = CASE WHEN Lvl1Agency IN ('', ' ') THEN NULL ELSE Lvl1Agency END,
  6238. Lvl1Services = CASE WHEN Lvl1Services IN ('', ' ') THEN NULL ELSE Lvl1Services END,
  6239. Lvl1Expenses = CASE WHEN Lvl1Expenses IN ('', ' ') THEN NULL ELSE Lvl1Expenses END,
  6240. Lvl1Products = CASE WHEN Lvl1Products IN ('', ' ') THEN NULL ELSE Lvl1Products END,
  6241. Lvl2Rate = CASE WHEN Lvl2Rate IN ('', ' ') THEN NULL ELSE Lvl2Rate END,
  6242. Lvl2RateType = CASE WHEN Lvl2RateType IN ('', ' ') THEN NULL ELSE Lvl2RateType END,
  6243. Lvl2Max = CASE WHEN Lvl2Max IN ('', ' ') THEN NULL ELSE Lvl2Max END,
  6244. Lvl2Caption = CASE WHEN Lvl2Caption IN ('', ' ') THEN NULL ELSE Lvl2Caption END,
  6245. Lvl2TaxCode = CASE WHEN Lvl2TaxCode IN ('', ' ') THEN NULL ELSE Lvl2TaxCode END,
  6246. Lvl2Agency = CASE WHEN Lvl2Agency IN ('', ' ') THEN NULL ELSE Lvl2Agency END,
  6247. Lvl2Services = CASE WHEN Lvl2Services IN ('', ' ') THEN NULL ELSE Lvl2Services END,
  6248. Lvl2Expenses = CASE WHEN Lvl2Expenses IN ('', ' ') THEN NULL ELSE Lvl2Expenses END,
  6249. Lvl2Products = CASE WHEN Lvl2Products IN ('', ' ') THEN NULL ELSE Lvl2Products END,
  6250. Lvl3Rate = CASE WHEN Lvl3Rate IN ('', ' ') THEN NULL ELSE Lvl3Rate END,
  6251. Lvl3RateType = CASE WHEN Lvl3RateType IN ('', ' ') THEN NULL ELSE Lvl3RateType END,
  6252. Lvl3Max = CASE WHEN Lvl3Max IN ('', ' ') THEN NULL ELSE Lvl3Max END,
  6253. Lvl3Caption = CASE WHEN Lvl3Caption IN ('', ' ') THEN NULL ELSE Lvl3Caption END,
  6254. Lvl3TaxCode = CASE WHEN Lvl3TaxCode IN ('', ' ') THEN NULL ELSE Lvl3TaxCode END,
  6255. Lvl3Agency = CASE WHEN Lvl3Agency IN ('', ' ') THEN NULL ELSE Lvl3Agency END,
  6256. Lvl3Services = CASE WHEN Lvl3Services IN ('', ' ') THEN NULL ELSE Lvl3Services END,
  6257. Lvl3Expenses = CASE WHEN Lvl3Expenses IN ('', ' ') THEN NULL ELSE Lvl3Expenses END,
  6258. Lvl3Products = CASE WHEN Lvl3Products IN ('', ' ') THEN NULL ELSE Lvl3Products END,
  6259. Lvl4Rate = CASE WHEN Lvl4Rate IN ('', ' ') THEN NULL ELSE Lvl4Rate END,
  6260. Lvl4RateType = CASE WHEN Lvl4RateType IN ('', ' ') THEN NULL ELSE Lvl4RateType END,
  6261. Lvl4Max = CASE WHEN Lvl4Max IN ('', ' ') THEN NULL ELSE Lvl4Max END,
  6262. Lvl4Caption = CASE WHEN Lvl4Caption IN ('', ' ') THEN NULL ELSE Lvl4Caption END,
  6263. Lvl4TaxCode = CASE WHEN Lvl4TaxCode IN ('', ' ') THEN NULL ELSE Lvl4TaxCode END,
  6264. Lvl4Agency = CASE WHEN Lvl4Agency IN ('', ' ') THEN NULL ELSE Lvl4Agency END,
  6265. Lvl4Services = CASE WHEN Lvl4Services IN ('', ' ') THEN NULL ELSE Lvl4Services END,
  6266. Lvl4Expenses = CASE WHEN Lvl4Expenses IN ('', ' ') THEN NULL ELSE Lvl4Expenses END,
  6267. Lvl4Products = CASE WHEN Lvl4Products IN ('', ' ') THEN NULL ELSE Lvl4Products END,
  6268. Lvl5Rate = CASE WHEN Lvl5Rate IN ('', ' ') THEN NULL ELSE Lvl5Rate END,
  6269. Lvl5RateType = CASE WHEN Lvl5RateType IN ('', ' ') THEN NULL ELSE Lvl5RateType END,
  6270. Lvl5Max = CASE WHEN Lvl5Max IN ('', ' ') THEN NULL ELSE Lvl5Max END,
  6271. Lvl5Caption = CASE WHEN Lvl5Caption IN ('', ' ') THEN NULL ELSE Lvl5Caption END,
  6272. Lvl5TaxCode = CASE WHEN Lvl5TaxCode IN ('', ' ') THEN NULL ELSE Lvl5TaxCode END,
  6273. Lvl5Agency = CASE WHEN Lvl5Agency IN ('', ' ') THEN NULL ELSE Lvl5Agency END,
  6274. Lvl5Services = CASE WHEN Lvl5Services IN ('', ' ') THEN NULL ELSE Lvl5Services END,
  6275. Lvl5Expenses = CASE WHEN Lvl5Expenses IN ('', ' ') THEN NULL ELSE Lvl5Expenses END,
  6276. Lvl5Products = CASE WHEN Lvl5Products IN ('', ' ') THEN NULL ELSE Lvl5Products END
  6277.  
  6278. -- Interpret all Y/N fields (Y = 1, N = 0, NULL = 0)
  6279. UPDATE #TC_Import_Val_Temp
  6280. SET
  6281. DispEachLvl = CASE DispEachLvl WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE DispEachLvl END,
  6282. Lvl1Services = CASE Lvl1Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl1Services END,
  6283. Lvl1Expenses = CASE Lvl1Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl1Expenses END,
  6284. Lvl1Products = CASE Lvl1Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl1Products END,
  6285. Lvl2Services = CASE Lvl2Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl2Services END,
  6286. Lvl2Expenses = CASE Lvl2Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl2Expenses END,
  6287. Lvl2Products = CASE Lvl2Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl2Products END,
  6288. Lvl3Services = CASE Lvl3Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl3Services END,
  6289. Lvl3Expenses = CASE Lvl3Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl3Expenses END,
  6290. Lvl3Products = CASE Lvl3Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl3Products END,
  6291. Lvl4Services = CASE Lvl4Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl4Services END,
  6292. Lvl4Expenses = CASE Lvl4Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl4Expenses END,
  6293. Lvl4Products = CASE Lvl4Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl4Products END,
  6294. Lvl5Services = CASE Lvl5Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl5Services END,
  6295. Lvl5Expenses = CASE Lvl5Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl5Expenses END,
  6296. Lvl5Products = CASE Lvl5Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl5Products END
  6297.  
  6298. -- Update null tax rates/max to 0
  6299. UPDATE #TC_Import_Val_Temp
  6300. SET
  6301. Lvl1Rate = CASE WHEN Lvl1Rate IS NULL THEN '0' ELSE Lvl1Rate END,
  6302. Lvl2Rate = CASE WHEN Lvl2Rate IS NULL THEN '0' ELSE Lvl2Rate END,
  6303. Lvl3Rate = CASE WHEN Lvl3Rate IS NULL THEN '0' ELSE Lvl3Rate END,
  6304. Lvl4Rate = CASE WHEN Lvl4Rate IS NULL THEN '0' ELSE Lvl4Rate END,
  6305. Lvl5Rate = CASE WHEN Lvl5Rate IS NULL THEN '0' ELSE Lvl5Rate END,
  6306. Lvl1Max = CASE WHEN Lvl1Max IS NULL THEN '0' ELSE Lvl1Max END,
  6307. Lvl2Max = CASE WHEN Lvl2Max IS NULL THEN '0' ELSE Lvl2Max END,
  6308. Lvl3Max = CASE WHEN Lvl3Max IS NULL THEN '0' ELSE Lvl3Max END,
  6309. Lvl4Max = CASE WHEN Lvl4Max IS NULL THEN '0' ELSE Lvl4Max END,
  6310. Lvl5Max = CASE WHEN Lvl5Max IS NULL THEN '0' ELSE Lvl5Max END
  6311.  
  6312. -- Populate Decimal column for rate and max - to be used for validations which require number comparison
  6313. UPDATE #TC_Import_Val_Temp
  6314. SET Lvl1RateDec = Lvl1Rate
  6315. WHERE ISNUMERIC(Lvl1Rate) = 1
  6316.  
  6317. UPDATE #TC_Import_Val_Temp
  6318. SET Lvl2RateDec = CONVERT(DECIMAL, Lvl2Rate)
  6319. WHERE ISNUMERIC(Lvl2Rate) = 1
  6320. AND Lvl2Rate IS NOT NULL
  6321.  
  6322. UPDATE #TC_Import_Val_Temp
  6323. SET Lvl3RateDec = CONVERT(DECIMAL, Lvl3Rate)
  6324. WHERE ISNUMERIC(Lvl3Rate) = 1
  6325. AND Lvl3Rate IS NOT NULL
  6326.  
  6327. UPDATE #TC_Import_Val_Temp
  6328. SET Lvl4RateDec = CONVERT(DECIMAL, Lvl4Rate)
  6329. WHERE ISNUMERIC(Lvl4Rate) = 1
  6330. AND Lvl4Rate IS NOT NULL
  6331.  
  6332. UPDATE #TC_Import_Val_Temp
  6333. SET Lvl5RateDec = CONVERT(DECIMAL, Lvl5Rate)
  6334. WHERE ISNUMERIC(Lvl5Rate) = 1
  6335. AND Lvl5Rate IS NOT NULL
  6336.  
  6337. UPDATE #TC_Import_Val_Temp
  6338. SET Lvl1MaxDec = CONVERT(DECIMAL, Lvl1Max)
  6339. WHERE ISNUMERIC(Lvl1Max) = 1
  6340. AND Lvl1Max IS NOT NULL
  6341.  
  6342. UPDATE #TC_Import_Val_Temp
  6343. SET Lvl2MaxDec = CONVERT(DECIMAL, Lvl2Max)
  6344. WHERE ISNUMERIC(Lvl2Max) = 1
  6345. AND Lvl2Max IS NOT NULL
  6346.  
  6347. UPDATE #TC_Import_Val_Temp
  6348. SET Lvl3MaxDec = CONVERT(DECIMAL, Lvl3Max)
  6349. WHERE ISNUMERIC(Lvl3Max) = 1
  6350. AND Lvl3Max IS NOT NULL
  6351.  
  6352. UPDATE #TC_Import_Val_Temp
  6353. SET Lvl4MaxDec = CONVERT(DECIMAL, Lvl4Max)
  6354. WHERE ISNUMERIC(Lvl4Max) = 1
  6355. AND Lvl4Max IS NOT NULL
  6356.  
  6357. UPDATE #TC_Import_Val_Temp
  6358. SET Lvl5MaxDec = CONVERT(DECIMAL, Lvl5Max)
  6359. WHERE ISNUMERIC(Lvl5Max) = 1
  6360. AND Lvl5Max IS NOT NULL
  6361.  
  6362. -- Update Rate Type to 'P' Where it is not specified
  6363. UPDATE #TC_Import_Val_Temp
  6364. SET Lvl1RateType = 'P'
  6365. WHERE Lvl1RateType IS NULL
  6366.  
  6367. UPDATE #TC_Import_Val_Temp
  6368. SET Lvl2RateType = 'P'
  6369. WHERE Lvl2RateType IS NULL
  6370.  
  6371. UPDATE #TC_Import_Val_Temp
  6372. SET Lvl3RateType = 'P'
  6373. WHERE Lvl3RateType IS NULL
  6374.  
  6375. UPDATE #TC_Import_Val_Temp
  6376. SET Lvl4RateType = 'P'
  6377. WHERE Lvl4RateType IS NULL
  6378.  
  6379. UPDATE #TC_Import_Val_Temp
  6380. SET Lvl5RateType = 'P'
  6381. WHERE Lvl5RateType IS NULL
  6382.  
  6383. -- Begin validations
  6384. INSERT INTO #tblResults
  6385. (
  6386. RowNumber,
  6387. ValMsg
  6388. )
  6389.  
  6390. -- TaxCodeID is required
  6391. SELECT
  6392. ExcelRowNum,
  6393. 'TaxCodeID field is required'
  6394. FROM #TC_Import_Val_Temp
  6395. WHERE TaxCodeID IS NULL
  6396.  
  6397. UNION ALL
  6398.  
  6399. -- TaxCodeID no more than 8 characters
  6400. SELECT
  6401. ExcelRowNum,
  6402. 'TaxCodeID cannot exceed 8 characters'
  6403. FROM #TC_Import_Val_Temp
  6404. WHERE LEN(TaxCodeID) > 8
  6405.  
  6406. UNION ALL
  6407.  
  6408. -- Description is required
  6409. SELECT
  6410. ExcelRowNum,
  6411. 'Description field is required'
  6412. FROM #TC_Import_Val_Temp
  6413. WHERE [Description] IS NULL
  6414.  
  6415. UNION ALL
  6416.  
  6417. -- Description no more than 50 characters
  6418. SELECT
  6419. ExcelRowNum,
  6420. 'Description cannot exceed 50 characters'
  6421. FROM #TC_Import_Val_Temp
  6422. WHERE LEN([Description]) > 50
  6423.  
  6424. UNION ALL
  6425.  
  6426. -- Caption on invoice is required
  6427. SELECT
  6428. ExcelRowNum,
  6429. 'Caption on invoice field is required'
  6430. FROM #TC_Import_Val_Temp
  6431. WHERE Caption IS NULL
  6432.  
  6433. UNION ALL
  6434.  
  6435. -- Caption on invoice no more than 25 characters
  6436. SELECT
  6437. ExcelRowNum,
  6438. 'Caption on invoice cannot exceed 25 characters'
  6439. FROM #TC_Import_Val_Temp
  6440. WHERE LEN(Caption) > 25
  6441.  
  6442. UNION ALL
  6443.  
  6444. -- Country is required
  6445. SELECT
  6446. ExcelRowNum,
  6447. 'Country field is required'
  6448. FROM #TC_Import_Val_Temp
  6449. WHERE Country IS NULL
  6450.  
  6451. UNION ALL
  6452.  
  6453. -- Country must be a valid reference
  6454. SELECT
  6455. ExcelRowNum,
  6456. 'Country "' + tmp.Country + '" is invalid.'
  6457. FROM #TC_Import_Val_Temp tmp
  6458. LEFT OUTER JOIN Country co
  6459. ON dbo.ufn_Import_Trim(co.Country) = tmp.Country
  6460. WHERE co.Country_RecID IS NULL
  6461. AND tmp.Country IS NOT NULL
  6462.  
  6463. UNION ALL
  6464.  
  6465. -- Country may not exceed 50 characters
  6466. SELECT
  6467. ExcelRowNum,
  6468. 'Country cannot exceed 50 characters'
  6469. FROM #TC_Import_Val_Temp
  6470. WHERE LEN(Country) > 50
  6471.  
  6472. UNION ALL
  6473.  
  6474. -- Check for duplicate country
  6475. SELECT
  6476. ExcelRowNum,
  6477. 'There are more than 1 countries named "' + co.Country + '" in the database'
  6478. FROM #TC_Import_Val_Temp tmp
  6479. INNER JOIN dbo.Country co
  6480. ON dbo.ufn_Import_Trim(co.Country) = tmp.Country
  6481. GROUP BY co.Country, tmp.ExcelRowNum
  6482. HAVING COUNT(*) > 1
  6483.  
  6484. UNION ALL
  6485.  
  6486. -- Effective date must be a valid date if entered
  6487. SELECT
  6488. ExcelRowNum,
  6489. 'Effective date must be a valid date - Please use MM/DD/YYYY format'
  6490. FROM #TC_Import_Val_Temp
  6491. WHERE (ISDATE(EffectiveDt) = 0 OR EffectiveDt NOT LIKE '%/%/%')
  6492. AND EffectiveDt IS NOT NULL
  6493.  
  6494.  
  6495. UNION ALL
  6496.  
  6497. -- Cancel date must be a valid date if entered
  6498. SELECT
  6499. ExcelRowNum,
  6500. 'Cancel date must be a valid date - Please use MM/DD/YYYY format'
  6501. FROM #TC_Import_Val_Temp
  6502. WHERE (ISDATE(CancelDt) = 0 OR CancelDt NOT LIKE '%/%/%')
  6503. AND CancelDt IS NOT NULL
  6504.  
  6505. UNION ALL
  6506.  
  6507. -- Display Each Level must be 0 or 1
  6508. SELECT
  6509. ExcelRowNum,
  6510. '"' + DispEachLvl + '" is not a valid value for Display Each Level on Invoice'
  6511. FROM #TC_Import_Val_Temp
  6512. WHERE DispEachLvl NOT IN('0', '1')
  6513.  
  6514. UNION ALL
  6515.  
  6516. -- Check that rate type is 'A' or 'P'
  6517. SELECT
  6518. ExcelRowNum,
  6519. '"' + Lvl1RateType + '" is not a valid rate type for level 1 - must be "A" or "P"'
  6520. FROM #TC_Import_Val_Temp
  6521. WHERE Lvl1RateType NOT IN('A', 'P')
  6522.  
  6523. UNION ALL
  6524.  
  6525. SELECT
  6526. ExcelRowNum,
  6527. '"' + Lvl2RateType + '" is not a valid rate type for level 2 - must be "A" or "P"'
  6528. FROM #TC_Import_Val_Temp
  6529. WHERE Lvl2RateType NOT IN('A', 'P')
  6530.  
  6531. UNION ALL
  6532.  
  6533. SELECT
  6534. ExcelRowNum,
  6535. '"' + Lvl3RateType + '" is not a valid rate type for level 3 - must be "A" or "P"'
  6536. FROM #TC_Import_Val_Temp
  6537. WHERE Lvl3RateType NOT IN('A', 'P')
  6538.  
  6539. UNION ALL
  6540.  
  6541. SELECT
  6542. ExcelRowNum,
  6543. '"' + Lvl4RateType + '" is not a valid rate type for level 4 - must be "A" or "P"'
  6544. FROM #TC_Import_Val_Temp
  6545. WHERE Lvl4RateType NOT IN('A', 'P')
  6546.  
  6547. UNION ALL
  6548.  
  6549. SELECT
  6550. ExcelRowNum,
  6551. '"' + Lvl5RateType + '" is not a valid rate type for level 5 - must be "A" or "P"'
  6552. FROM #TC_Import_Val_Temp
  6553. WHERE Lvl5RateType NOT IN('A', 'P')
  6554.  
  6555.  
  6556. UNION ALL
  6557.  
  6558. -- All rates and max rates must be numeric and max may not exceed 214748.3647
  6559. -- Level 1
  6560. SELECT
  6561. ExcelRowNum,
  6562. 'Level 1 rate must be a numeric value'
  6563. FROM #TC_Import_Val_Temp
  6564. WHERE ISNUMERIC(Lvl1Rate) = 0
  6565.  
  6566. UNION ALL
  6567.  
  6568. SELECT
  6569. ExcelRowNum,
  6570. 'Level 1 maximum tax must be a numeric value'
  6571. FROM #TC_Import_Val_Temp
  6572. WHERE ISNUMERIC(Lvl1Max) = 0
  6573.  
  6574. UNION ALL
  6575.  
  6576. SELECT
  6577. ExcelRowNum,
  6578. 'Level 1 maximum tax cannot exceed 214741.3647'
  6579. FROM #TC_Import_Val_Temp
  6580. WHERE Lvl1MaxDec > 214748.3647
  6581.  
  6582. UNION ALL
  6583.  
  6584. -- Level 2
  6585. SELECT
  6586. ExcelRowNum,
  6587. 'Level 2 rate must be a numeric value'
  6588. FROM #TC_Import_Val_Temp
  6589. WHERE ISNUMERIC(Lvl2Rate) = 0
  6590.  
  6591. UNION ALL
  6592.  
  6593. SELECT
  6594. ExcelRowNum,
  6595. 'Level 2 maximum tax must be a numeric value'
  6596. FROM #TC_Import_Val_Temp
  6597. WHERE ISNUMERIC(Lvl2Max) = 0
  6598.  
  6599. UNION ALL
  6600.  
  6601. SELECT
  6602. ExcelRowNum,
  6603. 'Level 2 maximum tax cannot exceed 214748.3647'
  6604. FROM #TC_Import_Val_Temp
  6605. WHERE Lvl2MaxDec > 214748.3647
  6606.  
  6607. UNION ALL
  6608.  
  6609. -- Level 3
  6610. SELECT
  6611. ExcelRowNum,
  6612. 'Level 3 rate must be a numeric value'
  6613. FROM #TC_Import_Val_Temp
  6614. WHERE ISNUMERIC(Lvl3Rate) = 0
  6615.  
  6616. UNION ALL
  6617.  
  6618. SELECT
  6619. ExcelRowNum,
  6620. 'Level 3 maximum tax must be a numeric value'
  6621. FROM #TC_Import_Val_Temp
  6622. WHERE ISNUMERIC(Lvl3Max) = 0
  6623.  
  6624. UNION ALL
  6625.  
  6626. SELECT
  6627. ExcelRowNum,
  6628. 'Level 3 maximum tax cannot exceed 214748.3647'
  6629. FROM #TC_Import_Val_Temp
  6630. WHERE Lvl3MaxDec > 214748.3647
  6631.  
  6632. UNION ALL
  6633.  
  6634. -- Level 4
  6635. SELECT
  6636. ExcelRowNum,
  6637. 'Level 4 rate must be a numeric value'
  6638. FROM #TC_Import_Val_Temp
  6639. WHERE ISNUMERIC(Lvl4Rate) = 0
  6640.  
  6641. UNION ALL
  6642.  
  6643. SELECT
  6644. ExcelRowNum,
  6645. 'Level 4 maximum tax must be a numeric value'
  6646. FROM #TC_Import_Val_Temp
  6647. WHERE ISNUMERIC(Lvl4Max) = 0
  6648.  
  6649. UNION ALL
  6650.  
  6651. SELECT
  6652. ExcelRowNum,
  6653. 'Level 4 maximum tax cannot exceed 214748.3647'
  6654. FROM #TC_Import_Val_Temp
  6655. WHERE Lvl4MaxDec > 214748.3647
  6656.  
  6657. UNION ALL
  6658.  
  6659. -- Level 5
  6660. SELECT
  6661. ExcelRowNum,
  6662. 'Level 5 rate must be a numeric value'
  6663. FROM #TC_Import_Val_Temp
  6664. WHERE ISNUMERIC(Lvl5Rate) = 0
  6665.  
  6666. UNION ALL
  6667.  
  6668. SELECT
  6669. ExcelRowNum,
  6670. 'Level 5 maximum tax must be a numeric value'
  6671. FROM #TC_Import_Val_Temp
  6672. WHERE ISNUMERIC(Lvl5Max) = 0
  6673.  
  6674. UNION ALL
  6675.  
  6676. SELECT
  6677. ExcelRowNum,
  6678. 'Level 5 maximum tax cannot exceed 214748.3647'
  6679. FROM #TC_Import_Val_Temp
  6680. WHERE Lvl5MaxDec > 214748.3647
  6681.  
  6682. UNION ALL
  6683.  
  6684. -- Rate must be a percentage (decimal) where rate type is percent
  6685. -- Level 1
  6686. SELECT
  6687. ExcelRowNum,
  6688. Lvl1Rate + ' is not a valid percentage for Level 1 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
  6689. FROM #TC_Import_Val_Temp
  6690. WHERE Lvl1RateDec NOT BETWEEN 0 AND 1
  6691. AND Lvl1RateType = 'P'
  6692.  
  6693. UNION ALL
  6694.  
  6695. -- Level 2
  6696. SELECT
  6697. ExcelRowNum,
  6698. Lvl2Rate + ' is not a valid percentage for Level 2 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
  6699. FROM #TC_Import_Val_Temp
  6700. WHERE Lvl2RateDec NOT BETWEEN 0 AND 1
  6701. AND Lvl2RateType = 'P'
  6702.  
  6703. UNION ALL
  6704.  
  6705. -- Level 3
  6706. SELECT
  6707. ExcelRowNum,
  6708. Lvl3Rate + ' is not a valid percentage for Level 3 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
  6709. FROM #TC_Import_Val_Temp
  6710. WHERE Lvl3RateDec NOT BETWEEN 0 AND 1
  6711. AND Lvl3RateType = 'P'
  6712.  
  6713. UNION ALL
  6714.  
  6715. -- Level 4
  6716. SELECT
  6717. ExcelRowNum,
  6718. Lvl4Rate + ' is not a valid percentage for Level 4 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
  6719. FROM #TC_Import_Val_Temp
  6720. WHERE Lvl4RateDec NOT BETWEEN 0 AND 1
  6721. AND Lvl4RateType = 'P'
  6722.  
  6723. UNION ALL
  6724.  
  6725. -- Level 5
  6726. SELECT
  6727. ExcelRowNum,
  6728. Lvl5Rate + ' is not a valid percentage for Level 5 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
  6729. FROM #TC_Import_Val_Temp
  6730. WHERE Lvl5RateDec NOT BETWEEN 0 AND 1
  6731. AND Lvl5RateType = 'P'
  6732.  
  6733. UNION ALL
  6734.  
  6735. -- Rate must be a whole number if rate type = 'A'
  6736. -- Level 1
  6737. SELECT
  6738. ExcelRowNum,
  6739. 'If rate type is set to amount for level 1 - rate must be a whole number'
  6740. FROM #TC_Import_Val_Temp
  6741. WHERE Lvl1RateDec <> FLOOR(Lvl1RateDec)
  6742. AND Lvl1RateType = 'A'
  6743.  
  6744. UNION ALL
  6745.  
  6746. -- Level 2
  6747. SELECT
  6748. ExcelRowNum,
  6749. 'If rate type is set to amount for level 2 - rate must be a whole number'
  6750. FROM #TC_Import_Val_Temp
  6751. WHERE Lvl2RateDec <> FLOOR(Lvl2RateDec)
  6752. AND Lvl2RateType = 'A'
  6753.  
  6754. UNION ALL
  6755.  
  6756. -- Level 3
  6757. SELECT
  6758. ExcelRowNum,
  6759. 'If rate type is set to amount for level 3 - rate must be a whole number'
  6760. FROM #TC_Import_Val_Temp
  6761. WHERE Lvl3RateDec <> FLOOR(Lvl3RateDec)
  6762. AND Lvl3RateType = 'A'
  6763.  
  6764. UNION ALL
  6765.  
  6766. -- Level 4
  6767. SELECT
  6768. ExcelRowNum,
  6769. 'If rate type is set to amount for level 4 - rate must be a whole number'
  6770. FROM #TC_Import_Val_Temp
  6771. WHERE Lvl4RateDec <> FLOOR(Lvl4RateDec)
  6772. AND Lvl4RateType = 'A'
  6773.  
  6774. UNION ALL
  6775.  
  6776. -- Level 5
  6777. SELECT
  6778. ExcelRowNum,
  6779. 'If rate type is set to amount for level 5 - rate must be a whole number'
  6780. FROM #TC_Import_Val_Temp
  6781. WHERE Lvl5RateDec <> FLOOR(Lvl5RateDec)
  6782. AND Lvl5RateType = 'A'
  6783.  
  6784. UNION ALL
  6785.  
  6786. -- Caption for each level cannot exceed 16 characters
  6787. -- Level 1
  6788. SELECT
  6789. ExcelRowNum,
  6790. 'Level 1 caption cannot exceed 16 characters'
  6791. FROM #TC_Import_Val_Temp
  6792. WHERE LEN(Lvl1Caption) > 16
  6793.  
  6794. UNION ALL
  6795.  
  6796. -- Level 2
  6797. SELECT
  6798. ExcelRowNum,
  6799. 'Level 2 caption cannot exceed 16 characters'
  6800. FROM #TC_Import_Val_Temp
  6801. WHERE LEN(Lvl2Caption) > 16
  6802.  
  6803. UNION ALL
  6804.  
  6805. -- Level 3
  6806. SELECT
  6807. ExcelRowNum,
  6808. 'Level 3 caption cannot exceed 16 characters'
  6809. FROM #TC_Import_Val_Temp
  6810. WHERE LEN(Lvl3Caption) > 16
  6811.  
  6812. UNION ALL
  6813.  
  6814. -- Level 4
  6815. SELECT
  6816. ExcelRowNum,
  6817. 'Level 4 caption cannot exceed 16 characters'
  6818. FROM #TC_Import_Val_Temp
  6819. WHERE LEN(Lvl4Caption) > 16
  6820.  
  6821. UNION ALL
  6822.  
  6823. -- Level 5
  6824. SELECT
  6825. ExcelRowNum,
  6826. 'Level 5 caption cannot exceed 16 characters'
  6827. FROM #TC_Import_Val_Temp
  6828. WHERE LEN(Lvl5Caption) > 16
  6829.  
  6830. UNION ALL
  6831.  
  6832. -- If specified, tax code cannot be more than 50 characters
  6833. SELECT
  6834. ExcelRowNum,
  6835. 'Level 1 tax code cannot exceed 50 characters'
  6836. FROM #TC_Import_Val_Temp
  6837. WHERE LEN(Lvl1TaxCode) > 50
  6838.  
  6839. UNION ALL
  6840.  
  6841. SELECT
  6842. ExcelRowNum,
  6843. 'Level 2 tax code cannot exceed 50 characters'
  6844. FROM #TC_Import_Val_Temp
  6845. WHERE LEN(Lvl2TaxCode) > 50
  6846.  
  6847. UNION ALL
  6848.  
  6849. SELECT
  6850. ExcelRowNum,
  6851. 'Level 3 tax code cannot exceed 50 characters'
  6852. FROM #TC_Import_Val_Temp
  6853. WHERE LEN(Lvl3TaxCode) > 50
  6854.  
  6855. UNION ALL
  6856.  
  6857. SELECT
  6858. ExcelRowNum,
  6859. 'Level 4 tax code cannot exceed 50 characters'
  6860. FROM #TC_Import_Val_Temp
  6861. WHERE LEN(Lvl4TaxCode) > 50
  6862.  
  6863. UNION ALL
  6864.  
  6865. SELECT
  6866. ExcelRowNum,
  6867. 'Level 5 tax code cannot exceed 50 characters'
  6868. FROM #TC_Import_Val_Temp
  6869. WHERE LEN(Lvl5TaxCode) > 50
  6870.  
  6871. UNION ALL
  6872.  
  6873. -- If specified, tax agency cannot be more than 255 characters
  6874. SELECT
  6875. ExcelRowNum,
  6876. 'Level 1 tax agency cannot exceed 255 characters'
  6877. FROM #TC_Import_Val_Temp
  6878. WHERE LEN(Lvl1Agency) > 255
  6879.  
  6880. UNION ALL
  6881.  
  6882. SELECT
  6883. ExcelRowNum,
  6884. 'Level 2 tax agency cannot exceed 255 characters'
  6885. FROM #TC_Import_Val_Temp
  6886. WHERE LEN(Lvl2Agency) > 255
  6887.  
  6888. UNION ALL
  6889.  
  6890. SELECT
  6891. ExcelRowNum,
  6892. 'Level 3 tax agency cannot exceed 255 characters'
  6893. FROM #TC_Import_Val_Temp
  6894. WHERE LEN(Lvl3Agency) > 255
  6895.  
  6896. UNION ALL
  6897.  
  6898. SELECT
  6899. ExcelRowNum,
  6900. 'Level 4 tax agency cannot exceed 255 characters'
  6901. FROM #TC_Import_Val_Temp
  6902. WHERE LEN(Lvl4Agency) > 255
  6903.  
  6904. UNION ALL
  6905.  
  6906. SELECT
  6907. ExcelRowNum,
  6908. 'Level 5 tax agency cannot exceed 255 characters'
  6909. FROM #TC_Import_Val_Temp
  6910. WHERE LEN(Lvl5Agency) > 255
  6911.  
  6912. UNION ALL
  6913.  
  6914. -- Services must be 0 or 1
  6915. SELECT
  6916. ExcelRowNum,
  6917. 'Level 1 services must be either 0 or 1'
  6918. FROM #TC_Import_Val_Temp
  6919. WHERE Lvl1Services NOT IN('0', '1')
  6920.  
  6921. UNION ALL
  6922.  
  6923. SELECT
  6924. ExcelRowNum,
  6925. 'Level 2 services must be either 0 or 1'
  6926. FROM #TC_Import_Val_Temp
  6927. WHERE Lvl2Services NOT IN('0', '1')
  6928.  
  6929. UNION ALL
  6930.  
  6931. SELECT
  6932. ExcelRowNum,
  6933. 'Level 3 services must be either 0 or 1'
  6934. FROM #TC_Import_Val_Temp
  6935. WHERE Lvl3Services NOT IN('0', '1')
  6936.  
  6937. UNION ALL
  6938.  
  6939. SELECT
  6940. ExcelRowNum,
  6941. 'Level 4 services must be either 0 or 1'
  6942. FROM #TC_Import_Val_Temp
  6943. WHERE Lvl4Services NOT IN('0', '1')
  6944.  
  6945. UNION ALL
  6946.  
  6947. SELECT
  6948. ExcelRowNum,
  6949. 'Level 5 services must be either 0 or 1'
  6950. FROM #TC_Import_Val_Temp
  6951. WHERE Lvl5Services NOT IN('0', '1')
  6952.  
  6953. UNION ALL
  6954.  
  6955. -- Expenses must be 0 or 1
  6956. SELECT
  6957. ExcelRowNum,
  6958. 'Level 1 Expenses must be either 0 or 1'
  6959. FROM #TC_Import_Val_Temp
  6960. WHERE Lvl1Expenses NOT IN('0', '1')
  6961.  
  6962. UNION ALL
  6963.  
  6964. SELECT
  6965. ExcelRowNum,
  6966. 'Level 2 Expenses must be either 0 or 1'
  6967. FROM #TC_Import_Val_Temp
  6968. WHERE Lvl2Expenses NOT IN('0', '1')
  6969.  
  6970. UNION ALL
  6971.  
  6972. SELECT
  6973. ExcelRowNum,
  6974. 'Level 3 Expenses must be either 0 or 1'
  6975. FROM #TC_Import_Val_Temp
  6976. WHERE Lvl3Expenses NOT IN('0', '1')
  6977.  
  6978. UNION ALL
  6979.  
  6980. SELECT
  6981. ExcelRowNum,
  6982. 'Level 4 Expenses must be either 0 or 1'
  6983. FROM #TC_Import_Val_Temp
  6984. WHERE Lvl4Expenses NOT IN('0', '1')
  6985.  
  6986. UNION ALL
  6987.  
  6988. SELECT
  6989. ExcelRowNum,
  6990. 'Level 5 Expenses must be either 0 or 1'
  6991. FROM #TC_Import_Val_Temp
  6992. WHERE Lvl5Expenses NOT IN('0', '1')
  6993.  
  6994. UNION ALL
  6995.  
  6996. -- Products must be 0 or 1
  6997. SELECT
  6998. ExcelRowNum,
  6999. 'Level 1 Products must be either 0 or 1'
  7000. FROM #TC_Import_Val_Temp
  7001. WHERE Lvl1Products NOT IN('0', '1')
  7002.  
  7003. UNION ALL
  7004.  
  7005. SELECT
  7006. ExcelRowNum,
  7007. 'Level 2 Products must be either 0 or 1'
  7008. FROM #TC_Import_Val_Temp
  7009. WHERE Lvl2Products NOT IN('0', '1')
  7010.  
  7011. UNION ALL
  7012.  
  7013. SELECT
  7014. ExcelRowNum,
  7015. 'Level 3 Products must be either 0 or 1'
  7016. FROM #TC_Import_Val_Temp
  7017. WHERE Lvl3Products NOT IN('0', '1')
  7018.  
  7019. UNION ALL
  7020.  
  7021. SELECT
  7022. ExcelRowNum,
  7023. 'Level 4 Products must be either 0 or 1'
  7024. FROM #TC_Import_Val_Temp
  7025. WHERE Lvl4Products NOT IN('0', '1')
  7026.  
  7027. UNION ALL
  7028.  
  7029. SELECT
  7030. ExcelRowNum,
  7031. 'Level 5 Products must be either 0 or 1'
  7032. FROM #TC_Import_Val_Temp
  7033. WHERE Lvl5Products NOT IN('0', '1')
  7034.  
  7035. UNION ALL
  7036.  
  7037. -- Make sure TaxCodeID does not already exist in DB
  7038. SELECT
  7039. ExcelRowNum,
  7040. 'Tax code: "' + tmp.TaxCodeID + '" already exists.'
  7041. FROM #TC_Import_Val_Temp tmp
  7042. INNER JOIN Tax_Code tc
  7043. ON dbo.ufn_Import_Trim(tc.Tax_Code_ID) = tmp.TaxCodeID
  7044. AND ISNULL(tc.Date_Cancel, '1/1/2999') > GETDATE()
  7045.  
  7046. UNION ALL
  7047.  
  7048. -- Make sure TaxCodeID is not duplicate within spreadsheet
  7049. SELECT
  7050. MAX(ExcelRowNum),
  7051. 'Tax code: "' + tmp.TaxCodeID + '" cannot be specified more than once'
  7052. FROM #TC_Import_Val_Temp tmp
  7053. WHERE tmp.TaxCodeID IS NOT NULL
  7054. GROUP BY tmp.TaxCodeID
  7055. HAVING COUNT(*) > 1
  7056.  
  7057. -- Return results
  7058. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  7059. BEGIN
  7060.  
  7061. exec dbo.usp_Condense_Validation_Results
  7062.  
  7063. SELECT
  7064. 0 AS ValPassed,
  7065. 0 AS RowNumber,
  7066. ValMsg
  7067. FROM #ResultsCondensed
  7068.  
  7069. ROLLBACK TRANSACTION
  7070.  
  7071. END
  7072. ELSE
  7073. BEGIN
  7074. SELECT
  7075. 1 AS ValPassed,
  7076. NULL AS RowNumber,
  7077. NULL AS ValMsg
  7078.  
  7079. ROLLBACK TRANSACTION
  7080.  
  7081. END
  7082.  
  7083. END
  7084.  
  7085.  
  7086. GO
  7087.  
  7088.  
  7089. -- =============================================
  7090. -- Author: m.gray
  7091. -- Create date: 03/25/2013
  7092. -- Description: Performs final validation
  7093. -- and inserts for Tax code import
  7094. -- Sample call: exec usp_TC_ImportPush 'TMP_Import123', 1
  7095. -- =============================================
  7096.  
  7097. ALTER PROCEDURE [dbo].[usp_TC_ImportPush]
  7098. @TableName VARCHAR(255),
  7099. @DebugMode INT = 0,
  7100. @ForceMode BIT = 0
  7101. AS
  7102. BEGIN TRY
  7103.  
  7104. -- Variable declaration
  7105. -- Dynamic statement to insert to staging table
  7106. DECLARE @DSQL VARCHAR(MAX)
  7107.  
  7108. -- Fully qualified name of source table
  7109. DECLARE @SourceTable VARCHAR(300)
  7110. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  7111.  
  7112. -- Object_ID of source table
  7113. DECLARE @Source_Object_ID INT
  7114. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  7115.  
  7116. -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
  7117. IF OBJECT_ID('tempdb..#TC_Import_Staging') IS NOT NULL
  7118. BEGIN
  7119. DROP TABLE #TC_Import_Staging
  7120. END
  7121.  
  7122. CREATE TABLE #TC_Import_Staging
  7123. (
  7124. TC_Import_Staging_RecID INT IDENTITY,
  7125. ExcelRowNum INT,
  7126. TaxCodeID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7127. [Description] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7128. Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7129. Country NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7130. EffectiveDt NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7131. CancelDt NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7132. DispEachLvl NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7133. Lvl1Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7134. Lvl1RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7135. Lvl1Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7136. Lvl1Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7137. Lvl1TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7138. Lvl1Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7139. Lvl1Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7140. Lvl1Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7141. Lvl1Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7142. Lvl2Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7143. Lvl2RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7144. Lvl2Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7145. Lvl2Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7146. Lvl2TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7147. Lvl2Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7148. Lvl2Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7149. Lvl2Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7150. Lvl2Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7151. Lvl3Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7152. Lvl3RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7153. Lvl3Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7154. Lvl3Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7155. Lvl3TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7156. Lvl3Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7157. Lvl3Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7158. Lvl3Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7159. Lvl3Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7160. Lvl4Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7161. Lvl4RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7162. Lvl4Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7163. Lvl4Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7164. Lvl4TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7165. Lvl4Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7166. Lvl4Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7167. Lvl4Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7168. Lvl4Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7169. Lvl5Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7170. Lvl5RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7171. Lvl5Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7172. Lvl5Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7173. Lvl5TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7174. Lvl5Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7175. Lvl5Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7176. Lvl5Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7177. Lvl5Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7178. Lvl1RateDec DECIMAL,
  7179. Lvl2RateDec DECIMAL,
  7180. Lvl3RateDec DECIMAL,
  7181. Lvl4RateDec DECIMAL,
  7182. Lvl5RateDec DECIMAL,
  7183. Lvl1MaxDec DECIMAL,
  7184. Lvl2MaxDec DECIMAL,
  7185. Lvl3MaxDec DECIMAL,
  7186. Lvl4MaxDec DECIMAL,
  7187. Lvl5MaxDec DECIMAL,
  7188. Default_Flag BIT,
  7189. Country_RecID INT,
  7190. Tax_Code_RecID INT,
  7191. Legacy_ID NVARCHAR(250) COLLATE DATABASE_DEFAULT NULL
  7192. )
  7193.  
  7194.  
  7195. SET NOCOUNT ON
  7196.  
  7197. -- Variable declaration
  7198. DECLARE
  7199. @ExpRowCount INT, -- Expected rowcount for inserts - Used for validation
  7200. @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
  7201.  
  7202. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  7203. SELECT @ImportBatchUser =
  7204. 'CONV_'
  7205. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  7206. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  7207. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  7208. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  7209.  
  7210. -- Populate Staging table variable with initial values
  7211. SELECT @DSQL = '
  7212. INSERT INTO #TC_Import_Staging
  7213. (
  7214. ExcelRowNum,
  7215. TaxCodeID,
  7216. [Description],
  7217. Caption,
  7218. Country,
  7219. EffectiveDt,
  7220. CancelDt,
  7221. DispEachLvl,
  7222. Lvl1Rate,
  7223. Lvl1RateType,
  7224. Lvl1Max,
  7225. Lvl1Caption,
  7226. Lvl1TaxCode,
  7227. Lvl1Agency,
  7228. Lvl1Services,
  7229. Lvl1Expenses,
  7230. Lvl1Products,
  7231. Lvl2Rate,
  7232. Lvl2RateType,
  7233. Lvl2Max,
  7234. Lvl2Caption,
  7235. Lvl2TaxCode,
  7236. Lvl2Agency,
  7237. Lvl2Services,
  7238. Lvl2Expenses,
  7239. Lvl2Products,
  7240. Lvl3Rate,
  7241. Lvl3RateType,
  7242. Lvl3Max,
  7243. Lvl3Caption,
  7244. Lvl3TaxCode,
  7245. Lvl3Agency,
  7246. Lvl3Services,
  7247. Lvl3Expenses,
  7248. Lvl3Products,
  7249. Lvl4Rate,
  7250. Lvl4RateType,
  7251. Lvl4Max,
  7252. Lvl4Caption,
  7253. Lvl4TaxCode,
  7254. Lvl4Agency,
  7255. Lvl4Services,
  7256. Lvl4Expenses,
  7257. Lvl4Products,
  7258. Lvl5Rate,
  7259. Lvl5RateType,
  7260. Lvl5Max,
  7261. Lvl5Caption,
  7262. Lvl5TaxCode,
  7263. Lvl5Agency,
  7264. Lvl5Services,
  7265. Lvl5Expenses,
  7266. Lvl5Products,
  7267. Default_Flag
  7268. )
  7269. SELECT
  7270. [Excel Row Number],
  7271. [TaxCodeID],
  7272. [Description],
  7273. [Caption On Invoice],
  7274. [Country],
  7275. [Effective Date],
  7276. [Cancel Date],
  7277. [Display Each Level On Invoice],
  7278. [Level 1 Rate],
  7279. [Level 1 Rate Type],
  7280. [Level 1 Max],
  7281. [Level 1 Caption],
  7282. [Level 1 Tax Code],
  7283. [Level 1 Agency],
  7284. [Level 1 Services],
  7285. [Level 1 Expenses],
  7286. [Level 1 Products],
  7287. [Level 2 Rate],
  7288. [Level 2 Rate Type],
  7289. [Level 2 Max],
  7290. [Level 2 Caption],
  7291. [Level 2 Tax Code],
  7292. [Level 2 Agency],
  7293. [Level 2 Services],
  7294. [Level 2 Expenses],
  7295. [Level 2 Products],
  7296. [Level 3 Rate],
  7297. [Level 3 Rate Type],
  7298. [Level 3 Max],
  7299. [Level 3 Caption],
  7300. [Level 3 Tax Code],
  7301. [Level 3 Agency],
  7302. [Level 3 Services],
  7303. [Level 3 Expenses],
  7304. [Level 3 Products],
  7305. [Level 4 Rate],
  7306. [Level 4 Rate Type],
  7307. [Level 4 Max],
  7308. [Level 4 Caption],
  7309. [Level 4 Tax Code],
  7310. [Level 4 Agency],
  7311. [Level 4 Services],
  7312. [Level 4 Expenses],
  7313. [Level 4 Products],
  7314. [Level 5 Rate],
  7315. [Level 5 Rate Type],
  7316. [Level 5 Max],
  7317. [Level 5 Caption],
  7318. [Level 5 Tax Code],
  7319. [Level 5 Agency],
  7320. [Level 5 Services],
  7321. [Level 5 Expenses],
  7322. [Level 5 Products],
  7323. 0
  7324. FROM ' + @SourceTable
  7325.  
  7326. -- Pull data into validation temp table
  7327. EXEC(@DSQL)
  7328.  
  7329. BEGIN TRANSACTION TC_Import
  7330.  
  7331. -- For all fields, update empty string or single space to null
  7332. UPDATE #TC_Import_Staging
  7333. SET
  7334. TaxCodeID = CASE WHEN TaxCodeID IN ('', ' ') THEN NULL ELSE TaxCodeID END,
  7335. [Description] = CASE WHEN [Description] IN ('', ' ') THEN NULL ELSE [Description] END,
  7336. Caption = CASE WHEN Caption IN ('', ' ') THEN NULL ELSE Caption END,
  7337. Country = CASE WHEN Country IN ('', ' ') THEN NULL ELSE Country END,
  7338. EffectiveDt = CASE WHEN EffectiveDt IN ('', ' ') THEN NULL ELSE EffectiveDt END,
  7339. CancelDt = CASE WHEN CancelDt IN ('', ' ') THEN NULL ELSE CancelDt END,
  7340. DispEachLvl = CASE WHEN DispEachLvl IN ('', ' ') THEN NULL ELSE DispEachLvl END,
  7341. Lvl1Rate = CASE WHEN Lvl1Rate IN ('', ' ') THEN NULL ELSE Lvl1Rate END,
  7342. Lvl1RateType = CASE WHEN Lvl1RateType IN ('', ' ') THEN NULL ELSE Lvl1RateType END,
  7343. Lvl1Max = CASE WHEN Lvl1Max IN ('', ' ') THEN NULL ELSE Lvl1Max END,
  7344. Lvl1Caption = CASE WHEN Lvl1Caption IN ('', ' ') THEN NULL ELSE Lvl1Caption END,
  7345. Lvl1TaxCode = CASE WHEN Lvl1TaxCode IN ('', ' ') THEN NULL ELSE Lvl1TaxCode END,
  7346. Lvl1Agency = CASE WHEN Lvl1Agency IN ('', ' ') THEN NULL ELSE Lvl1Agency END,
  7347. Lvl1Services = CASE WHEN Lvl1Services IN ('', ' ') THEN NULL ELSE Lvl1Services END,
  7348. Lvl1Expenses = CASE WHEN Lvl1Expenses IN ('', ' ') THEN NULL ELSE Lvl1Expenses END,
  7349. Lvl1Products = CASE WHEN Lvl1Products IN ('', ' ') THEN NULL ELSE Lvl1Products END,
  7350. Lvl2Rate = CASE WHEN Lvl2Rate IN ('', ' ') THEN NULL ELSE Lvl2Rate END,
  7351. Lvl2RateType = CASE WHEN Lvl2RateType IN ('', ' ') THEN NULL ELSE Lvl2RateType END,
  7352. Lvl2Max = CASE WHEN Lvl2Max IN ('', ' ') THEN NULL ELSE Lvl2Max END,
  7353. Lvl2Caption = CASE WHEN Lvl2Caption IN ('', ' ') THEN NULL ELSE Lvl2Caption END,
  7354. Lvl2TaxCode = CASE WHEN Lvl2TaxCode IN ('', ' ') THEN NULL ELSE Lvl2TaxCode END,
  7355. Lvl2Agency = CASE WHEN Lvl2Agency IN ('', ' ') THEN NULL ELSE Lvl2Agency END,
  7356. Lvl2Services = CASE WHEN Lvl2Services IN ('', ' ') THEN NULL ELSE Lvl2Services END,
  7357. Lvl2Expenses = CASE WHEN Lvl2Expenses IN ('', ' ') THEN NULL ELSE Lvl2Expenses END,
  7358. Lvl2Products = CASE WHEN Lvl2Products IN ('', ' ') THEN NULL ELSE Lvl2Products END,
  7359. Lvl3Rate = CASE WHEN Lvl3Rate IN ('', ' ') THEN NULL ELSE Lvl3Rate END,
  7360. Lvl3RateType = CASE WHEN Lvl3RateType IN ('', ' ') THEN NULL ELSE Lvl3RateType END,
  7361. Lvl3Max = CASE WHEN Lvl3Max IN ('', ' ') THEN NULL ELSE Lvl3Max END,
  7362. Lvl3Caption = CASE WHEN Lvl3Caption IN ('', ' ') THEN NULL ELSE Lvl3Caption END,
  7363. Lvl3TaxCode = CASE WHEN Lvl3TaxCode IN ('', ' ') THEN NULL ELSE Lvl3TaxCode END,
  7364. Lvl3Agency = CASE WHEN Lvl3Agency IN ('', ' ') THEN NULL ELSE Lvl3Agency END,
  7365. Lvl3Services = CASE WHEN Lvl3Services IN ('', ' ') THEN NULL ELSE Lvl3Services END,
  7366. Lvl3Expenses = CASE WHEN Lvl3Expenses IN ('', ' ') THEN NULL ELSE Lvl3Expenses END,
  7367. Lvl3Products = CASE WHEN Lvl3Products IN ('', ' ') THEN NULL ELSE Lvl3Products END,
  7368. Lvl4Rate = CASE WHEN Lvl4Rate IN ('', ' ') THEN NULL ELSE Lvl4Rate END,
  7369. Lvl4RateType = CASE WHEN Lvl4RateType IN ('', ' ') THEN NULL ELSE Lvl4RateType END,
  7370. Lvl4Max = CASE WHEN Lvl4Max IN ('', ' ') THEN NULL ELSE Lvl4Max END,
  7371. Lvl4Caption = CASE WHEN Lvl4Caption IN ('', ' ') THEN NULL ELSE Lvl4Caption END,
  7372. Lvl4TaxCode = CASE WHEN Lvl4TaxCode IN ('', ' ') THEN NULL ELSE Lvl4TaxCode END,
  7373. Lvl4Agency = CASE WHEN Lvl4Agency IN ('', ' ') THEN NULL ELSE Lvl4Agency END,
  7374. Lvl4Services = CASE WHEN Lvl4Services IN ('', ' ') THEN NULL ELSE Lvl4Services END,
  7375. Lvl4Expenses = CASE WHEN Lvl4Expenses IN ('', ' ') THEN NULL ELSE Lvl4Expenses END,
  7376. Lvl4Products = CASE WHEN Lvl4Products IN ('', ' ') THEN NULL ELSE Lvl4Products END,
  7377. Lvl5Rate = CASE WHEN Lvl5Rate IN ('', ' ') THEN NULL ELSE Lvl5Rate END,
  7378. Lvl5RateType = CASE WHEN Lvl5RateType IN ('', ' ') THEN NULL ELSE Lvl5RateType END,
  7379. Lvl5Max = CASE WHEN Lvl5Max IN ('', ' ') THEN NULL ELSE Lvl5Max END,
  7380. Lvl5Caption = CASE WHEN Lvl5Caption IN ('', ' ') THEN NULL ELSE Lvl5Caption END,
  7381. Lvl5TaxCode = CASE WHEN Lvl5TaxCode IN ('', ' ') THEN NULL ELSE Lvl5TaxCode END,
  7382. Lvl5Agency = CASE WHEN Lvl5Agency IN ('', ' ') THEN NULL ELSE Lvl5Agency END,
  7383. Lvl5Services = CASE WHEN Lvl5Services IN ('', ' ') THEN NULL ELSE Lvl5Services END,
  7384. Lvl5Expenses = CASE WHEN Lvl5Expenses IN ('', ' ') THEN NULL ELSE Lvl5Expenses END,
  7385. Lvl5Products = CASE WHEN Lvl5Products IN ('', ' ') THEN NULL ELSE Lvl5Products END
  7386.  
  7387. -- Interpret all Y/N fields (Y = 1, N = 0, NULL = 0)
  7388. UPDATE #TC_Import_Staging
  7389. SET
  7390. DispEachLvl = CASE DispEachLvl WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE DispEachLvl END,
  7391. Lvl1Services = CASE Lvl1Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl1Services END,
  7392. Lvl1Expenses = CASE Lvl1Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl1Expenses END,
  7393. Lvl1Products = CASE Lvl1Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl1Products END,
  7394. Lvl2Services = CASE Lvl2Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl2Services END,
  7395. Lvl2Expenses = CASE Lvl2Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl2Expenses END,
  7396. Lvl2Products = CASE Lvl2Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl2Products END,
  7397. Lvl3Services = CASE Lvl3Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl3Services END,
  7398. Lvl3Expenses = CASE Lvl3Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl3Expenses END,
  7399. Lvl3Products = CASE Lvl3Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl3Products END,
  7400. Lvl4Services = CASE Lvl4Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl4Services END,
  7401. Lvl4Expenses = CASE Lvl4Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl4Expenses END,
  7402. Lvl4Products = CASE Lvl4Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl4Products END,
  7403. Lvl5Services = CASE Lvl5Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl5Services END,
  7404. Lvl5Expenses = CASE Lvl5Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl5Expenses END,
  7405. Lvl5Products = CASE Lvl5Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl5Products END
  7406.  
  7407. -- Set first record in staging table as default if no default exists
  7408. IF NOT EXISTS(SELECT * FROM Tax_Code WHERE Default_Flag = 1)
  7409. BEGIN
  7410. UPDATE #TC_Import_Staging
  7411. SET Default_Flag = 1
  7412. WHERE TC_Import_Staging_RecID = 1
  7413. END
  7414.  
  7415. -- Get Country_RecID that maps back to Country
  7416. UPDATE stag
  7417. SET stag.Country_RecID = co.Country_RecID
  7418. FROM #TC_Import_Staging stag
  7419. INNER JOIN Country co
  7420. ON dbo.ufn_Import_Trim(co.Country) = stag.Country
  7421.  
  7422. -- Get Expected row count for dbo.Tax_Code insert
  7423. SELECT @ExpRowCount = COUNT(*) FROM #TC_Import_Staging
  7424.  
  7425. -- Perform insert
  7426. INSERT INTO dbo.Tax_Code
  7427. (
  7428. Owner_ID,
  7429. Tax_Code_ID,
  7430. [Description],
  7431. CodeCaption,
  7432. Country_RecID,
  7433. Date_Effective,
  7434. Date_Cancel,
  7435. DisplayDetail_Flag,
  7436. State_Rate,
  7437. TaxRateType,
  7438. State_Max,
  7439. LevelCaption,
  7440. State_Xref,
  7441. Agency_Xref,
  7442. TaxServices_Flag,
  7443. TaxExpenses_Flag,
  7444. TaxProducts_Flag,
  7445. County_Rate,
  7446. TaxRateType2,
  7447. County_Max,
  7448. LevelCaption2,
  7449. County_Xref,
  7450. Agency2_Xref,
  7451. TaxServices2_Flag,
  7452. TaxExpenses2_Flag,
  7453. TaxProducts2_Flag,
  7454. City_Rate,
  7455. TaxRateType3,
  7456. City_Max,
  7457. LevelCaption3,
  7458. City_Xref,
  7459. Agency3_Xref,
  7460. TaxServices3_Flag,
  7461. TaxExpenses3_Flag,
  7462. TaxProducts3_Flag,
  7463. Tax4_Rate,
  7464. TaxRateType4,
  7465. Tax4_Max,
  7466. LevelCaption4,
  7467. Tax4_Xref,
  7468. Agency4_Xref,
  7469. TaxServices4_Flag,
  7470. TaxExpenses4_Flag,
  7471. TaxProducts4_Flag,
  7472. Tax5_Rate,
  7473. TaxRateType5,
  7474. Tax5_Max,
  7475. LevelCaption5,
  7476. Tax5_Xref,
  7477. Agency5_Xref,
  7478. TaxServices5_Flag,
  7479. TaxExpenses5_Flag,
  7480. TaxProducts5_Flag,
  7481. Updated_By
  7482. )
  7483.  
  7484. SELECT
  7485. ExcelRowNum,
  7486. TaxCodeID,
  7487. [Description],
  7488. Caption,
  7489. Country_RecID,
  7490. ISNULL(EffectiveDt, GETDATE()),
  7491. CancelDt,
  7492. DispeachLvl,
  7493. Lvl1Rate,
  7494. ISNULL(Lvl1RateType,'P'),
  7495. Lvl1Max,
  7496. Lvl1Caption,
  7497. Lvl1TaxCode,
  7498. Lvl1Agency,
  7499. Lvl1Services,
  7500. Lvl1Expenses,
  7501. Lvl1Products,
  7502. Lvl2Rate,
  7503. ISNULL(Lvl2RateType,'P'),
  7504. Lvl2Max,
  7505. Lvl2Caption,
  7506. Lvl2TaxCode,
  7507. Lvl2Agency,
  7508. Lvl2Services,
  7509. Lvl2Expenses,
  7510. Lvl2Products,
  7511. Lvl3Rate,
  7512. ISNULL(Lvl3RateType,'P'),
  7513. Lvl3Max,
  7514. Lvl3Caption,
  7515. Lvl3TaxCode,
  7516. Lvl3Agency,
  7517. Lvl3Services,
  7518. Lvl3Expenses,
  7519. Lvl3Products,
  7520. Lvl4Rate,
  7521. ISNULL(Lvl4RateType,'P'),
  7522. Lvl4Max,
  7523. Lvl4Caption,
  7524. Lvl4TaxCode,
  7525. Lvl4Agency,
  7526. Lvl4Services,
  7527. Lvl4Expenses,
  7528. Lvl4Products,
  7529. Lvl5Rate,
  7530. ISNULL(Lvl5RateType,'P'),
  7531. Lvl5Max,
  7532. Lvl5Caption,
  7533. Lvl5TaxCode,
  7534. Lvl5Agency,
  7535. Lvl5Services,
  7536. Lvl5Expenses,
  7537. Lvl5Products,
  7538. @ImportBatchUser
  7539. FROM #TC_Import_Staging
  7540.  
  7541. UPDATE stag
  7542. SET stag.Tax_Code_RecID = tc.Tax_Code_RecID
  7543. FROM #TC_Import_Staging stag
  7544. CROSS APPLY(SELECT TOP 1 * FROM dbo.Tax_Code tc WHERE tc.Owner_ID = stag.ExcelRowNum)tc
  7545.  
  7546. UPDATE Tax_Code SET Owner_ID = 1
  7547.  
  7548. IF @@ROWCOUNT <> @ExpRowCount
  7549. BEGIN
  7550. RAISERROR('Incorrect number of rows inserted - import fails', 16, 1)
  7551. END
  7552.  
  7553. -- If debug mode and successful, select the rows that were inserted
  7554. -- and rollback transaction
  7555. IF @DebugMode = 1 AND @@ERROR = 0
  7556. BEGIN
  7557. SELECT * FROM Tax_Code WHERE Tax_Code_ID IN(SELECT TaxCodeID FROM #TC_Import_Staging)
  7558. ROLLBACK TRANSACTION TC_Import
  7559. END
  7560.  
  7561. IF @DebugMode = 2 AND @@ERROR = 0
  7562. BEGIN
  7563. SELECT
  7564. 1 AS Success,
  7565. NULL AS ExcelRowNumber,
  7566. NULL AS ErrorDetails
  7567. ROLLBACK TRANSACTION TC_Import
  7568. END
  7569.  
  7570. IF @DebugMode = 0 AND @@Error = 0
  7571. BEGIN
  7572.  
  7573. -- Import successful - commit and return results
  7574. COMMIT TRANSACTION TC_Import
  7575.  
  7576. SELECT
  7577. 1 AS Success,
  7578. NULL AS ExcelRowNumber,
  7579. NULL AS ErrorDetails
  7580. END
  7581.  
  7582. END TRY
  7583.  
  7584. BEGIN CATCH
  7585.  
  7586. -- An error has occured
  7587. -- Return SQL error message encountered
  7588. SELECT
  7589. 0 AS Success,
  7590. 'Unknown' AS ExcelRowNumber,
  7591. ERROR_MESSAGE() AS ErrorDetails
  7592.  
  7593. -- Rollback transaction
  7594. WHILE @@TRANCOUNT > 0
  7595. ROLLBACK TRANSACTION TC_Import
  7596.  
  7597. END CATCH
  7598.  
  7599.  
  7600. GO
  7601.  
  7602. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Opp_ImportValidate')
  7603. BEGIN
  7604. EXEC('CREATE PROCEDURE [dbo].[usp_Opp_ImportValidate] AS SELECT 1')
  7605. END
  7606. GO
  7607.  
  7608. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Opp_ImportPush')
  7609. BEGIN
  7610. EXEC('CREATE PROCEDURE [dbo].[usp_Opp_ImportPush] AS SELECT 1')
  7611. END
  7612. GO
  7613.  
  7614. -- =============================================
  7615. -- Author: m.gray
  7616. -- Create date: 03/26/2013
  7617. -- Description: Validates from spreadsheet for Opportunity
  7618. -- Import
  7619. -- Sample call: exec usp_Opp_ImportValidate 'TMP_Import_7207a9bf0215403cbedc1d7f74bd575d', 0
  7620. -- =============================================
  7621.  
  7622. ALTER PROCEDURE [dbo].[usp_Opp_ImportValidate]
  7623. @TableName VARCHAR(255),
  7624. @Forcemode BIT = 0
  7625. AS
  7626.  
  7627. SET NOCOUNT ON
  7628.  
  7629. -- Set date format to MDY to validate dates from excel
  7630. SET DATEFORMAT MDY
  7631.  
  7632. -- Variable declaration
  7633. -- Flag to indicate migration being matched on Legacy_ID
  7634. DECLARE @Legacy_Flag BIT = 0
  7635.  
  7636. -- Table to hold results of procedure
  7637. CREATE TABLE #tblResults
  7638. (
  7639. RowNumber INT,
  7640. ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
  7641. InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  7642. ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  7643. Warning_Flag BIT DEFAULT 0
  7644. )
  7645.  
  7646. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  7647.  
  7648. -- Table to hold condensed summary results
  7649. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  7650. BEGIN
  7651. DROP TABLE #ResultsCondensed
  7652. END
  7653.  
  7654. CREATE TABLE #ResultsCondensed
  7655. (
  7656. RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  7657. ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  7658. )
  7659.  
  7660. -- Dynamic statement to insert to staging table
  7661. DECLARE @DSQL VARCHAR(MAX)
  7662.  
  7663. DECLARE @ImportBatchUser VARCHAR(15)
  7664. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  7665. SELECT @ImportBatchUser =
  7666. 'CONV_'
  7667. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  7668. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  7669. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  7670. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  7671.  
  7672.  
  7673. -- Fully qualified name of source table
  7674. DECLARE @SourceTable VARCHAR(300)
  7675. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  7676.  
  7677. -- Object_ID of source table
  7678. DECLARE @Source_Object_ID INT
  7679. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  7680.  
  7681. -- Pre-validation
  7682. -- Create & populate table variable with list of required columns
  7683. DECLARE @RequiredColumns TABLE
  7684. (
  7685. ColumnName VARCHAR(255)
  7686. )
  7687.  
  7688. INSERT INTO @RequiredColumns
  7689. (
  7690. ColumnName
  7691. )
  7692.  
  7693. SELECT 'Company Name' UNION ALL
  7694. SELECT 'Contact Name' UNION ALL
  7695. SELECT 'Opportunity Name' UNION ALL
  7696. SELECT 'Description' UNION ALL
  7697. SELECT 'Type' UNION ALL
  7698. SELECT 'Status' UNION ALL
  7699. SELECT 'Est Close Date' UNION ALL
  7700. SELECT 'Rating' UNION ALL
  7701. SELECT 'Stage' UNION ALL
  7702. SELECT 'Source' UNION ALL
  7703. SELECT 'Primary Sales Person' UNION ALL
  7704. SELECT 'Primary Sales Percent Split' UNION ALL
  7705. SELECT 'Secondary Sales Person' UNION ALL
  7706. SELECT 'Secondary Sales Percent Split' UNION ALL
  7707. SELECT 'Marketing Campaign' UNION ALL
  7708. SELECT 'Location' UNION ALL
  7709. SELECT 'Group' UNION ALL
  7710. SELECT 'Forecast Product Description' UNION ALL
  7711. SELECT 'Forecast Product Revenue' UNION ALL
  7712. SELECT 'Forecast Product Cost' UNION ALL
  7713. SELECT 'Forecast Service Description' UNION ALL
  7714. SELECT 'Forecast Service Revenue' UNION ALL
  7715. SELECT 'Forecast Service Cost' UNION ALL
  7716. SELECT 'Forecast Other-1 Description' UNION ALL
  7717. SELECT 'Forecast Other-1 Revenue' UNION ALL
  7718. SELECT 'Forecast Other-1 Cost' UNION ALL
  7719. SELECT 'Forecast Other-2 Description' UNION ALL
  7720. SELECT 'Forecast Other-2 Revenue' UNION ALL
  7721. SELECT 'Forecast Other-2 Cost'
  7722.  
  7723. -- Table variable to hold column names from source table
  7724. DECLARE @SourceColumns TABLE
  7725. (
  7726. ColumnName VARCHAR(255)
  7727. )
  7728.  
  7729. -- Populate @SourceColumns
  7730. INSERT INTO @SourceColumns
  7731. (
  7732. ColumnName
  7733. )
  7734.  
  7735. SELECT
  7736. name
  7737. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  7738.  
  7739. -- Check that all required columns exist in @SourceColumns
  7740. INSERT INTO #tblResults
  7741. (
  7742. RowNumber,
  7743. ValMsg
  7744. )
  7745.  
  7746. SELECT
  7747. 0,
  7748. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  7749. FROM @RequiredColumns rq
  7750.  
  7751. EXCEPT
  7752.  
  7753. SELECT
  7754. 0,
  7755. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  7756. FROM @SourceColumns sc
  7757.  
  7758. -- If a column is missing, stop here and return results
  7759. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  7760. BEGIN
  7761. SELECT
  7762. 0 AS ValPassed,
  7763. RowNumber,
  7764. ValMsg
  7765. FROM #tblResults
  7766. ORDER BY RowNumber, ValMsg
  7767.  
  7768. ROLLBACK TRANSACTION
  7769.  
  7770. RETURN
  7771. END
  7772.  
  7773. -- Pre-validation complete - proceed with normal validation
  7774. -- Table to hold source data for this batch from temp table
  7775. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  7776. BEGIN
  7777. DROP TABLE #Import_Staging
  7778. END
  7779.  
  7780. CREATE TABLE #Import_Staging
  7781. (
  7782. ExcelRowNumber INT,
  7783. Company_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7784. ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7785. OpportunityName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7786. Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7787. Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7788. Status NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7789. EstCloseDate VARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7790. Rating NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7791. Stage NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7792. Source NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7793. PrimarySalesPerson NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7794. PrimarySalesPercentSplit INT NULL,
  7795. SecondarySalesPerson NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7796. SecondarySalesPercentSplit INT NULL,
  7797. MarketingCampaign NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7798. Location NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7799. BillingUnit NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7800. ForecastProductDescription NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7801. ForecastProductRev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7802. ForecastProductCost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7803. ForecastServiceDescription NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7804. ForecastServiceRev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7805. ForecastServiceCost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7806. ForecastOther1Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7807. ForecastOther1Rev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7808. ForecastOther1Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7809. ForecastOther2Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7810. ForecastOther2Rev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7811. ForecastOther2Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7812. New_Identity INT NULL,
  7813. ConvertMessage NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7814. Company_RecID INT NULL,
  7815. Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  7816. Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  7817. Company_Duplicate_Flag BIT NULL,
  7818. Contact_RecID INT NULL,
  7819. Contact_Duplicate_Flag BIT NULL,
  7820. Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
  7821. Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
  7822. Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  7823. Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  7824. Legacy_Site_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  7825. Company_Address_RecID INT,
  7826. SR_Service_RecID INT,
  7827. SO_Opportunity_RecID INT,
  7828. Diff_Exclude_Flag BIT,
  7829. Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  7830. Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  7831. Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  7832. Owner_Level_RecID INT,
  7833. Billing_Unit_RecID INT
  7834. )
  7835.  
  7836. -- Build statement to populate validation temp table
  7837. -- Convert blank string or single space to null
  7838. SELECT @DSQL = '
  7839. INSERT INTO #Import_Staging
  7840. (
  7841. ExcelRowNumber,
  7842. Company_Name,
  7843. ContactName,
  7844. OpportunityName,
  7845. [Description],
  7846. [Type],
  7847. [Status],
  7848. EstCloseDate,
  7849. Rating,
  7850. Stage,
  7851. Source,
  7852. PrimarySalesPerson,
  7853. PrimarySalesPercentSplit,
  7854. SecondarySalesPerson,
  7855. SecondarySalesPercentSplit,
  7856. MarketingCampaign,
  7857. Location,
  7858. BillingUnit,
  7859. ForecastProductDescription,
  7860. ForecastProductRev,
  7861. ForecastProductCost,
  7862. ForecastServiceDescription,
  7863. ForecastServiceRev,
  7864. ForecastServiceCost,
  7865. ForecastOther1Description,
  7866. ForecastOther1Rev,
  7867. ForecastOther1Cost,
  7868. ForecastOther2Description,
  7869. ForecastOther2Rev,
  7870. ForecastOther2Cost,
  7871. Company_Match_Val
  7872. )
  7873. SELECT
  7874. [Excel Row Number],
  7875. [Company Name],
  7876. [Contact Name],
  7877. [Opportunity Name],
  7878. LEFT([Description], 1000),
  7879. [Type],
  7880. [Status],
  7881. [Est Close Date],
  7882. [Rating],
  7883. [Stage],
  7884. [Source],
  7885. [Primary Sales Person],
  7886. [Primary Sales Percent Split],
  7887. [Secondary Sales Person],
  7888. [Secondary Sales Percent Split],
  7889. [Marketing Campaign],
  7890. [Location],
  7891. [Group],
  7892. [Forecast Product Description],
  7893. [Forecast Product Revenue],
  7894. [Forecast Product Cost],
  7895. [Forecast Service Description],
  7896. [Forecast Service Revenue],
  7897. [Forecast Service Cost],
  7898. [Forecast Other-1 Description],
  7899. [Forecast Other-1 Revenue],
  7900. [Forecast Other-1 Cost],
  7901. [Forecast Other-2 Description],
  7902. [Forecast Other-2 Revenue],
  7903. [Forecast Other-2 Cost],
  7904. LEFT([Company Name], 3)
  7905. FROM ' + @SourceTable
  7906.  
  7907. -- Pull data into validation temp table
  7908. EXEC(@DSQL)
  7909.  
  7910. BEGIN TRANSACTION
  7911.  
  7912. -- Update single space or blank string to null
  7913. UPDATE #Import_Staging SET
  7914. [ExcelRowNumber] = CASE WHEN [ExcelRowNumber] IN('', ' ') THEN NULL ELSE [ExcelRowNumber] END,
  7915. [Company_Name] = CASE WHEN [Company_Name] IN('', ' ') THEN NULL ELSE [Company_Name] END,
  7916. [ContactName] = CASE WHEN [ContactName] IN('', ' ') THEN NULL ELSE [ContactName] END,
  7917. [OpportunityName] = CASE WHEN [OpportunityName] IN('', ' ') THEN NULL ELSE [OpportunityName] END,
  7918. [Description] = CASE WHEN [Description] IN('', ' ') THEN NULL ELSE [Description] END,
  7919. [Type] = CASE WHEN [Type] IN('', ' ') THEN NULL ELSE [Type] END,
  7920. [Status] = CASE WHEN [Status] IN('', ' ') THEN NULL ELSE [Status] END,
  7921. [EstCloseDate] = CASE WHEN [EstCloseDate] IN('', ' ') THEN NULL ELSE [EstCloseDate] END,
  7922. [Rating] = CASE WHEN [Rating] IN('', ' ') THEN NULL ELSE [Rating] END,
  7923. [Stage] = CASE WHEN [Stage] IN('', ' ') THEN NULL ELSE [Stage] END,
  7924. [Source] = CASE WHEN [Source] IN('', ' ') THEN NULL ELSE [Source] END,
  7925. [PrimarySalesPerson] = CASE WHEN [PrimarySalesPerson] IN('', ' ') THEN NULL ELSE [PrimarySalesPerson] END,
  7926. [PrimarySalesPercentSplit] = CASE WHEN [PrimarySalesPercentSplit] IN('', ' ') THEN NULL ELSE [PrimarySalesPercentSplit] END,
  7927. [SecondarySalesPerson] = CASE WHEN [SecondarySalesPerson] IN('', ' ') THEN NULL ELSE [SecondarySalesPerson] END,
  7928. [SecondarySalesPercentSplit] = CASE WHEN [SecondarySalesPercentSplit] IN('', ' ') THEN NULL ELSE [SecondarySalesPercentSplit] END,
  7929. [MarketingCampaign] = CASE WHEN [MarketingCampaign] IN('', ' ') THEN NULL ELSE [MarketingCampaign] END,
  7930. [Location] = CASE WHEN [Location] IN('', ' ') THEN NULL ELSE [Location] END,
  7931. [BillingUnit] = CASE WHEN [BillingUnit] IN('', ' ') THEN NULL ELSE [BillingUnit] END,
  7932. [ForecastProductDescription] = CASE WHEN [ForecastProductDescription] IN('', ' ') THEN NULL ELSE [ForecastProductDescription] END,
  7933. [ForecastProductRev] = CASE WHEN [ForecastProductRev] IN('', ' ', '??') THEN NULL ELSE [ForecastProductRev] END,
  7934. [ForecastProductCost] = CASE WHEN [ForecastProductCost] IN('', ' ', '??') THEN NULL ELSE [ForecastProductCost] END,
  7935. [ForecastServiceDescription] = CASE WHEN [ForecastServiceDescription] IN('', ' ') THEN NULL ELSE [ForecastServiceDescription] END,
  7936. [ForecastServiceRev] = CASE WHEN [ForecastServiceRev] IN('', ' ', '??') THEN NULL ELSE [ForecastServiceRev] END,
  7937. [ForecastServiceCost] = CASE WHEN [ForecastServiceCost] IN('', ' ', '??') THEN NULL ELSE [ForecastServiceCost] END,
  7938. [ForecastOther1Description] = CASE WHEN [ForecastOther1Description] IN('', ' ') THEN NULL ELSE [ForecastOther1Description] END,
  7939. [ForecastOther1Rev] = CASE WHEN [ForecastOther1Rev] IN('', ' ', '??') THEN NULL ELSE [ForecastOther1Rev] END,
  7940. [ForecastOther1Cost] = CASE WHEN [ForecastOther1Cost] IN('', ' ', '??') THEN NULL ELSE [ForecastOther1Cost] END,
  7941. [ForecastOther2Description] = CASE WHEN [ForecastOther2Description] IN('', ' ') THEN NULL ELSE [ForecastOther2Description] END,
  7942. [ForecastOther2Rev] = CASE WHEN [ForecastOther2Rev] IN('', ' ', '??') THEN NULL ELSE [ForecastOther2Rev] END,
  7943. [ForecastOther2Cost] = CASE WHEN [ForecastOther2Cost] IN('', ' ', '??') THEN NULL ELSE [ForecastOther2Cost] END
  7944.  
  7945. -- Remove import config row created by custom conversion process
  7946. DELETE FROM #Import_Staging
  7947. WHERE Company_Name = 'CW_Import_Config_Row'
  7948.  
  7949. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
  7950. BEGIN
  7951. SELECT @DSQL = '
  7952. UPDATE tmp
  7953. SET tmp.Legacy_ID = src.Legacy_ID
  7954. FROM #Import_Staging tmp
  7955. INNER JOIN ' + @SourceTable + ' src
  7956. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  7957.  
  7958. EXEC(@DSQL)
  7959. END
  7960.  
  7961. -- Remove commas and dollar signs from revenue/cost fields (common validation error)
  7962. UPDATE #Import_Staging
  7963. SET ForecastProductCost = REPLACE(ForecastProductCost, ',', ''),
  7964. ForecastProductRev = REPLACE(ForecastProductRev, ',', ''),
  7965. ForecastServiceCost = REPLACE(ForecastServiceCost, ',', ''),
  7966. ForecastServiceRev = REPLACE(ForecastServiceRev, ',', ''),
  7967. ForecastOther1Cost = REPLACE(ForecastOther1Cost, ',', ''),
  7968. ForecastOther1Rev = REPLACE(ForecastOther1Rev, ',', ''),
  7969. ForecastOther2Cost = REPLACE(ForecastOther2Cost, ',', ''),
  7970. ForecastOther2Rev = REPLACE(ForecastOther2Rev, ',', '')
  7971.  
  7972. UPDATE #Import_Staging
  7973. SET ForecastProductCost = REPLACE(ForecastProductCost, '$', ''),
  7974. ForecastProductRev = REPLACE(ForecastProductRev, '$', ''),
  7975. ForecastServiceCost = REPLACE(ForecastServiceCost, '$', ''),
  7976. ForecastServiceRev = REPLACE(ForecastServiceRev, '$', ''),
  7977. ForecastOther1Cost = REPLACE(ForecastOther1Cost, '$', ''),
  7978. ForecastOther1Rev = REPLACE(ForecastOther1Rev, '$', ''),
  7979. ForecastOther2Cost = REPLACE(ForecastOther2Cost, '$', ''),
  7980. ForecastOther2Rev = REPLACE(ForecastOther2Rev, '$', '')
  7981.  
  7982. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
  7983. BEGIN
  7984. SELECT @DSQL = '
  7985. UPDATE tmp
  7986. SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
  7987. FROM #Import_Staging tmp
  7988. INNER JOIN ' + @SourceTable + ' src
  7989. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  7990.  
  7991. EXEC(@DSQL)
  7992. END
  7993.  
  7994. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
  7995. BEGIN
  7996. SELECT @DSQL = '
  7997. UPDATE tmp
  7998. SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
  7999. FROM #Import_Staging tmp
  8000. INNER JOIN ' + @SourceTable + ' src
  8001. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  8002.  
  8003. EXEC(@DSQL)
  8004. END
  8005.  
  8006. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  8007. IF Object_ID('tempdb..#Company') IS NOT NULL
  8008. BEGIN
  8009. DROP TABLE #Company
  8010. END
  8011.  
  8012. SELECT DISTINCT
  8013. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  8014. comp.Company_ID,
  8015. comp.Company_Name,
  8016. Delete_Flag,
  8017. LEFT(Company_Name, 3) AS Company_Match_Val,
  8018. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  8019. 0 AS Duplicate_Flag
  8020. INTO #Company
  8021. FROM dbo.Company comp
  8022. WHERE Delete_Flag = 0
  8023. AND
  8024. (
  8025. LEFT(Company_Name, 3) IN(SELECT Company_Match_Val FROM #Import_Staging)
  8026. OR Company_ID IN(SELECT Company_Name FROM #Import_Staging)
  8027. OR Company_RecID = (SELECT TOP 1 Company_RecID FROM dbo.Owner)
  8028. )
  8029.  
  8030. -- Table to hold contact information
  8031. IF Object_ID('tempdb..#Contact') IS NOT NULL
  8032. BEGIN
  8033. DROP TABLE #Contact
  8034. END
  8035.  
  8036. SELECT
  8037. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  8038. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  8039. First_Name,
  8040. Last_Name,
  8041. cont.Company_RecID,
  8042. Default_Flag
  8043. INTO #Contact
  8044. FROM dbo.Contact cont
  8045. INNER JOIN #Company comp
  8046. ON comp.Company_RecID = cont.Company_RecID
  8047.  
  8048. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  8049. BEGIN
  8050. SELECT @Legacy_Flag = 1
  8051. EXEC usp_Import_Match_Legacy @TableName, 'Opportunity'
  8052. END
  8053.  
  8054. IF @Legacy_Flag = 0
  8055. BEGIN
  8056. -- Match companies and contacts
  8057. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  8058. END
  8059.  
  8060. -- Assume primary sales percent split is 100 if no secondary rep specified
  8061. UPDATE #Import_Staging
  8062. SET PrimarySalesPercentSplit = 100
  8063. WHERE SecondarySalesPerson IS NULL
  8064.  
  8065. -- Strip commas from numeric fields
  8066. UPDATE #Import_Staging
  8067. SET ForecastProductCost = REPLACE(ForecastProductCost, ',', ''),
  8068. ForecastProductRev = REPLACE(ForecastProductRev, ',', ''),
  8069. ForecastServiceCost = REPLACE(ForecastServiceCost, ',', ''),
  8070. ForecastServiceRev = REPLACE(ForecastServiceRev, ',', ''),
  8071. ForecastOther1Cost = REPLACE(ForecastOther1Cost, ',', ''),
  8072. ForecastOther1Rev = REPLACE(ForecastOther1Rev, ',', ''),
  8073. ForecastOther2Cost = REPLACE(ForecastOther2Cost, ',', ''),
  8074. ForecastOther2Rev = REPLACE(ForecastOther2Rev, ',', '')
  8075.  
  8076. -- Get RecID for Owner_Level / Billing Unit
  8077. UPDATE stag
  8078. SET stag.Owner_Level_RecID = ol.Owner_Level_RecID
  8079. FROM #Import_Staging stag
  8080. CROSS APPLY(SELECT TOP 1 * FROM dbo.Owner_Level ol WHERE ol.Location_Flag = 1 AND (ol.Owner_Level_Name = stag.Location OR ol.[Description] = stag.Location))ol
  8081.  
  8082. UPDATE stag
  8083. SET stag.Billing_Unit_RecID = bu.Billing_Unit_RecID
  8084. FROM #Import_Staging stag
  8085. CROSS APPLY(SELECT TOP 1 * FROM dbo.Billing_Unit bu WHERE bu.Billing_Unit_ID = stag.BillingUnit OR bu.[Description] = stag.BillingUnit)bu
  8086.  
  8087.  
  8088. -- If running in 'Force Mode', create necessary references
  8089. IF @ForceMode = 1
  8090. BEGIN
  8091.  
  8092. -- Insert Opportunity Types
  8093. INSERT INTO SO_Type
  8094. (
  8095. [Description],
  8096. Update_By
  8097. )
  8098. SELECT DISTINCT
  8099. [Type],
  8100. @ImportBatchUser
  8101. FROM #Import_Staging tmp
  8102. LEFT OUTER JOIN SO_Type sot
  8103. ON dbo.ufn_Import_Trim(sot.[Description]) = tmp.[Type]
  8104. WHERE sot.SO_Type_RecID IS NULL
  8105. AND tmp.[Type] IS NOT NULL
  8106.  
  8107. -- Insert Opportunity Statuses
  8108. INSERT INTO SO_Opp_Status
  8109. (
  8110. Owner_ID,
  8111. [Description],
  8112. Updated_By,
  8113. Entered_By
  8114. )
  8115. SELECT DISTINCT
  8116. 1,
  8117. tmp.[Status],
  8118. @ImportBatchUser,
  8119. @ImportBatchUser
  8120. FROM #Import_Staging tmp
  8121. LEFT OUTER JOIN SO_Opp_Status sos
  8122. ON sos.[Description] = tmp.[Status]
  8123. WHERE sos.SO_Opp_Status_RecID IS NULL
  8124. AND tmp.[Status] IS NOT NULL
  8125.  
  8126. -- Insert opportunity stage
  8127. INSERT INTO SO_Pipeline
  8128. (
  8129. Owner_ID,
  8130. [Description],
  8131. Funnel_Color,
  8132. SO_Probability_RecID,
  8133. Updated_By
  8134. )
  8135. SELECT DISTINCT
  8136. 1,
  8137. tmp.Stage,
  8138. 'window',
  8139. (SELECT TOP 1 SO_Probability_RecID FROM SO_Probability),
  8140. @ImportBatchUser
  8141. FROM #Import_Staging tmp
  8142. LEFT OUTER JOIN SO_Pipeline sop
  8143. ON sop.[Description] = tmp.Stage
  8144. WHERE tmp.Stage IS NOT NULL
  8145. AND sop.SO_Pipeline_RecID IS NULL
  8146.  
  8147. -- Set primary salesperson to 'zAdmin' if no match found
  8148. UPDATE tmp
  8149. SET tmp.PrimarySalesPerson = 'zAdmin'
  8150. FROM #Import_Staging tmp
  8151. LEFT OUTER JOIN Member mem
  8152. ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.PrimarySalesPerson
  8153. OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = tmp.PrimarySalesPerson
  8154. WHERE mem.Member_RecID IS NULL
  8155.  
  8156. -- Attempt to match location/group by Member_ID of primary sales rep
  8157. UPDATE tmp
  8158. SET tmp.Location = ol.Owner_Level_Name,
  8159. tmp.BillingUnit = bu.Billing_Unit_ID
  8160. FROM #Import_Staging tmp
  8161. INNER JOIN dbo.Member mem
  8162. ON mem.Member_ID = tmp.PrimarySalesPerson
  8163. INNER JOIN dbo.Owner_Level ol
  8164. ON ol.Owner_Level_RecID = COALESCE(mem.Default_Loc_RecID, mem.Owner_Level_RecID)
  8165. LEFT OUTER JOIN Billing_Unit bu
  8166. ON bu.Billing_Unit_RecID = mem.Billing_Unit_RecID
  8167. WHERE NOT EXISTS(SELECT TOP 1 * FROM Owner_Level WHERE Owner_Level_Name = tmp.Location AND Location_Flag = 1)
  8168.  
  8169.  
  8170.  
  8171. END
  8172.  
  8173. -- Begin validations
  8174. INSERT INTO #tblResults
  8175. (
  8176. RowNumber,
  8177. ValMsg
  8178. )
  8179.  
  8180. -- Company name is required
  8181. SELECT
  8182. tmp.ExcelRowNumber,
  8183. 'Company name is required'
  8184. FROM #Import_Staging tmp
  8185. WHERE Company_Name IS NULL
  8186. AND @Legacy_Flag <> 1
  8187.  
  8188. UNION ALL
  8189.  
  8190. -- Company name must be 50 characters or less
  8191. SELECT
  8192. tmp.ExcelRowNumber,
  8193. 'Company name must be less than 50 characters'
  8194. FROM #Import_Staging tmp
  8195. WHERE LEN(Company_Name) > 50
  8196.  
  8197. UNION ALL
  8198.  
  8199. -- If Contact specified, must be <= 61 characters
  8200. SELECT
  8201. tmp.ExcelRowNumber,
  8202. 'Contact name cannot be more than 61 characters'
  8203. FROM #Import_Staging tmp
  8204. WHERE LEN(ContactName) > 61
  8205.  
  8206. UNION ALL
  8207.  
  8208. -- Company Name is Required
  8209. SELECT
  8210. tmp.ExcelRowNumber,
  8211. 'Company Name is required'
  8212. FROM #Import_Staging tmp
  8213. WHERE tmp.Company_Name IS NULL
  8214. AND @Legacy_Flag <> 1
  8215.  
  8216. UNION ALL
  8217.  
  8218. -- Check that company names are valid
  8219. SELECT
  8220. tmp.ExcelRowNumber,
  8221. 'Company not found: "' + ISNULL(tmp.Company_Name, '') + '"'
  8222. FROM #Import_Staging tmp
  8223. WHERE Company_Name IS NOT NULL
  8224. AND Company_RecID IS NULL
  8225.  
  8226. UNION ALL
  8227.  
  8228. -- Check for more than one company with the same name
  8229. SELECT
  8230. tmp.ExcelRowNumber,
  8231. 'There are more than one companies named "' + ISNULL(Company_Name, '') + '" - company name must be unique'
  8232. FROM #Import_Staging tmp
  8233. WHERE Company_Duplicate_Flag = 1
  8234.  
  8235. UNION ALL
  8236.  
  8237. -- Check that contact is valid
  8238. SELECT
  8239. tmp.ExcelRowNumber,
  8240. 'Unable to locate contact: "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '') + '"'
  8241. FROM #Import_Staging tmp
  8242. WHERE Contact_RecID IS NULL
  8243. AND tmp.ContactName IS NOT NULL
  8244. AND tmp.Company_Duplicate_Flag = 0
  8245. AND tmp.Company_RecID IS NOT NULL
  8246.  
  8247. UNION ALL
  8248.  
  8249. -- Check for duplicate contacts within company
  8250. SELECT
  8251. tmp.ExcelRowNumber,
  8252. 'There are more than one contacts named "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
  8253. FROM #Import_Staging tmp
  8254. WHERE tmp.Contact_Duplicate_Flag = 1
  8255. AND tmp.Company_Duplicate_Flag = 0
  8256.  
  8257. UNION ALL
  8258.  
  8259. -- Check that a default contact for company exists if contact is null
  8260. SELECT
  8261. tmp.ExcelRowNumber,
  8262. 'Contact must be specified for company: "' + ISNULL(tmp.Company_Name, '') + '" because no default contact exists for this company'
  8263. FROM #Import_Staging tmp
  8264. WHERE tmp.Contact_RecID IS NULL
  8265. AND tmp.ContactName IS NULL
  8266. AND tmp.Company_Name IS NOT NULL
  8267. AND tmp.Company_RecID IS NOT NULL
  8268. AND tmp.Company_Duplicate_Flag = 0
  8269.  
  8270. UNION ALL
  8271.  
  8272. -- Opportunity Name is required
  8273. SELECT
  8274. tmp.ExcelRowNumber,
  8275. 'Opportunity name cannot be blank'
  8276. FROM #Import_Staging tmp
  8277. WHERE OpportunityName IS NULL
  8278.  
  8279. UNION ALL
  8280.  
  8281. -- Opportunity Name must be <= 50 characters
  8282. SELECT
  8283. tmp.ExcelRowNumber,
  8284. 'Opportunity name cannot be more than 50 characters.'
  8285. FROM #Import_Staging tmp
  8286. WHERE LEN(OpportunityName) > 50
  8287.  
  8288. UNION ALL
  8289.  
  8290. -- Opportunity description cannot exceed 1000 characters
  8291. SELECT
  8292. tmp.ExcelRowNumber,
  8293. 'Opportunity description cannot exceed 1000 characters'
  8294. FROM #Import_Staging tmp
  8295. WHERE LEN([Description]) > 1000
  8296. AND [Description] IS NOT NULL
  8297.  
  8298. UNION ALL
  8299.  
  8300. -- Opportunity type must be <= 50 characters
  8301. SELECT
  8302. tmp.ExcelRowNumber,
  8303. 'Opportunity type cannot be more than 50 characters.'
  8304. FROM #Import_Staging tmp
  8305. WHERE LEN([Type]) > 50
  8306.  
  8307. UNION ALL
  8308.  
  8309. -- Opportunity Type must be valid
  8310. SELECT
  8311. tmp.ExcelRowNumber,
  8312. '"' + tmp.[Type] + '" is not a valid opportunity type.'
  8313. FROM #Import_Staging tmp
  8314. LEFT OUTER JOIN SO_Type sot
  8315. ON dbo.ufn_Import_Trim(sot.[Description]) = tmp.[Type]
  8316. WHERE sot.SO_Type_RecID IS NULL
  8317. AND tmp.[Type] IS NOT NULL
  8318.  
  8319. UNION ALL
  8320.  
  8321. -- Opportunity Status must be valid
  8322. SELECT
  8323. tmp.ExcelRowNumber,
  8324. '"' + tmp.[Status] + '" is not a valid opportunity status.'
  8325. FROM #Import_Staging tmp
  8326. LEFT OUTER JOIN SO_Opp_Status sos
  8327. ON sos.[Description] = tmp.[Status]
  8328. WHERE sos.SO_Opp_Status_RecID IS NULL
  8329. AND tmp.[Status] IS NOT NULL
  8330.  
  8331. UNION ALL
  8332.  
  8333. -- Status may not exceed 30 characters
  8334. SELECT
  8335. tmp.ExcelRowNumber,
  8336. 'Opportunity status cannot exceed 30 characters'
  8337. FROM #Import_Staging tmp
  8338. WHERE LEN(tmp.[Status]) > 30
  8339.  
  8340. -- If Status is not specified, a default status must exist
  8341. IF NOT EXISTS(SELECT TOP 1 * FROM SO_Opp_Status WHERE Default_Flag = 1)
  8342. BEGIN
  8343. INSERT INTO #tblResults
  8344. (
  8345. RowNumber,
  8346. ValMsg
  8347. )
  8348. SELECT
  8349. tmp.ExcelRowNumber,
  8350. 'If opportunity status is not specified, a default status must exist.'
  8351. FROM #Import_Staging tmp
  8352. WHERE tmp.[Status] IS NULL
  8353. END
  8354.  
  8355. INSERT INTO #tblResults
  8356. (
  8357. RowNumber,
  8358. ValMsg
  8359. )
  8360.  
  8361. -- Estimated close date must be a valid date if entered
  8362. SELECT
  8363. tmp.ExcelRowNumber,
  8364. 'Estimated close date must be a valid date - Please use MM/DD/YYYY format'
  8365. FROM #Import_Staging tmp
  8366. WHERE (ISDATE(tmp.EstCloseDate) = 0)
  8367. AND tmp.EstCloseDate IS NOT NULL
  8368.  
  8369. UNION ALL
  8370.  
  8371. -- Rating must be <= 50 characters
  8372. SELECT
  8373. tmp.ExcelRowNumber,
  8374. 'Rating cannot exceed 50 characters'
  8375. FROM #Import_Staging tmp
  8376. WHERE LEN(Rating) > 50
  8377.  
  8378. UNION ALL
  8379.  
  8380. -- Rating must be a valid reference
  8381. SELECT
  8382. tmp.ExcelRowNumber,
  8383. 'Opportunity Rating "' + tmp.Rating + '" is not valid'
  8384. FROM #Import_Staging tmp
  8385. LEFT OUTER JOIN SO_Interest soi
  8386. ON tmp.Rating = dbo.ufn_Import_Trim(soi.[Description])
  8387. WHERE soi.SO_Interest_RecID IS NULL
  8388. AND tmp.Rating IS NOT NULL
  8389.  
  8390. UNION ALL
  8391.  
  8392. -- Stage cannot exceed 50 characters
  8393. SELECT
  8394. tmp.ExcelRowNumber,
  8395. 'Opportunity stage cannot exceed 50 characters'
  8396. FROM #Import_Staging tmp
  8397. WHERE LEN(tmp.Stage) > 50
  8398.  
  8399. UNION ALL
  8400.  
  8401. -- Stage must be valid reference if specified
  8402. SELECT
  8403. tmp.ExcelRowNumber,
  8404. 'Opportunity stage "' + tmp.Stage + '" is not valid.'
  8405. FROM #Import_Staging tmp
  8406. LEFT OUTER JOIN SO_Pipeline sop
  8407. ON dbo.ufn_Import_Trim(sop.[Description]) = tmp.Stage
  8408. WHERE sop.SO_Pipeline_RecID IS NULL
  8409. AND tmp.Stage IS NOT NULL
  8410.  
  8411. UNION ALL
  8412.  
  8413. -- Source cannot exceed 50 characters
  8414. SELECT
  8415. tmp.ExcelRowNumber,
  8416. 'Source cannot exceed 50 characters.'
  8417. FROM #Import_Staging tmp
  8418. WHERE LEN([Source]) > 50
  8419.  
  8420. UNION ALL
  8421.  
  8422. -- Primary sales person is required
  8423. SELECT
  8424. tmp.ExcelRowNumber,
  8425. 'Primary sales person is required'
  8426. FROM #Import_Staging tmp
  8427. WHERE PrimarySalesPerson IS NULL
  8428.  
  8429. UNION ALL
  8430.  
  8431. ---- Primary sales person cannot exceed 15 characters
  8432. --SELECT
  8433. -- tmp.ExcelRowNumber,
  8434. -- 'Primary sales person cannot exceed 15 characters'
  8435. --FROM #Import_Staging tmp
  8436. --WHERE LEN(PrimarySalesPerson) > 15
  8437. -- AND PrimarySalesPerson IS NOT NULL
  8438.  
  8439. --UNION ALL
  8440.  
  8441. -- Primary sales person must be a valid Member_ID or name
  8442. SELECT
  8443. tmp.ExcelRowNumber,
  8444. '"' + tmp.PrimarySalesPerson + '" is not a valid Member_ID or name for primary sales person'
  8445. FROM #Import_Staging tmp
  8446. LEFT OUTER JOIN Member mem
  8447. ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.PrimarySalesPerson
  8448. OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = tmp.PrimarySalesPerson
  8449. WHERE mem.Member_RecID IS NULL
  8450. AND tmp.PrimarySalesPerson IS NOT NULL
  8451.  
  8452. UNION ALL
  8453.  
  8454. -- Sales percentages must total 100%
  8455. SELECT
  8456. tmp.ExcelRowNumber,
  8457. 'Primary and secondary sales percentages must total 100 percent'
  8458. FROM #Import_Staging tmp
  8459. WHERE (CAST(ISNULL(PrimarySalesPercentSplit, 0) AS DECIMAL) + CAST(ISNULL(SecondarySalesPercentSplit, 0) AS DECIMAL)) <> 100
  8460.  
  8461. UNION ALL
  8462.  
  8463. -- Primary sales percentage cannot be negative
  8464. SELECT
  8465. tmp.ExcelRowNumber,
  8466. 'Primary sales percentage cannot be negative'
  8467. FROM #Import_Staging tmp
  8468. WHERE PrimarySalesPercentSplit < 0
  8469.  
  8470. UNION ALL
  8471.  
  8472. -- Secondary sales percentage cannot be negative
  8473. SELECT
  8474. tmp.ExcelRowNumber,
  8475. 'Secondary sales percentage cannot be negative'
  8476. FROM #Import_Staging tmp
  8477. WHERE SecondarySalesPercentSplit < 0
  8478.  
  8479. UNION ALL
  8480.  
  8481. -- Secondary sales person must be a valid Member_ID or name
  8482. SELECT
  8483. tmp.ExcelRowNumber,
  8484. '"' + SecondarySalesPerson + '" is not a valid Member_ID for secondary sales person'
  8485. FROM #Import_Staging tmp
  8486. LEFT OUTER JOIN Member mem
  8487. ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.SecondarySalesPerson
  8488. OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = tmp.SecondarySalesPerson
  8489. WHERE mem.Member_RecID IS NULL
  8490. AND tmp.SecondarySalesPerson IS NOT NULL
  8491.  
  8492. UNION ALL
  8493.  
  8494. -- Marketing Campaign cannot exceed 50 characters
  8495. SELECT
  8496. tmp.ExcelRowNumber,
  8497. 'Marketing campaign cannot exceed 50 characters'
  8498. FROM #Import_Staging tmp
  8499. WHERE LEN(tmp.MarketingCampaign) > 50
  8500.  
  8501. UNION ALL
  8502.  
  8503. -- If specified, Marketing campaign must be a valid reference
  8504. SELECT
  8505. tmp.ExcelRowNumber,
  8506. 'Invalid marketing campaign: "' + MarketingCampaign + '"'
  8507. FROM #Import_Staging tmp
  8508. LEFT OUTER JOIN Marketing_Campaign mc
  8509. ON dbo.ufn_Import_Trim(mc.Marketing_ID) = tmp.MarketingCampaign
  8510. WHERE mc.Marketing_Campaign_RecID IS NULL
  8511. AND tmp.MarketingCampaign IS NOT NULL
  8512.  
  8513. UNION ALL
  8514.  
  8515. -- Location is required
  8516. SELECT
  8517. tmp.ExcelRowNumber,
  8518. 'Location is required'
  8519. FROM #Import_Staging tmp
  8520. WHERE tmp.Location IS NULL
  8521.  
  8522. UNION ALL
  8523.  
  8524. -- Location cannot exceed 50 characters
  8525. SELECT
  8526. tmp.ExcelRowNumber,
  8527. 'Location cannot exceed 50 characters'
  8528. FROM #Import_Staging tmp
  8529. WHERE LEN(tmp.Location) > 50
  8530.  
  8531. UNION ALL
  8532.  
  8533. -- Group must be specified
  8534. SELECT
  8535. tmp.ExcelRowNumber,
  8536. 'Group is required'
  8537. FROM #Import_Staging tmp
  8538. WHERE tmp.BillingUnit IS NULL
  8539.  
  8540. UNION ALL
  8541.  
  8542. -- Group cannot exceed 50 characters
  8543. SELECT
  8544. tmp.ExcelRowNumber,
  8545. 'Group cannot exceed 50 characters'
  8546. FROM #Import_Staging tmp
  8547. WHERE LEN(tmp.BillingUnit) > 50
  8548.  
  8549. UNION ALL
  8550.  
  8551. -- Group and location must match up
  8552. -- Location must be valid reference
  8553. SELECT
  8554. tmp.ExcelRowNumber,
  8555. 'Invalid location: "' + tmp.Location + '"'
  8556. FROM #Import_Staging tmp
  8557. WHERE tmp.Location IS NOT NULL
  8558. AND tmp.Owner_Level_RecID IS NULL
  8559.  
  8560. UNION ALL
  8561.  
  8562. -- Group Must be valid reference
  8563. SELECT
  8564. tmp.ExcelRowNumber,
  8565. 'Invalid Group: "' + tmp.BillingUnit + '"'
  8566. FROM #Import_Staging tmp
  8567. WHERE tmp.BillingUnit IS NOT NULL
  8568. AND tmp.Billing_Unit_RecID IS NULL
  8569.  
  8570. UNION ALL
  8571.  
  8572. ---- Group must be assigned to location
  8573. --SELECT
  8574. -- tmp.ExcelRowNumber,
  8575. -- 'The group "' + tmp.BillingUnit + '" is not assigned to the location: "' + tmp.Location'"'
  8576. --FROM #Import_Staging tmp
  8577. -- INNER JOIN Billing_Unit bu
  8578. -- ON tmp.BillingUnit = dbo.ufn_Import_Trim(bu.Billing_Unit_ID)
  8579. -- INNER JOIN Owner_Level ol
  8580. -- ON tmp.Location = dbo.ufn_Import_Trim(ol.Owner_Level_Name)
  8581. -- AND ol.Location_Flag = 1
  8582. -- LEFT OUTER JOIN Billing_Unit_Loc bul
  8583. -- ON bul.Owner_Level_RecID = ol.Owner_Level_RecID
  8584. -- AND bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
  8585. --WHERE bul.Billing_Unit_Loc_RecID IS NULL
  8586. -- AND bu.Billing_Unit_ID IS NOT NULL
  8587. -- AND ol.Owner_Level_RecID IS NOT NULL
  8588.  
  8589. --UNION ALL
  8590.  
  8591. -- Forecast Product Description cannot exceed 50 characters
  8592. SELECT
  8593. tmp.ExcelRowNumber,
  8594. 'Forecast product description cannot exceed 50 characters'
  8595. FROM #Import_Staging tmp
  8596. WHERE LEN(tmp.ForecastProductDescription) > 50
  8597.  
  8598. UNION ALL
  8599.  
  8600. -- Forecast Product Revenue must be numeric with no formatting
  8601. SELECT
  8602. tmp.ExcelRowNumber,
  8603. 'Forecast product revenue must be a number with no formatting'
  8604. FROM #Import_Staging tmp
  8605. WHERE ISNUMERIC(tmp.ForecastProductRev + 'e0') = 0
  8606. AND tmp.ForecastProductRev IS NOT NULL
  8607.  
  8608. UNION ALL
  8609.  
  8610. -- Forecast Product cost must be numeric with no formatting
  8611. SELECT
  8612. tmp.ExcelRowNumber,
  8613. 'Forecast product cost must be a number with no formatting'
  8614. FROM #Import_Staging tmp
  8615. WHERE ISNUMERIC(tmp.ForecastProductCost + 'e0') = 0
  8616. AND tmp.ForecastProductCost IS NOT NULL
  8617.  
  8618. UNION ALL
  8619.  
  8620. -- Forecast Service description must be <= 50 characters
  8621. SELECT
  8622. tmp.ExcelRowNumber,
  8623. 'Forecast service description cannot exceed 50 characters'
  8624. FROM #Import_Staging tmp
  8625. WHERE LEN(tmp.ForecastServiceDescription) > 50
  8626.  
  8627. UNION ALL
  8628.  
  8629. -- Forecast service revenue must me a number with no formatting
  8630. SELECT
  8631. tmp.ExcelRowNumber,
  8632. 'Forecast service revenue must be a number with no formatting'
  8633. FROM #Import_Staging tmp
  8634. WHERE ISNUMERIC(tmp.ForecastServiceRev + 'e0') = 0
  8635. AND tmp.ForecastServiceRev IS NOT NULL
  8636.  
  8637. UNION ALL
  8638.  
  8639. -- Forecast service cost must be a number with no formatting
  8640. SELECT
  8641. tmp.ExcelRowNumber,
  8642. 'Forecast service cost must be a number with no formatting'
  8643. FROM #Import_Staging tmp
  8644. WHERE ISNUMERIC(tmp.ForecastServiceCost + 'e0') = 0
  8645. AND tmp.ForecastServiceCost IS NOT NULL
  8646.  
  8647. UNION ALL
  8648.  
  8649. -- Forecast Other-1 description must be <= 50 characters
  8650. SELECT
  8651. tmp.ExcelRowNumber,
  8652. 'Forecast Other-1 description cannot exceed 50 characters'
  8653. FROM #Import_Staging tmp
  8654. WHERE LEN(tmp.ForecastOther1Description) > 50
  8655.  
  8656. UNION ALL
  8657.  
  8658. -- Forecast Other-1 Revenue must be a number with no formatting
  8659. SELECT
  8660. tmp.ExcelRowNumber,
  8661. 'Forecast Other-1 revenue must be a number with no formatting'
  8662. FROM #Import_Staging tmp
  8663. WHERE ISNUMERIC(tmp.ForecastOther1Rev + 'e0') = 0
  8664. AND tmp.ForecastOther1Rev IS NOT NULL
  8665.  
  8666. UNION ALL
  8667.  
  8668. -- Forecast Other-1 Cost must be a number with no formatting
  8669. SELECT
  8670. tmp.ExcelRowNumber,
  8671. 'Forecast Other-1 cost must be a number with no formatting'
  8672. FROM #Import_Staging tmp
  8673. WHERE ISNUMERIC(tmp.ForecastOther1Cost + 'e0') = 0
  8674. AND tmp.ForecastOther1Cost IS NOT NULL
  8675.  
  8676. UNION ALL
  8677.  
  8678. -- Forecast Other-2 description must be <= 50 characters
  8679. SELECT
  8680. tmp.ExcelRowNumber,
  8681. 'Forecast Other-2 description cannot exceed 50 characters'
  8682. FROM #Import_Staging tmp
  8683. WHERE LEN(tmp.ForecastOther2Description) > 50
  8684.  
  8685. UNION ALL
  8686.  
  8687. -- Forecast Other-2 Revenue must be a number with no formatting
  8688. SELECT
  8689. tmp.ExcelRowNumber,
  8690. 'Forecast Other-2 revenue must be a number with no formatting'
  8691. FROM #Import_Staging tmp
  8692. WHERE ISNUMERIC(tmp.ForecastOther2Rev+ 'e0') = 0
  8693. AND tmp.ForecastOther2Rev IS NOT NULL
  8694.  
  8695. UNION ALL
  8696.  
  8697. -- Forecast Other-2 Cost must be a number with no formatting
  8698. SELECT
  8699. tmp.ExcelRowNumber,
  8700. 'Forecast Other-2 cost must be a number with no formatting'
  8701. FROM #Import_Staging tmp
  8702. WHERE ISNUMERIC(tmp.ForecastOther2Cost + 'e0')= 0
  8703. AND tmp.ForecastOther2Cost IS NOT NULL
  8704.  
  8705. UNION ALL
  8706.  
  8707.  
  8708. -- If Forecast product cost or revenue are specified, a description must be entered.
  8709. SELECT
  8710. tmp.ExcelRowNumber,
  8711. 'Forecast product description is required if a cost or revenue is specified.'
  8712. FROM #Import_Staging tmp
  8713. WHERE ForecastProductDescription IS NULL
  8714. AND COALESCE(ForecastProductCost, ForecastProductRev) IS NOT NULL
  8715.  
  8716. UNION ALL
  8717.  
  8718. -- If Forecast service cost or revenue are specified, a description must be entered.
  8719. SELECT
  8720. tmp.ExcelRowNumber,
  8721. 'Forecast service description is required if a cost or revenue is specified.'
  8722. FROM #Import_Staging tmp
  8723. WHERE ForecastServiceDescription IS NULL
  8724. AND COALESCE(ForecastServiceCost, ForecastServiceRev) IS NOT NULL
  8725.  
  8726. UNION ALL
  8727.  
  8728. -- If Forecast Other 1 cost or revenue are specified, a description must be entered.
  8729. SELECT
  8730. tmp.ExcelRowNumber,
  8731. 'Forecast Other 1 description is required if a cost or revenue is specified.'
  8732. FROM #Import_Staging tmp
  8733. WHERE ForecastOther1Description IS NULL
  8734. AND COALESCE(ForecastOther1Cost, ForecastOther1Rev) IS NOT NULL
  8735.  
  8736. UNION ALL
  8737.  
  8738. -- If Forecast Other 2 cost or revenue are specified, a description must be entered.
  8739. SELECT
  8740. tmp.ExcelRowNumber,
  8741. 'Forecast Other 2 description is required if a cost or revenue is specified.'
  8742. FROM #Import_Staging tmp
  8743. WHERE ForecastOther2Description IS NULL
  8744. AND COALESCE(ForecastOther2Cost, ForecastOther2Rev) IS NOT NULL
  8745.  
  8746. -- Insert notification messages for any created references
  8747. INSERT INTO #tblResults
  8748. (
  8749. RowNumber,
  8750. ValMsg,
  8751. Warning_Flag,
  8752. ReferenceType
  8753. )
  8754.  
  8755. SELECT
  8756. 0,
  8757. ISNULL(cont.First_Name, '') + ' ' + ISNULL(cont.Last_Name, ''),
  8758. 1,
  8759. 'Contact(s)'
  8760. FROM dbo.Contact cont
  8761. WHERE cont.Updated_By = @ImportBatchUser
  8762.  
  8763. UNION ALL
  8764.  
  8765. SELECT DISTINCT
  8766. ExcelRowNumber,
  8767. 'Company: "' + tmp.Company_Name + '" fuzzy matched to Company: ' + tmp.Company_Name_Fuzzy,
  8768. 1,
  8769. NULL
  8770. FROM #Import_Staging tmp
  8771. WHERE Company_Name_Fuzzy IS NOT NULL
  8772.  
  8773. UNION ALL
  8774.  
  8775. SELECT DISTINCT
  8776. ExcelRowNumber,
  8777. 'Contact "' + tmp.ContactName + '" fuzzy matched to Contact: ' + tmp.Contact_Name_Fuzzy,
  8778. 1,
  8779. NULL
  8780. FROM #Import_Staging tmp
  8781. WHERE Contact_Name_Fuzzy IS NOT NULL
  8782.  
  8783. -- Return results
  8784. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  8785. BEGIN
  8786.  
  8787. exec dbo.usp_Condense_Validation_Results
  8788.  
  8789. SELECT
  8790. 0 AS ValPassed,
  8791. 0 AS RowNumber,
  8792. ValMsg
  8793. FROM #ResultsCondensed
  8794.  
  8795. ROLLBACK TRANSACTION
  8796. RETURN
  8797.  
  8798. END
  8799. ELSE
  8800. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
  8801. BEGIN
  8802.  
  8803. exec dbo.usp_Condense_Validation_Results
  8804.  
  8805. SELECT
  8806. 2 AS ValPassed,
  8807. 0 AS RowNumber,
  8808. ValMsg
  8809. FROM #ResultsCondensed res
  8810.  
  8811.  
  8812. UNION ALL
  8813.  
  8814. SELECT
  8815. 2 AS ValPassed,
  8816. 0 AS RowNumber,
  8817. 'The following ' + ReferenceType + ' will be created: '+
  8818. STUFF(
  8819. (SELECT ', ' + ValMsg
  8820. FROM #tblResults
  8821. WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
  8822. FOR XML PATH (''))
  8823. , 1, 1, '') AS ValMsg
  8824. FROM #tblResults res
  8825. WHERE ReferenceType IS NOT NULL
  8826. GROUP BY ReferenceType
  8827.  
  8828. ROLLBACK TRANSACTION
  8829.  
  8830. END
  8831. ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  8832. BEGIN
  8833. SELECT
  8834. 1 AS ValPassed,
  8835. NULL AS RowNumber,
  8836. NULL AS ValMsg
  8837.  
  8838. ROLLBACK TRANSACTION
  8839.  
  8840. END
  8841.  
  8842. GO
  8843.  
  8844.  
  8845. -- =============================================
  8846. -- Author: m.gray
  8847. -- Create date: 03/27/2013
  8848. -- Description: Performs final validation
  8849. -- and inserts for Opportunities import
  8850. -- Sample call: exec usp_Opp_ImportPush 'TMP_Import_bc81116e707446c1a2e52e951d36f58b', 0, 1, 0
  8851. -- =============================================
  8852.  
  8853. ALTER PROCEDURE [dbo].[usp_Opp_ImportPush]
  8854. @TableName VARCHAR(MAX),
  8855. @DebugMode INT = 0,
  8856. @OwnerID INT = 1,
  8857. @Forcemode BIT = 0,
  8858. @ForecastTableName NVARCHAR(MAX) = NULL
  8859. AS
  8860. BEGIN TRY
  8861. BEGIN TRANSACTION Opp_Import
  8862. SET NOCOUNT ON
  8863.  
  8864. -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
  8865. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  8866. BEGIN
  8867. DROP TABLE #Import_Staging
  8868. END
  8869.  
  8870. CREATE TABLE #Import_Staging
  8871. (
  8872. ExcelRowNumber INT NULL,
  8873. Company_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8874. ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8875. OpportunityName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8876. Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8877. Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8878. Status NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8879. EstCloseDate VARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8880. Rating NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8881. Stage NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8882. Source NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8883. PrimarySalesPerson NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8884. PrimarySalesPercentSplit INT NULL,
  8885. SecondarySalesPerson NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8886. SecondarySalesPercentSplit INT NULL,
  8887. MarketingCampaign NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8888. Location NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8889. BillingUnit NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8890. ForecastProductDescription NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8891. ForecastProductRev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8892. ForecastProductCost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8893. ForecastServiceDescription NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8894. ForecastServiceRev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8895. ForecastServiceCost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8896. ForecastOther1Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8897. ForecastOther1Rev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8898. ForecastOther1Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8899. ForecastOther2Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8900. ForecastOther2Rev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8901. ForecastOther2Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8902. New_Identity INT NULL,
  8903. ConvertMessage NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8904. BatchID UNIQUEIDENTIFIER NULL,
  8905. Company_Address_RecID INT NULL,
  8906. SO_Opp_Status_RecID INT NULL,
  8907. SO_Interest_RecID INT NULL,
  8908. SO_Pipeline_RecID INT NULL,
  8909. PrimarySales_MemberID INT NULL,
  8910. PrimarySales_FirstName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8911. PrimarySales_LastName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8912. PrimarySales_RecID INT NULL,
  8913. SecondarySales_MemberID INT NULL,
  8914. SecondarySales_FirstName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8915. SecondarySales_LastName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8916. SecondarySales_RecID INT NULL,
  8917. Location_RecID INT NULL,
  8918. Group_RecID INT NULL,
  8919. Billing_Unit_Loc_RecID INT NULL,
  8920. SO_Probability_RecID INT NULL,
  8921. Probability SMALLINT NULL,
  8922. SO_Type_RecID INT NULL,
  8923. Marketing_Campaign_RecID INT NULL,
  8924. SO_Urgency_RecID INT NULL,
  8925. ImportRowNum INT NULL,
  8926. Billing_Unit_RecID INT NULL,
  8927. Company_RecID INT NULL,
  8928. Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  8929. Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  8930. Company_Duplicate_Flag BIT NULL,
  8931. Contact_RecID INT NULL,
  8932. Contact_Duplicate_Flag BIT NULL,
  8933. Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
  8934. Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
  8935. Legacy_Opp_ID NVARCHAR(50) COLLATE DATABASE_DEFAULT,
  8936. Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  8937. Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  8938. Legacy_Site_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  8939. SR_Service_RecID INT,
  8940. SO_Opportunity_RecID INT,
  8941. Diff_Exclude_Flag BIT,
  8942. Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  8943. Duplicate_Flag BIT,
  8944. Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  8945. Currency_RecID INT
  8946. )
  8947.  
  8948. CREATE TABLE #Opportunity_Lines
  8949. (
  8950. RecID INT IDENTITY,
  8951. Legacy_Opp_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  8952. SO_Forecast_Type_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  8953. [Description] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  8954. Revenue NVARCHAR(10) COLLATE DATABASE_DEFAULT,
  8955. Cost NVARCHAR(10) COLLATE DATABASE_DEFAULT,
  8956. SO_Opportunity_RecID INT
  8957. )
  8958.  
  8959. -- Variable declaration
  8960. DECLARE
  8961. @ExpRowCount INT, -- Expected rowcount for inserts - Used for validation
  8962. @ErrorMsg VARCHAR(350), -- Variable to hold custom error message
  8963. @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
  8964. @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
  8965.  
  8966. -- Dynamic statement to insert to staging table
  8967. DECLARE @DSQL VARCHAR(MAX)
  8968.  
  8969. -- Flag to indicate migration being matched on Legacy_ID
  8970. DECLARE @Legacy_Flag BIT = 0
  8971.  
  8972. -- Fully qualified name of source table
  8973. DECLARE @SourceTable VARCHAR(300)
  8974. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  8975.  
  8976. DECLARE @ForecastSourceTable VARCHAR(300)
  8977. SELECT @ForecastSourceTable = 'tempdb.dbo.' + @ForecastTableName
  8978.  
  8979. -- Get current time in UTC
  8980. DECLARE @CurrTimeUTC DATETIME
  8981.  
  8982. SELECT @CurrTimeUTC = DATEADD(HOUR, -OffsetFromUTC, GETDATE()) FROM Time_Zone_Offsets tzo
  8983. INNER JOIN Time_Zone_Name tzn
  8984. ON tzn.Time_Zone_Name_RecID = tzo.Time_Zone_Name_RecID
  8985. INNER JOIN Time_Zone tz
  8986. ON tz.Time_Zone_Name_RecID = tzn.Time_Zone_Name_RecID
  8987. AND tz.Default_Flag = 1
  8988. WHERE GETDATE() BETWEEN tzo.StartDate and tzo.EndDate
  8989.  
  8990. -- Object_ID of source table
  8991. DECLARE @Source_Object_ID INT
  8992. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  8993.  
  8994. DECLARE @Forecast_Source_Object_ID INT
  8995. SELECT @Forecast_Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @ForecastTableName
  8996.  
  8997. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  8998. SELECT @ImportBatchUser =
  8999. 'CONV_'
  9000. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  9001. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  9002. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  9003. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  9004.  
  9005. -- Populate Staging table variable with initial values
  9006. SELECT @DSQL = '
  9007. INSERT INTO #Import_Staging
  9008. (
  9009. ExcelRowNumber,
  9010. Company_Name,
  9011. ContactName,
  9012. OpportunityName,
  9013. [Description],
  9014. [Type],
  9015. [Status],
  9016. EstCloseDate,
  9017. Rating,
  9018. Stage,
  9019. Source,
  9020. PrimarySalesPerson,
  9021. PrimarySalesPercentSplit,
  9022. SecondarySalesPerson,
  9023. SecondarySalesPercentSplit,
  9024. MarketingCampaign,
  9025. Location,
  9026. BillingUnit,
  9027. ForecastProductDescription,
  9028. ForecastProductRev,
  9029. ForecastProductCost,
  9030. ForecastServiceDescription,
  9031. ForecastServiceRev,
  9032. ForecastServiceCost,
  9033. ForecastOther1Description,
  9034. ForecastOther1Rev,
  9035. ForecastOther1Cost,
  9036. ForecastOther2Description,
  9037. ForecastOther2Rev,
  9038. ForecastOther2Cost,
  9039. Company_Match_Val
  9040. )
  9041.  
  9042. SELECT
  9043. [Excel Row Number],
  9044. [Company Name],
  9045. [Contact Name],
  9046. [Opportunity Name],
  9047. LEFT([Description], 1000),
  9048. [Type],
  9049. [Status],
  9050. [Est Close Date],
  9051. [Rating],
  9052. [Stage],
  9053. [Source],
  9054. [Primary Sales Person],
  9055. [Primary Sales Percent Split],
  9056. [Secondary Sales Person],
  9057. [Secondary Sales Percent Split],
  9058. [Marketing Campaign],
  9059. [Location],
  9060. [Group],
  9061. [Forecast Product Description],
  9062. [Forecast Product Revenue],
  9063. [Forecast Product Cost],
  9064. [Forecast Service Description],
  9065. [Forecast Service Revenue],
  9066. [Forecast Service Cost],
  9067. [Forecast Other-1 Description],
  9068. [Forecast Other-1 Revenue],
  9069. [Forecast Other-1 Cost],
  9070. [Forecast Other-2 Description],
  9071. [Forecast Other-2 Revenue],
  9072. [Forecast Other-2 Cost],
  9073. LEFT([Company Name], 3)
  9074. FROM ' + @SourceTable
  9075.  
  9076. -- Pull data into validation temp table
  9077. EXEC(@DSQL)
  9078.  
  9079. -- Update single space or blank string to null
  9080. UPDATE #Import_Staging SET
  9081. [ExcelRowNumber] = CASE WHEN [ExcelRowNumber] IN('', ' ') THEN NULL ELSE [ExcelRowNumber] END,
  9082. [Company_Name] = CASE WHEN [Company_Name] IN('', ' ') THEN NULL ELSE [Company_Name] END,
  9083. [ContactName] = CASE WHEN [ContactName] IN('', ' ') THEN NULL ELSE [ContactName] END,
  9084. [OpportunityName] = CASE WHEN [OpportunityName] IN('', ' ') THEN NULL ELSE [OpportunityName] END,
  9085. [Description] = CASE WHEN [Description] IN('', ' ') THEN NULL ELSE [Description] END,
  9086. [Type] = CASE WHEN [Type] IN('', ' ') THEN NULL ELSE [Type] END,
  9087. [Status] = CASE WHEN [Status] IN('', ' ') THEN NULL ELSE [Status] END,
  9088. [EstCloseDate] = CASE WHEN [EstCloseDate] IN('', ' ') THEN NULL ELSE [EstCloseDate] END,
  9089. [Rating] = CASE WHEN [Rating] IN('', ' ') THEN NULL ELSE [Rating] END,
  9090. [Stage] = CASE WHEN [Stage] IN('', ' ') THEN NULL ELSE [Stage] END,
  9091. [Source] = CASE WHEN [Source] IN('', ' ') THEN NULL ELSE [Source] END,
  9092. [PrimarySalesPerson] = CASE WHEN [PrimarySalesPerson] IN('', ' ') THEN NULL ELSE [PrimarySalesPerson] END,
  9093. [PrimarySalesPercentSplit] = CASE WHEN [PrimarySalesPercentSplit] IN('', ' ') THEN NULL ELSE [PrimarySalesPercentSplit] END,
  9094. [SecondarySalesPerson] = CASE WHEN [SecondarySalesPerson] IN('', ' ') THEN NULL ELSE [SecondarySalesPerson] END,
  9095. [SecondarySalesPercentSplit] = CASE WHEN [SecondarySalesPercentSplit] IN('', ' ') THEN NULL ELSE [SecondarySalesPercentSplit] END,
  9096. [MarketingCampaign] = CASE WHEN [MarketingCampaign] IN('', ' ') THEN NULL ELSE [MarketingCampaign] END,
  9097. [Location] = CASE WHEN [Location] IN('', ' ') THEN NULL ELSE [Location] END,
  9098. [BillingUnit] = CASE WHEN [BillingUnit] IN('', ' ') THEN NULL ELSE [BillingUnit] END,
  9099. [ForecastProductDescription] = CASE WHEN [ForecastProductDescription] IN('', ' ') THEN NULL ELSE [ForecastProductDescription] END,
  9100. [ForecastProductRev] = CASE WHEN [ForecastProductRev] IN('', ' ', '??') THEN NULL ELSE [ForecastProductRev] END,
  9101. [ForecastProductCost] = CASE WHEN [ForecastProductCost] IN('', ' ', '??') THEN NULL ELSE [ForecastProductCost] END,
  9102. [ForecastServiceDescription] = CASE WHEN [ForecastServiceDescription] IN('', ' ') THEN NULL ELSE [ForecastServiceDescription] END,
  9103. [ForecastServiceRev] = CASE WHEN [ForecastServiceRev] IN('', ' ', '??') THEN NULL ELSE [ForecastServiceRev] END,
  9104. [ForecastServiceCost] = CASE WHEN [ForecastServiceCost] IN('', ' ', '??') THEN NULL ELSE [ForecastServiceCost] END,
  9105. [ForecastOther1Description] = CASE WHEN [ForecastOther1Description] IN('', ' ') THEN NULL ELSE [ForecastOther1Description] END,
  9106. [ForecastOther1Rev] = CASE WHEN [ForecastOther1Rev] IN('', ' ', '??') THEN NULL ELSE [ForecastOther1Rev] END,
  9107. [ForecastOther1Cost] = CASE WHEN [ForecastOther1Cost] IN('', ' ', '??') THEN NULL ELSE [ForecastOther1Cost] END,
  9108. [ForecastOther2Description] = CASE WHEN [ForecastOther2Description] IN('', ' ') THEN NULL ELSE [ForecastOther2Description] END,
  9109. [ForecastOther2Rev] = CASE WHEN [ForecastOther2Rev] IN('', ' ', '??') THEN NULL ELSE [ForecastOther2Rev] END,
  9110. [ForecastOther2Cost] = CASE WHEN [ForecastOther2Cost] IN('', ' ', '??') THEN NULL ELSE [ForecastOther2Cost] END
  9111.  
  9112. -- Remove commas and dollar signs from revenue/cost fields (common validation error)
  9113. UPDATE #Import_Staging
  9114. SET ForecastProductCost = REPLACE(ForecastProductCost, ',', ''),
  9115. ForecastProductRev = REPLACE(ForecastProductRev, ',', ''),
  9116. ForecastServiceCost = REPLACE(ForecastServiceCost, ',', ''),
  9117. ForecastServiceRev = REPLACE(ForecastServiceRev, ',', ''),
  9118. ForecastOther1Cost = REPLACE(ForecastOther1Cost, ',', ''),
  9119. ForecastOther1Rev = REPLACE(ForecastOther1Rev, ',', ''),
  9120. ForecastOther2Cost = REPLACE(ForecastOther2Cost, ',', ''),
  9121. ForecastOther2Rev = REPLACE(ForecastOther2Rev, ',', '')
  9122.  
  9123. UPDATE #Import_Staging
  9124. SET ForecastProductCost = REPLACE(ForecastProductCost, '$', ''),
  9125. ForecastProductRev = REPLACE(ForecastProductRev, '$', ''),
  9126. ForecastServiceCost = REPLACE(ForecastServiceCost, '$', ''),
  9127. ForecastServiceRev = REPLACE(ForecastServiceRev, '$', ''),
  9128. ForecastOther1Cost = REPLACE(ForecastOther1Cost, '$', ''),
  9129. ForecastOther1Rev = REPLACE(ForecastOther1Rev, '$', ''),
  9130. ForecastOther2Cost = REPLACE(ForecastOther2Cost, '$', ''),
  9131. ForecastOther2Rev = REPLACE(ForecastOther2Rev, '$', '')
  9132.  
  9133. -- Table variable to hold column names from source table
  9134. DECLARE @SourceColumns TABLE
  9135. (
  9136. ColumnName VARCHAR(255)
  9137. )
  9138.  
  9139. -- Populate @SourceColumns
  9140. INSERT INTO @SourceColumns
  9141. (
  9142. ColumnName
  9143. )
  9144.  
  9145. SELECT
  9146. name
  9147. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  9148.  
  9149. -- Update temp table with optional field values if they exist
  9150. IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Company_ID' AND Object_ID = @Source_Object_ID)
  9151. BEGIN
  9152. SELECT @DSQL = '
  9153. UPDATE tmp
  9154. SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
  9155. FROM #Import_Staging tmp
  9156. INNER JOIN ' + @SourceTable + ' src
  9157. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  9158.  
  9159. EXEC(@DSQL)
  9160. END
  9161.  
  9162. -- Update temp table with optional field values if they exist
  9163. IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Contact_ID' AND Object_ID = @Source_Object_ID)
  9164. BEGIN
  9165. SELECT @DSQL = '
  9166. UPDATE tmp
  9167. SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
  9168. FROM #Import_Staging tmp
  9169. INNER JOIN ' + @SourceTable + ' src
  9170. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  9171.  
  9172. EXEC(@DSQL)
  9173. END
  9174.  
  9175. -- Update temp table with optional field values if they exist
  9176. IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_ID' AND Object_ID = @Source_Object_ID)
  9177. BEGIN
  9178. SELECT @DSQL = '
  9179. UPDATE tmp
  9180. SET tmp.Legacy_ID = src.Legacy_ID
  9181. FROM #Import_Staging tmp
  9182. INNER JOIN ' + @SourceTable + ' src
  9183. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  9184.  
  9185. EXEC(@DSQL)
  9186. END
  9187.  
  9188.  
  9189. -- Remove import config row created by custom conversion process
  9190. DELETE FROM #Import_Staging
  9191. WHERE Company_Name = 'CW_Import_Config_Row'
  9192.  
  9193. -- If forecast sheet being used, populate forecast table
  9194. IF @ForecastTableName IS NOT NULL
  9195. BEGIN
  9196. SELECT @DSQL = '
  9197. INSERT INTO #Opportunity_Lines
  9198. (
  9199. Legacy_Opp_ID,
  9200. SO_Forecast_Type_ID,
  9201. [Description],
  9202. Revenue,
  9203. Cost
  9204. )
  9205.  
  9206. SELECT
  9207. Legacy_Opp_ID,
  9208. SO_Forecast_Type_ID,
  9209. [Description],
  9210. Revenue,
  9211. Cost
  9212. FROM ' + @ForecastSourceTable
  9213.  
  9214. EXEC(@DSQL)
  9215. END
  9216.  
  9217. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  9218. IF Object_ID('tempdb..#Company') IS NOT NULL
  9219. BEGIN
  9220. DROP TABLE #Company
  9221. END
  9222.  
  9223. SELECT DISTINCT
  9224. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  9225. comp.Company_ID,
  9226. comp.Company_Name,
  9227. Delete_Flag,
  9228. LEFT(Company_Name, 3) AS Company_Match_Val,
  9229. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  9230. 0 AS Duplicate_Flag
  9231. INTO #Company
  9232. FROM dbo.Company comp
  9233. WHERE Delete_Flag = 0
  9234. AND
  9235. (
  9236. LEFT(Company_Name, 3) IN(SELECT Company_Match_Val FROM #Import_Staging)
  9237. OR Company_ID IN(SELECT Company_Name FROM #Import_Staging)
  9238. OR Company_RecID = (SELECT TOP 1 Company_RecID FROM dbo.Owner)
  9239. )
  9240.  
  9241. -- Table to hold contact information
  9242. IF Object_ID('tempdb..#Contact') IS NOT NULL
  9243. BEGIN
  9244. DROP TABLE #Contact
  9245. END
  9246.  
  9247. SELECT
  9248. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  9249. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  9250. First_Name,
  9251. Last_Name,
  9252. cont.Company_RecID,
  9253. Default_Flag
  9254. INTO #Contact
  9255. FROM dbo.Contact cont
  9256. INNER JOIN #Company comp
  9257. ON comp.Company_RecID = cont.Company_RecID
  9258.  
  9259. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  9260. BEGIN
  9261. SELECT @Legacy_Flag = 1
  9262. EXEC usp_Import_Match_Legacy @TableName, 'Opportunity'
  9263. END
  9264.  
  9265. IF @Legacy_Flag = 0
  9266. BEGIN
  9267. -- Match companies and contacts
  9268. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  9269. END
  9270.  
  9271. -- Strip commas from numeric fields
  9272. UPDATE #Import_Staging
  9273. SET ForecastProductCost = REPLACE(ForecastProductCost, ',', ''),
  9274. ForecastProductRev = REPLACE(ForecastProductRev, ',', ''),
  9275. ForecastServiceCost = REPLACE(ForecastServiceCost, ',', ''),
  9276. ForecastServiceRev = REPLACE(ForecastServiceRev, ',', ''),
  9277. ForecastOther1Cost = REPLACE(ForecastOther1Cost, ',', ''),
  9278. ForecastOther1Rev = REPLACE(ForecastOther1Rev, ',', ''),
  9279. ForecastOther2Cost = REPLACE(ForecastOther2Cost, ',', ''),
  9280. ForecastOther2Rev = REPLACE(ForecastOther2Rev, ',', '')
  9281.  
  9282. -- Get Company_Address_RecID for contact
  9283. UPDATE stag
  9284. SET stag.Company_Address_RecID = cont.Company_Address_RecID
  9285. FROM #Import_Staging stag
  9286. INNER JOIN dbo.Contact cont
  9287. ON cont.Contact_RecID = stag.Contact_RecID
  9288.  
  9289. -- If Company_Address_RecID still null, get default for company
  9290. UPDATE stag
  9291. SET stag.Company_Address_RecID = cad.Company_Address_RecID
  9292. FROM #Import_Staging stag
  9293. INNER JOIN Company_Address cad
  9294. ON stag.Company_RecID = cad.Company_RecID
  9295. AND cad.Inactive_Flag = 0
  9296. AND cad.Default_Flag = 1
  9297. WHERE stag.Company_Address_RecID IS NULL
  9298.  
  9299. -- Get SO_Status_RecID
  9300. UPDATE stag
  9301. SET stag.SO_Opp_Status_RecID = sos.SO_Opp_Status_RecID
  9302. FROM #Import_Staging stag
  9303. INNER JOIN SO_Opp_Status sos
  9304. ON sos.[Description] = stag.[Status]
  9305. WHERE stag.[Status] IS NOT NULL
  9306.  
  9307. -- Get default SO_Status_RecID if not otherwise specified
  9308. UPDATE stag
  9309. SET stag.SO_Opp_Status_RecID = (SELECT TOP 1 SO_Opp_Status_RecID FROM SO_Opp_Status WHERE Default_Flag = 1)
  9310. FROM #Import_Staging stag
  9311. WHERE stag.[Status] IS NULL
  9312.  
  9313. -- Get SO_Interest_RecID for rating
  9314. UPDATE stag
  9315. SET stag.SO_Interest_RecID = soi.SO_Interest_RecID
  9316. FROM #Import_Staging stag
  9317. INNER JOIN SO_Interest soi
  9318. ON dbo.ufn_Import_Trim(soi.[Description]) = stag.Rating
  9319. WHERE stag.Rating IS NOT NULL
  9320.  
  9321. -- If interest (rating) not specified or not found - get record with min sort order from SO_Interest
  9322. UPDATE stag
  9323. SET stag.SO_Interest_RecID = (SELECT TOP 1 SO_Interest_RecID FROM SO_Interest ORDER BY Sort_Order ASC)
  9324. FROM #Import_Staging stag
  9325. WHERE SO_Interest_RecID IS NULL
  9326.  
  9327. -- Get SO_Pipeline_RecID for stage
  9328. UPDATE stag
  9329. SET stag.SO_Pipeline_RecID = sop.SO_Pipeline_RecID
  9330. FROM #Import_Staging stag
  9331. INNER JOIN SO_Pipeline sop
  9332. ON stag.Stage = sop.[Description]
  9333. WHERE stag.Stage IS NOT NULL
  9334.  
  9335. -- If stage not specified or not found, get stage w/ lowest sequence number
  9336. UPDATE stag
  9337. SET stag.SO_Pipeline_RecID = (SELECT TOP 1 SO_Pipeline_RecID FROM SO_Pipeline ORDER BY Seq_Nbr ASC)
  9338. FROM #Import_Staging stag
  9339. WHERE stag.SO_Pipeline_RecID IS NULL
  9340.  
  9341. -- Update primary sales percent to 100, secondary to 0 if no secondary rep
  9342. UPDATE #Import_Staging
  9343. SET PrimarySalesPercentSplit = 100,
  9344. SecondarySalesPercentSplit = 0
  9345. FROM #Import_Staging
  9346. WHERE SecondarySalesPerson IS NULL
  9347.  
  9348. -- Get primary sales rep info
  9349. UPDATE stag
  9350. SET stag.PrimarySales_MemberID = mem.Member_RecID,
  9351. stag.PrimarySales_FirstName = mem.First_Name,
  9352. stag.PrimarySales_LastName = mem.Last_Name,
  9353. stag.PrimarySales_RecID = mem.Member_RecID
  9354. FROM #Import_Staging stag
  9355. INNER JOIN Member mem
  9356. ON stag.PrimarySalesPerson = dbo.ufn_Import_Trim(mem.Member_ID)
  9357. OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = stag.PrimarySalesPerson
  9358.  
  9359. -- Get secondary sales rep info
  9360. UPDATE stag
  9361. SET stag.SecondarySales_MemberID = mem.Member_RecID,
  9362. stag.SecondarySales_FirstName = mem.First_Name,
  9363. stag.SecondarySales_LastName = mem.Last_Name,
  9364. stag.SecondarySales_RecID = mem.Member_RecID
  9365. FROM #Import_Staging stag
  9366. INNER JOIN Member mem
  9367. ON stag.SecondarySalesPerson = dbo.ufn_Import_Trim(mem.Member_ID)
  9368. OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = stag.SecondarySalesPerson
  9369. WHERE stag.SecondarySalesPerson IS NOT NULL
  9370.  
  9371. -- Get info for location/group
  9372. UPDATE stag
  9373. SET stag.Group_RecID = bu.Billing_Unit_RecID,
  9374. stag.Location_RecID = ol.Owner_Level_RecID,
  9375. stag.Billing_Unit_Loc_RecID = bul.Billing_Unit_Loc_RecID
  9376. FROM #Import_Staging stag
  9377. INNER JOIN Billing_Unit bu
  9378. ON bu.[Description] = stag.BillingUnit
  9379. OR bu.Billing_Unit_ID = stag.BillingUnit
  9380. INNER JOIN Owner_Level ol
  9381. ON ol.Owner_Level_Name = stag.Location
  9382. OR ol.[Description] = stag.Location
  9383. INNER JOIN Billing_Unit_Loc bul
  9384. ON bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
  9385. AND bul.Owner_Level_RecID = ol.Owner_Level_RecID
  9386.  
  9387. -- Get probability RecID
  9388. UPDATE stag
  9389. SET stag.SO_Probability_RecID = sop.SO_Probability_RecID
  9390. FROM #Import_Staging stag
  9391. INNER JOIN SO_Pipeline sop
  9392. ON sop.[Description] = stag.Stage
  9393.  
  9394. -- If probability recid still null, get top by sequence number
  9395. UPDATE stag
  9396. SET SO_Probability_RecID = (SELECT TOP 1 SO_Probability_RecID FROM SO_Pipeline ORDER BY Seq_Nbr ASC)
  9397. FROM #Import_Staging stag
  9398. WHERE SO_Probability_RecID IS NULL
  9399.  
  9400. -- Determine probability from SO_Probability
  9401. UPDATE stag
  9402. SET stag.Probability = sop.Probability
  9403. FROM #Import_Staging stag
  9404. INNER JOIN dbo.SO_Probability sop
  9405. ON stag.SO_Probability_RecID = sop.SO_Probability_RecID
  9406.  
  9407. -- Get SO_Type_RecID
  9408. UPDATE stag
  9409. SET stag.SO_Type_RecID = sot.SO_Type_RecID
  9410. FROM #Import_Staging stag
  9411. INNER JOIN SO_Type sot
  9412. ON stag.[Type] = dbo.ufn_Import_Trim(sot.[Description])
  9413.  
  9414. -- Get Marketing_Campaign_RecID
  9415. UPDATE stag
  9416. SET stag.Marketing_Campaign_RecID = mc.Marketing_Campaign_RecID
  9417. FROM #Import_Staging stag
  9418. INNER JOIN Marketing_Campaign mc
  9419. ON mc.Marketing_ID = stag.MarketingCampaign
  9420.  
  9421. -- Get SO_Urgency_RecID for default urgency or first sort order
  9422. UPDATE stag
  9423. SET stag.SO_Urgency_RecID = (SELECT TOP 1 SO_Urgency_RecID FROM SO_Urgency ORDER BY Default_Flag DESC, Sort_Order ASC)
  9424. FROM #Import_Staging stag
  9425.  
  9426. -- If running in 'Force Mode', create necessary references
  9427. IF @ForceMode = 1
  9428. BEGIN
  9429.  
  9430. -- Insert Opportunity Types
  9431. INSERT INTO SO_Type
  9432. (
  9433. Owner_ID,
  9434. [Description],
  9435. Update_By
  9436. )
  9437. SELECT DISTINCT
  9438. 1,
  9439. [Type],
  9440. @ImportBatchUser
  9441. FROM #Import_Staging tmp
  9442. LEFT OUTER JOIN SO_Type sot
  9443. ON dbo.ufn_Import_Trim(sot.[Description]) = tmp.[Type]
  9444. WHERE sot.SO_Type_RecID IS NULL
  9445. AND tmp.[Type] IS NOT NULL
  9446.  
  9447. -- Grab RecIDs for newly inserted opportunity types
  9448. UPDATE stag
  9449. SET stag.SO_Type_RecID = sot.SO_Type_RecID
  9450. FROM #Import_Staging stag
  9451. INNER JOIN SO_Type sot
  9452. ON stag.[Type] = dbo.ufn_Import_Trim(sot.[Description])
  9453. AND sot.Update_By = @ImportBatchUser
  9454.  
  9455. -- Insert Opportunity Statuses
  9456. INSERT INTO SO_Opp_Status
  9457. (
  9458. Owner_ID,
  9459. [Description],
  9460. Updated_By,
  9461. Entered_By
  9462. )
  9463. SELECT DISTINCT
  9464. 1,
  9465. tmp.[Status],
  9466. @ImportBatchUser,
  9467. 'zAdmin'
  9468. FROM #Import_Staging tmp
  9469. LEFT OUTER JOIN SO_Opp_Status sos
  9470. ON sos.[Description] = tmp.[Status]
  9471. WHERE sos.SO_Opp_Status_RecID IS NULL
  9472. AND tmp.[Status] IS NOT NULL
  9473.  
  9474. -- Grab RecIDs for newly inserted opportunity Statuses
  9475. UPDATE stag
  9476. SET stag.SO_Opp_Status_RecID = sos.SO_Opp_Status_RecID
  9477. FROM #Import_Staging stag
  9478. INNER JOIN SO_Opp_Status sos
  9479. ON stag.[Status] = sos.[Description]
  9480. AND sos.Updated_By = @ImportBatchUser
  9481.  
  9482. -- Insert opportunity stage
  9483. INSERT INTO SO_Pipeline
  9484. (
  9485. Owner_ID,
  9486. [Description],
  9487. Funnel_Color,
  9488. SO_Probability_RecID,
  9489. Updated_By
  9490. )
  9491. SELECT DISTINCT
  9492. 1,
  9493. tmp.Stage,
  9494. 'window',
  9495. (SELECT TOP 1 SO_Probability_RecID FROM SO_Probability),
  9496. @ImportBatchUser
  9497. FROM #Import_Staging tmp
  9498. LEFT OUTER JOIN SO_Pipeline sop
  9499. ON tmp.Stage = sop.[Description]
  9500. WHERE sop.SO_Pipeline_RecID IS NULL
  9501. AND tmp.Stage IS NOT NULL
  9502.  
  9503. -- Get SO_Pipeline_RecID for newly inserted stages
  9504. UPDATE stag
  9505. SET stag.SO_Pipeline_RecID = sop.SO_Pipeline_RecID
  9506. FROM #Import_Staging stag
  9507. INNER JOIN SO_Pipeline sop
  9508. ON stag.Stage = dbo.ufn_Import_Trim(sop.[Description])
  9509. WHERE stag.Stage IS NOT NULL
  9510. AND sop.Updated_By = @ImportBatchUser
  9511.  
  9512. -- Set primary salesperson to 'zAdmin' if no match found
  9513. UPDATE tmp
  9514. SET tmp.PrimarySales_MemberID = za.Member_RecID,
  9515. tmp.PrimarySales_FirstName = za.First_Name,
  9516. tmp.PrimarySales_LastName = za.Last_Name,
  9517. tmp.PrimarySales_RecID = za.Member_RecID
  9518. FROM #Import_Staging tmp
  9519. LEFT OUTER JOIN Member mem
  9520. ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.PrimarySalesPerson
  9521. OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = tmp.PrimarySalesPerson
  9522. LEFT OUTER JOIN dbo.Member za ON za.Member_ID = 'zAdmin'
  9523. WHERE mem.Member_RecID IS NULL
  9524. AND tmp.PrimarySales_RecID IS NULL
  9525.  
  9526. -- Attempt to match location/group by Member_ID of primary sales rep
  9527. UPDATE tmp
  9528. SET tmp.Location = ol.Owner_Level_Name,
  9529. tmp.BillingUnit = bu.Billing_Unit_ID,
  9530. tmp.Location_RecID = ol.Owner_Level_RecID,
  9531. tmp.Group_RecID = bu.Billing_Unit_RecID
  9532. FROM #Import_Staging tmp
  9533. INNER JOIN dbo.Member mem
  9534. ON mem.Member_ID = tmp.PrimarySalesPerson
  9535. INNER JOIN dbo.Owner_Level ol
  9536. ON ol.Owner_Level_RecID = COALESCE(mem.Default_Loc_RecID, mem.Owner_Level_RecID)
  9537. LEFT OUTER JOIN Billing_Unit bu
  9538. ON bu.Billing_Unit_RecID = mem.Billing_Unit_RecID
  9539. WHERE tmp.Billing_Unit_Loc_RecID IS NULL
  9540.  
  9541. END
  9542.  
  9543. -- Check required fields and update convert message
  9544. UPDATE #Import_Staging
  9545. SET ConvertMessage =
  9546. CASE
  9547. WHEN stag.Company_RecID IS NULL THEN 'Unable to locate company: "' + stag.Company_Name + '"'
  9548. WHEN stag.SO_Opp_Status_RecID IS NULL THEN 'Invalid status: "' + stag.Status + '"'
  9549. WHEN stag.SO_Interest_RecID IS NULL THEN 'Invalid rating: "' + stag.Rating + '"'
  9550. WHEN stag.SO_Pipeline_RecID IS NULL THEN 'Invalid stage: "' + stag.Stage + '"'
  9551. WHEN stag.PrimarySales_MemberID IS NULL THEN 'Invalid Primary Salesperson: "' + stag.PrimarySalesPerson + '"'
  9552. WHEN stag.SecondarySales_MemberID IS NULL AND stag.SecondarySalesPerson IS NOT NULL THEN 'Invalid secondary salesperson: "' + stag.SecondarySalesPerson + '"'
  9553. WHEN stag.Location_RecID IS NULL THEN 'Invalid location: "' + stag.Location + '"'
  9554. WHEN stag.Group_RecID IS NULL THEN 'Invalid group: "' + stag.BillingUnit + '"'
  9555. WHEN stag.Billing_Unit_Loc_RecID IS NULL AND stag.Group_RecID IS NOT NULL AND stag.Location_RecID IS NOT NULL THEN 'Group is not assigned to this location'
  9556. --WHEN stag.Contact_RecID IS NULL THEN 'Invalid contact'
  9557. ELSE NULL
  9558. END
  9559. FROM #Import_Staging stag
  9560.  
  9561. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE ConvertMessage IS NOT NULL)
  9562. BEGIN
  9563. SELECT DISTINCT
  9564. 0 AS Success,
  9565. ExcelRowNumber,
  9566. ConvertMessage AS ErrorDetails
  9567. FROM #Import_Staging
  9568. WHERE ConvertMessage IS NOT NULL
  9569.  
  9570. ROLLBACK TRANSACTION
  9571. RETURN
  9572. END
  9573.  
  9574. -- If probability specified in spreadsheet (optional field), override default probability
  9575. IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Probability' AND object_id = @Source_Object_ID)
  9576. BEGIN
  9577.  
  9578. SELECT @DSQL = '
  9579. UPDATE stag
  9580. SET stag.Probability = src.Probability
  9581. FROM #Import_Staging stag
  9582. INNER JOIN ' + @SourceTable + ' src
  9583. ON stag.[ExcelRowNumber] = src.ExcelRowNumber
  9584. AND ISNUMERIC(src.Probability) = 1
  9585. '
  9586. EXEC(@DSQL)
  9587.  
  9588. END
  9589.  
  9590. -- Get Currency_RecID
  9591. -- From Company
  9592. UPDATE stag
  9593. SET stag.Currency_RecID = comp.Currency_RecID
  9594. FROM #Import_Staging stag
  9595. CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Company comp WHERE comp.Company_RecID = stag.Company_RecID)comp
  9596.  
  9597. -- If still null, get from Company Country
  9598. UPDATE stag
  9599. SET stag.Currency_RecID = curr.Currency_RecID
  9600. FROM #Import_Staging stag
  9601. CROSS APPLY(SELECT TOP 1 Country_RecID FROM dbo.Company_Address cad WHERE cad.Company_RecID = stag.Company_RecID ORDER BY Default_Flag DESC)comp
  9602. CROSS APPLY(SELECT TOP 1 Currency_ID FROM dbo.Country cn WHERE cn.Country_RecID = comp.Country_RecID)cn
  9603. CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Currency curr WHERE curr.Currency_ID = cn.Currency_ID)curr
  9604. WHERE stag.Currency_RecID IS NULL
  9605.  
  9606. -- If still null, get default
  9607. UPDATE stag
  9608. SET stag.Currency_RecID = curr.Currency_RecID
  9609. FROM #Import_Staging stag
  9610. CROSS APPLY(SELECT TOP 1 Currency_ID FROM dbo.Country ORDER BY Default_Flag DESC)cn
  9611. CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Currency curr WHERE curr.Currency_ID = cn.Currency_ID)curr
  9612. WHERE stag.Currency_RecID IS NULL
  9613.  
  9614.  
  9615. -- Begin push
  9616. -- Get expected rowcount for insert to SO_Opportunity
  9617. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE ConvertMessage IS NULL
  9618.  
  9619. -- Perform insert to dbo.SO_Opportunity, catching new identity values in temp table
  9620. -- Repurpose Owner_ID temporarily to hold RecID from source table (used to join back and grab new identity)
  9621. IF EXISTS(SELECT * FROM sys.columns WHERE object_name(object_id) = 'SO_Opportunity' AND name = 'Last_Update_UTC')
  9622. AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_NAME(OBJECT_ID) = 'SO_Opportunity' AND name = 'Currency_RecID')
  9623. BEGIN
  9624. INSERT INTO dbo.SO_Opportunity
  9625. (
  9626. Owner_ID,
  9627. Opportunity_Name,
  9628. Company_RecID,
  9629. Contact_RecID,
  9630. SO_Pipeline_RecID,
  9631. In_Projection_Flag,
  9632. SO_Interest_RecID,
  9633. Probability_to_Close,
  9634. Source,
  9635. Date_Close_Expected,
  9636. Billing_Unit_RecID,
  9637. Entered_By,
  9638. Updated_By,
  9639. --Last_Update,
  9640. Notes,
  9641. Company_Address_RecID,
  9642. Red_Flag,
  9643. SO_Opp_Status_RecID,
  9644. SO_Type_RecID,
  9645. Owner_Level_RecID,
  9646. Marketing_Campaign_RecID,
  9647. SO_Urgency_RecID,
  9648. Notification_History,
  9649. Mobile_Guid,
  9650. Date_Became_Lead_UTC,
  9651. Last_Update_UTC
  9652. )
  9653.  
  9654. SELECT
  9655. stag.ExcelRowNumber,
  9656. stag.OpportunityName,
  9657. stag.Company_RecID,
  9658. stag.Contact_RecID,
  9659. stag.SO_Pipeline_RecID,
  9660. 0 AS In_Projection_Flag,
  9661. stag.SO_Interest_RecID,
  9662. stag.Probability,
  9663. stag.Source,
  9664. stag.EstCloseDate,
  9665. stag.Group_RecID AS Billing_Unit_RecID,
  9666. @ImportBatchUser,
  9667. @ImportBatchUser,
  9668. --GETDATE() AS Last_Update,
  9669. stag.[Description] AS Notes,
  9670. stag.Company_Address_RecID,
  9671. 0 AS Red_Flag,
  9672. stag.SO_Opp_Status_RecID,
  9673. stag.SO_Type_RecID,
  9674. stag.Location_RecID AS Owner_Level_RecID,
  9675. stag.Marketing_Campaign_RecID,
  9676. stag.SO_Urgency_RecID,
  9677. ',' AS Notification_History,
  9678. NEWID() AS Mobile_Guid,
  9679. @CurrTimeUTC,
  9680. @CurrTimeUTC
  9681. FROM #Import_Staging stag
  9682. END
  9683.  
  9684. -- Perform insert to dbo.SO_Opportunity, catching new identity values in temp table
  9685. -- Repurpose Owner_ID temporarily to hold RecID from source table (used to join back and grab new identity)
  9686. IF EXISTS(SELECT * FROM sys.columns WHERE object_name(object_id) = 'SO_Opportunity' AND name = 'Last_Update_UTC')
  9687. AND EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_NAME(OBJECT_ID) = 'SO_Opportunity' AND name = 'Currency_RecID')
  9688. BEGIN
  9689. INSERT INTO dbo.SO_Opportunity
  9690. (
  9691. Owner_ID,
  9692. Opportunity_Name,
  9693. Company_RecID,
  9694. Contact_RecID,
  9695. SO_Pipeline_RecID,
  9696. In_Projection_Flag,
  9697. SO_Interest_RecID,
  9698. Probability_to_Close,
  9699. Source,
  9700. Date_Close_Expected,
  9701. Billing_Unit_RecID,
  9702. Entered_By,
  9703. Updated_By,
  9704. --Last_Update,
  9705. Notes,
  9706. Company_Address_RecID,
  9707. Red_Flag,
  9708. SO_Opp_Status_RecID,
  9709. SO_Type_RecID,
  9710. Owner_Level_RecID,
  9711. Marketing_Campaign_RecID,
  9712. SO_Urgency_RecID,
  9713. Notification_History,
  9714. Mobile_Guid,
  9715. Date_Became_Lead_UTC,
  9716. Last_Update_UTC,
  9717. Currency_RecID
  9718. )
  9719.  
  9720. SELECT
  9721. stag.ExcelRowNumber,
  9722. stag.OpportunityName,
  9723. stag.Company_RecID,
  9724. stag.Contact_RecID,
  9725. stag.SO_Pipeline_RecID,
  9726. 0 AS In_Projection_Flag,
  9727. stag.SO_Interest_RecID,
  9728. stag.Probability,
  9729. stag.Source,
  9730. stag.EstCloseDate,
  9731. stag.Group_RecID AS Billing_Unit_RecID,
  9732. @ImportBatchUser,
  9733. @ImportBatchUser,
  9734. --GETDATE() AS Last_Update,
  9735. stag.[Description] AS Notes,
  9736. stag.Company_Address_RecID,
  9737. 0 AS Red_Flag,
  9738. stag.SO_Opp_Status_RecID,
  9739. stag.SO_Type_RecID,
  9740. stag.Location_RecID AS Owner_Level_RecID,
  9741. stag.Marketing_Campaign_RecID,
  9742. stag.SO_Urgency_RecID,
  9743. ',' AS Notification_History,
  9744. NEWID() AS Mobile_Guid,
  9745. @CurrTimeUTC,
  9746. @CurrTimeUTC,
  9747. Currency_RecID
  9748. FROM #Import_Staging stag
  9749. END
  9750.  
  9751.  
  9752. -- Insert for CW releases where UTC fields do not appear in SO_Opportunity
  9753. IF NOT EXISTS(SELECT * FROM sys.columns WHERE object_name(object_id) = 'SO_Opportunity' AND name = 'Last_Update_UTC')
  9754. BEGIN
  9755. INSERT INTO dbo.SO_Opportunity
  9756. (
  9757. Owner_ID,
  9758. Opportunity_Name,
  9759. Company_RecID,
  9760. Contact_RecID,
  9761. SO_Pipeline_RecID,
  9762. In_Projection_Flag,
  9763. SO_Interest_RecID,
  9764. Probability_to_Close,
  9765. Source,
  9766. Date_Close_Expected,
  9767. Billing_Unit_RecID,
  9768. Entered_By,
  9769. Updated_By,
  9770. --Last_Update,
  9771. Notes,
  9772. Company_Address_RecID,
  9773. Red_Flag,
  9774. SO_Opp_Status_RecID,
  9775. SO_Type_RecID,
  9776. Owner_Level_RecID,
  9777. Marketing_Campaign_RecID,
  9778. SO_Urgency_RecID,
  9779. Notification_History,
  9780. Mobile_Guid
  9781. )
  9782.  
  9783. SELECT
  9784. stag.ExcelRowNumber,
  9785. stag.OpportunityName,
  9786. stag.Company_RecID,
  9787. stag.Contact_RecID,
  9788. stag.SO_Pipeline_RecID,
  9789. 0 AS In_Projection_Flag,
  9790. stag.SO_Interest_RecID,
  9791. stag.Probability,
  9792. stag.Source,
  9793. stag.EstCloseDate,
  9794. stag.Group_RecID AS Billing_Unit_RecID,
  9795. @ImportBatchUser,
  9796. @ImportBatchUser,
  9797. --GETDATE() AS Last_Update,
  9798. stag.[Description] AS Notes,
  9799. stag.Company_Address_RecID,
  9800. 0 AS Red_Flag,
  9801. stag.SO_Opp_Status_RecID,
  9802. stag.SO_Type_RecID,
  9803. stag.Location_RecID AS Owner_Level_RecID,
  9804. stag.Marketing_Campaign_RecID,
  9805. stag.SO_Urgency_RecID,
  9806. ',' AS Notification_History,
  9807. NEWID() AS Mobile_Guid
  9808. FROM #Import_Staging stag
  9809. END
  9810.  
  9811. -- Join back to staging table to capture new identity
  9812. UPDATE stag
  9813. SET stag.New_Identity = op.Opportunity_RecID
  9814. FROM #Import_Staging stag
  9815. INNER JOIN SO_Opportunity op
  9816. ON op.Owner_ID = stag.ExcelRowNumber
  9817. AND Entered_By = @ImportBatchUser
  9818.  
  9819. -- Update Owner_ID to appropriate value
  9820. UPDATE op
  9821. SET op.Owner_ID = 1
  9822. FROM #Import_Staging stag
  9823. INNER JOIN SO_Opportunity op
  9824. ON op.Owner_ID = stag.ExcelRowNumber
  9825. AND Entered_By = @ImportBatchUser
  9826.  
  9827. -- Update forecast lines table with RecID from newly created opps
  9828. UPDATE fl
  9829. SET fl.SO_Opportunity_RecID = stag.New_Identity
  9830. FROM #Opportunity_Lines fl
  9831. CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging stag WHERE stag.Legacy_Opp_ID = fl.Legacy_Opp_ID) stag
  9832.  
  9833. -- Raise error if New_Identity is null in either staging table
  9834. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE New_Identity IS NULL)
  9835. OR EXISTS(SELECT TOP 1 * FROM #Opportunity_Lines WHERE SO_Opportunity_RecID IS NULL)
  9836. BEGIN
  9837. SELECT @ErrorMsg = 'Error capturing new identity values after insert to SO_Opportunity'
  9838. RAISERROR(@ErrorMsg, 16, 1)
  9839. END
  9840.  
  9841. -- Insert to SO_Team for primary rep
  9842. INSERT INTO SO_Team
  9843. (
  9844. Owner_ID,
  9845. Opportunity_RecID,
  9846. RecID,
  9847. [Description],
  9848. Owner_Flag,
  9849. Last_Update,
  9850. Updated_By,
  9851. member_id,
  9852. referral_flag,
  9853. Secondary_Flag,
  9854. Percent_Split,
  9855. Team_Flag
  9856. )
  9857.  
  9858. SELECT
  9859. 1 AS Owner_ID,
  9860. stag.New_Identity,
  9861. stag.PrimarySales_RecID,
  9862. stag.PrimarySales_FirstName + ' ' + stag.PrimarySales_LastName,
  9863. 1 AS Owner_Flag,
  9864. GETDATE() AS Last_Update,
  9865. 'zAdmin' AS UpdatedBy,
  9866. stag.PrimarySales_MemberID,
  9867. 0,
  9868. 0,
  9869. stag.PrimarySalesPercentSplit,
  9870. 0
  9871. FROM #Import_Staging stag
  9872.  
  9873. -- Insert to SO_Team for secondary rep
  9874. INSERT INTO SO_Team
  9875. (
  9876. Owner_ID,
  9877. Opportunity_RecID,
  9878. RecID,
  9879. [Description],
  9880. Owner_Flag,
  9881. Last_Update,
  9882. Updated_By,
  9883. member_id,
  9884. referral_flag,
  9885. Secondary_Flag,
  9886. Percent_Split,
  9887. Team_Flag
  9888. )
  9889.  
  9890. SELECT
  9891. 1 AS Owner_ID,
  9892. stag.New_Identity,
  9893. stag.SecondarySales_RecID,
  9894. stag.SecondarySales_FirstName + ' ' + stag.SecondarySales_LastName,
  9895. 1 AS Owner_Flag,
  9896. GETDATE() AS Last_Update,
  9897. 'zAdmin' AS UpdatedBy,
  9898. stag.SecondarySales_MemberID,
  9899. 0,
  9900. 1,
  9901. stag.PrimarySalesPercentSplit,
  9902. 0
  9903. FROM #Import_Staging stag
  9904. WHERE stag.SecondarySales_MemberID IS NOT NULL
  9905.  
  9906. -- Insert to SO_Forecast_Dtl for product
  9907. INSERT INTO SO_Forecast_Dtl
  9908. (
  9909. Opportunity_RecID,
  9910. Description,
  9911. Revenue,
  9912. Cost,
  9913. SO_Opp_Status_RecID,
  9914. Include_Flag,
  9915. Updated_By,
  9916. Last_Update,
  9917. SO_Forecast_Type_ID,
  9918. Product_Flag,
  9919. Link_Flag,
  9920. Recurring_Flag
  9921. )
  9922.  
  9923. SELECT
  9924. New_Identity,
  9925. ForecastProductDescription,
  9926. ForecastProductRev,
  9927. ForecastProductCost,
  9928. SO_Opp_Status_RecID,
  9929. 1,
  9930. 'zAdmin',
  9931. GETDATE(),
  9932. 'P',
  9933. 0,
  9934. 0,
  9935. 0
  9936. FROM #Import_Staging
  9937. WHERE ForecastProductDescription IS NOT NULL
  9938.  
  9939. -- Insert to SO_Forecast_Dtl for service
  9940. INSERT INTO SO_Forecast_Dtl
  9941. (
  9942. Opportunity_RecID,
  9943. Description,
  9944. Revenue,
  9945. Cost,
  9946. SO_Opp_Status_RecID,
  9947. Include_Flag,
  9948. Updated_By,
  9949. Last_Update,
  9950. SO_Forecast_Type_ID,
  9951. Product_Flag,
  9952. Link_Flag,
  9953. Recurring_Flag
  9954. )
  9955.  
  9956. SELECT
  9957. New_Identity,
  9958. ForecastServiceDescription,
  9959. ForecastServiceRev,
  9960. ForecastServiceCost,
  9961. SO_Opp_Status_RecID,
  9962. 1,
  9963. 'zAdmin',
  9964. GETDATE(),
  9965. 'S',
  9966. 0,
  9967. 0,
  9968. 0
  9969. FROM #Import_Staging
  9970. WHERE ForecastServiceDescription IS NOT NULL
  9971.  
  9972. -- Insert to SO_Forecast_Dtl for Other - 1
  9973. INSERT INTO SO_Forecast_Dtl
  9974. (
  9975. Opportunity_RecID,
  9976. Description,
  9977. Revenue,
  9978. Cost,
  9979. SO_Opp_Status_RecID,
  9980. Include_Flag,
  9981. Updated_By,
  9982. Last_Update,
  9983. SO_Forecast_Type_ID,
  9984. Product_Flag,
  9985. Link_Flag,
  9986. Recurring_Flag
  9987. )
  9988.  
  9989. SELECT
  9990. New_Identity,
  9991. ForecastOther1Description,
  9992. ForecastOther1Rev,
  9993. ForecastOther1Cost,
  9994. SO_Opp_Status_RecID,
  9995. 1,
  9996. 'zAdmin',
  9997. GETDATE(),
  9998. 'O1',
  9999. 0,
  10000. 0,
  10001. 0
  10002. FROM #Import_Staging
  10003. WHERE ForecastOther1Description IS NOT NULL
  10004.  
  10005. -- Insert to SO_Forecast_Dtl for Other - 2
  10006. INSERT INTO SO_Forecast_Dtl
  10007. (
  10008. Opportunity_RecID,
  10009. Description,
  10010. Revenue,
  10011. Cost,
  10012. SO_Opp_Status_RecID,
  10013. Include_Flag,
  10014. Updated_By,
  10015. Last_Update,
  10016. SO_Forecast_Type_ID,
  10017. Product_Flag,
  10018. Link_Flag,
  10019. Recurring_Flag
  10020. )
  10021.  
  10022. SELECT
  10023. New_Identity,
  10024. ForecastOther2Description,
  10025. ForecastOther2Rev,
  10026. ForecastOther2Cost,
  10027. SO_Opp_Status_RecID,
  10028. 1,
  10029. 'zAdmin',
  10030. GETDATE(),
  10031. 'O2',
  10032. 0,
  10033. 0,
  10034. 0
  10035. FROM #Import_Staging
  10036. WHERE ForecastOther2Description IS NOT NULL
  10037.  
  10038. -- If forecast line sheet included, perform insert
  10039. INSERT INTO SO_Forecast_Dtl
  10040. (
  10041. Opportunity_RecID,
  10042. Description,
  10043. Revenue,
  10044. Cost,
  10045. SO_Opp_Status_RecID,
  10046. Include_Flag,
  10047. Updated_By,
  10048. Last_Update,
  10049. SO_Forecast_Type_ID,
  10050. Product_Flag,
  10051. Link_Flag,
  10052. Recurring_Flag
  10053. )
  10054.  
  10055. SELECT
  10056. ol.SO_Opportunity_RecID,
  10057. LEFT(ol.[Description], 50),
  10058. Revenue,
  10059. Cost,
  10060. stag.SO_Opp_Status_RecID,
  10061. 1,
  10062. 'zAdmin',
  10063. GETDATE(),
  10064. ol.SO_Forecast_Type_ID,
  10065. 0,
  10066. 0,
  10067. 0
  10068. FROM #Opportunity_Lines ol
  10069. CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging stag WHERE stag.New_Identity = ol.SO_Opportunity_RecID) stag
  10070. WHERE ol.SO_Opportunity_RecID IS NOT NULL
  10071.  
  10072. ---- If debug mode and successful, select the rows that were inserted
  10073. ---- and rollback transaction
  10074. IF @DebugMode = 1 AND @@ERROR = 0
  10075. BEGIN
  10076. SELECT soa.* FROM SO_Activity soa INNER JOIN #Import_Staging stag ON stag.New_Identity = soa.Opportunity_Recid
  10077. SELECT tm.* FROM SO_Team tm INNER JOIN #Import_Staging stag ON stag.New_Identity = tm.Opportunity_RecID
  10078. SELECT sfd.* FROM SO_Forecast_Dtl sfd INNER JOIN #Import_Staging stag ON stag.New_Identity = sfd.Opportunity_RecID
  10079.  
  10080. ROLLBACK TRANSACTION Opp_Import
  10081. END
  10082.  
  10083. IF @DebugMode = 2 AND @@ERROR = 0
  10084. BEGIN
  10085. SELECT
  10086. 1 AS Success,
  10087. NULL AS ExcelRowNumber,
  10088. NULL AS ErrorDetails
  10089. ROLLBACK TRANSACTION Opp_Import
  10090. END
  10091.  
  10092. EXEC usp_Import_UDF @TableName, 'Opportunity'
  10093.  
  10094. IF @DebugMode = 0 AND @@Error = 0
  10095. BEGIN
  10096.  
  10097. -- Import successful - Save legacy_id's if necessary, commit and return results
  10098. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  10099. BEGIN
  10100.  
  10101. IF OBJECT_ID('tempdb..#Legacy_IDs') IS NOT NULL
  10102. DROP TABLE #Legacy_IDs
  10103.  
  10104. SELECT
  10105. Legacy_ID AS Legacy_ID,
  10106. New_Identity AS CW_RecID,
  10107. 'Opportunity' AS Record_Type
  10108. INTO #Legacy_IDs
  10109. FROM #Import_Staging stag
  10110. WHERE Legacy_ID IS NOT NULL
  10111.  
  10112.  
  10113. EXEC dbo.usp_Import_Legacy_IDs
  10114. END
  10115.  
  10116.  
  10117. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  10118. BEGIN
  10119. DROP TABLE #Import_Staging
  10120. END
  10121.  
  10122. COMMIT TRANSACTION Opp_Import
  10123.  
  10124. SELECT
  10125. 1 AS Success,
  10126. NULL AS ExcelRowNumber,
  10127. NULL AS Reason
  10128.  
  10129. END
  10130.  
  10131. END TRY
  10132.  
  10133. BEGIN CATCH
  10134.  
  10135. -- Return SQL error message encountered
  10136. SELECT
  10137. 0 AS Success,
  10138. 'Unknown' AS ExcelRowNumber,
  10139. ERROR_MESSAGE() + CONVERT(NVARCHAR, ERROR_LINE()) AS ErrorDetails
  10140.  
  10141. -- Rollback transaction
  10142. IF @@TRANCOUNT > 0
  10143. ROLLBACK TRANSACTION
  10144.  
  10145. END CATCH
  10146.  
  10147.  
  10148.  
  10149.  
  10150.  
  10151. GO
  10152.  
  10153.  
  10154.  
  10155.  
  10156.  
  10157. -- *************************************
  10158. -- *********** ACTIVITIES **************
  10159. -- *************************************
  10160.  
  10161.  
  10162. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_AC_ImportValidate')
  10163. BEGIN
  10164. EXEC('CREATE PROCEDURE [dbo].[usp_AC_ImportValidate] AS SELECT 1')
  10165. END
  10166. GO
  10167. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_AC_ImportPush')
  10168. BEGIN
  10169. EXEC('CREATE PROCEDURE [dbo].[usp_AC_ImportPush] AS SELECT 1')
  10170. END
  10171.  
  10172.  
  10173. SET ANSI_NULLS ON
  10174. GO
  10175.  
  10176. SET QUOTED_IDENTIFIER ON
  10177. GO
  10178.  
  10179.  
  10180. -- =============================================
  10181. -- Author: m.gray
  10182. -- Create date: 04/11/2013
  10183. -- Description: Validates data in spreadsheet
  10184. --- for Activity Import
  10185. -- Sample call: exec usp_AC_ImportValidate 'TMP_Import_1637365ab3ae44478726c8ec3e9faaba', 1
  10186. -- =============================================
  10187.  
  10188. ALTER PROCEDURE [dbo].[usp_AC_ImportValidate]
  10189. @TableName VARCHAR(MAX),
  10190. @Forcemode BIT = 0
  10191. AS
  10192. BEGIN
  10193.  
  10194.  
  10195. SET NOCOUNT ON
  10196.  
  10197. -- Set date format to MDY to validate dates from excel
  10198. SET DATEFORMAT MDY
  10199.  
  10200. -- Variable declaration
  10201. DECLARE @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
  10202.  
  10203. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  10204. SELECT @ImportBatchUser =
  10205. 'CONV_'
  10206. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  10207. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  10208. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  10209. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  10210.  
  10211. IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
  10212. BEGIN
  10213. DROP TABLE #tblResults
  10214. END
  10215.  
  10216. -- Table to hold results of procedure
  10217. CREATE TABLE #tblResults
  10218. (
  10219. RowNumber INT,
  10220. ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
  10221. InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  10222. ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  10223. Warning_Flag BIT DEFAULT 0
  10224. )
  10225.  
  10226. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  10227.  
  10228. -- Table to hold condensed summary results
  10229. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  10230. BEGIN
  10231. DROP TABLE #ResultsCondensed
  10232. END
  10233.  
  10234. CREATE TABLE #ResultsCondensed
  10235. (
  10236. RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  10237. ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  10238. )
  10239.  
  10240. -- Dynamic statement to insert to staging table
  10241. DECLARE @DSQL VARCHAR(MAX)
  10242.  
  10243. -- Fully qualified name of source table
  10244. DECLARE @SourceTable VARCHAR(300)
  10245. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  10246.  
  10247. -- Object_ID of source table
  10248. DECLARE @Source_Object_ID INT
  10249. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  10250.  
  10251. -- Flag to indicate migration being matched on Legacy_ID
  10252. DECLARE @Legacy_Flag BIT = 0
  10253.  
  10254. -- Pre-validation
  10255. -- Create & populate table variable with list of required columns
  10256. DECLARE @RequiredColumns TABLE
  10257. (
  10258. ColumnName VARCHAR(255)
  10259. )
  10260.  
  10261. INSERT INTO @RequiredColumns
  10262. (
  10263. ColumnName
  10264. )
  10265.  
  10266. SELECT 'Assign To' UNION ALL
  10267. SELECT 'Subject' UNION ALL
  10268. SELECT 'Activity Status' UNION ALL
  10269. SELECT 'Company Name' UNION ALL
  10270. SELECT 'Contact First Name' UNION ALL
  10271. SELECT 'Contact Last Name' UNION ALL
  10272. SELECT 'Activity Type' UNION ALL
  10273. SELECT 'Assign By' UNION ALL
  10274. SELECT 'Marketing Campaign' UNION ALL
  10275. SELECT 'Due Date' UNION ALL
  10276. SELECT 'Start Time' UNION ALL
  10277. SELECT 'End Time' UNION ALL
  10278. SELECT 'Reminder Minutes' UNION ALL
  10279. SELECT 'Notes'
  10280.  
  10281. -- Table variable to hold column names from source table
  10282. DECLARE @SourceColumns TABLE
  10283. (
  10284. ColumnName VARCHAR(255)
  10285. )
  10286.  
  10287. -- Populate @SourceColumns
  10288. INSERT INTO @SourceColumns
  10289. (
  10290. ColumnName
  10291. )
  10292.  
  10293. SELECT
  10294. name
  10295. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  10296.  
  10297. -- Check that all required columns exist in @SourceColumns
  10298. INSERT INTO #tblResults
  10299. (
  10300. RowNumber,
  10301. ValMsg
  10302. )
  10303.  
  10304. SELECT
  10305. 0,
  10306. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  10307. FROM @RequiredColumns rq
  10308.  
  10309. EXCEPT
  10310.  
  10311. SELECT
  10312. 0,
  10313. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  10314. FROM @SourceColumns sc
  10315.  
  10316.  
  10317. -- Table to hold source data for this batch from temp table
  10318. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  10319. BEGIN
  10320. DROP TABLE #Import_Staging
  10321. END
  10322.  
  10323. CREATE TABLE #Import_Staging
  10324. (
  10325. ExcelRowNumber int NULL,
  10326. AssignTo nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10327. [Subject] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10328. ActivityStatus nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10329. Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10330. ContactFirstName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10331. ContactLastName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10332. ActivityType nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10333. AssignBy nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10334. MarketingCampaign nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10335. ReminderMinutes nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10336. Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  10337. DueDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10338. StartTime nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10339. EndTime nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  10340. dtmDueDate DATETIME NULL,
  10341. SO_Activity_Type_RecID INT NULL,
  10342. ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  10343. Company_RecID INT NULL,
  10344. Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  10345. Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  10346. Company_Duplicate_Flag BIT NULL,
  10347. Contact_RecID INT NULL,
  10348. Contact_Duplicate_Flag BIT NULL,
  10349. Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
  10350. Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
  10351. Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  10352. Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  10353. Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  10354. Legacy_Site_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  10355. Company_Address_RecID INT,
  10356. SR_Service_RecID INT,
  10357. SO_Opportunity_RecID INT,
  10358. Duplicate_Flag BIT,
  10359. Legacy_Ticket_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  10360. Legacy_Opp_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  10361. Diff_Exclude_Flag BIT
  10362. )
  10363.  
  10364. CREATE INDEX IX_Comp ON #Import_Staging(Legacy_Company_ID)
  10365. CREATE INDEX IX_Cont ON #Import_Staging(Legacy_Contact_ID)
  10366.  
  10367. CREATE INDEX IX_XL ON #Import_Staging(ExcelRowNumber) INCLUDE(Legacy_Company_ID, Legacy_Contact_ID, Legacy_ID)
  10368.  
  10369. -- Build statement to populate validation temp table
  10370. SELECT @DSQL = '
  10371. INSERT INTO #Import_Staging
  10372. (
  10373. ExcelRowNumber,
  10374. AssignTo,
  10375. [Subject],
  10376. ActivityStatus,
  10377. Company_Name,
  10378. ContactFirstName,
  10379. ContactLastName,
  10380. ActivityType,
  10381. AssignBy,
  10382. MarketingCampaign,
  10383. DueDate,
  10384. StartTime,
  10385. EndTime,
  10386. ReminderMinutes,
  10387. Notes,
  10388. Company_Match_Val
  10389. )
  10390. SELECT
  10391. [Excel Row Number],
  10392. [Assign To],
  10393. [Subject],
  10394. [Activity Status],
  10395. [Company Name],
  10396. [Contact First Name],
  10397. [Contact Last Name],
  10398. [Activity Type],
  10399. [Assign By],
  10400. [Marketing Campaign],
  10401. [Due Date],
  10402. [Start Time],
  10403. [End Time],
  10404. [Reminder Minutes],
  10405. [Notes],
  10406. LEFT([Company Name], 3)
  10407. FROM ' + @SourceTable
  10408.  
  10409. -- Pull records into temp table
  10410. EXEC(@DSQL)
  10411.  
  10412. BEGIN TRANSACTION AC_Validate
  10413.  
  10414. -- If this is a custom migration, remove datatype config row
  10415. DELETE FROM #Import_Staging
  10416. WHERE [Subject] = 'CW_Import_Config_Row'
  10417.  
  10418. -- Update single space or blank string to null
  10419. UPDATE #Import_Staging SET
  10420. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  10421. AssignTo = CASE WHEN AssignTo IN('', ' ') THEN NULL ELSE AssignTo END,
  10422. [Subject] = CASE WHEN [Subject] IN('', ' ') THEN NULL ELSE [Subject] END,
  10423. ActivityStatus = CASE WHEN ActivityStatus IN('', ' ') THEN NULL ELSE ActivityStatus END,
  10424. Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
  10425. ContactFirstName = CASE WHEN ContactFirstName IN('', ' ') THEN NULL ELSE ContactFirstName END,
  10426. ContactLastName = CASE WHEN ContactLastName IN('', ' ') THEN NULL ELSE ContactLastName END,
  10427. ActivityType = CASE WHEN ActivityType IN('', ' ') THEN NULL ELSE ActivityType END,
  10428. AssignBy = CASE WHEN AssignBy IN('', ' ') THEN NULL ELSE AssignBy END,
  10429. MarketingCampaign = CASE WHEN MarketingCampaign IN('', ' ') THEN NULL ELSE MarketingCampaign END,
  10430. ReminderMinutes = CASE WHEN ReminderMinutes IN('', ' ') THEN NULL ELSE ReminderMinutes END,
  10431. DueDate = CASE WHEN DueDate IN('', ' ') THEN NULL ELSE REPLACE(DueDate, '000000', '') END,
  10432. StartTime = CASE WHEN StartTime IN('', ' ') THEN NULL ELSE StartTime END,
  10433. EndTime = CASE WHEN EndTime IN('', ' ') THEN NULL ELSE EndTime END,
  10434. Notes = CASE WHEN Notes IN('', ' ') THEN NULL ELSE Notes END
  10435.  
  10436. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
  10437. BEGIN
  10438. SELECT @DSQL = '
  10439. UPDATE tmp
  10440. SET tmp.Legacy_ID = src.Legacy_ID
  10441. FROM #Import_Staging tmp
  10442. INNER JOIN ' + @SourceTable + ' src
  10443. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  10444.  
  10445. EXEC(@DSQL)
  10446. END
  10447.  
  10448. -- Condense contact first and last names to ContactName
  10449. UPDATE tmp
  10450. SET ContactName = LTRIM(ISNULL(tmp.ContactFirstName + ' ', '') + ISNULL(tmp.ContactLastName, ''))
  10451. FROM #Import_Staging tmp
  10452.  
  10453. -- Get DueDate as datetime if valid
  10454. UPDATE tmp
  10455. SET dtmDueDate = CAST(DueDate AS DATETIME)
  10456. FROM #Import_Staging tmp
  10457. WHERE ISDATE(DueDate) = 1
  10458.  
  10459.  
  10460.  
  10461. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  10462. BEGIN
  10463. SELECT @Legacy_Flag = 1
  10464. EXEC usp_Import_Match_Legacy @TableName, 'Activity'
  10465. END
  10466.  
  10467. IF @Legacy_Flag = 0
  10468. BEGIN
  10469. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  10470. IF Object_ID('tempdb..#Company') IS NOT NULL
  10471. BEGIN
  10472. DROP TABLE #Company
  10473. END
  10474.  
  10475. SELECT
  10476. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  10477. comp.Company_ID,
  10478. comp.Company_Name,
  10479. Delete_Flag,
  10480. LEFT(Company_Name, 3) AS Company_Match_Val,
  10481. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  10482. 0 AS Duplicate_Flag
  10483. INTO #Company
  10484. FROM dbo.Company comp
  10485. WHERE Delete_Flag = 0
  10486.  
  10487.  
  10488. -- Table to hold contact information
  10489. IF Object_ID('tempdb..#Contact') IS NOT NULL
  10490. BEGIN
  10491. DROP TABLE #Contact
  10492. END
  10493.  
  10494. SELECT
  10495. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  10496. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  10497. First_Name,
  10498. Last_Name,
  10499. cont.Company_RecID,
  10500. Default_Flag
  10501. INTO #Contact
  10502. FROM dbo.Contact cont
  10503. INNER JOIN #Company comp
  10504. ON comp.Company_RecID = cont.Company_RecID
  10505.  
  10506. -- Match companies and contacts
  10507. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  10508. END
  10509.  
  10510.  
  10511.  
  10512. -- Get RecID for Activity Type
  10513. UPDATE tmp
  10514. SET tmp.SO_Activity_Type_RecID = aty.SO_Activity_Type_RecID
  10515. FROM #Import_Staging tmp
  10516. INNER JOIN dbo.SO_Activity_Type aty
  10517. ON aty.[Description] = tmp.ActivityType
  10518.  
  10519. UPDATE #Import_Staging SET [Subject] = '[No Subject]' WHERE [Subject] IS NULL
  10520.  
  10521. -- If running in force mode, create references and override validations as necessary
  10522. -- Insert will differ between CW releases (Entered_By column may or may not be present - handle accordingly
  10523. IF(@Forcemode = 1 AND EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('SO_Activity_Type') AND name = 'Entered_By'))
  10524. BEGIN
  10525.  
  10526.  
  10527.  
  10528. -- Insert activity type if specified but not found
  10529. INSERT INTO dbo.SO_Activity_Type
  10530. (
  10531. Owner_ID,
  10532. SO_Activity_Type_ID,
  10533. [Description],
  10534. History_Flag,
  10535. Updated_By,
  10536. Cleanup_Flag,
  10537. Default_Flag,
  10538. Import_Flag,
  10539. email_Flag,
  10540. Memo_Flag,
  10541. Points_Value,
  10542. Inactive_Flag,
  10543. Entered_By
  10544. )
  10545.  
  10546. SELECT DISTINCT
  10547. 1,
  10548. SUBSTRING(ActivityType, 1, 15),
  10549. SUBSTRING(ActivityType, 1, 50),
  10550. 0,
  10551. @ImportBatchUser,
  10552. 0,
  10553. 0,
  10554. 0,
  10555. 0,
  10556. 0,
  10557. 0,
  10558. 0,
  10559. @ImportBatchUser
  10560. FROM #Import_Staging tmp
  10561. WHERE tmp.SO_Activity_Type_RecID IS NULL
  10562. AND tmp.ActivityType IS NOT NULL
  10563. AND NOT EXISTS(SELECT TOP 1 * FROM SO_Activity_Type WHERE SO_Activity_Type_ID = SUBSTRING(ActivityType, 1, 15))
  10564.  
  10565. END
  10566.  
  10567. -- If running in force mode, create references and override validations as necessary
  10568. -- Insert will differ between CW releases (Entered_By column may or may not be present - handle accordingly
  10569. IF(@Forcemode = 1 AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('SO_Activity_Type') AND name = 'Entered_By'))
  10570. BEGIN
  10571.  
  10572.  
  10573.  
  10574. -- Insert activity type if specified but not found
  10575. INSERT INTO dbo.SO_Activity_Type
  10576. (
  10577. Owner_ID,
  10578. SO_Activity_Type_ID,
  10579. [Description],
  10580. History_Flag,
  10581. Updated_By,
  10582. Cleanup_Flag,
  10583. Default_Flag,
  10584. Import_Flag,
  10585. email_Flag,
  10586. Memo_Flag,
  10587. Points_Value,
  10588. Inactive_Flag
  10589. )
  10590.  
  10591. SELECT DISTINCT
  10592. 1,
  10593. SUBSTRING(ActivityType, 1, 15),
  10594. SUBSTRING(ActivityType, 1, 50),
  10595. 0,
  10596. @ImportBatchUser,
  10597. 0,
  10598. 0,
  10599. 0,
  10600. 0,
  10601. 0,
  10602. 0,
  10603. 0
  10604. FROM #Import_Staging tmp
  10605. WHERE tmp.SO_Activity_Type_RecID IS NULL
  10606. AND tmp.ActivityType IS NOT NULL
  10607. AND NOT EXISTS(SELECT TOP 1 * FROM SO_Activity_Type WHERE SO_Activity_Type_ID = SUBSTRING(ActivityType, 1, 15))
  10608.  
  10609. END
  10610.  
  10611.  
  10612. -- If running in force mode, truncate subjects > 100 characters
  10613. UPDATE tmp
  10614. SET tmp.Subject = SUBSTRING(tmp.Subject, 1, 100)
  10615. FROM #Import_Staging tmp
  10616. WHERE @ForceMode = 1
  10617.  
  10618. -- If resource name is used for 'Assign To', update to use member_id instead
  10619. UPDATE tmp
  10620. SET tmp.AssignTo = mem.Member_ID
  10621. FROM #Import_Staging tmp
  10622. INNER JOIN dbo.Member mem
  10623. ON dbo.ufn_Import_Trim(ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_name, '')) = tmp.AssignTo
  10624.  
  10625. -- Begin validations
  10626. INSERT INTO #tblResults
  10627. (
  10628. RowNumber,
  10629. ValMsg
  10630. )
  10631.  
  10632. -- Assign To is required
  10633. SELECT
  10634. tmp.ExcelRowNumber,
  10635. 'Assign to is required'
  10636. FROM #Import_Staging tmp
  10637. WHERE AssignTo IS NULL
  10638.  
  10639. UNION ALL
  10640.  
  10641. -- Assign to must be a valid reference
  10642. SELECT
  10643. tmp.ExcelRowNumber,
  10644. '"' + tmp.AssignTo + '" is not a valid Member_ID for Assign To'
  10645. FROM #Import_Staging tmp
  10646. LEFT OUTER JOIN Member mem
  10647. ON tmp.AssignTo = mem.Member_ID
  10648. WHERE mem.Member_RecID IS NULL
  10649. AND tmp.AssignTo IS NOT NULL
  10650. AND @ForceMode <> 1
  10651.  
  10652. UNION ALL
  10653.  
  10654. -- Subject is required
  10655. SELECT
  10656. tmp.ExcelRowNumber,
  10657. 'Subject is required'
  10658. FROM #Import_Staging tmp
  10659. WHERE tmp.Subject IS NULL
  10660.  
  10661. UNION ALL
  10662.  
  10663. -- Subject must be <= 100 characters
  10664. SELECT
  10665. tmp.ExcelRowNumber,
  10666. 'Subject cannot exceed 100 characters'
  10667. FROM #Import_Staging tmp
  10668. WHERE LEN(tmp.[Subject]) > 100
  10669. AND tmp.[Subject] IS NOT NULL
  10670.  
  10671. UNION ALL
  10672.  
  10673. -- Activity status is required
  10674. SELECT
  10675. tmp.ExcelRowNumber,
  10676. 'Activity Status is required'
  10677. FROM #Import_Staging tmp
  10678. WHERE tmp.ActivityStatus IS NULL
  10679.  
  10680. UNION ALL
  10681.  
  10682. -- Activity status must be a valid reference
  10683. SELECT
  10684. tmp.ExcelRowNumber,
  10685. 'Activity status: "' + tmp.ActivityStatus + '" is not a valid status'
  10686. FROM #Import_Staging tmp
  10687. LEFT OUTER JOIN SO_Act_Status stat
  10688. ON stat.[Description] = tmp.ActivityStatus
  10689. WHERE stat.SO_Act_Status_RecID IS NULL
  10690. AND tmp.ActivityStatus IS NOT NULL
  10691.  
  10692. UNION ALL
  10693.  
  10694. -- Company name must be 50 characters or less
  10695. SELECT
  10696. tmp.ExcelRowNumber,
  10697. 'Company name must be less than 50 characters'
  10698. FROM #Import_Staging tmp
  10699. WHERE LEN(tmp.Company_Name) > 50
  10700. AND tmp.Company_Name IS NOT NULL
  10701.  
  10702. UNION ALL
  10703.  
  10704. -- Company Name is Required
  10705. SELECT
  10706. tmp.ExcelRowNumber,
  10707. 'Company Name is required'
  10708. FROM #Import_Staging tmp
  10709. WHERE tmp.Company_Name IS NULL
  10710. AND Legacy_ID IS NULL
  10711.  
  10712. UNION ALL
  10713.  
  10714. -- Check that company names are valid
  10715. SELECT
  10716. tmp.ExcelRowNumber,
  10717. 'Company not found: "' + ISNULL(tmp.Company_Name, '') + '"'
  10718. FROM #Import_Staging tmp
  10719. WHERE Company_Name IS NOT NULL
  10720. AND Company_RecID IS NULL
  10721.  
  10722. UNION ALL
  10723.  
  10724. -- Check for more than one company with the same name
  10725. SELECT
  10726. tmp.ExcelRowNumber,
  10727. 'There are more than one companies named "' + ISNULL(Company_Name, '') + '" - company name must be unique'
  10728. FROM #Import_Staging tmp
  10729. WHERE Company_Duplicate_Flag = 1
  10730.  
  10731. UNION ALL
  10732.  
  10733. -- Check that contact is valid
  10734. SELECT
  10735. tmp.ExcelRowNumber,
  10736. 'Unable to locate contact: "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '') + '"'
  10737. FROM #Import_Staging tmp
  10738. WHERE Contact_RecID IS NULL
  10739. AND tmp.ContactName IS NOT NULL
  10740. AND tmp.Company_Duplicate_Flag = 0
  10741. AND tmp.Company_RecID IS NOT NULL
  10742.  
  10743. UNION ALL
  10744.  
  10745. -- Check for duplicate contacts within company
  10746. SELECT
  10747. tmp.ExcelRowNumber,
  10748. 'There are more than one contacts named "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
  10749. FROM #Import_Staging tmp
  10750. WHERE tmp.Contact_Duplicate_Flag = 1
  10751. AND tmp.Company_Duplicate_Flag = 0
  10752.  
  10753. UNION ALL
  10754.  
  10755. -- Check that a default contact for company exists if contact is null
  10756. SELECT
  10757. tmp.ExcelRowNumber,
  10758. 'Contact must be specified for company: "' + ISNULL(tmp.Company_Name, '') + '" because no default contact exists for this company'
  10759. FROM #Import_Staging tmp
  10760. WHERE tmp.Contact_RecID IS NULL
  10761. AND tmp.ContactName IS NULL
  10762. AND tmp.Company_Name IS NOT NULL
  10763. AND tmp.Company_RecID IS NOT NULL
  10764. AND tmp.Company_Duplicate_Flag = 0
  10765.  
  10766. UNION ALL
  10767.  
  10768. -- Activity type must be a valid reference if entered
  10769. SELECT
  10770. tmp.ExcelRowNumber,
  10771. 'Invalid activity type: "' + tmp.ActivityType + '"'
  10772. FROM #Import_Staging tmp
  10773. LEFT OUTER JOIN SO_Activity_Type aty
  10774. ON aty.[Description] = tmp.ActivityType
  10775. OR aty.SO_Activity_Type_ID = tmp.ActivityType
  10776. WHERE tmp.ActivityType IS NOT NULL
  10777. AND aty.SO_Activity_Type_RecID IS NULL
  10778.  
  10779. UNION ALL
  10780.  
  10781. -- Default activity type must exist if not entered on spreadsheet
  10782. SELECT
  10783. tmp.ExcelRowNumber,
  10784. 'Activity type is not specified and no default exists'
  10785. FROM #Import_Staging tmp
  10786. LEFT OUTER JOIN SO_Activity_Type sot
  10787. ON sot.Default_Flag = 1
  10788. AND sot.Inactive_Flag = 0
  10789. WHERE tmp.ActivityType IS NULL
  10790. AND sot.SO_Activity_Type_RecID IS NULL
  10791.  
  10792. UNION ALL
  10793.  
  10794. -- Assign By must be a valid reference if specified
  10795. SELECT
  10796. tmp.ExcelRowNumber,
  10797. '"' + tmp.AssignBy + '" is not a valid Member_ID for Assign By'
  10798. FROM #Import_Staging tmp
  10799. LEFT OUTER JOIN Member mem
  10800. ON tmp.AssignBy = mem.Member_ID
  10801. WHERE mem.Member_RecID IS NULL
  10802. AND tmp.AssignBy IS NOT NULL
  10803.  
  10804. UNION ALL
  10805.  
  10806. -- If specified, Marketing campaign must be a valid reference
  10807. SELECT
  10808. tmp.ExcelRowNumber,
  10809. 'Invalid marketing campaign: "' + MarketingCampaign + '"'
  10810. FROM #Import_Staging tmp
  10811. LEFT OUTER JOIN Marketing_Campaign mc
  10812. ON mc.Marketing_ID = tmp.MarketingCampaign
  10813. WHERE mc.Marketing_Campaign_RecID IS NULL
  10814. AND tmp.MarketingCampaign IS NOT NULL
  10815.  
  10816. UNION ALL
  10817.  
  10818. -- If marketing campaign specified, it must start prior to due date
  10819. SELECT
  10820. tmp.ExcelRowNumber,
  10821. 'Marketing campaign start date cannot be after activity due date.'
  10822. FROM #Import_Staging tmp
  10823. INNER JOIN Marketing_Campaign mc
  10824. ON mc.Marketing_ID = tmp.MarketingCampaign
  10825. WHERE tmp.MarketingCampaign IS NOT NULL
  10826. AND mc.Date_Start IS NOT NULL
  10827. AND mc.Date_Start > dtmDueDate
  10828. AND tmp.dtmDueDate IS NOT NULL
  10829.  
  10830. UNION ALL
  10831.  
  10832. -- If marketing campaign specified, Due date must be prior to end date
  10833. SELECT
  10834. tmp.ExcelRowNumber,
  10835. 'Activity due date cannot be after end date of marketing campaign.'
  10836. FROM #Import_Staging tmp
  10837. INNER JOIN Marketing_Campaign mc
  10838. ON mc.Marketing_ID = tmp.MarketingCampaign
  10839. WHERE tmp.MarketingCampaign IS NOT NULL
  10840. AND mc.Date_Cancel IS NOT NULL
  10841. AND tmp.dtmDueDate > mc.Date_Cancel
  10842. AND tmp.dtmDueDate IS NOT NULL
  10843.  
  10844. UNION ALL
  10845.  
  10846. -- Due date must be entered if start time, end time, or reminder minutes are used
  10847. SELECT
  10848. tmp.ExcelRowNumber,
  10849. 'If start/end time or reminder minutes are used, Due date is required'
  10850. FROM #Import_Staging tmp
  10851. WHERE tmp.DueDate IS NULL
  10852. AND COALESCE(tmp.StartTime, tmp.EndTime, tmp.ReminderMinutes) IS NOT NULL
  10853.  
  10854. UNION ALL
  10855.  
  10856. -- Due date must be a valid date if entered
  10857. SELECT
  10858. tmp.ExcelRowNumber,
  10859. 'Due date must be a valid date - Please use MM/DD/YYYY format'
  10860. FROM #Import_Staging tmp
  10861. WHERE (ISDATE(tmp.DueDate) = 0)
  10862. AND tmp.DueDate IS NOT NULL
  10863.  
  10864. UNION ALL
  10865.  
  10866. -- Start time must be a valid time if entered
  10867. SELECT
  10868. tmp.ExcelRowNumber,
  10869. 'Start time must be in 24 hour format - "' + tmp.StartTime + '" is invalid'
  10870. FROM #Import_Staging tmp
  10871. WHERE ISDATE(tmp.StartTime) = 0
  10872. AND tmp.StartTime IS NOT NULL
  10873.  
  10874. UNION ALL
  10875.  
  10876. -- End time must be a valid time if entered
  10877. SELECT
  10878. tmp.ExcelRowNumber,
  10879. 'End time must be in 24 hour format - "' + tmp.EndTime + '" is invalid'
  10880. FROM #Import_Staging tmp
  10881. WHERE ISDATE(tmp.EndTime) = 0
  10882. AND tmp.EndTime IS NOT NULL
  10883.  
  10884. UNION ALL
  10885.  
  10886. -- Start time required if reminder minutes used
  10887. SELECT
  10888. tmp.ExcelRowNumber,
  10889. 'Start time is required if reminder minutes are used'
  10890. FROM #Import_Staging tmp
  10891. WHERE tmp.StartTime IS NULL
  10892. AND tmp.ReminderMinutes IS NOT NULL
  10893.  
  10894. UNION ALL
  10895.  
  10896. -- End time required if reminder minutes used
  10897. SELECT
  10898. tmp.ExcelRowNumber,
  10899. 'End time is required if reminder minutes are used'
  10900. FROM #Import_Staging tmp
  10901. WHERE tmp.EndTime IS NULL
  10902. AND tmp.ReminderMinutes IS NOT NULL
  10903.  
  10904. UNION ALL
  10905.  
  10906. -- Reminder minutes must be valid
  10907. SELECT
  10908. tmp.ExcelRowNumber,
  10909. 'Invalid reminder minutes: "' + tmp.ReminderMinutes + '"'
  10910. FROM #Import_Staging tmp
  10911. WHERE tmp.ReminderMinutes NOT IN('0', '5', '10', '15', '30', '60', '120', '180', '240', '300', '360', '420', '480', '540', '600', '660', '720', '1440', '10080', '43200', '86400', '129600')
  10912. AND tmp.ReminderMinutes IS NOT NULL
  10913.  
  10914. UNION ALL
  10915.  
  10916. -- Activity status must be closed if Activity type is inactive
  10917. SELECT
  10918. tmp.ExcelRowNumber,
  10919. 'Activity type: "' + tmp.ActivityType + '" is inactive - cannot import activity in open status with an inactive activity type'
  10920. FROM #Import_Staging tmp
  10921. INNER JOIN SO_Act_Status sos
  10922. ON sos.Closed_Flag = 0
  10923. AND sos.[Description] = tmp.ActivityStatus
  10924. INNER JOIN SO_Activity_Type sot
  10925. ON sot.Inactive_Flag = 1
  10926. AND sot.[Description] = tmp.ActivityType
  10927. WHERE tmp.ActivityType IS NOT NULL
  10928.  
  10929. -- Insert notification messages for any created references
  10930. INSERT INTO #tblResults
  10931. (
  10932. RowNumber,
  10933. ValMsg,
  10934. Warning_Flag,
  10935. ReferenceType
  10936. )
  10937.  
  10938. SELECT
  10939. NULL,
  10940. ISNULL(cont.First_Name, '') + ' ' + ISNULL(cont.Last_Name, ''),
  10941. 1,
  10942. 'Contact(s)'
  10943. FROM dbo.Contact cont
  10944. WHERE cont.Updated_By = @ImportBatchUser
  10945.  
  10946. UNION ALL
  10947.  
  10948. SELECT
  10949. NULL,
  10950. sot.[Description],
  10951. 1,
  10952. 'Activity Types(s)'
  10953. FROM dbo.SO_Activity_Type sot
  10954. WHERE sot.Updated_By = @ImportBatchUser
  10955.  
  10956. UNION ALL
  10957.  
  10958. SELECT DISTINCT
  10959. ExcelRowNumber,
  10960. 'Company: "' + tmp.Company_Name + '" fuzzy matched to Company: ' + tmp.Company_Name_Fuzzy,
  10961. 1,
  10962. NULL
  10963. FROM #Import_Staging tmp
  10964. WHERE Company_Name_Fuzzy IS NOT NULL
  10965.  
  10966. UNION ALL
  10967.  
  10968. SELECT DISTINCT
  10969. ExcelRowNumber,
  10970. 'Contact "' + tmp.ContactName + '" fuzzy matched to Contact: ' + tmp.Contact_Name_Fuzzy,
  10971. 1,
  10972. NULL
  10973. FROM #Import_Staging tmp
  10974. WHERE Contact_Name_Fuzzy IS NOT NULL
  10975.  
  10976. -- Return results
  10977. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  10978. BEGIN
  10979.  
  10980. exec dbo.usp_Condense_Validation_Results
  10981.  
  10982. SELECT
  10983. 0 AS ValPassed,
  10984. 0 AS RowNumber,
  10985. ValMsg
  10986. FROM #ResultsCondensed
  10987.  
  10988. ROLLBACK TRANSACTION
  10989. RETURN
  10990.  
  10991. END
  10992. ELSE
  10993. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
  10994. BEGIN
  10995.  
  10996. exec dbo.usp_Condense_Validation_Results
  10997.  
  10998. SELECT
  10999. 2 AS ValPassed,
  11000. 0 AS RowNumber,
  11001. ValMsg
  11002. FROM #ResultsCondensed res
  11003.  
  11004.  
  11005. UNION ALL
  11006.  
  11007. SELECT
  11008. 2 AS ValPassed,
  11009. 0 AS RowNumber,
  11010. 'The following ' + ReferenceType + ' will be created: '+
  11011. STUFF(
  11012. (SELECT ', ' + ValMsg
  11013. FROM #tblResults
  11014. WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
  11015. FOR XML PATH (''))
  11016. , 1, 1, '') AS ValMsg
  11017. FROM #tblResults res
  11018. WHERE ReferenceType IS NOT NULL
  11019. GROUP BY ReferenceType
  11020.  
  11021. ROLLBACK TRANSACTION
  11022. EXEC usp_Import_Record_Validation @TableName
  11023.  
  11024. END
  11025. ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  11026. BEGIN
  11027. SELECT
  11028. 1 AS ValPassed,
  11029. NULL AS RowNumber,
  11030. NULL AS ValMsg
  11031.  
  11032. ROLLBACK TRANSACTION
  11033. EXEC usp_Import_Record_Validation @TableName
  11034. END
  11035.  
  11036. END
  11037.  
  11038. GO
  11039.  
  11040. -- =============================================
  11041. -- Author: m.gray
  11042. -- Create date: 04/08/2013
  11043. -- Description: Performs final validation
  11044. -- and inserts for activities import
  11045. -- Sample call: EXEC usp_AC_ImportPush 'TMP_Import_fff0c4a40ed041e688baac5959c268ff', 0, 1
  11046. -- =============================================
  11047.  
  11048. ALTER PROCEDURE [dbo].[usp_AC_ImportPush]
  11049. @TableName VARCHAR(MAX),
  11050. @DebugMode INT = 0,
  11051. @Forcemode BIT = 0
  11052. AS
  11053. BEGIN TRY
  11054.  
  11055. -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
  11056. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  11057. BEGIN
  11058. DROP TABLE #Import_Staging
  11059. END
  11060.  
  11061. -- Dynamic statement to insert to staging table
  11062. DECLARE @DSQL VARCHAR(MAX)
  11063.  
  11064. -- Fully qualified name of source table
  11065. DECLARE @SourceTable VARCHAR(300)
  11066. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  11067.  
  11068. -- Object_ID of source table
  11069. DECLARE @Source_Object_ID INT
  11070. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  11071.  
  11072. -- Flag to indicate migration being matched on Legacy_ID
  11073. DECLARE @Legacy_Flag BIT = 0
  11074.  
  11075. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  11076. BEGIN
  11077. DROP TABLE #Import_Staging
  11078. END
  11079.  
  11080. CREATE TABLE #Import_Staging
  11081. (
  11082. ExcelRowNumber INT,
  11083. AssignTo nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11084. [Subject] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11085. ActivityStatus nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11086. Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11087. ContactFirstName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11088. ContactLastName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11089. ActivityType nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11090. AssignBy nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11091. MarketingCampaign nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11092. ReminderMinutes nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11093. Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  11094. DueDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11095. StartTime nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11096. EndTime nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  11097. BatchID uniqueidentifier NULL,
  11098. AssignTo_Member_RecID VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  11099. AssignTo_Member_ID VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  11100. Activity_Status_RecID INT,
  11101. SO_Activity_Type_RecID INT,
  11102. AssignBy_Member_RecID VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  11103. Marketing_Campaign_RecID INT,
  11104. ConvertMessage VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  11105. Close_Flag BIT,
  11106. New_Identity INT,
  11107. StartDateTime DATETIME,
  11108. EndDateTime DATETIME,
  11109. Schedule_RecID INT,
  11110. Company_RecID INT NULL,
  11111. Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  11112. Company_Name_Fuzzy NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  11113. Company_Duplicate_Flag BIT NULL,
  11114. Contact_RecID INT NULL,
  11115. Contact_Duplicate_Flag BIT NULL,
  11116. Contact_Name_Fuzzy NVARCHAR(MAX),
  11117. ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  11118. Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
  11119. Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  11120. Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  11121. Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  11122. Legacy_Site_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  11123. Company_Address_RecID INT,
  11124. SR_Service_RecID INT,
  11125. SO_Opportunity_RecID INT,
  11126. Duplicate_Flag BIT,
  11127. Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  11128. Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  11129. Diff_Exclude_Flag BIT,
  11130. Date_Time_Start_UTC DATETIME,
  11131. Date_Time_End_UTC DATETIME
  11132. )
  11133. CREATE INDEX IX_Comp ON #Import_Staging(Legacy_Company_ID)
  11134. CREATE INDEX IX_Cont ON #Import_Staging(Legacy_Contact_ID)
  11135.  
  11136. SET NOCOUNT ON
  11137.  
  11138. -- Variable declaration
  11139. DECLARE
  11140. @ExpRowCount INT, -- Expected rowcount inserts - Used for validation
  11141. @ActualRowCount INT,
  11142. @ErrorMsg VARCHAR(350), -- Variable to hold custom error message
  11143. @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
  11144. @ImportBatchUser VARCHAR(15), -- Unique value to identify records created by this import
  11145. @MAX_SO_Activity_RecID INT, -- Highest SO_Activity_RecID (Performance - helps w/ slow join on this table)
  11146. @MAX_Schedule_RecID INT, -- Highest SO_Activity_RecID (Performance - helps w/ slow join on this table)
  11147. @MAX_Schedule_Detail_RecID INT, -- Highest Schedule_Detail_RecID (Performance - helps w/ slow join on this table)
  11148. @UTCOffSet INT = (SELECT DATEDIFF(HOUR, GETDATE(), GETUTCDATE()))
  11149.  
  11150. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  11151. SELECT @ImportBatchUser =
  11152. 'CONV_'
  11153. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  11154. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  11155. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  11156. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  11157.  
  11158.  
  11159. -- Populate Staging table with initial values
  11160. -- Build statement to populate validation temp table
  11161. SELECT @DSQL= '
  11162. INSERT INTO #Import_Staging
  11163. (
  11164. ExcelRowNumber,
  11165. AssignTo,
  11166. [Subject],
  11167. ActivityStatus,
  11168. Company_Name,
  11169. ContactFirstName,
  11170. ContactLastName,
  11171. ActivityType,
  11172. AssignBy,
  11173. MarketingCampaign,
  11174. DueDate,
  11175. StartTime,
  11176. EndTime,
  11177. ReminderMinutes,
  11178. Notes,
  11179. Company_Match_Val
  11180. )
  11181. SELECT
  11182. [Excel Row Number],
  11183. [Assign To],
  11184. [Subject],
  11185. [Activity Status],
  11186. [Company Name],
  11187. [Contact First Name],
  11188. [Contact Last Name],
  11189. [Activity Type],
  11190. [Assign By],
  11191. [Marketing Campaign],
  11192. [Due Date],
  11193. [Start Time],
  11194. [End Time],
  11195. [Reminder Minutes],
  11196. [Notes],
  11197. LEFT([Company Name], 3)
  11198. FROM ' + @SourceTable
  11199.  
  11200. EXEC(@DSQL)
  11201.  
  11202. BEGIN TRANSACTION AC_Import
  11203.  
  11204. -- If this is a custom migration, remove datatype config row
  11205. DELETE FROM #Import_Staging
  11206. WHERE [Subject] = 'CW_Import_Config_Row'
  11207.  
  11208. -- Trim subject as needed
  11209. UPDATE #Import_Staging
  11210. SET [Subject] = LEFT([Subject], 100)
  11211.  
  11212. -- Update single space or blank string to null
  11213. UPDATE #Import_Staging SET
  11214. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  11215. AssignTo = CASE WHEN AssignTo IN('', ' ') THEN NULL ELSE AssignTo END,
  11216. [Subject] = CASE WHEN [Subject] IN('', ' ') THEN NULL ELSE [Subject] END,
  11217. ActivityStatus = CASE WHEN ActivityStatus IN('', ' ') THEN NULL ELSE ActivityStatus END,
  11218. Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
  11219. ContactFirstName = CASE WHEN ContactFirstName IN('', ' ') THEN NULL ELSE ContactFirstName END,
  11220. ContactLastName = CASE WHEN ContactLastName IN('', ' ') THEN NULL ELSE ContactLastName END,
  11221. ActivityType = CASE WHEN ActivityType IN('', ' ') THEN NULL ELSE ActivityType END,
  11222. AssignBy = CASE WHEN AssignBy IN('', ' ') THEN NULL ELSE AssignBy END,
  11223. MarketingCampaign = CASE WHEN MarketingCampaign IN('', ' ') THEN NULL ELSE MarketingCampaign END,
  11224. ReminderMinutes = CASE WHEN ReminderMinutes IN('', ' ') THEN NULL ELSE ReminderMinutes END,
  11225. Notes = CASE WHEN Notes IN('', ' ') THEN NULL ELSE Notes END,
  11226. DueDate = CASE WHEN DueDate IN('', ' ') THEN NULL ELSE REPLACE(DueDate, '000000', '') END,
  11227. StartTime = CASE WHEN StartTime IN('', ' ') THEN NULL ELSE StartTime END,
  11228. EndTime = CASE WHEN EndTime IN('', ' ') THEN NULL ELSE EndTime END
  11229.  
  11230. UPDATE #Import_Staging SET [Subject] = '[No Subject]' WHERE [Subject] IS NULL
  11231.  
  11232. -- Table variable to hold column names from source table
  11233. DECLARE @SourceColumns TABLE
  11234. (
  11235. ColumnName VARCHAR(255)
  11236. )
  11237.  
  11238. -- Populate @SourceColumns
  11239. INSERT INTO @SourceColumns
  11240. (
  11241. ColumnName
  11242. )
  11243.  
  11244. SELECT
  11245. name
  11246. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  11247.  
  11248. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
  11249. BEGIN
  11250. SELECT @DSQL = '
  11251. UPDATE tmp
  11252. SET tmp.Legacy_ID = src.Legacy_ID
  11253. FROM #Import_Staging tmp
  11254. INNER JOIN ' + @SourceTable + ' src
  11255. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  11256.  
  11257. EXEC(@DSQL)
  11258. END
  11259.  
  11260. -- Condense contact first and last names to ContactName
  11261. UPDATE tmp
  11262. SET ContactName = LTRIM(ISNULL(tmp.ContactFirstName + ' ', '') + ISNULL(tmp.ContactLastName, ''))
  11263. FROM #Import_Staging tmp
  11264.  
  11265. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  11266. BEGIN
  11267. SELECT @Legacy_Flag = 1
  11268. EXEC usp_Import_Match_Legacy @TableName, 'Activity'
  11269. END
  11270.  
  11271. IF(@Legacy_Flag = 0)
  11272. BEGIN
  11273.  
  11274. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  11275. IF Object_ID('tempdb..#Company') IS NOT NULL
  11276. BEGIN
  11277. DROP TABLE #Company
  11278. END
  11279.  
  11280. SELECT DISTINCT
  11281. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  11282. comp.Company_ID,
  11283. comp.Company_Name,
  11284. Delete_Flag,
  11285. LEFT(Company_Name, 3) AS Company_Match_Val,
  11286. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  11287. 0 AS Duplicate_Flag
  11288. INTO #Company
  11289. FROM dbo.Company comp
  11290. WHERE Delete_Flag = 0
  11291.  
  11292. -- Table to hold contact information
  11293. IF Object_ID('tempdb..#Contact') IS NOT NULL
  11294. BEGIN
  11295. DROP TABLE #Contact
  11296. END
  11297.  
  11298. SELECT
  11299. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  11300. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  11301. First_Name,
  11302. Last_Name,
  11303. cont.Company_RecID,
  11304. Default_Flag
  11305. INTO #Contact
  11306. FROM dbo.Contact cont
  11307. INNER JOIN #Company comp
  11308. ON comp.Company_RecID = cont.Company_RecID
  11309.  
  11310. -- Match companies and contacts to grab recid
  11311. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  11312. END
  11313.  
  11314.  
  11315. -- If resource name is used for 'Assign To', update to use member_id instead
  11316. UPDATE tmp
  11317. SET tmp.AssignTo = mem.Member_ID
  11318. FROM #Import_Staging tmp
  11319. INNER JOIN dbo.Member mem
  11320. ON ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_name, '') = tmp.AssignTo
  11321.  
  11322. -- Grab reference RecID's needed to start import
  11323. -- AssignTo
  11324. UPDATE stag
  11325. SET stag.AssignTo_Member_RecID = mem.Member_RecID,
  11326. stag.AssignTo_Member_ID = mem.Member_ID
  11327. FROM #Import_Staging stag
  11328. INNER JOIN Member mem
  11329. ON mem.Member_ID = stag.AssignTo
  11330.  
  11331. -- Activity Status
  11332. UPDATE stag
  11333. SET stag.Activity_Status_RecID = ast.SO_Act_Status_RecID
  11334. FROM #Import_Staging stag
  11335. INNER JOIN SO_Act_Status ast
  11336. ON ast.[Description] = stag.ActivityStatus
  11337.  
  11338. -- Status closed flag
  11339. UPDATE stag
  11340. SET stag.Close_Flag = ast.Closed_Flag
  11341. FROM #Import_Staging stag
  11342. INNER JOIN SO_Act_Status ast
  11343. ON ast.SO_Act_Status_RecID = stag.Activity_Status_RecID
  11344.  
  11345.  
  11346.  
  11347. -- If running in force mode, create references and override validations as necessary
  11348. -- Insert will differ between CW releases (Entered_By column may or may not be present - handle accordingly
  11349. IF(@Forcemode = 1 AND EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('SO_Activity_Type') AND name = 'Entered_By'))
  11350. BEGIN
  11351.  
  11352. -- Insert activity type if specified but not found
  11353. INSERT INTO dbo.SO_Activity_Type
  11354. (
  11355. Owner_ID,
  11356. SO_Activity_Type_ID,
  11357. [Description],
  11358. History_Flag,
  11359. Updated_By,
  11360. Cleanup_Flag,
  11361. Default_Flag,
  11362. Import_Flag,
  11363. email_Flag,
  11364. Memo_Flag,
  11365. Points_Value,
  11366. Inactive_Flag,
  11367. Entered_By
  11368. )
  11369.  
  11370. SELECT DISTINCT
  11371. 1,
  11372. SUBSTRING(ActivityType, 1, 15),
  11373. SUBSTRING(ActivityType, 1, 50),
  11374. 0,
  11375. @ImportBatchUser,
  11376. 0,
  11377. 0,
  11378. 0,
  11379. 0,
  11380. 0,
  11381. 0,
  11382. 0,
  11383. @ImportBatchUser
  11384. FROM #Import_Staging tmp
  11385. WHERE tmp.SO_Activity_Type_RecID IS NULL
  11386. AND tmp.ActivityType IS NOT NULL
  11387. AND NOT EXISTS(SELECT TOP 1 * FROM SO_Activity_Type ty WHERE ty.SO_Activity_Type_ID = SUBSTRING(ActivityType, 1, 15) OR ty.[Description] = tmp.ActivityType)
  11388.  
  11389. END
  11390.  
  11391. -- If running in force mode, create references and override validations as necessary
  11392. -- Insert will differ between CW releases (Entered_By column may or may not be present - handle accordingly
  11393. IF(@Forcemode = 1 AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('SO_Activity_Type') AND name = 'Entered_By'))
  11394. BEGIN
  11395.  
  11396. -- Insert activity type if specified but not found
  11397. INSERT INTO dbo.SO_Activity_Type
  11398. (
  11399. Owner_ID,
  11400. SO_Activity_Type_ID,
  11401. [Description],
  11402. History_Flag,
  11403. Updated_By,
  11404. Cleanup_Flag,
  11405. Default_Flag,
  11406. Import_Flag,
  11407. email_Flag,
  11408. Memo_Flag,
  11409. Points_Value,
  11410. Inactive_Flag
  11411. )
  11412.  
  11413. SELECT DISTINCT
  11414. 1,
  11415. SUBSTRING(ActivityType, 1, 15),
  11416. SUBSTRING(ActivityType, 1, 50),
  11417. 0,
  11418. @ImportBatchUser,
  11419. 0,
  11420. 0,
  11421. 0,
  11422. 0,
  11423. 0,
  11424. 0,
  11425. 0
  11426. FROM #Import_Staging tmp
  11427. WHERE tmp.SO_Activity_Type_RecID IS NULL
  11428. AND tmp.ActivityType IS NOT NULL
  11429. AND NOT EXISTS(SELECT TOP 1 * FROM SO_Activity_Type ty WHERE SO_Activity_Type_ID = SUBSTRING(ActivityType, 1, 15) OR ty.[Description] = tmp.ActivityType)
  11430.  
  11431. END
  11432.  
  11433. -- Activity type
  11434. UPDATE stag
  11435. SET stag.SO_Activity_Type_RecID = aty.SO_Activity_Type_RecID
  11436. FROM #Import_Staging stag
  11437. INNER JOIN SO_Activity_Type aty
  11438. ON aty.[Description] = stag.ActivityType
  11439. OR aty.SO_Activity_Type_ID = stag.ActivityType
  11440. WHERE stag.ActivityType IS NOT NULL
  11441.  
  11442. -- Get default Activity type if null
  11443. UPDATE stag
  11444. SET stag.SO_Activity_Type_RecID = aty.SO_Activity_Type_RecID
  11445. FROM #Import_Staging stag
  11446. INNER JOIN SO_Activity_Type aty
  11447. ON aty.Default_Flag = 1
  11448. AND aty.Inactive_Flag = 0
  11449. WHERE stag.ActivityType IS NULL
  11450.  
  11451. -- Assign By
  11452. UPDATE stag
  11453. SET stag.AssignBy_Member_RecID = mem.Member_RecID
  11454. FROM #Import_Staging stag
  11455. INNER JOIN Member mem
  11456. ON mem.Member_ID = stag.AssignBy
  11457. AND Stag.AssignBy IS NOT NULL
  11458.  
  11459. -- Marketing campaign
  11460. UPDATE stag
  11461. SET stag.Marketing_Campaign_RecID = mc.Marketing_Campaign_RecID
  11462. FROM #Import_Staging stag
  11463. INNER JOIN Marketing_Campaign mc
  11464. ON mc.Marketing_ID = stag.MarketingCampaign
  11465. WHERE stag.MarketingCampaign IS NOT NULL
  11466.  
  11467. -- Get zAdmin RecID
  11468. SELECT @zAdmin_Member_RecID = Member_RecID
  11469. FROM Member
  11470. WHERE Member_ID = 'zadmin'
  11471.  
  11472. -- If running in force mode, update invalid Member_ID to 'zAdmin
  11473. UPDATE stag
  11474. SET stag.AssignTo_Member_RecID = @zAdmin_Member_RecID,
  11475. stag.AssignTo_Member_ID = 'zAdmin'
  11476. FROM #Import_Staging stag
  11477. WHERE stag.AssignTo_Member_RecID IS NULL
  11478. AND @ForceMode = 1
  11479.  
  11480. -- Set ConvertMessage and error out if any invalid references
  11481. UPDATE stag
  11482. SET ConvertMessage =
  11483. CASE
  11484. WHEN stag.AssignTo_Member_RecID IS NULL THEN 'Invalid Assign To'
  11485. WHEN stag.Activity_Status_RecID IS NULL THEN 'Invalid Activity Status'
  11486. WHEN stag.Company_RecID IS NULL AND stag.Company_Name iS NOT NULL THEN 'Invalid Company Name'
  11487. WHEN stag.Contact_RecID IS NULL AND COALESCE(stag.Company_Name, stag.ContactFirstName, stag.ContactLastName) IS NOT NULL THEN 'Invalid contact'
  11488. WHEN stag.SO_Activity_Type_RecID IS NULL AND stag.ActivityType IS NOT NULL THEN 'Invalid activity type'
  11489. WHEN stag.AssignBy_Member_RecID IS NULL AND stag.AssignBy IS NOT NULL THEN 'Invalid Member ID'
  11490. WHEN stag.Marketing_Campaign_RecID IS NULL AND stag.MarketingCampaign IS NOT NULL THEN 'Invalid Marketing Campaign'
  11491. END
  11492. FROM #Import_Staging stag
  11493.  
  11494. -- Set original start/end times to time only (handles common mistake where entire date is supplied rather than time only)
  11495. UPDATE stag
  11496. SET stag.StartTime = CONVERT(CHAR(5), CAST(StartTime AS DATETIME), 108),
  11497. stag.EndTime = CONVERT(CHAR(5), CAST(EndTime AS DATETIME), 108)
  11498. FROM #Import_Staging stag
  11499.  
  11500. -- Get Start and end as datetime
  11501. UPDATE stag
  11502. SET stag.StartDateTime = CONVERT(NVARCHAR(25), CONVERT(DATETIME, DueDate, 102), 101) + ' ' + ISNULL(StartTime, '00:00'),
  11503. stag.EndDateTime = CONVERT(NVARCHAR(25), CONVERT(DATETIME, DueDate, 102), 101) + ' ' + + ISNULL(EndTime, '00:00')
  11504. FROM #Import_Staging stag
  11505.  
  11506. -- If there is an invalid reference, raise error
  11507. IF EXISTS(SELECT * FROM #Import_Staging WHERE ConvertMessage IS NOT NULL)
  11508. BEGIN
  11509. -- Raise error w/ 16 severity to jump to catch
  11510. RAISERROR('Validation Error', 16, 2)
  11511. END
  11512.  
  11513. -- Error if no zAdmin user
  11514. IF @zAdmin_Member_RecID IS NULL
  11515. BEGIN
  11516. RAISERROR('zAdmin user not found for this implementation - required for import', 16, 2)
  11517. END
  11518.  
  11519. ELSE
  11520.  
  11521. -- Validation suceeded - begin push
  11522. -- Get expected rowcount for insert to SO_Activity
  11523. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging
  11524. SELECT @Max_SO_Activity_RecID = ISNULL(MAX(SO_Activity_RecID), 0) FROM SO_Activity
  11525.  
  11526. UPDATE stag
  11527. SET stag.date_time_start_utc = DATEADD(HOUR, @UTCOFFSET, StartDateTime)
  11528. FROM #Import_Staging stag
  11529. WHERE ISDATE(StartDateTime) = 1
  11530.  
  11531. UPDATE stag
  11532. SET stag.date_time_end_utc = DATEADD(HOUR, @UTCOFFSET, EndDateTime)
  11533. FROM #Import_Staging stag
  11534. WHERE ISDATE(EndDateTime) = 1
  11535.  
  11536. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  11537. DROP TABLE #Force_Compile
  11538.  
  11539. CREATE TABLE #Force_Compile
  11540. (
  11541. Column_Name VARCHAR(20)
  11542. )
  11543.  
  11544. -- Perform insert to SO_Activity
  11545. -- Conditional based on structure to support various CW releases
  11546. IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
  11547. BEGIN
  11548.  
  11549. INSERT INTO SO_Activity
  11550. (
  11551. Owner_ID,
  11552. Assign_To,
  11553. Assigned_By,
  11554. Company_RecID,
  11555. SO_Activity_Type_RecID,
  11556. [Subject],
  11557. Date_Entered,
  11558. Entered_By,
  11559. Contact_RecID,
  11560. Contact_Name,
  11561. --Notes,
  11562. Close_Flag,
  11563. Date_Closed,
  11564. Closed_By,
  11565. Updated_By,
  11566. Last_Update,
  11567. so_act_status_recid,
  11568. Marketing_Campaign_RecID,
  11569. assignto_recid,
  11570. assignby_recid,
  11571. date_time_start,
  11572. date_time_end
  11573. )
  11574. OUTPUT INSERTED.Contact_Name, INSERTED.SO_Activity_RecID, 'Activity' INTO Import_Legacy_ID_Custom
  11575. SELECT
  11576. stag.ExcelRowNumber,
  11577. SUBSTRING(stag.AssignTo, 1, 15),
  11578. stag.AssignBy,
  11579. stag.Company_RecID,
  11580. stag.SO_Activity_Type_RecID,
  11581. stag.[Subject],
  11582. GETDATE(),
  11583. @ImportBatchUser,
  11584. stag.Contact_RecID,
  11585. Legacy_ID,
  11586. --stag.Notes,
  11587. stag.Close_Flag,
  11588. CASE WHEN stag.Close_Flag = 1 THEN GETDATE() ELSE NULL END,
  11589. CASE WHEN stag.Close_Flag = 1 THEN 'zAdmin' ELSE NULL END,
  11590. @ImportBatchUser,
  11591. GETDATE(),
  11592. stag.Activity_Status_RecID,
  11593. stag.Marketing_Campaign_RecID,
  11594. stag.AssignTo_Member_RecID,
  11595. stag.AssignBy_Member_RecID,
  11596. stag.StartDateTime,
  11597. stag.EndDateTime
  11598. FROM #Import_Staging stag
  11599. OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
  11600. END
  11601.  
  11602.  
  11603.  
  11604.  
  11605. IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
  11606. AND EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
  11607. BEGIN
  11608. INSERT INTO SO_Activity
  11609. (
  11610. Owner_ID,
  11611. Assign_To,
  11612. Assigned_By,
  11613. Company_RecID,
  11614. SO_Activity_Type_RecID,
  11615. [Subject],
  11616. Date_Entered,
  11617. Entered_By,
  11618. Contact_RecID,
  11619. Contact_Name,
  11620. --Notes,
  11621. Close_Flag,
  11622. Date_Closed,
  11623. Closed_By,
  11624. Updated_By,
  11625. Last_Update,
  11626. so_act_status_recid,
  11627. Marketing_Campaign_RecID,
  11628. assignto_recid,
  11629. assignby_recid,
  11630. date_time_end,
  11631. Date_Time_Start,
  11632. Date_Time_Start_UTC,
  11633. Date_Time_End_UTC,
  11634. Date_Entered_UTC,
  11635. Last_Update_UTC,
  11636. Date_Closed_UTC,
  11637. Currency_RecID
  11638. )
  11639. OUTPUT INSERTED.Contact_Name, INSERTED.SO_Activity_RecID, 'Activity' INTO Import_Legacy_ID_Custom
  11640. SELECT
  11641. stag.ExcelRowNumber,
  11642. SUBSTRING(stag.AssignTo, 1, 15),
  11643. stag.AssignBy,
  11644. stag.Company_RecID,
  11645. stag.SO_Activity_Type_RecID,
  11646. stag.[Subject],
  11647. GETDATE(),
  11648. @ImportBatchUser,
  11649. stag.Contact_RecID,
  11650. Legacy_ID,
  11651. --stag.Notes,
  11652. stag.Close_Flag,
  11653. CASE WHEN stag.Close_Flag = 1 THEN GETDATE() ELSE NULL END,
  11654. CASE WHEN stag.Close_Flag = 1 THEN 'zAdmin' ELSE NULL END,
  11655. @ImportBatchUser,
  11656. GETDATE(),
  11657. stag.Activity_Status_RecID,
  11658. stag.Marketing_Campaign_RecID,
  11659. stag.AssignTo_Member_RecID,
  11660. stag.AssignBy_Member_RecID,
  11661. stag.StartDateTime,
  11662. stag.EndDateTime,
  11663. stag.Date_Time_Start_UTC,
  11664. stag.Date_Time_End_UTC,
  11665. GETUTCDATE(),
  11666. GETUTCDATE(),
  11667. CASE WHEN stag.Close_Flag = 1 THEN GETUTCDATE() ELSE NULL END,
  11668. 7
  11669. FROM #Import_Staging stag
  11670. OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
  11671. END
  11672.  
  11673. IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
  11674. AND NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
  11675. BEGIN
  11676. INSERT INTO SO_Activity
  11677. (
  11678. Owner_ID,
  11679. Assign_To,
  11680. Assigned_By,
  11681. Company_RecID,
  11682. SO_Activity_Type_RecID,
  11683. [Subject],
  11684. Date_Entered,
  11685. Entered_By,
  11686. Contact_RecID,
  11687. Contact_Name,
  11688. --Notes,
  11689. Close_Flag,
  11690. Date_Closed,
  11691. Closed_By,
  11692. Updated_By,
  11693. Last_Update,
  11694. so_act_status_recid,
  11695. Marketing_Campaign_RecID,
  11696. assignto_recid,
  11697. assignby_recid,
  11698. date_time_end,
  11699. Date_Time_Start,
  11700. Date_Time_Start_UTC,
  11701. Date_Time_End_UTC,
  11702. Date_Entered_UTC,
  11703. Last_Update_UTC,
  11704. Date_Closed_UTC
  11705. )
  11706. OUTPUT INSERTED.Contact_Name, INSERTED.SO_Activity_RecID, 'Activity' INTO Import_Legacy_ID_Custom
  11707. SELECT
  11708. stag.ExcelRowNumber,
  11709. SUBSTRING(stag.AssignTo, 1, 15),
  11710. stag.AssignBy,
  11711. stag.Company_RecID,
  11712. stag.SO_Activity_Type_RecID,
  11713. stag.[Subject],
  11714. GETDATE(),
  11715. @ImportBatchUser,
  11716. stag.Contact_RecID,
  11717. Legacy_ID,
  11718. --stag.Notes,
  11719. stag.Close_Flag,
  11720. CASE WHEN stag.Close_Flag = 1 THEN GETDATE() ELSE NULL END,
  11721. CASE WHEN stag.Close_Flag = 1 THEN 'zAdmin' ELSE NULL END,
  11722. @ImportBatchUser,
  11723. GETDATE(),
  11724. stag.Activity_Status_RecID,
  11725. stag.Marketing_Campaign_RecID,
  11726. stag.AssignTo_Member_RecID,
  11727. stag.AssignBy_Member_RecID,
  11728. stag.StartDateTime,
  11729. stag.EndDateTime,
  11730. stag.Date_Time_Start_UTC,
  11731. stag.Date_Time_End_UTC,
  11732. GETUTCDATE(),
  11733. GETUTCDATE(),
  11734. CASE WHEN stag.Close_Flag = 1 THEN GETUTCDATE() ELSE NULL END
  11735. FROM #Import_Staging stag
  11736. OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
  11737. END
  11738.  
  11739.  
  11740. -- Join final table back to staging to capture newly inserted identities
  11741. UPDATE stag
  11742. SET stag.New_Identity = soa.SO_Activity_RecID
  11743. FROM #Import_Staging stag
  11744. INNER JOIN dbo.SO_Activity soa
  11745. ON soa.Owner_ID = stag.ExcelRowNumber
  11746. AND soa.Entered_By = @ImportBatchUser
  11747.  
  11748.  
  11749. -- Update Owner_ID in SO_Activity to 1 for newly inserted records
  11750. UPDATE act
  11751. SET act.Owner_ID = 1,
  11752. act.Contact_Name = ISNULL(ct.First_Name + ' ', '') + ISNULL(ct.Last_Name, '')
  11753. FROM SO_Activity act
  11754. CROSS APPLY(SELECT TOP 1 * FROM dbo.Contact cont WHERE cont.Contact_RecID = act.Contact_RecID)ct
  11755. WHERE act.SO_Activity_RecID > @Max_SO_Activity_RecID
  11756. AND act.Entered_By = @ImportBatchUser
  11757.  
  11758. IF EXISTS(SELECT TOP 1 * FROM sys.tables WHERE [Name] = 'SO_Activity_Notes')
  11759. BEGIN
  11760.  
  11761. INSERT INTO dbo.SO_Activity_Notes
  11762. (
  11763. SO_Activity_RecID,
  11764. Notes,
  11765. Internal_Analysis_Flag,
  11766. Date_Created_UTC,
  11767. Entered_By,
  11768. Last_Update_UTC,
  11769. Updated_By
  11770. )
  11771.  
  11772. SELECT
  11773. stag.New_Identity, --SO_Activity_RecID,
  11774. stag.Notes, --Notes,
  11775. 0, --Internal_Analysis_Flag,
  11776. GETUTCDATE(), --Date_Created_UTC,
  11777. 'Migration', --Entered_By,
  11778. GETUTCDATE(), --Last_Update_UTC,
  11779. 'Migration'--Updated_By
  11780. FROM #Import_Staging stag
  11781. WHERE stag.Notes IS NOT NULL
  11782. END
  11783.  
  11784. -- Get highest Schedule_RecID
  11785. SELECT @MAX_Schedule_RecID = ISNULL(MAX(Schedule_RecID), 0) FROM dbo.Schedule
  11786. -- Perform insert to Schedule table
  11787. IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Schedule')
  11788. BEGIN
  11789. INSERT INTO Schedule
  11790. (
  11791. Owner_ID,
  11792. RecID,
  11793. Schedule_Type_RecID,
  11794. Member_ID,
  11795. Date_Time_Start,
  11796. Date_Time_End,
  11797. close_flag,
  11798. Hours_Estimated,
  11799. Schedule_Desc,
  11800. Last_Update,
  11801. Updated_By,
  11802. Syncable,
  11803. Reminder_Flag,
  11804. Reminder_Minutes,
  11805. All_Day_Flag,
  11806. Duration,
  11807. Xref_Mbr_RecID,
  11808. Hours_Sched,
  11809. Hours_per_Day,
  11810. Ack_Flag,
  11811. --DW_1_Flag,
  11812. --DW_2_Flag,
  11813. --DW_3_Flag,
  11814. --DW_4_Flag,
  11815. --DW_5_Flag,
  11816. --DW_6_Flag,
  11817. --DW_7_Flag,
  11818. --IncHol_Flag,
  11819. Billable_Flag,
  11820. Date_Entered,
  11821. Date_Time_Start_UTC,
  11822. Date_Time_End_UTC,
  11823. Date_Entered_UTC
  11824. )
  11825.  
  11826. SELECT
  11827. stag.ExcelRowNumber,
  11828. stag.New_Identity,
  11829. 1, -- (always 1????)
  11830. stag.AssignTo_Member_ID,
  11831. stag.StartDateTime,
  11832. stag.EndDateTime,
  11833. stag.Close_Flag,
  11834. 0,
  11835. COALESCE(ISNULL(stag.ActivityType + ' / ', '') + ISNULL(stag.Company_Name, ''), stag.[Subject]),
  11836. GETDATE(),
  11837. @ImportBatchUser,
  11838. 1,
  11839. CASE WHEN stag.ReminderMinutes IS NOT NULL THEN 1 ELSE 0 END,
  11840. ISNULL(stag.ReminderMinutes, 0),
  11841. 0,
  11842. 1,
  11843. stag.AssignTo_Member_RecID,
  11844. DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
  11845. DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
  11846. 0,
  11847. --0,
  11848. --0,
  11849. --0,
  11850. --0,
  11851. --0,
  11852. --0,
  11853. --0,
  11854. --0,
  11855. 0,
  11856. GETDATE(),
  11857. Date_Time_Start_UTC,
  11858. Date_Time_End_UTC,
  11859. GETUTCDATE()
  11860. FROM #Import_Staging stag
  11861. OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
  11862. END
  11863.  
  11864. IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Schedule')
  11865. BEGIN
  11866. INSERT INTO Schedule
  11867. (
  11868. Owner_ID,
  11869. RecID,
  11870. Schedule_Type_RecID,
  11871. Member_ID,
  11872. Date_Time_Start,
  11873. Date_Time_End,
  11874. close_flag,
  11875. Hours_Estimated,
  11876. Schedule_Desc,
  11877. Last_Update,
  11878. Updated_By,
  11879. Syncable,
  11880. Reminder_Flag,
  11881. Reminder_Minutes,
  11882. All_Day_Flag,
  11883. Duration,
  11884. Xref_Mbr_RecID,
  11885. Hours_Sched,
  11886. Hours_per_Day,
  11887. Ack_Flag,
  11888. --DW_1_Flag,
  11889. --DW_2_Flag,
  11890. --DW_3_Flag,
  11891. --DW_4_Flag,
  11892. --DW_5_Flag,
  11893. --DW_6_Flag,
  11894. --DW_7_Flag,
  11895. --IncHol_Flag,
  11896. Billable_Flag,
  11897. Date_Entered
  11898. )
  11899.  
  11900. SELECT
  11901. stag.ExcelRowNumber,
  11902. stag.New_Identity,
  11903. 1, -- (always 1????)
  11904. stag.AssignTo_Member_ID,
  11905. stag.StartDateTime,
  11906. stag.EndDateTime,
  11907. stag.Close_Flag,
  11908. 0,
  11909. COALESCE(ISNULL(stag.ActivityType + ' / ', '') + ISNULL(stag.Company_Name, ''), stag.[Subject]),
  11910. GETDATE(),
  11911. @ImportBatchUser,
  11912. 1,
  11913. CASE WHEN stag.ReminderMinutes IS NOT NULL THEN 1 ELSE 0 END,
  11914. ISNULL(stag.ReminderMinutes, 0),
  11915. 0,
  11916. 1,
  11917. stag.AssignTo_Member_RecID,
  11918. DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
  11919. DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
  11920. 0,
  11921. --0,
  11922. --0,
  11923. --0,
  11924. --0,
  11925. --0,
  11926. --0,
  11927. --0,
  11928. --0,
  11929. 0,
  11930. GETDATE()
  11931. FROM #Import_Staging stag
  11932. OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
  11933. END
  11934.  
  11935.  
  11936. -- Join back to staging table to get Schedule RecID
  11937. UPDATE stag
  11938. SET stag.Schedule_RecID = sched.Schedule_RecID
  11939. FROM #Import_Staging stag
  11940. INNER JOIN dbo.Schedule sched
  11941. ON stag.ExcelRowNumber = sched.Owner_ID
  11942. WHERE sched.Schedule_RecID > @MAX_Schedule_RecID
  11943. AND Updated_By = @ImportBatchUser
  11944.  
  11945. -- Set Owner_ID to 1 in schedule table for newly inserted records
  11946. UPDATE dbo.Schedule
  11947. SET Owner_ID = 1
  11948. WHERE Schedule_RecID > @Max_Schedule_RecID
  11949. AND Updated_By = @ImportBatchUser
  11950.  
  11951. -- Get highest Schedule_Detail_RecID
  11952. SELECT @MAX_Schedule_Detail_RecID = ISNULL(MAX(Schedule_Detail_RecID), 0) FROM dbo.Schedule_Detail
  11953.  
  11954.  
  11955. -- Perform schedule detail insert
  11956. IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Schedule')
  11957. BEGIN
  11958. INSERT INTO Schedule_Detail
  11959. (
  11960. Schedule_RecID,
  11961. Date_Scheduled,
  11962. Hours_Scheduled,
  11963. Start_Time,
  11964. End_Time,
  11965. Member_RecID,
  11966. Schedule_Type_ID,
  11967. RecID,
  11968. Updated_By,
  11969. Last_Update,
  11970. time_flag,
  11971. --Upd_Flag,
  11972. Date_Time_Start_UTC,
  11973. Date_Time_End_UTC
  11974. )
  11975. SELECT
  11976. stag.Schedule_RecID,
  11977. stag.DueDate,
  11978. DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
  11979. CAST('1/1/1900 ' + ISNULL(StartTime, '00:00') AS DATETIME),
  11980. CAST('1/1/1900 ' + ISNULL(EndTime, '00:00') AS DATETIME),
  11981. stag.AssignTo_Member_RecID,
  11982. 'C',
  11983. stag.New_Identity,
  11984. @ImportBatchUser,
  11985. GETDATE(),
  11986. 0,
  11987. --0,
  11988. Date_Time_Start_UTC,
  11989. Date_Time_End_UTC
  11990. FROM #Import_Staging stag
  11991. OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
  11992. WHERE Schedule_RecID IS NOT NULL
  11993. END
  11994.  
  11995. IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Schedule')
  11996. BEGIN
  11997. INSERT INTO Schedule_Detail
  11998. (
  11999. Schedule_RecID,
  12000. Date_Scheduled,
  12001. Hours_Scheduled,
  12002. Start_Time,
  12003. End_Time,
  12004. Member_RecID,
  12005. Schedule_Type_ID,
  12006. RecID,
  12007. Updated_By,
  12008. Last_Update,
  12009. time_flag
  12010. --Upd_Flag
  12011. )
  12012. SELECT
  12013. stag.Schedule_RecID,
  12014. stag.DueDate,
  12015. DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
  12016. CAST('1/1/1900 ' + ISNULL(StartTime, '00:00') AS DATETIME),
  12017. CAST('1/1/1900 ' + ISNULL(EndTime, '00:00') AS DATETIME),
  12018. stag.AssignTo_Member_RecID,
  12019. 'C',
  12020. stag.New_Identity,
  12021. @ImportBatchUser,
  12022. GETDATE(),
  12023. 0
  12024. --0
  12025. FROM #Import_Staging stag
  12026. OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
  12027. WHERE Schedule_RecID IS NOT NULL
  12028. END
  12029.  
  12030. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  12031. DROP TABLE #Force_Compile
  12032.  
  12033. -- If debug mode and successful, select the rows that were inserted
  12034. -- and rollback transaction
  12035. IF @DebugMode = 1 AND @@ERROR = 0
  12036. BEGIN
  12037. SELECT * FROM SO_Activity WHERE SO_Activity_Recid IN(SELECT New_Identity FROM #Import_Staging)
  12038. SELECT * FROM Schedule WHERE Schedule_RecID IN(SELECT Schedule_RecID FROM #Import_Staging)
  12039. SELECT * FROM Schedule_Detail WHERE Schedule_RecID IN(SELECT Schedule_RecID FROM #Import_Staging)
  12040. ROLLBACK TRANSACTION AC_Import
  12041. END
  12042.  
  12043. IF @DebugMode = 2 AND @@ERROR = 0
  12044. BEGIN
  12045. SELECT
  12046. 1 AS Success,
  12047. NULL AS ExcelRowNumber,
  12048. NULL AS ErrorDetails
  12049. ROLLBACK TRANSACTION AC_Import
  12050. END
  12051.  
  12052. EXEC usp_Import_UDF @TableName, 'Activity'
  12053.  
  12054. IF @DebugMode = 0 AND @@Error = 0
  12055. BEGIN
  12056.  
  12057. -- Import successful - commit and return results
  12058. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  12059. BEGIN
  12060. DROP TABLE #Import_Staging
  12061. END
  12062.  
  12063. COMMIT TRANSACTION AC_Import
  12064.  
  12065. SELECT
  12066. 1 AS Success,
  12067. NULL AS ExcelRowNumber,
  12068. NULL AS ErrorDetails
  12069. END
  12070.  
  12071. END TRY
  12072.  
  12073. BEGIN CATCH
  12074.  
  12075. -- An error has occured - determine if validation error
  12076. IF ERROR_MESSAGE() = 'Validation Error'
  12077. BEGIN
  12078. -- Return details of error from staging table
  12079. SELECT
  12080. 0 AS Success,
  12081. stag.ExcelRowNumber,
  12082. stag.ConvertMessage AS ErrorDetails
  12083. FROM #Import_Staging stag
  12084. WHERE ConvertMessage IS NOT NULL
  12085.  
  12086. ROLLBACK TRANSACTION AC_Import
  12087. END
  12088. ELSE
  12089. -- Not a validation error - return SQL error message encountered
  12090. SELECT
  12091. 0 AS Success,
  12092. 'Unknown' AS ExcelRowNumber,
  12093. ISNULL(ERROR_MESSAGE(), '') + ISNULL(CONVERT(NVARCHAR(20), ERROR_LINE()), '') + ISNULL(ERROR_PROCEDURE(), '') AS ErrorDetails
  12094.  
  12095. -- Rollback transaction
  12096. IF @@TRANCOUNT > 0
  12097. ROLLBACK TRANSACTION AC_Import
  12098.  
  12099. END CATCH
  12100.  
  12101. GO
  12102.  
  12103. ---------------------------
  12104. -- CONFIGURATIONS
  12105. ---------------------------
  12106. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_CFG_ImportValidate')
  12107. BEGIN
  12108. EXEC('CREATE PROCEDURE [dbo].[usp_CFG_ImportValidate] AS SELECT 1')
  12109. END
  12110. GO
  12111. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_CFG_ImportPush')
  12112. BEGIN
  12113. EXEC('CREATE PROCEDURE [dbo].[usp_CFG_ImportPush] AS SELECT 1')
  12114. END
  12115. GO
  12116.  
  12117. -- =============================================
  12118. -- Author: m.gray
  12119. -- Create date: 04/17/2013
  12120. -- Description: Validates data from spreadsheet
  12121. -- for configuration Import
  12122. -- Sample call: exec usp_CFG_ImportValidate 'TMP_Import_bfa8df223cca47a48d7eca6ce19bfb5f', 'TMP_Questions_bfa8df223cca47a48d7eca6ce19bfb5f', 1
  12123. -- =============================================
  12124.  
  12125. ALTER PROCEDURE [dbo].[usp_CFG_ImportValidate]
  12126. @TableName VARCHAR(MAX),
  12127. @TempQuestionsName VARCHAR(MAX),
  12128. @Forcemode BIT = 0
  12129. AS
  12130. BEGIN TRY
  12131. BEGIN TRANSACTION CFG_Validate
  12132. SET NOCOUNT ON
  12133.  
  12134. -- Set date format to MDY to validate dates from excel
  12135. SET DATEFORMAT MDY
  12136.  
  12137. -- Variable declaration
  12138. -- Dynamic statement to insert to validation table
  12139. DECLARE @DSQL VARCHAR(MAX)
  12140.  
  12141. -- Fully qualified name of source table
  12142. DECLARE @SourceTable VARCHAR(300)
  12143. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  12144.  
  12145. -- Fully qualified name of Questions table
  12146. DECLARE @QuestionsTable VARCHAR(300)
  12147. SELECT @QuestionsTable = 'tempdb.dbo.' + @TempQuestionsName
  12148.  
  12149. -- Object_ID of source table
  12150. DECLARE @Source_Object_ID INT
  12151. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  12152.  
  12153. -- Unique value to identify records created by this import
  12154. DECLARE @ImportBatchUser VARCHAR(15)
  12155.  
  12156. -- Flag to indicate migration being matched on Legacy_ID
  12157. DECLARE @Legacy_Flag BIT = 0
  12158.  
  12159. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  12160. SELECT @ImportBatchUser =
  12161. 'CONV_'
  12162. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  12163. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  12164. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  12165. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  12166.  
  12167. -- Handle current & legacy templates by renaming column 'Vendor Company Name' to 'Manufacturer Company Name'
  12168. IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Company Name')
  12169. AND NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE Object_id = object_id(@SourceTable) AND name = 'Manufacturer Company Name')
  12170. BEGIN
  12171. SELECT @DSQL =
  12172. '
  12173. USE tempdb
  12174. EXEC sp_rename
  12175. @objname = ''tempdb..' + @TableName + '.[Vendor Company Name]'' ,
  12176. @newname = ''Manufacturer Company Name'',
  12177. @objtype = ''COLUMN''
  12178. '
  12179.  
  12180. EXEC(@DSQL)
  12181. END
  12182.  
  12183. -- Add/Re-Add [Vendor Company Name] field to avoid any compilation errors based on structure
  12184. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Company Name')
  12185. BEGIN
  12186. SELECT @DSQL =
  12187. '
  12188. ALTER TABLE ' + @SourceTable + '
  12189. ADD [Vendor Company Name] NVARCHAR(255) COLLATE DATABASE_DEFAULT
  12190. '
  12191.  
  12192. EXEC(@DSQL)
  12193.  
  12194. END
  12195.  
  12196. -- Add Manufacturer field if it doesn't exist (field is optional to accommodate legacy templates)
  12197. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Manufacturer')
  12198. BEGIN
  12199. SELECT @DSQL =
  12200. '
  12201. ALTER TABLE ' + @SourceTable + '
  12202. ADD [Manufacturer] NVARCHAR(255) COLLATE DATABASE_DEFAULT
  12203. '
  12204.  
  12205. EXEC(@DSQL)
  12206.  
  12207. END
  12208.  
  12209. -- Add Config_RecID if it doesn't exist (field is optional to accommodate legacy templates)
  12210. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Configuration RecID')
  12211. BEGIN
  12212. SELECT @DSQL =
  12213. '
  12214. ALTER TABLE ' + @SourceTable + '
  12215. ADD [Configuration RecID] NVARCHAR(255) COLLATE DATABASE_DEFAULT
  12216. '
  12217.  
  12218. EXEC(@DSQL)
  12219.  
  12220. END
  12221.  
  12222.  
  12223. -- Add [Vendor Notes] field if it doesn't exist (field is optional to accommodate legacy templates)
  12224. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Notes')
  12225. BEGIN
  12226. SELECT @DSQL =
  12227. '
  12228. ALTER TABLE ' + @SourceTable + '
  12229. ADD [Vendor Notes] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  12230. '
  12231.  
  12232. EXEC(@DSQL)
  12233.  
  12234. END
  12235.  
  12236. -- Add Legacy_ID field if it doesn't exist (field is optional to accommodate legacy templates)
  12237. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_ID')
  12238. BEGIN
  12239. SELECT @DSQL =
  12240. '
  12241. ALTER TABLE ' + @SourceTable + '
  12242. ADD Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  12243. '
  12244.  
  12245. EXEC(@DSQL)
  12246.  
  12247. END
  12248.  
  12249. -- Add Legacy_Company_ID field if it doesn't exist (field is optional to accommodate legacy templates)
  12250. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Company_ID')
  12251. BEGIN
  12252. SELECT @DSQL =
  12253. '
  12254. ALTER TABLE ' + @SourceTable + '
  12255. ADD Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  12256. '
  12257.  
  12258. EXEC(@DSQL)
  12259.  
  12260. END
  12261.  
  12262. -- Add Legacy_Contact_ID field if it doesn't exist (field is optional to accommodate legacy templates)
  12263. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Contact_ID')
  12264. BEGIN
  12265. SELECT @DSQL =
  12266. '
  12267. ALTER TABLE ' + @SourceTable + '
  12268. ADD Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  12269. '
  12270.  
  12271. EXEC(@DSQL)
  12272.  
  12273. END
  12274.  
  12275. -- Add Legacy_Opp_ID field if it doesn't exist (field is optional to accommodate legacy templates)
  12276. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Opp_ID')
  12277. BEGIN
  12278. SELECT @DSQL =
  12279. '
  12280. ALTER TABLE ' + @SourceTable + '
  12281. ADD Legacy_Opp_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  12282. '
  12283.  
  12284. EXEC(@DSQL)
  12285.  
  12286. END
  12287.  
  12288. -- Add Legacy_Ticket_ID field if it doesn't exist (field is optional to accommodate legacy templates)
  12289. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Ticket_ID')
  12290. BEGIN
  12291. SELECT @DSQL =
  12292. '
  12293. ALTER TABLE ' + @SourceTable + '
  12294. ADD Legacy_Ticket_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  12295. '
  12296.  
  12297. EXEC(@DSQL)
  12298.  
  12299. END
  12300.  
  12301.  
  12302.  
  12303. IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
  12304. BEGIN
  12305. DROP TABLE #tblResults
  12306. END
  12307.  
  12308. -- Table to hold results of procedure
  12309. CREATE TABLE #tblResults
  12310. (
  12311. RowNumber INT,
  12312. ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
  12313. InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12314. ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12315. Warning_Flag BIT DEFAULT 0
  12316. )
  12317.  
  12318. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  12319.  
  12320. -- Table to hold condensed summary results
  12321. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  12322. BEGIN
  12323. DROP TABLE #ResultsCondensed
  12324. END
  12325.  
  12326. CREATE TABLE #ResultsCondensed
  12327. (
  12328. RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12329. ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  12330. )
  12331.  
  12332. -- Pre-validation
  12333. -- Create & populate table variable with list of required columns
  12334. DECLARE @RequiredColumns TABLE
  12335. (
  12336. ColumnName VARCHAR(255)
  12337. )
  12338.  
  12339. INSERT INTO @RequiredColumns
  12340. (
  12341. ColumnName
  12342. )
  12343.  
  12344. SELECT 'Excel Row Number' UNION ALL
  12345. SELECT 'Configuration Type' UNION ALL
  12346. SELECT 'Configuration Name' UNION ALL
  12347. SELECT 'Manufacturer Company Name' UNION ALL
  12348. SELECT 'Serial Number' UNION ALL
  12349. SELECT 'Model Number' UNION ALL
  12350. SELECT 'Tag Number' UNION ALL
  12351. SELECT 'Purchase Date' UNION ALL
  12352. SELECT 'Installed Date' UNION ALL
  12353. SELECT 'Installed By' UNION ALL
  12354. SELECT 'Warranty Date' UNION ALL
  12355. SELECT 'Configuration Status' UNION ALL
  12356. SELECT 'Company Name' UNION ALL
  12357. SELECT 'Contact First Name' UNION ALL
  12358. SELECT 'Contact Last Name' UNION ALL
  12359. SELECT 'Company Address Site Name' UNION ALL
  12360. SELECT 'Location' UNION ALL
  12361. SELECT 'Group' UNION ALL
  12362. SELECT 'Configuration Notes' UNION ALL
  12363. SELECT 'Vendor Company Name' UNION ALL
  12364. SELECT 'Manufacturer' UNION ALL
  12365. SELECT 'Configuration RecID' UNION ALL
  12366. SELECT 'Vendor Notes' UNION ALL
  12367. SELECT 'Legacy_ID' UNION ALL
  12368. SELECT 'Legacy_Company_ID' UNION ALL
  12369. SELECT 'Legacy_Contact_ID' UNION ALL
  12370. SELECT 'Legacy_Site_ID' UNION ALL
  12371. SELECT 'Legacy_Opp_ID' UNION ALL
  12372. SELECT 'Legacy_Ticket_ID'
  12373.  
  12374. -- Table variable to hold column names from source table
  12375. DECLARE @SourceColumns TABLE
  12376. (
  12377. ColumnName VARCHAR(255)
  12378. )
  12379.  
  12380. -- Populate @SourceColumns
  12381. INSERT INTO @SourceColumns
  12382. (
  12383. ColumnName
  12384. )
  12385.  
  12386. SELECT
  12387. name
  12388. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  12389.  
  12390. -- Check that all required columns exist in @SourceColumns
  12391. INSERT INTO #tblResults
  12392. (
  12393. RowNumber,
  12394. ValMsg
  12395. )
  12396.  
  12397. SELECT
  12398. 0,
  12399. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  12400. FROM @RequiredColumns rq
  12401.  
  12402. EXCEPT
  12403.  
  12404. SELECT
  12405. 0,
  12406. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  12407. FROM @SourceColumns sc
  12408.  
  12409. UNION ALL
  12410.  
  12411. -- Check that there are no extra invalid columns (i.e. a 'Question' column that wasn't proceeded by 'Q:'
  12412. SELECT
  12413. 0,
  12414. 'Invalid column: "' + sc.ColumnName + '". Question columns must begin with "Q:"'
  12415. FROM @SourceColumns sc
  12416.  
  12417. EXCEPT
  12418.  
  12419. SELECT
  12420. 0,
  12421. 'Invalid column: "' + rc.ColumnName + '". Question columns must begin with "Q:"'
  12422. FROM @RequiredColumns rc
  12423.  
  12424.  
  12425. -- If any column related errors, stop here and return results
  12426. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  12427. BEGIN
  12428. SELECT
  12429. 0 AS ValPassed,
  12430. RowNumber,
  12431. ValMsg
  12432. FROM #tblResults
  12433. ORDER BY RowNumber, ValMsg
  12434.  
  12435. ROLLBACK TRANSACTION
  12436.  
  12437. RETURN
  12438. END
  12439.  
  12440. -- Capture question source into temp table
  12441. IF (OBJECT_ID('tempdb..#QuestionSource')) IS NOT NULL
  12442. BEGIN
  12443. DROP TABLE #QuestionSource
  12444. END
  12445.  
  12446. CREATE TABLE #QuestionSource
  12447. (
  12448. ExcelRowNumber INT,
  12449. Question NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12450. Answer NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  12451. )
  12452.  
  12453. SELECT @DSQL =
  12454. '
  12455. INSERT INTO #QuestionSource
  12456. (
  12457. ExcelRowNumber,
  12458. Question,
  12459. Answer
  12460. )
  12461. SELECT
  12462. src.[Excel Row Number],
  12463. src.[Question],
  12464. src.[Answer]
  12465. FROM ' + @QuestionsTable + ' src'
  12466.  
  12467. EXEC (@DSQL)
  12468.  
  12469. -- Table to hold questions for validation
  12470. IF (OBJECT_ID('tempdb..#Questions')) IS NOT NULL
  12471. BEGIN
  12472. DROP TABLE #Questions
  12473. END
  12474.  
  12475. CREATE TABLE #Questions
  12476. (
  12477. ExcelRowNumber INT,
  12478. Question VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12479. Answer VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12480. ConfigType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12481. CS_Survey_RecID INT,
  12482. CS_Survey_Detail_RecID INT,
  12483. SF_Field_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT,
  12484. SF_Entry_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT,
  12485. HasValueList BIT,
  12486. IsRequired BIT,
  12487. Decimals_Flag BIT,
  12488. Max_Decimals INT,
  12489. Num_Decimals INT,
  12490. Action_Type NVARCHAR(10) COLLATE DATABASE_DEFAULT,
  12491. Seq_Nbr DECIMAL(8,2)
  12492. )
  12493.  
  12494. -- Table to hold error columns (i.e. Question column w/ no corresponding answer column
  12495. DECLARE @tblErrorColumns TABLE
  12496. (
  12497. ExcelRowNumber INT,
  12498. ColumnName NVARCHAR(1000),
  12499. ColumnType VARCHAR(1)
  12500. )
  12501.  
  12502. -- Table to hold source data for this batch from temp table
  12503. IF (OBJECT_ID('#Import_Staging')) IS NOT NULL
  12504. BEGIN
  12505. DROP TABLE #Import_Staging
  12506. END
  12507.  
  12508. CREATE TABLE #Import_Staging
  12509. (
  12510. ExcelRowNumber int NULL,
  12511. ConfigType nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12512. CS_Survey_RecID INT,
  12513. ConfigName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12514. ManufacturerCompanyName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12515. Manufacturer nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12516. Manufacturer_RecID INT NULL,
  12517. SerialNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12518. ModelNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12519. TagNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12520. InstalledBy nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12521. WarrantyDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12522. ConfigStatus nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12523. Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12524. ContactFirstName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12525. ContactLastName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12526. CompanyAddressSiteName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12527. Location nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12528. [Group] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12529. ConfigNotes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  12530. PurchaseDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12531. InstalledDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  12532. Questions nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  12533. QuestionErrorList VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12534. HasInvalidColumnID BIT NULL,
  12535. Company_RecID INT NULL,
  12536. Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  12537. Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  12538. Company_Duplicate_Flag BIT NULL,
  12539. Contact_RecID INT NULL,
  12540. Contact_Duplicate_Flag BIT NULL,
  12541. Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
  12542. ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12543. [Configuration RecID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12544. ConfigType_Old NVARCHAR(50) COLLATE DATABASE_DEFAULT,
  12545. Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
  12546. Duplicate_Flag BIT,
  12547. Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12548. Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  12549. Diff_Exclude_Flag BIT,
  12550. Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  12551. Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  12552. Company_Address_RecID INT,
  12553. Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  12554. SR_Service_RecID INT,
  12555. Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  12556. SO_Opportunity_RecID INT
  12557. )
  12558.  
  12559. -- Build insert to populate validation table
  12560. SET @DSQL = '
  12561. INSERT INTO #Import_Staging
  12562. (
  12563. ExcelRowNumber,
  12564. ConfigType,
  12565. ConfigName,
  12566. ManufacturerCompanyName,
  12567. Manufacturer,
  12568. SerialNumber,
  12569. ModelNumber,
  12570. TagNumber,
  12571. InstalledBy,
  12572. WarrantyDate,
  12573. ConfigStatus,
  12574. Company_Name,
  12575. ContactFirstName,
  12576. ContactLastName,
  12577. CompanyAddressSiteName,
  12578. Location,
  12579. [Group],
  12580. ConfigNotes,
  12581. PurchaseDate,
  12582. InstalledDate,
  12583. [Configuration RecID],
  12584. Company_Match_Val
  12585. )
  12586. SELECT
  12587. [Excel Row Number],
  12588. [Configuration Type],
  12589. [Configuration Name],
  12590. [Manufacturer Company Name],
  12591. [Manufacturer],
  12592. [Serial Number],
  12593. [Model Number],
  12594. [Tag Number],
  12595. [Installed By],
  12596. [Warranty Date],
  12597. [Configuration Status],
  12598. [Company Name],
  12599. [Contact First Name],
  12600. [Contact Last Name],
  12601. [Company Address Site Name],
  12602. [Location],
  12603. [Group],
  12604. [Configuration Notes],
  12605. [Purchase Date],
  12606. [Installed Date],
  12607. [Configuration RecID],
  12608. LEFT([Company Name], 3)
  12609. FROM ' + @SourceTable
  12610.  
  12611. -- Pull data into validation table
  12612. EXEC(@DSQL)
  12613.  
  12614.  
  12615. -- Convert empty string and single space to null for all values in validation table
  12616. UPDATE #Import_Staging SET
  12617. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  12618. ConfigType = CASE WHEN ConfigType IN('', ' ') THEN NULL ELSE ConfigType END,
  12619. ConfigName = CASE WHEN ConfigName IN('', ' ') THEN NULL ELSE ConfigName END,
  12620. Manufacturer = CASE WHEN Manufacturer IN('', ' ') THEN NULL ELSE Manufacturer END,
  12621. ManufacturerCompanyName = CASE WHEN ManufacturerCompanyName IN('', ' ') THEN NULL ELSE ManufacturerCompanyName END,
  12622. SerialNumber = CASE WHEN SerialNumber IN('', ' ') THEN NULL ELSE SerialNumber END,
  12623. ModelNumber = CASE WHEN ModelNumber IN('', ' ') THEN NULL ELSE ModelNumber END,
  12624. TagNumber = CASE WHEN TagNumber IN('', ' ') THEN NULL ELSE TagNumber END,
  12625. InstalledBy = CASE WHEN InstalledBy IN('', ' ') THEN NULL ELSE InstalledBy END,
  12626. WarrantyDate = CASE WHEN WarrantyDate IN('', ' ') THEN NULL ELSE WarrantyDate END,
  12627. ConfigStatus = CASE WHEN ConfigStatus IN('', ' ') THEN NULL ELSE ConfigStatus END,
  12628. Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
  12629. ContactFirstName = CASE WHEN ContactFirstName IN('', ' ') THEN NULL ELSE ContactFirstName END,
  12630. ContactLastName = CASE WHEN ContactLastName IN('', ' ') THEN NULL ELSE ContactLastName END,
  12631. CompanyAddressSiteName = CASE WHEN CompanyAddressSiteName IN('', ' ') THEN NULL ELSE CompanyAddressSiteName END,
  12632. Location = CASE WHEN Location IN('', ' ') THEN NULL ELSE Location END,
  12633. [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
  12634. ConfigNotes = CASE WHEN ConfigNotes IN('', ' ') THEN NULL ELSE ConfigNotes END,
  12635. PurchaseDate = CASE WHEN PurchaseDate IN('', ' ') THEN NULL ELSE PurchaseDate END,
  12636. InstalledDate = CASE WHEN InstalledDate IN('', ' ') THEN NULL ELSE InstalledDate END,
  12637. [Configuration RecID] = CASE WHEN [Configuration RecID] IN('', ' ') THEN NULL ELSE [Configuration RecID] END
  12638.  
  12639. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
  12640. BEGIN
  12641. SELECT @DSQL = '
  12642. UPDATE tmp
  12643. SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
  12644. FROM #Import_Staging tmp
  12645. INNER JOIN ' + @SourceTable + ' src
  12646. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  12647.  
  12648. EXEC(@DSQL)
  12649. END
  12650.  
  12651. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
  12652. BEGIN
  12653. SELECT @DSQL = '
  12654. UPDATE tmp
  12655. SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
  12656. FROM #Import_Staging tmp
  12657. INNER JOIN ' + @SourceTable + ' src
  12658. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  12659.  
  12660. EXEC(@DSQL)
  12661. END
  12662.  
  12663. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
  12664. BEGIN
  12665. SELECT @DSQL = '
  12666. UPDATE tmp
  12667. SET tmp.Legacy_ID = src.Legacy_ID
  12668. FROM #Import_Staging tmp
  12669. INNER JOIN ' + @SourceTable + ' src
  12670. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  12671.  
  12672. EXEC(@DSQL)
  12673. END
  12674.  
  12675. -- Condense contact first and last names to ContactName
  12676. UPDATE tmp
  12677. SET ContactName = LTRIM(ISNULL(tmp.ContactFirstName + ' ', '')) + ISNULL(tmp.ContactLastName, '')
  12678. FROM #Import_Staging tmp
  12679.  
  12680. -- Get RecID for Config Type
  12681. UPDATE tmp
  12682. SET tmp.CS_Survey_RecID = csc.CS_Survey_RecID
  12683. FROM #Import_Staging tmp
  12684. INNER JOIN dbo.CS_Survey csc
  12685. ON tmp.ConfigType = csc.Survey_Name
  12686.  
  12687. -- Remove datatype row created by export
  12688. DELETE FROM #Import_Staging WHERE Company_Name = 'CW_Import_Config_Row'
  12689.  
  12690. -- Force config types if necessary
  12691. IF @Forcemode = 1 AND EXISTS(SELECT TOP 1 * FROM #Import_Staging tmp WHERE CS_Survey_RecID IS NULL)
  12692. BEGIN
  12693. INSERT INTO dbo.CS_Survey
  12694. (
  12695. Owner_ID,
  12696. Survey_Name,
  12697. Instructions,
  12698. Inactive_Flag,
  12699. Last_Update,
  12700. Updated_By,
  12701. Survey_Flag,
  12702. System_Flag
  12703. )
  12704.  
  12705. SELECT DISTINCT
  12706. 1,
  12707. tmp.ConfigType,
  12708. 'Created by import utility on ' + CONVERT(VARCHAR, GETDATE(), 101),
  12709. 0,
  12710. GETDATE(),
  12711. @ImportBatchUser,
  12712. 0,
  12713. 0
  12714. FROM #Import_Staging tmp
  12715. WHERE tmp.CS_Survey_RecID IS NULL
  12716. AND tmp.ConfigType IS NOT NULL
  12717.  
  12718. -- Capture RecIDs for newly inserted config types
  12719. UPDATE tmp
  12720. SET tmp.CS_Survey_RecID = css.CS_Survey_RecID
  12721. FROM #Import_Staging tmp
  12722. INNER JOIN CS_Survey css
  12723. ON css.Survey_Name = tmp.ConfigType
  12724. AND tmp.CS_Survey_RecID IS NULL
  12725. AND css.Updated_By = @ImportBatchUser
  12726. END
  12727.  
  12728. -- Prepare custom question records for each spreadsheet row
  12729. INSERT INTO #Questions
  12730. (
  12731. ExcelRowNumber,
  12732. ConfigType,
  12733. Question,
  12734. CS_Survey_RecID,
  12735. CS_Survey_Detail_RecID,
  12736. SF_Field_Type_ID,
  12737. SF_Entry_Type_ID,
  12738. IsRequired,
  12739. Max_Decimals,
  12740. Decimals_Flag,
  12741. Answer,
  12742. HasValueList
  12743. )
  12744.  
  12745. SELECT
  12746. ISNULL(stag.ExcelRowNumber, qs.[ExcelRowNumber]),
  12747. ct.ConfigType,
  12748. ISNULL(qs.Question, csd.Question),
  12749. ct.CS_Survey_RecID,
  12750. csd.CS_Survey_Detail_RecID,
  12751. csd.SF_Field_Type_ID,
  12752. csd.SF_Entry_Type_ID,
  12753. CASE WHEN csd.Required_Flag = 1 THEN 1 ELSE 0 END,
  12754. csd.Nbr_Decimals,
  12755. CASE WHEN csd.SF_Entry_Type_ID IN('L', 'O') THEN 1 ELSE 0 END,
  12756. LEFT(ISNULL(qs.Answer, csv.CS_Survey_Value), 1000),
  12757. CASE WHEN csv.CS_Survey_Value IS NOT NULL THEN 1 ELSE 0 END
  12758. FROM CS_Survey_Detail csd
  12759. INNER JOIN CS_Survey css
  12760. ON css.CS_Survey_RecID = csd.CS_Survey_RecID
  12761. AND csd.Inactive_Flag = 0
  12762. INNER JOIN #Import_Staging stag
  12763. ON stag.CS_Survey_RecID = css.CS_Survey_RecID
  12764. FULL OUTER JOIN #QuestionSource qs
  12765. ON qs.Question = csd.Question
  12766. AND qs.ExcelRowNumber = stag.ExcelRowNumber
  12767. OUTER APPLY
  12768. (
  12769. SELECT TOP 1 csv.CS_Survey_Value
  12770. FROM CS_Survey_Value csv
  12771. WHERE csv.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID
  12772. AND csv.Default_Flag = 1
  12773. ) csv
  12774. CROSS APPLY(SELECT TOP 1 ConfigType, CS_Survey_RecID FROM #Import_Staging stag WHERE stag.ExcelRowNumber = qs.ExcelRowNumber) ct
  12775. --LEFT OUTER JOIN CS_Survey_Value csv
  12776. -- ON csv.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID
  12777. -- AND csv.Default_Flag = 1
  12778.  
  12779. --LEFT OUTER JOIN(SELECT MIN(CS_Survey_Value) AS Default_Value, CS_Survey_Detail_RecID FROM dbo.CS_Survey_Value WHERE Default_Flag = 1 GROUP BY CS_Survey_Detail_RecID) csv
  12780. --ON csv.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID
  12781.  
  12782. -- Pull over config type for questions that didnt match
  12783. --UPDATE qu
  12784. -- SET qu.ConfigType = stag.ConfigType,
  12785. -- qu.CS_Survey_RecID = stag.CS_Survey_RecID
  12786. --FROM #Questions qu
  12787. -- CROSS APPLY(SELECT TOP 1 ConfigType, CS_Survey_RecID FROM #Import_Staging stag WHERE stag.ExcelRowNumber = qu.ExcelRowNumber) stag
  12788.  
  12789. -- Update blank string answers to null
  12790. UPDATE qu
  12791. SET qu.Answer = NULL
  12792. FROM #Questions qu
  12793. WHERE qu.Answer = ''
  12794.  
  12795. ---- Get decimal flag
  12796. --UPDATE qu
  12797. -- SET qu.Decimals_Flag = 1
  12798. --FROM #Questions qu
  12799. --WHERE qu.SF_Field_Type_ID IN(SELECT SF_Field_Type_ID FROM SF_Field_Type WHERE Decimals_Flag = 1)
  12800.  
  12801. -- Get number of decimals for decimal fields
  12802. UPDATE qu
  12803. SET Num_Decimals = LEN(PARSENAME(qu.Answer, 1))
  12804. FROM #Questions qu
  12805. WHERE qu.Answer IS NOT NULL
  12806. AND qu.Decimals_Flag = 1
  12807. AND qu.Answer LIKE('%.%')
  12808. AND ISNUMERIC(qu.Answer + 'e0') = 1
  12809.  
  12810. -- Convert decimal fields to proper number of decimals based on question type
  12811. UPDATE qu
  12812. SET Answer = CONVERT(Decimal(30,0), Answer)
  12813. FROM #Questions qu
  12814. WHERE qu.Decimals_Flag = 1
  12815. AND ISNUMERIC(qu.Answer + 'e0') = 1
  12816. AND qu.Max_Decimals = 0
  12817. AND qu.Num_Decimals > qu.Max_Decimals
  12818. AND HasValueList = 0
  12819.  
  12820. UPDATE qu
  12821. SET Answer = CONVERT(Decimal(30,1), Answer)
  12822. FROM #Questions qu
  12823. WHERE qu.Decimals_Flag = 1
  12824. AND ISNUMERIC(qu.Answer + 'e0') = 1
  12825. AND qu.Max_Decimals = 1
  12826. AND qu.Num_Decimals > qu.Max_Decimals
  12827. AND HasValueList = 0
  12828.  
  12829. UPDATE qu
  12830. SET Answer = CONVERT(Decimal(30,2), Answer)
  12831. FROM #Questions qu
  12832. WHERE qu.Decimals_Flag = 1
  12833. AND ISNUMERIC(qu.Answer + 'e0') = 1
  12834. AND qu.Max_Decimals = 2
  12835. AND qu.Num_Decimals > qu.Max_Decimals
  12836. AND HasValueList = 0
  12837.  
  12838. UPDATE qu
  12839. SET Answer = CONVERT(Decimal(30,3), Answer)
  12840. FROM #Questions qu
  12841. WHERE qu.Decimals_Flag = 1
  12842. AND ISNUMERIC(qu.Answer + 'e0') = 1
  12843. AND qu.Max_Decimals = 3
  12844. AND qu.Num_Decimals > qu.Max_Decimals
  12845. AND HasValueList = 0
  12846.  
  12847. UPDATE qu
  12848. SET Answer = CONVERT(Decimal(30,4), Answer)
  12849. FROM #Questions qu
  12850. WHERE qu.Decimals_Flag = 1
  12851. AND ISNUMERIC(qu.Answer + 'e0') = 1
  12852. AND qu.Max_Decimals = 4
  12853. AND qu.Num_Decimals > qu.Max_Decimals
  12854. AND HasValueList = 0
  12855.  
  12856. UPDATE qu
  12857. SET Answer = CONVERT(Decimal(30,5), Answer)
  12858. FROM #Questions qu
  12859. WHERE qu.Decimals_Flag = 1
  12860. AND ISNUMERIC(qu.Answer + 'e0') = 1
  12861. AND qu.Max_Decimals = 5
  12862. AND qu.Num_Decimals > qu.Max_Decimals
  12863. AND HasValueList = 0
  12864.  
  12865. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  12866. IF Object_ID('tempdb..#Company') IS NOT NULL
  12867. BEGIN
  12868. DROP TABLE #Company
  12869. END
  12870.  
  12871. SELECT DISTINCT
  12872. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  12873. comp.Company_ID,
  12874. comp.Company_Name,
  12875. Delete_Flag,
  12876. LEFT(Company_Name, 3) AS Company_Match_Val,
  12877. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  12878. 0 AS Duplicate_Flag
  12879. INTO #Company
  12880. FROM dbo.Company comp
  12881. WHERE Delete_Flag = 0
  12882. AND (LEFT(Company_Name, 3) IN(SELECT Company_Match_Val FROM #Import_Staging)
  12883. OR Company_Name IN(SELECT ManufacturerCompanyName FROM #Import_Staging)
  12884. OR Company_RecID = (SELECT TOP 1 Company_RecID FROM dbo.Owner)
  12885. )
  12886.  
  12887. -- Table to hold contact information
  12888. IF Object_ID('tempdb..#Contact') IS NOT NULL
  12889. BEGIN
  12890. DROP TABLE #Contact
  12891. END
  12892.  
  12893. SELECT
  12894. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  12895. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  12896. First_Name,
  12897. Last_Name,
  12898. cont.Company_RecID,
  12899. Default_Flag
  12900. INTO #Contact
  12901. FROM dbo.Contact cont
  12902. CROSS APPLY (SELECT DISTINCT Company_Name FROM #Company comp WHERE comp.Company_RecID = cont.Company_RecID) comp
  12903. --INNER JOIN #Company comp
  12904. --ON comp.Company_RecID = cont.Company_RecID
  12905.  
  12906. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
  12907. BEGIN
  12908. SELECT @DSQL = '
  12909. UPDATE tmp
  12910. SET tmp.Legacy_ID = src.Legacy_ID
  12911. FROM #Import_Staging tmp
  12912. INNER JOIN ' + @SourceTable + ' src
  12913. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  12914.  
  12915. EXEC(@DSQL)
  12916. END
  12917.  
  12918. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  12919. BEGIN
  12920. SELECT @Legacy_Flag = 1
  12921. EXEC usp_Import_Match_Legacy @TableName, 'Configuration'
  12922. END
  12923.  
  12924. IF @Legacy_Flag = 0
  12925. BEGIN
  12926. -- Match companies and contacts
  12927. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  12928. END
  12929.  
  12930.  
  12931. --Format dates as mm/dd/yyyy
  12932. UPDATE tmp
  12933. SET InstalledDate = CONVERT(VARCHAR, CAST(InstalledDate AS DATETIME), 101)
  12934. FROM #Import_Staging tmp
  12935. WHERE ISDATE(InstalledDate) = 1
  12936.  
  12937. UPDATE tmp
  12938. SET WarrantyDate = CONVERT(VARCHAR, CAST(WarrantyDate AS DATETIME), 101)
  12939. FROM #Import_Staging tmp
  12940. WHERE ISDATE(WarrantyDate) = 1
  12941.  
  12942. UPDATE tmp
  12943. SET PurchaseDate = CONVERT(VARCHAR, CAST(PurchaseDate AS DATETIME), 101)
  12944. FROM #Import_Staging tmp
  12945. WHERE ISDATE(PurchaseDate) = 1
  12946.  
  12947. -- Update Date fields to NULL if 1900-01-01
  12948. UPDATE #Import_Staging
  12949. SET InstalledDate = NULL
  12950. WHERE InstalledDate = '01/01/1900'
  12951.  
  12952. UPDATE #Import_Staging
  12953. SET WarrantyDate = NULL
  12954. WHERE WarrantyDate = '01/01/1900'
  12955.  
  12956. UPDATE #Import_Staging
  12957. SET PurchaseDate = NULL
  12958. WHERE PurchaseDate = '01/01/1900'
  12959.  
  12960. -- Clean up export config row (used for SSIS to manage column datatypes)
  12961. DELETE FROM #Import_Staging
  12962. WHERE Company_Name = 'CW_IMPORT_CONFIG_ROW'
  12963. -- Strip non-numeric characters from IP addresses so that SQL error does not occur when validating that numbers are < 256
  12964. -- Force validation error by setting to 256
  12965. UPDATE qu
  12966. SET qu.Answer = '256.256.256.256'
  12967. FROM #Questions qu
  12968. WHERE qu.SF_Field_Type_ID = 'I'
  12969. AND ISNUMERIC(REPLACE(Answer, '.', '')) = 0
  12970. AND Answer IS NOT NULL
  12971.  
  12972. -- Get RecID for Manufacturer
  12973. UPDATE tmp
  12974. SET tmp.Manufacturer_RecID = mfg.Manufacturer_RecID
  12975. FROM #Import_Staging tmp
  12976. INNER JOIN dbo.Manufacturer mfg
  12977. ON mfg.Manufacturer_Name = tmp.Manufacturer
  12978.  
  12979. -- If @ForceMode = 1, create references as needed
  12980. IF(@Forcemode = 1)
  12981. BEGIN
  12982.  
  12983. INSERT INTO dbo.CS_Survey_Detail
  12984. (
  12985. CS_Survey_RecID,
  12986. Seq_Nbr,
  12987. Question,
  12988. SF_Field_Type_ID,
  12989. Nbr_Decimals,
  12990. SF_Entry_Type_ID,
  12991. Required_Flag,
  12992. Inactive_Flag,
  12993. Last_Update,
  12994. Updated_By
  12995. )
  12996.  
  12997. SELECT
  12998. qu.CS_Survey_RecID,
  12999. ISNULL(MAX(csd.Seq_Nbr), 0.00) + Row_Number() OVER(PARTITION BY qu.CS_Survey_RecID ORDER BY qu.CS_Survey_RecID ASC) AS Seq_Nbr,
  13000. qu.Question,
  13001. CASE WHEN MAX(LEN(qu.Answer)) > 100 THEN 'A' ELSE 'T' END AS SF_Field_Type_ID,
  13002. 0 AS Nbr_Decimals,
  13003. 'E' AS SF_Entry_Type_ID,
  13004. 0 AS Required_Flag,
  13005. 0 AS Inactive_Flag,
  13006. GETDATE() AS Last_Update,
  13007. @ImportBatchUser AS Updated_By
  13008.  
  13009. FROM #Questions qu
  13010. CROSS APPLY(SELECT MAX(Seq_Nbr) AS Seq_Nbr FROM CS_Survey_Detail csd WHERE csd.CS_Survey_RecID = qu.CS_Survey_RecID) csd
  13011. WHERE qu.CS_Survey_Detail_RecID IS NULL
  13012. AND qu.CS_Survey_RecID IS NOT NULL
  13013. AND qu.Answer IS NOT NULL
  13014. GROUP BY CS_Survey_RecID, Question
  13015.  
  13016. -- Update #Questions with appropriate information for newly inserted questions
  13017. UPDATE qu
  13018. SET qu.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID,
  13019. qu.SF_Field_Type_ID = csd.SF_Field_Type_ID,
  13020. qu.SF_Entry_Type_ID = 'E',
  13021. qu.Max_Decimals = 0
  13022. FROM #Questions qu
  13023. CROSS APPLY(SELECT TOP 1 * FROM CS_Survey_Detail csd WHERE csd.CS_Survey_RecID = qu.CS_Survey_RecID AND csd.Question = qu.Question AND csd.Updated_By = @ImportBatchUser) csd
  13024. WHERE qu.CS_Survey_Detail_RecID IS NULL
  13025.  
  13026. -- Vendor company
  13027. IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
  13028. BEGIN
  13029. INSERT INTO dbo.Company
  13030. (
  13031. Company_ID,
  13032. Company_Name,
  13033. Updated_By,
  13034. Company_Type_RecID,
  13035. Company_Status_RecID,
  13036. Delete_Flag,
  13037. Entered_by,
  13038. Options_Last_Update_UTC,
  13039. Options_Updated_by
  13040. )
  13041.  
  13042. SELECT DISTINCT
  13043. 'M-' + LEFT(ManufacturerCompanyName, 48),
  13044. SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
  13045. @ImportBatchUser,
  13046. ctype.Company_Type_RecID,
  13047. cstat.Company_Status_RecID,
  13048. 0,
  13049. @ImportBatchUser,
  13050. GETUTCDATE(),
  13051. 'zAdmin'
  13052. FROM #Import_Staging tmp
  13053. LEFT OUTER JOIN #Company comp
  13054. ON comp.Company_Name = tmp.ManufacturerCompanyName
  13055. INNER JOIN Company_Type ctype
  13056. ON ctype.[Description] = 'Vendor'
  13057. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
  13058. WHERE tmp.ManufacturerCompanyName IS NOT NULL
  13059. AND comp.Company_RecID IS NULL
  13060. END
  13061.  
  13062. IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company')
  13063. AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Company')
  13064. BEGIN
  13065. INSERT INTO dbo.Company
  13066. (
  13067. Company_ID,
  13068. Company_Name,
  13069. Updated_By,
  13070. Company_Type_RecID,
  13071. Company_Status_RecID,
  13072. Delete_Flag,
  13073. Entered_by
  13074. )
  13075.  
  13076. SELECT DISTINCT
  13077. 'M-' + LEFT(ManufacturerCompanyName, 48),
  13078. SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
  13079. @ImportBatchUser,
  13080. ctype.Company_Type_RecID,
  13081. cstat.Company_Status_RecID,
  13082. 0,
  13083. @ImportBatchUser
  13084. FROM #Import_Staging tmp
  13085. LEFT OUTER JOIN #Company comp
  13086. ON comp.Company_Name = tmp.ManufacturerCompanyName
  13087. INNER JOIN Company_Type ctype
  13088. ON ctype.[Description] = 'Vendor'
  13089. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
  13090. WHERE tmp.ManufacturerCompanyName IS NOT NULL
  13091. AND comp.Company_RecID IS NULL
  13092. END
  13093.  
  13094. IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company')
  13095. AND NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
  13096. BEGIN
  13097. INSERT INTO dbo.Company
  13098. (
  13099. Company_ID,
  13100. Company_Name,
  13101. Updated_By,
  13102. Company_Type_RecID,
  13103. Company_Status_RecID,
  13104. Delete_Flag
  13105. )
  13106.  
  13107. SELECT DISTINCT
  13108. 'M-' + LEFT(ManufacturerCompanyName, 48),
  13109. SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
  13110. @ImportBatchUser,
  13111. ctype.Company_Type_RecID,
  13112. cstat.Company_Status_RecID,
  13113. 0
  13114. FROM #Import_Staging tmp
  13115. LEFT OUTER JOIN #Company comp
  13116. ON comp.Company_Name = tmp.ManufacturerCompanyName
  13117. INNER JOIN Company_Type ctype
  13118. ON ctype.[Description] = 'Vendor'
  13119. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
  13120. WHERE tmp.ManufacturerCompanyName IS NOT NULL
  13121. AND comp.Company_RecID IS NULL
  13122. END
  13123.  
  13124. -- If more than one company inserted with same name, raise error
  13125. -- This would be due to 2 or more types named 'Vendor' or 2 or more statuses set to Import_Flag = 1
  13126. IF EXISTS(SELECT Company_Name FROM dbo.Company WHERE Updated_By = @ImportBatchUser GROUP BY Company_Name HAVING COUNT(*) > 1)
  13127. BEGIN
  13128. RAISERROR('More than one company reference created - check company types and statuses.', 16, 1)
  13129. END
  13130.  
  13131. ---- Insert a 'Main' site record for any manufacturer company created
  13132. --IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
  13133. --BEGIN
  13134. -- INSERT INTO dbo.Company_Address
  13135. -- (
  13136. -- Owner_ID,
  13137. -- Company_RecID,
  13138. -- Zip, -- Place a dot in zip code because at least one address field must be filled out per PSA validation
  13139. -- Default_Flag,
  13140. -- Updated_By,
  13141. -- [Description],
  13142. -- Entered_By
  13143. -- )
  13144.  
  13145. -- SELECT DISTINCT
  13146. -- 1,
  13147. -- Company_RecID,
  13148. -- '.',
  13149. -- 1,
  13150. -- @ImportBatchUser,
  13151. -- 'Main',
  13152. -- @ImportBatchUser
  13153. -- FROM dbo.Company comp
  13154. -- WHERE Updated_By = @ImportBatchUser
  13155. -- -- Hack to suppress structural errors
  13156. -- AND NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE 1=2)
  13157. -- AND NOT EXISTS(SELECT 1 FROM dbo.Company_Address cad WHERE cad.Company_RecID = comp.Company_RecID)
  13158.  
  13159. -- DELETE cad
  13160. -- FROM Company_Address cad
  13161. -- WHERE Updated_By = @ImportBatchUser
  13162. -- AND cad.Zip = '.'
  13163. -- AND EXISTS(SELECT 1 FROM Company_Address cad2 WHERE cad2.Company_RecID = cad.Company_RecID AND cad2.Company_Address_RecID < cad.Company_Address_RecID)
  13164.  
  13165. --END
  13166.  
  13167.  
  13168. --IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
  13169. --BEGIN
  13170. -- INSERT INTO dbo.Company_Address
  13171. -- (
  13172. -- Owner_ID,
  13173. -- Company_RecID,
  13174. -- Zip, -- Place a dot in zip code because at least one address field must be filled out per PSA validation
  13175. -- Default_Flag,
  13176. -- Updated_By,
  13177. -- [Description]
  13178. -- )
  13179.  
  13180. -- SELECT DISTINCT
  13181. -- 1,
  13182. -- Company_RecID,
  13183. -- '.',
  13184. -- 1,
  13185. -- @ImportBatchUser,
  13186. -- 'Main'
  13187. -- FROM dbo.Company comp
  13188. -- WHERE Updated_By = @ImportBatchUser
  13189. -- AND NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE 1=2)
  13190. -- AND NOT EXISTS(SELECT 1 FROM dbo.Company_Address cad WHERE cad.Company_RecID = comp.Company_RecID)
  13191.  
  13192. -- DELETE cad
  13193. -- FROM Company_Address cad
  13194. -- WHERE Updated_By = @ImportBatchUser
  13195. -- AND cad.Zip = '.'
  13196. -- AND EXISTS(SELECT 1 FROM Company_Address cad2 WHERE cad2.Company_RecID = cad.Company_RecID AND cad2.Company_Address_RecID < cad.Company_Address_RecID)
  13197.  
  13198. --END
  13199.  
  13200.  
  13201.  
  13202. -- Insert newly created companies to #Company
  13203. INSERT INTO #Company
  13204. (
  13205. Company_RecID,
  13206. Company_ID,
  13207. Company_Name,
  13208. Delete_Flag,
  13209. Duplicate_Flag
  13210. )
  13211.  
  13212. SELECT
  13213. Company_RecID,
  13214. Company_ID,
  13215. Company_Name,
  13216. Delete_Flag,
  13217. 0
  13218. FROM dbo.Company
  13219. WHERE Updated_By = @ImportBatchUser
  13220.  
  13221. -- Configuration Status
  13222. INSERT INTO dbo.Config_Status
  13223. (
  13224. [Description],
  13225. Closed_Flag,
  13226. Updated_By,
  13227. Default_Flag
  13228. )
  13229.  
  13230. SELECT DISTINCT
  13231. tmp.ConfigStatus,
  13232. 0,
  13233. @ImportBatchUser,
  13234. 0
  13235. FROM #Import_Staging tmp
  13236. LEFT OUTER JOIN Config_Status cfs
  13237. ON LTRIM(RTRIM(cfs.[Description])) = tmp.ConfigStatus
  13238. WHERE tmp.ConfigStatus IS NOT NULL
  13239. AND cfs.Config_Status_RecID IS NULL
  13240.  
  13241. -- Update invalid 'Installed By' members to 'zAdmin'
  13242. UPDATE tmp
  13243. SET tmp.InstalledBy = 'zAdmin'
  13244. FROM #Import_Staging tmp
  13245. LEFT OUTER JOIN Member mem
  13246. ON LTRIM(RTRIM(mem.Member_ID)) = tmp.InstalledBy
  13247. WHERE tmp.InstalledBy IS NOT NULL
  13248. AND mem.Member_RecID IS NULL
  13249.  
  13250. -- Truncate model numbers > 50 characters
  13251. UPDATE tmp
  13252. SET tmp.ModelNumber = SUBSTRING(tmp.ModelNumber, 1, 50)
  13253. FROM #Import_Staging tmp
  13254.  
  13255. -- Insert manufacturer if missing
  13256. INSERT INTO dbo.Manufacturer
  13257. (
  13258. Manufacturer_Name,
  13259. Inactive_Flag,
  13260. Last_Update,
  13261. Updated_By
  13262. )
  13263.  
  13264. SELECT DISTINCT
  13265. Manufacturer,
  13266. 0,
  13267. GETDATE(),
  13268. @ImportBatchUser
  13269. FROM #Import_Staging
  13270. WHERE Manufacturer IS NOT NULL
  13271. AND Manufacturer_RecID IS NULL
  13272.  
  13273. -- Update manufacturer RecID in source table so that validation passes
  13274. UPDATE tmp
  13275. SET tmp.Manufacturer_RecID = mfg.Manufacturer_RecID
  13276. FROM #Import_Staging tmp
  13277. INNER JOIN dbo.Manufacturer mfg
  13278. ON mfg.Manufacturer_Name = tmp.Manufacturer
  13279.  
  13280. END
  13281.  
  13282. -- If configurations are being updated, get old config type
  13283. UPDATE tmp
  13284. SET tmp.ConfigType_OLD = css.Survey_Name
  13285. FROM #Import_Staging tmp
  13286. INNER JOIN dbo.Config conf
  13287. ON conf.Config_RecID = tmp.[Configuration RecID]
  13288. INNER JOIN dbo.CS_Survey css
  13289. ON css.CS_Survey_RecID = conf.CS_Survey_RecID
  13290.  
  13291. -- Begin validations
  13292. INSERT INTO #tblResults
  13293. (
  13294. RowNumber,
  13295. ValMsg
  13296. )
  13297.  
  13298. -- Configuration Type must be valid
  13299. SELECT
  13300. tmp.ExcelRowNumber,
  13301. 'Invalid Configuration type: "' + tmp.ConfigType + '"'
  13302. FROM #Import_Staging tmp
  13303. WHERE tmp.CS_Survey_RecID IS NULL
  13304.  
  13305. UNION ALL
  13306.  
  13307. -- No/blank column name for question or answer column
  13308. SELECT TOP 1
  13309. tmp.ExcelRowNumber,
  13310. 'Question/Answer column names cannot be blank'
  13311. FROM #Import_Staging tmp
  13312. WHERE HasInvalidColumnID = 1
  13313.  
  13314. UNION ALL
  13315.  
  13316. -- Questions must be assigned to config type
  13317. SELECT
  13318. qu.ExcelRowNumber,
  13319. 'Question: "' + qu.Question + '" is not assigned to Configuration Type "' + qu.ConfigType + '" - answer must be blank.'
  13320. FROM #Questions qu
  13321. WHERE qu.Answer IS NOT NULL
  13322. AND qu.CS_Survey_RecID IS NOT NULL
  13323. AND qu.CS_Survey_Detail_RecID IS NULL
  13324.  
  13325. UNION ALL
  13326.  
  13327. -- Validate that answers are valid for the type
  13328. -- Text area cannot exceed 1000 characters
  13329. SELECT
  13330. qu.ExcelRowNumber,
  13331. 'The answer for question: "' + qu.Question + '" cannot exceed 1000 characters.'
  13332. FROM #Questions qu
  13333. WHERE qu.SF_Field_Type_ID = 'A'
  13334. AND LEN(qu.Answer) > 1000
  13335. AND qu.Answer IS NOT NULL
  13336.  
  13337. UNION ALL
  13338.  
  13339. -- Currency field must be numeric
  13340. SELECT
  13341. qu.ExcelRowNumber,
  13342. 'The answer for question: "' + qu.Question + '" must be numeric.'
  13343. FROM #Questions qu
  13344. WHERE qu.SF_Field_Type_ID = 'C'
  13345. AND ISNUMERIC(qu.Answer) <> 1
  13346. AND qu.Answer IS NOT NULL
  13347.  
  13348. UNION ALL
  13349.  
  13350. -- Date field must be a valid date
  13351. SELECT
  13352. qu.ExcelRowNumber,
  13353. 'The answer for question "' + qu.Question + '" must be a valid date.'
  13354. FROM #Questions qu
  13355. WHERE qu.SF_Field_Type_ID = 'D'
  13356. AND ISDATE(qu.Answer) <> 1
  13357. AND qu.Answer IS NOT NULL
  13358.  
  13359. UNION ALL
  13360.  
  13361. -- IP address field must contain valid IP address
  13362. SELECT
  13363. qu.ExcelRowNumber,
  13364. 'The answer to question "' + qu.Question + '" must be a valid IP address.'
  13365. FROM #Questions qu
  13366. WHERE qu.SF_Field_Type_ID = 'I'
  13367. AND qu.Answer IS NOT NULL
  13368. AND
  13369. (
  13370. ISNULL(PARSENAME(qu.Answer, 1), 999) NOT BETWEEN 0 AND 255
  13371. OR ISNULL(PARSENAME(qu.Answer, 2), 999) NOT BETWEEN 0 AND 255
  13372. OR ISNULL(PARSENAME(qu.Answer, 3), 999) NOT BETWEEN 0 AND 255
  13373. OR ISNULL(PARSENAME(qu.Answer, 4), 999) NOT BETWEEN 0 AND 255
  13374. )
  13375.  
  13376. UNION ALL
  13377.  
  13378. -- Checkbox field must evaluate to 0, 1, True, or False
  13379. SELECT
  13380. qu.ExcelRowNumber,
  13381. 'The answer to question: "' + qu.Question + '" must be True or False.'
  13382. FROM #Questions qu
  13383. WHERE qu.SF_Field_Type_ID = 'K'
  13384. AND qu.Answer IS NOT NULL
  13385. AND qu.Answer NOT IN('True', 'False', '0', '1', 'Y', 'N', 'T', 'F', 'Yes', 'No')
  13386.  
  13387. UNION ALL
  13388.  
  13389. -- Number field must be numeric
  13390. SELECT
  13391. qu.ExcelRowNumber,
  13392. 'The answer to question: "' + qu.Question + '" must be numeric.'
  13393. FROM #Questions qu
  13394. WHERE qu.SF_Field_Type_ID = 'N'
  13395. AND qu.Answer IS NOT NULL
  13396. AND ISNUMERIC(qu.Answer) = 0
  13397.  
  13398. UNION ALL
  13399.  
  13400. -- Percent field must be numeric and < 100
  13401. SELECT
  13402. qu.ExcelRowNumber,
  13403. 'Question: "' + qu.Question + '" must be answered with a valid percentage'
  13404. FROM #Questions qu
  13405. WHERE qu.SF_Field_Type_ID = 'P'
  13406. AND ISNUMERIC(REPLACE(qu.Answer, '%', '')) <> 1
  13407. AND qu.Answer IS NOT NULL
  13408.  
  13409. UNION ALL
  13410.  
  13411. -- Text field must not exceed 100 characters
  13412. SELECT
  13413. qu.ExcelRowNumber,
  13414. 'The answer for Question: "' + qu.Question + '" cannot exceed 100 characters'
  13415. FROM #Questions qu
  13416. WHERE qu.SF_Field_Type_ID = 'T'
  13417. AND LEN(qu.Answer) > 100
  13418. AND qu.Answer IS NOT NULL
  13419.  
  13420. UNION ALL
  13421.  
  13422. -- If question has a value list, check that answer is valid
  13423. SELECT
  13424. qu.ExcelRowNumber,
  13425. 'The Answer: "' + qu.Answer + '" is not valid for Question: "' + qu.Question + '"'
  13426. FROM #Questions qu
  13427. LEFT OUTER JOIN CS_Survey_Value csv
  13428. ON qu.Answer = LTRIM(RTRIM(csv.CS_Survey_Value))
  13429. AND qu.CS_Survey_Detail_RecID = csv.CS_Survey_Detail_RecID
  13430. WHERE qu.HasValueList = 1
  13431. AND csv.CS_Survey_Detail_RecID IS NULL
  13432. AND qu.Answer IS NOT NULL
  13433.  
  13434. UNION ALL
  13435.  
  13436. -- If question requires an answer, check that one is provided
  13437. SELECT
  13438. qu.ExcelRowNumber,
  13439. 'The configuration type: "' + qu.ConfigType + '" requires an answer for the question: "' + qu.Question + '"'
  13440. FROM #Questions qu
  13441. WHERE qu.IsRequired = 1
  13442. AND qu.Answer IS NULL
  13443.  
  13444. INSERT INTO #tblResults
  13445. (
  13446. RowNumber,
  13447. ValMsg
  13448. )
  13449.  
  13450. -- Configuration Type is required
  13451. SELECT
  13452. tmp.ExcelRowNumber,
  13453. 'Configuration type is required'
  13454. FROM #Import_Staging tmp
  13455. WHERE tmp.ConfigType IS NULL
  13456.  
  13457. UNION ALL
  13458.  
  13459. -- Configuration Type must be valid
  13460. SELECT
  13461. tmp.ExcelRowNumber,
  13462. 'Invalid Configuration type: "' + tmp.ConfigType + '"'
  13463. FROM #Import_Staging tmp
  13464. WHERE tmp.CS_Survey_RecID IS NULL
  13465. AND tmp.ConfigType IS NOT NULL
  13466.  
  13467. UNION ALL
  13468.  
  13469. -- Configuration name is required
  13470. SELECT
  13471. tmp.ExcelRowNumber,
  13472. 'Configuration name is required'
  13473. FROM #Import_Staging tmp
  13474. WHERE tmp.ConfigName IS NULL
  13475.  
  13476. UNION ALL
  13477.  
  13478. -- Configuration name cannot exceed 100 characters
  13479. SELECT
  13480. tmp.ExcelRowNumber,
  13481. 'Configuration name cannot exceed 100 characters'
  13482. FROM #Import_Staging tmp
  13483. WHERE LEN(tmp.ConfigName) > 100
  13484. AND tmp.ConfigName IS NOT NULL
  13485.  
  13486. UNION ALL
  13487.  
  13488. -- If specified, Vendor must be a company in CW
  13489. SELECT
  13490. tmp.ExcelRowNumber,
  13491. 'Invalid Vendor: "' + tmp.ManufacturerCompanyName + '"'
  13492. FROM #Import_Staging tmp
  13493. LEFT OUTER JOIN #Company comp
  13494. ON comp.Company_Name = tmp.ManufacturerCompanyName
  13495. WHERE tmp.ManufacturerCompanyName IS NOT NULL
  13496. AND comp.Company_RecID IS NULL
  13497.  
  13498. UNION ALL
  13499.  
  13500. SELECT
  13501. tmp.ExcelRowNumber,
  13502. 'Invalid manufacturer: "' + tmp.Manufacturer + '"'
  13503. FROM #Import_Staging tmp
  13504. WHERE Manufacturer IS NOT NULL
  13505. AND Manufacturer_RecID IS NULL
  13506.  
  13507. UNION ALL
  13508.  
  13509. -- Check for duplicate manufacturer company
  13510. SELECT
  13511. tmp.ExcelRowNumber,
  13512. 'Invalid manufacturer - There are more than 1 companies named "' + MIN(tmp.ManufacturerCompanyName) + '"'
  13513. FROM #Import_Staging tmp
  13514. INNER JOIN #Company comp
  13515. ON comp.Company_Name = tmp.ManufacturerCompanyName
  13516. WHERE tmp.ManufacturerCompanyName IS NOT NULL
  13517. AND @Legacy_Flag = 0
  13518. GROUP BY comp.Company_Name, ExcelRowNumber
  13519. HAVING COUNT(*) > 1
  13520.  
  13521. UNION ALL
  13522.  
  13523. -- Serial number cannot exceed 50 characters
  13524. SELECT
  13525. tmp.ExcelRowNumber,
  13526. 'Serial number cannot exceed 50 characters'
  13527. FROM #Import_Staging tmp
  13528. WHERE LEN(tmp.SerialNumber) > 50
  13529. AND tmp.SerialNumber IS NOT NULL
  13530.  
  13531. UNION ALL
  13532.  
  13533. -- Model number cannot exceed 50 characters
  13534. SELECT
  13535. tmp.ExcelRowNumber,
  13536. 'Model number cannot exceed 50 characters'
  13537. FROM #Import_Staging tmp
  13538. WHERE LEN(tmp.ModelNumber) > 50
  13539. AND tmp.ModelNumber IS NOT NULL
  13540.  
  13541. UNION ALL
  13542.  
  13543. -- Tag number cannot exceed 50 characters
  13544. SELECT
  13545. tmp.ExcelRowNumber,
  13546. 'Tag number cannot exceed 50 characters'
  13547. FROM #Import_Staging tmp
  13548. WHERE LEN(tmp.TagNumber) > 50
  13549. AND tmp.TagNumber IS NOT NULL
  13550.  
  13551. UNION ALL
  13552.  
  13553. -- Purchase date must be a valid date in mm/dd/yyyy format if entered
  13554. SELECT
  13555. tmp.ExcelRowNumber,
  13556. 'Purchase date must be a valid date - Please use MM/DD/YYYY format' + tmp.PurchaseDate
  13557. FROM #Import_Staging tmp
  13558. WHERE (ISDATE(tmp.PurchaseDate) = 0 OR tmp.PurchaseDate NOT LIKE '%/%/%')
  13559. AND tmp.PurchaseDate IS NOT NULL
  13560.  
  13561. UNION ALL
  13562.  
  13563. -- Installed date must be a valid date in mm/dd/yyyy format if entered
  13564. SELECT
  13565. tmp.ExcelRowNumber,
  13566. 'Installed date must be a valid date - Please use MM/DD/YYYY format ' + tmp.InstalledDate
  13567. FROM #Import_Staging tmp
  13568. WHERE (ISDATE(tmp.InstalledDate) = 0 OR tmp.InstalledDate NOT LIKE '%/%/%')
  13569. AND tmp.InstalledDate IS NOT NULL
  13570.  
  13571. UNION ALL
  13572.  
  13573. -- Installed by must be a valid member_id
  13574. SELECT
  13575. tmp.ExcelRowNumber,
  13576. 'Installed by member not found: "' + tmp.InstalledBy + '"'
  13577. FROM #Import_Staging tmp
  13578. LEFT OUTER JOIN Member mem
  13579. ON mem.Member_ID = tmp.InstalledBy
  13580. OR tmp.InstalledBy = ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, '') WHERE tmp.InstalledBy IS NOT NULL
  13581. AND mem.Member_RecID IS NULL
  13582.  
  13583. UNION ALL
  13584.  
  13585. -- Warranty date must be a valid date in mm/dd/yyyy format if entered
  13586. SELECT
  13587. tmp.ExcelRowNumber,
  13588. 'Warranty date must be a valid date - Please use MM/DD/YYYY format ' + tmp.WarrantyDate
  13589. FROM #Import_Staging tmp
  13590. WHERE (ISDATE(tmp.WarrantyDate) = 0 OR tmp.WarrantyDate NOT LIKE '%/%/%')
  13591. AND tmp.WarrantyDate IS NOT NULL
  13592.  
  13593. UNION ALL
  13594.  
  13595. -- Configuration status must be valid if specified
  13596. SELECT
  13597. tmp.ExcelRowNumber,
  13598. 'Invalid configuration status: "' + tmp.ConfigStatus + '"'
  13599. FROM #Import_Staging tmp
  13600. LEFT OUTER JOIN Config_Status cfs
  13601. ON dbo.ufn_Import_Trim(cfs.[Description]) = tmp.ConfigStatus
  13602. WHERE tmp.ConfigStatus IS NOT NULL
  13603. AND cfs.Config_Status_RecID IS NULL
  13604.  
  13605. UNION ALL
  13606.  
  13607. -- If Configuration status not specified, a default must exist
  13608. SELECT
  13609. tmp.ExcelRowNumber,
  13610. 'Configuration status is required if no default status exists'
  13611. FROM #Import_Staging tmp
  13612. WHERE tmp.ConfigStatus IS NULL
  13613. AND NOT EXISTS(SELECT TOP 1 * FROM Config_Status WHERE Default_Flag = 1)
  13614.  
  13615. UNION ALL
  13616.  
  13617. -- Company Name is Required
  13618. SELECT
  13619. tmp.ExcelRowNumber,
  13620. 'Company Name is required'
  13621. FROM #Import_Staging tmp
  13622. WHERE tmp.Company_Name IS NULL
  13623. AND tmp.Legacy_Company_ID IS NULL
  13624.  
  13625. UNION ALL
  13626. -- Check that company names are valid
  13627. SELECT
  13628. tmp.ExcelRowNumber,
  13629. 'Company not found: "' + ISNULL(tmp.Company_Name, '') + '"'
  13630. FROM #Import_Staging tmp
  13631. WHERE Company_Name IS NOT NULL
  13632. AND Company_RecID IS NULL
  13633.  
  13634. UNION ALL
  13635.  
  13636. -- Check for more than one company with the same name
  13637. SELECT
  13638. tmp.ExcelRowNumber,
  13639. 'There are more than one companies named "' + ISNULL(Company_Name, '') + '" - company name must be unique'
  13640. FROM #Import_Staging tmp
  13641. WHERE Company_Duplicate_Flag = 1
  13642.  
  13643. UNION ALL
  13644.  
  13645. -- Check that contact is valid
  13646. SELECT
  13647. tmp.ExcelRowNumber,
  13648. 'Unable to locate contact: "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '') + '"'
  13649. FROM #Import_Staging tmp
  13650. WHERE Contact_RecID IS NULL
  13651. AND tmp.ContactName IS NOT NULL
  13652. AND tmp.Company_Duplicate_Flag = 0
  13653. AND tmp.Company_RecID IS NOT NULL
  13654.  
  13655. UNION ALL
  13656.  
  13657. -- Check for duplicate contacts within company
  13658. SELECT
  13659. tmp.ExcelRowNumber,
  13660. 'There are more than one contacts named "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
  13661. FROM #Import_Staging tmp
  13662. WHERE tmp.Contact_Duplicate_Flag = 1
  13663. AND tmp.Company_Duplicate_Flag = 0
  13664.  
  13665. UNION ALL
  13666.  
  13667. -- Check that a default contact for company exists if contact is null
  13668. SELECT
  13669. tmp.ExcelRowNumber,
  13670. 'Contact must be specified for company: "' + ISNULL(tmp.Company_Name, '') + '" because no default contact exists for this company'
  13671. FROM #Import_Staging tmp
  13672. WHERE tmp.Contact_RecID IS NULL
  13673. AND tmp.ContactName IS NULL
  13674. AND tmp.Company_Name IS NOT NULL
  13675. AND tmp.Company_RecID IS NOT NULL
  13676. AND tmp.Company_Duplicate_Flag = 0
  13677.  
  13678. UNION ALL
  13679.  
  13680. -- Company site name must be valid if specified
  13681. -- Also join if it matches on Address_Line1 (common mistake by partner)
  13682. SELECT
  13683. tmp.ExcelRowNumber,
  13684. 'Company Address Site Name: "' + tmp.CompanyAddressSiteName + '" is invalid for company "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
  13685. FROM #Import_Staging tmp
  13686. LEFT OUTER JOIN Company_Address cadd
  13687. ON cadd.Company_RecID = tmp.Company_RecID
  13688. AND (cadd.[Description] = tmp.CompanyAddressSiteName OR cadd.Address_Line1 = tmp.CompanyAddressSiteName)
  13689. WHERE tmp.CompanyAddressSiteName IS NOT NULL
  13690. AND tmp.Company_RecID IS NOT NULL
  13691. AND cadd.Company_Address_RecID IS NULL
  13692.  
  13693. UNION ALL
  13694.  
  13695. -- If specified, location must be valid
  13696. SELECT
  13697. tmp.ExcelRowNumber,
  13698. 'Invalid location: "' + tmp.Location + '"'
  13699. FROM #Import_Staging tmp
  13700. LEFT OUTER JOIN dbo.Owner_Level ol
  13701. ON ol.[Description] = tmp.Location
  13702. WHERE tmp.Location IS NOT NULL
  13703. AND ol.Owner_Level_RecID IS NULL
  13704.  
  13705. UNION ALL
  13706.  
  13707. -- If specified, group must exist
  13708. SELECT
  13709. tmp.ExcelRowNumber,
  13710. 'Invalid group: "' + tmp.[Group] + '"'
  13711. FROM #Import_Staging tmp
  13712. LEFT OUTER JOIN Billing_Unit bu
  13713. ON bu.[Description] = tmp.[Group]
  13714. WHERE tmp.[Group] IS NOT NULL
  13715. AND bu.Billing_Unit_RecID IS NULL
  13716.  
  13717. UNION ALL
  13718.  
  13719. -- If group specified, location must be entered
  13720. SELECT
  13721. tmp.ExcelRowNumber,
  13722. 'Location is required if a group is specified'
  13723. FROM #Import_Staging tmp
  13724. WHERE tmp.[Group] IS NOT NULL
  13725. AND tmp.[Location] IS NULL
  13726.  
  13727. UNION ALL
  13728.  
  13729. -- Group must be associated with location
  13730. SELECT
  13731. tmp.ExcelRowNumber,
  13732. 'Group: "' + tmp.[Group] + '" is not valid for location: ' + tmp.Location
  13733. FROM #Import_Staging tmp
  13734. INNER JOIN Billing_Unit bu
  13735. ON dbo.ufn_Import_Trim(bu.[Description]) = tmp.[Group]
  13736. INNER JOIN Owner_Level ol
  13737. ON dbo.ufn_Import_Trim(ol.[Description]) = tmp.Location
  13738. LEFT OUTER JOIN Billing_Unit_Loc bul
  13739. ON bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
  13740. AND bul.Owner_Level_RecID = ol.Owner_Level_RecID
  13741. WHERE bul.Billing_Unit_RecID IS NULL
  13742. AND tmp.[Group] IS NOT NULL
  13743. AND tmp.[Location] IS NOT NULL
  13744.  
  13745. UNION ALL
  13746.  
  13747. -- If updating record, configuration type cannot be changed.
  13748. SELECT
  13749. tmp.ExcelRowNumber,
  13750. 'When updating a configuration, configuration type cannot change'
  13751. FROM #Import_Staging tmp
  13752. WHERE tmp.ConfigType IS NOT NULL
  13753. AND tmp.ConfigType_Old IS NOT NULL
  13754. AND tmp.ConfigType <> tmp.ConfigType_Old
  13755.  
  13756. UNION ALL
  13757.  
  13758. -- If configuration recid is specified (to update configuration) - must be valid
  13759. SELECT
  13760. tmp.ExcelRowNumber,
  13761. 'Cannot perform update: Configuration RecID: ' + [Configuration RecID] ' is invalid'
  13762. FROM #Import_Staging tmp
  13763. LEFT OUTER JOIN dbo.Config conf
  13764. ON conf.Config_RecID = tmp.[Configuration RecID]
  13765. WHERE tmp.[Configuration RecID] IS NOT NULL
  13766. AND conf.Config_RecID IS NULL
  13767.  
  13768. UNION ALL
  13769.  
  13770. -- Location must exist if specified
  13771. SELECT
  13772. tmp.ExcelRowNumber,
  13773. 'Invalid location: "' + tmp.Location + '"'
  13774. FROM #Import_Staging tmp
  13775. LEFT OUTER JOIN Owner_Level ol
  13776. ON ol.[Description] = tmp.Location
  13777. WHERE tmp.Location IS NOT NULL
  13778. AND ol.Owner_Level_RecID IS NULL
  13779.  
  13780. UNION ALL
  13781.  
  13782. -- Invalid question columns
  13783. SELECT DISTINCT
  13784. 0,
  13785. 'Question column: "' + ec.ColumnName + '" does not have a corresponding answer column named "' + REPLACE(ec.ColumnName, 'Q:', 'A:') + '"'
  13786. FROM @tblErrorColumns ec
  13787. WHERE ec.ColumnType = 'Q'
  13788.  
  13789. UNION ALL
  13790.  
  13791. -- Invalid answer columns
  13792. SELECT DISTINCT
  13793. 0,
  13794. 'Answer column: "' + ec.ColumnName + '" does not have a corresponding question column named "' + REPLACE(ec.ColumnName, 'A:', 'Q:') + '"'
  13795. FROM @tblErrorColumns ec
  13796. WHERE ec.ColumnType = 'A'
  13797.  
  13798. UNION ALL
  13799.  
  13800. -- Invalid column names
  13801. SELECT DISTINCT
  13802. 0,
  13803. 'Invalid column name: "' + ec.ColumnName + '" Question columns must begin with "Q:", answer columns must begin with "A:"'
  13804. FROM @tblErrorColumns ec
  13805. WHERE ec.ColumnType = 'I'
  13806.  
  13807. UNION ALL
  13808.  
  13809. -- Blank column names
  13810. SELECT DISTINCT
  13811. 0,
  13812. 'Question/Answer column names cannot be blank - there are ' + CAST(COUNT(*) AS VARCHAR(10)) + ' blank column names'
  13813. FROM @tblErrorColumns ec
  13814. WHERE ec.ColumnType = 'B'
  13815. HAVING COUNT(*) > 0
  13816.  
  13817. -- Insert notification messages for any created references
  13818. INSERT INTO #tblResults
  13819. (
  13820. RowNumber,
  13821. ValMsg,
  13822. Warning_Flag,
  13823. ReferenceType
  13824. )
  13825.  
  13826. SELECT
  13827. NULL,
  13828. Survey_Name,
  13829. 1,
  13830. 'Configuration Type(s)'
  13831. FROM dbo.CS_Survey
  13832. WHERE Updated_By = @ImportBatchUser
  13833.  
  13834. UNION ALL
  13835.  
  13836. SELECT
  13837. NULL,
  13838. Company_Name,
  13839. 1,
  13840. 'Vendor Company(s)'
  13841. FROM dbo.Company
  13842. WHERE Updated_By = @ImportBatchUser
  13843.  
  13844. UNION ALL
  13845.  
  13846. SELECT
  13847. NULL,
  13848. ISNULL(First_Name + ' ', '') + ISNULL(Last_Name, ''),
  13849. 1,
  13850. 'Contact(s)'
  13851. FROM dbo.Contact
  13852. WHERE Updated_By = @ImportBatchUser
  13853.  
  13854. UNION ALL
  13855.  
  13856. SELECT
  13857. NULL,
  13858. [Description],
  13859. 1,
  13860. 'Configuration Status(es)'
  13861. FROM dbo.Config_Status
  13862. WHERE Updated_By = @ImportBatchUser
  13863.  
  13864. UNION ALL
  13865.  
  13866. SELECT
  13867. NULL,
  13868. Manufacturer_Name,
  13869. 1,
  13870. 'Manufacturer(s)'
  13871. FROM dbo.Manufacturer
  13872. WHERE Updated_By = @ImportBatchUser
  13873.  
  13874. UNION ALL
  13875.  
  13876. SELECT DISTINCT
  13877. ExcelRowNumber,
  13878. 'Company: "' + tmp.Company_Name + '" fuzzy matched to Company: ' + tmp.Company_Name_Fuzzy,
  13879. 1,
  13880. NULL
  13881. FROM #Import_Staging tmp
  13882. WHERE Company_Name_Fuzzy IS NOT NULL
  13883.  
  13884. UNION ALL
  13885.  
  13886. SELECT DISTINCT
  13887. ExcelRowNumber,
  13888. 'Contact "' + tmp.ContactName + '" fuzzy matched to Contact: ' + tmp.Contact_Name_Fuzzy,
  13889. 1,
  13890. NULL
  13891. FROM #Import_Staging tmp
  13892. WHERE Contact_Name_Fuzzy IS NOT NULL
  13893.  
  13894. UNION ALL
  13895.  
  13896. SELECT
  13897. NULL,
  13898. '"' + csd.Question + '" for configuration type "' + css.Survey_Name + '"',
  13899. 1,
  13900. 'Custom Questions'
  13901. FROM dbo.CS_Survey_Detail csd
  13902. INNER JOIN CS_Survey css ON css.CS_Survey_RecID = csd.CS_Survey_RecID
  13903. WHERE csd.Updated_By = @ImportBatchUser
  13904.  
  13905.  
  13906. -- Return results
  13907. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  13908. BEGIN
  13909.  
  13910. exec dbo.usp_Condense_Validation_Results
  13911.  
  13912. SELECT
  13913. 0 AS ValPassed,
  13914. 0 AS RowNumber,
  13915. ValMsg
  13916. FROM #ResultsCondensed
  13917.  
  13918. ROLLBACK TRANSACTION
  13919. RETURN
  13920.  
  13921. END
  13922. ELSE
  13923. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
  13924. BEGIN
  13925.  
  13926. exec dbo.usp_Condense_Validation_Results
  13927.  
  13928. SELECT
  13929. 2 AS ValPassed,
  13930. 0 AS RowNumber,
  13931. ValMsg
  13932. FROM #ResultsCondensed res
  13933.  
  13934.  
  13935. UNION ALL
  13936.  
  13937. SELECT
  13938. 2 AS ValPassed,
  13939. 0 AS RowNumber,
  13940. 'The following ' + ReferenceType + ' will be created: '+
  13941. STUFF(
  13942. (SELECT ', ' + ValMsg
  13943. FROM #tblResults
  13944. WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
  13945. FOR XML PATH (''))
  13946. , 1, 1, '') AS ValMsg
  13947. FROM #tblResults res
  13948. WHERE ReferenceType IS NOT NULL
  13949. GROUP BY ReferenceType
  13950.  
  13951. ROLLBACK TRANSACTION
  13952. EXEC usp_Import_Record_Validation @TableName
  13953. RETURN
  13954.  
  13955. END
  13956. ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  13957. BEGIN
  13958. SELECT
  13959. 1 AS ValPassed,
  13960. NULL AS RowNumber,
  13961. NULL AS ValMsg
  13962.  
  13963. ROLLBACK TRANSACTION
  13964. EXEC usp_Import_Record_Validation @TableName
  13965. RETURN
  13966. END
  13967.  
  13968. END TRY
  13969.  
  13970. BEGIN CATCH
  13971.  
  13972.  
  13973.  
  13974.  
  13975. -- Return error information and rollback transaction
  13976. SELECT
  13977. 0 AS ValPassed,
  13978. ERROR_LINE() AS RowNumber,
  13979. ERROR_MESSAGE() AS ValMsg
  13980.  
  13981. ROLLBACK TRANSACTION CFG_Validate
  13982.  
  13983. END CATCH
  13984.  
  13985.  
  13986. GO
  13987.  
  13988.  
  13989. -- =============================================
  13990. -- Author: m.gray
  13991. -- Create date: 04/18/2013
  13992. -- Description: Performs final validation
  13993. -- and inserts for Configurations import
  13994. -- Sample call: exec usp_CFG_ImportPush 'TMP_Import_544245135e294947973ed30b293f4033', 'TMP_Questions_544245135e294947973ed30b293f4033', 1
  13995. -- =============================================
  13996.  
  13997. ALTER PROCEDURE [dbo].[usp_CFG_ImportPush]
  13998. @TableName VARCHAR(MAX),
  13999. @TempQuestionsName VARCHAR(MAX),
  14000. @DebugMode INT = 0,
  14001. @Forcemode BIT = 0
  14002. AS
  14003. BEGIN TRY
  14004. SET NOCOUNT ON
  14005. BEGIN TRANSACTION CFG_Import
  14006. -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
  14007. IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
  14008. BEGIN
  14009. DROP TABLE #Import_Staging
  14010. END
  14011.  
  14012. CREATE TABLE #Import_Staging
  14013. (
  14014. ExcelRowNumber int NULL,
  14015. ConfigType nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14016. ConfigName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14017. ManufacturerCompanyName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14018. Manufacturer nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14019. SerialNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14020. ModelNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14021. TagNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14022. InstalledBy nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14023. WarrantyDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14024. ConfigStatus nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14025. Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14026. ContactFirstName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14027. ContactLastName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14028. CompanyAddressSiteName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14029. Location nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14030. [Group] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14031. ConfigNotes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  14032. PurchaseDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14033. InstalledDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  14034. Phone VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  14035. Ext VARCHAR(15) COLLATE DATABASE_DEFAULT NULL,
  14036. Email VARCHAR(200) COLLATE DATABASE_DEFAULT NULL,
  14037. Company_Address_RecID INT NULL,
  14038. Address_Line1 VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  14039. Address_Line2 VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  14040. City VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  14041. State_ID VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  14042. Zip VARCHAR(12) COLLATE DATABASE_DEFAULT NULL,
  14043. SiteName VARCHAR(50) COLLATE DATABASE_DEFAULT,
  14044. CS_Survey_RecID INT,
  14045. Mfg_Company_RecID INT,
  14046. Manufacturer_RecID INT,
  14047. InstalledBy_RecID VARCHAR(10) COLLATE DATABASE_DEFAULT,
  14048. Config_Status_RecID INT,
  14049. Owner_Level_RecID INT,
  14050. Billing_Unit_RecID INT,
  14051. ConvertMessage VARCHAR(1000)COLLATE DATABASE_DEFAULT,
  14052. Config_RecID INT,
  14053. Company_RecID INT NULL,
  14054. Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  14055. Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  14056. Company_Duplicate_Flag BIT NULL,
  14057. Contact_RecID INT NULL,
  14058. ContactName NVARCHAR(61) COLLATE DATABASE_DEFAULT,
  14059. Contact_Duplicate_Flag BIT NULL,
  14060. Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
  14061. [Configuration RecID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  14062. Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
  14063. Duplicate_Flag BIT,
  14064. Vendor_Notes NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  14065. Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  14066. Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  14067. Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  14068. Diff_Exclude_Flag BIT,
  14069. Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  14070. Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  14071. SR_Service_RecID INT,
  14072. Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  14073. SO_Opportunity_RecID INT
  14074. )
  14075.  
  14076. -- Variable declaration
  14077. DECLARE
  14078. @ExpRowCount INT, -- Expected rowcount for inserts - Used for validation
  14079. @ErrorMsg VARCHAR(350), -- Variable to hold custom error message
  14080. @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
  14081. @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
  14082.  
  14083. -- Flag to indicate migration being matched on Legacy_ID
  14084. DECLARE @Legacy_Flag BIT = 0
  14085.  
  14086. -- Dynamic statement to insert to validation table
  14087. DECLARE @DSQL VARCHAR(MAX)
  14088.  
  14089. -- Fully qualified name of source table
  14090. DECLARE @SourceTable VARCHAR(300)
  14091. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  14092.  
  14093. -- Fully qualified name of Questions table
  14094. DECLARE @QuestionsTable VARCHAR(300)
  14095. SELECT @QuestionsTable = 'tempdb.dbo.' + @TempQuestionsName
  14096.  
  14097. -- Object_ID of source table
  14098. DECLARE @Source_Object_ID INT
  14099. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  14100.  
  14101. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  14102. SELECT @ImportBatchUser =
  14103. 'CONV_'
  14104. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  14105. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  14106. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  14107. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  14108.  
  14109. -- Table variable to hold column names from source table
  14110. DECLARE @SourceColumns TABLE
  14111. (
  14112. ColumnName VARCHAR(255)
  14113. )
  14114.  
  14115. -- Populate @SourceColumns
  14116. INSERT INTO @SourceColumns
  14117. (
  14118. ColumnName
  14119. )
  14120.  
  14121. SELECT
  14122. name
  14123. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  14124.  
  14125. -- Handle current & legacy templates by renaming column 'Vendor Company Name' to 'Manufacturer Company Name'
  14126. IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Company Name')
  14127. AND NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE Object_id = object_id(@SourceTable) AND name = 'Manufacturer Company Name')
  14128. BEGIN
  14129. SELECT @DSQL =
  14130. '
  14131. USE tempdb
  14132. EXEC sp_rename
  14133. @objname = ''tempdb..' + @TableName + '.[Vendor Company Name]'' ,
  14134. @newname = ''Manufacturer Company Name'',
  14135. @objtype = ''COLUMN''
  14136. '
  14137.  
  14138. EXEC(@DSQL)
  14139. END
  14140.  
  14141. -- Add/Re-Add [Vendor Company Name] field to avoid any compilation errors based on structure
  14142. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Company Name')
  14143. BEGIN
  14144. SELECT @DSQL =
  14145. '
  14146. ALTER TABLE ' + @SourceTable + '
  14147. ADD [Vendor Company Name] NVARCHAR(255) COLLATE DATABASE_DEFAULT
  14148. '
  14149.  
  14150. EXEC(@DSQL)
  14151.  
  14152. END
  14153.  
  14154. -- Add Manufacturer field if it doesn't exist (field is optional to accommodate legacy templates)
  14155. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Manufacturer')
  14156. BEGIN
  14157. SELECT @DSQL =
  14158. '
  14159. ALTER TABLE ' + @SourceTable + '
  14160. ADD [Manufacturer] NVARCHAR(255) COLLATE DATABASE_DEFAULT
  14161. '
  14162.  
  14163. EXEC(@DSQL)
  14164.  
  14165. END
  14166.  
  14167. -- Add [Configuration RecID] field if it doesn't exist (field is optional and only used to update configurations)
  14168. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Configuration RecID')
  14169. BEGIN
  14170. SELECT @DSQL =
  14171. '
  14172. ALTER TABLE ' + @SourceTable + '
  14173. ADD [Configuration RecID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  14174. '
  14175.  
  14176. EXEC(@DSQL)
  14177.  
  14178. END
  14179.  
  14180. -- Add [Vendor Notes] field if it doesn't exist (field is optional to accommodate legacy templates)
  14181. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Notes')
  14182. BEGIN
  14183. SELECT @DSQL =
  14184. '
  14185. ALTER TABLE ' + @SourceTable + '
  14186. ADD [Vendor Notes] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  14187. '
  14188.  
  14189. EXEC(@DSQL)
  14190.  
  14191. END
  14192.  
  14193. -- Capture question source into temp table
  14194. IF (OBJECT_ID('tempdb..#QuestionSource')) IS NOT NULL
  14195. BEGIN
  14196. DROP TABLE #QuestionSource
  14197. END
  14198.  
  14199. CREATE TABLE #QuestionSource
  14200. (
  14201. ExcelRowNumber INT,
  14202. Question NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  14203. Answer NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  14204. )
  14205.  
  14206. SELECT @DSQL =
  14207. '
  14208. INSERT INTO #QuestionSource
  14209. (
  14210. ExcelRowNumber,
  14211. Question,
  14212. Answer
  14213. )
  14214. SELECT
  14215. src.[Excel Row Number],
  14216. src.[Question],
  14217. src.[Answer]
  14218. FROM ' + @QuestionsTable + ' src'
  14219.  
  14220. EXEC (@DSQL)
  14221.  
  14222. -- Table to hold questions
  14223. IF (OBJECT_ID('tempdb..#Questions')) IS NOT NULL
  14224. BEGIN
  14225. DROP TABLE #Questions
  14226. END
  14227.  
  14228. CREATE TABLE #Questions
  14229. (
  14230. ExcelRowNumber INT,
  14231. Question VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  14232. Answer VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  14233. ConfigType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  14234. CS_Survey_RecID INT,
  14235. CS_Survey_Detail_RecID INT,
  14236. SF_Field_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT,
  14237. SF_Entry_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT,
  14238. HasValueList BIT,
  14239. IsRequired BIT,
  14240. Decimals_Flag BIT,
  14241. Max_Decimals INT,
  14242. Num_Decimals INT,
  14243. ConvertMessage NVARCHAR(500) COLLATE DATABASE_DEFAULT,
  14244. Config_RecID INT,
  14245. Spreadsheet_Flag BIT,
  14246. Seq_Nbr DECIMAL(8,2)
  14247. )
  14248.  
  14249. -- Build insert to populate Staging table variable with initial values
  14250. SET @DSQL = '
  14251. INSERT INTO #Import_Staging
  14252. (
  14253. ExcelRowNumber,
  14254. ConfigType,
  14255. ConfigName,
  14256. ManufacturerCompanyName,
  14257. Manufacturer,
  14258. SerialNumber,
  14259. ModelNumber,
  14260. TagNumber,
  14261. InstalledBy,
  14262. WarrantyDate,
  14263. ConfigStatus,
  14264. Company_Name,
  14265. ContactFirstName,
  14266. ContactLastName,
  14267. CompanyAddressSiteName,
  14268. Location,
  14269. [Group],
  14270. ConfigNotes,
  14271. PurchaseDate,
  14272. InstalledDate,
  14273. [Configuration RecID],
  14274. Company_Match_Val,
  14275. Vendor_Notes
  14276. )
  14277.  
  14278. SELECT
  14279. [Excel Row Number],
  14280. [Configuration Type],
  14281. LEFT([Configuration Name], 100),
  14282. [Manufacturer Company Name],
  14283. [Manufacturer],
  14284. [Serial Number],
  14285. [Model Number],
  14286. [Tag Number],
  14287. [Installed By],
  14288. [Warranty Date],
  14289. [Configuration Status],
  14290. [Company Name],
  14291. [Contact First Name],
  14292. [Contact Last Name],
  14293. [Company Address Site Name],
  14294. [Location],
  14295. [Group],
  14296. [Configuration Notes],
  14297. [Purchase Date],
  14298. [Installed Date],
  14299. [Configuration RecID],
  14300. LEFT([Company Name], 3),
  14301. [Vendor Notes]
  14302. FROM ' + @SourceTable
  14303.  
  14304. -- Pull data into staging table
  14305. EXEC(@DSQL)
  14306.  
  14307. -- Convert empty string and single space to null for all values in staging table
  14308. UPDATE #Import_Staging SET
  14309. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  14310. ConfigType = CASE WHEN ConfigType IN('', ' ') THEN NULL ELSE ConfigType END,
  14311. ConfigName = CASE WHEN ConfigName IN('', ' ') THEN NULL ELSE ConfigName END,
  14312. ManufacturerCompanyName = CASE WHEN ManufacturerCompanyName IN('', ' ') THEN NULL ELSE ManufacturerCompanyName END,
  14313. SerialNumber = CASE WHEN SerialNumber IN('', ' ') THEN NULL ELSE SerialNumber END,
  14314. ModelNumber = CASE WHEN ModelNumber IN('', ' ') THEN NULL ELSE ModelNumber END,
  14315. TagNumber = CASE WHEN TagNumber IN('', ' ') THEN NULL ELSE TagNumber END,
  14316. InstalledBy = CASE WHEN InstalledBy IN('', ' ') THEN NULL ELSE InstalledBy END,
  14317. WarrantyDate = CASE WHEN WarrantyDate IN('', ' ') THEN NULL ELSE WarrantyDate END,
  14318. ConfigStatus = CASE WHEN ConfigStatus IN('', ' ') THEN NULL ELSE ConfigStatus END,
  14319. Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
  14320. ContactFirstName = CASE WHEN ContactFirstName IN('', ' ') THEN NULL ELSE ContactFirstName END,
  14321. ContactLastName = CASE WHEN ContactLastName IN('', ' ') THEN NULL ELSE ContactLastName END,
  14322. CompanyAddressSiteName = CASE WHEN CompanyAddressSiteName IN('', ' ') THEN NULL ELSE CompanyAddressSiteName END,
  14323. Location = CASE WHEN Location IN('', ' ') THEN NULL ELSE Location END,
  14324. [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
  14325. ConfigNotes = CASE WHEN ConfigNotes IN('', ' ') THEN NULL ELSE ConfigNotes END,
  14326. PurchaseDate = CASE WHEN PurchaseDate IN('', ' ') THEN NULL ELSE PurchaseDate END,
  14327. InstalledDate = CASE WHEN InstalledDate IN('', ' ') THEN NULL ELSE InstalledDate END,
  14328. Manufacturer = CASE WHEN Manufacturer IN('', ' ') THEN NULL ELSE Manufacturer END,
  14329. [Configuration RecID] = CASE WHEN [Configuration RecID] IN('', ' ') THEN NULL ELSE [Configuration RecID] END
  14330.  
  14331. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
  14332. BEGIN
  14333. SELECT @DSQL = '
  14334. UPDATE tmp
  14335. SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
  14336. FROM #Import_Staging tmp
  14337. INNER JOIN ' + @SourceTable + ' src
  14338. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  14339.  
  14340. EXEC(@DSQL)
  14341. END
  14342.  
  14343. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
  14344. BEGIN
  14345. SELECT @DSQL = '
  14346. UPDATE tmp
  14347. SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
  14348. FROM #Import_Staging tmp
  14349. INNER JOIN ' + @SourceTable + ' src
  14350. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  14351.  
  14352. EXEC(@DSQL)
  14353. END
  14354.  
  14355. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
  14356. BEGIN
  14357. SELECT @DSQL = '
  14358. UPDATE tmp
  14359. SET tmp.Legacy_ID = src.Legacy_ID
  14360. FROM #Import_Staging tmp
  14361. INNER JOIN ' + @SourceTable + ' src
  14362. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  14363.  
  14364. EXEC(@DSQL)
  14365. END
  14366.  
  14367. -- Condense contact first and last names to ContactName
  14368. UPDATE tmp
  14369. SET ContactName = LTRIM(ISNULL(tmp.ContactFirstName + ' ', '')) + RTRIM(ISNULL(tmp.ContactLastName, ''))
  14370. FROM #Import_Staging tmp
  14371.  
  14372. -- Remove export datatype config row
  14373. DELETE FROM #Import_Staging WHERE Company_Name = 'CW_Import_Config_Row'
  14374.  
  14375. -- Get RecID for Config Type
  14376. UPDATE tmp
  14377. SET tmp.CS_Survey_RecID = csc.CS_Survey_RecID
  14378. FROM #Import_Staging tmp
  14379. INNER JOIN dbo.CS_Survey csc
  14380. ON tmp.ConfigType = csc.Survey_Name
  14381.  
  14382. -- Force config types if necessary
  14383. IF @Forcemode = 1 AND EXISTS(SELECT TOP 1 * FROM #Import_Staging tmp WHERE CS_Survey_RecID IS NULL)
  14384. BEGIN
  14385.  
  14386. INSERT INTO dbo.CS_Survey
  14387. (
  14388. Owner_ID,
  14389. Survey_Name,
  14390. Instructions,
  14391. Inactive_Flag,
  14392. Last_Update,
  14393. Updated_By,
  14394. Survey_Flag,
  14395. System_Flag
  14396. )
  14397.  
  14398. SELECT DISTINCT
  14399. 1,
  14400. tmp.ConfigType,
  14401. 'Created by import utility on ' + CONVERT(VARCHAR, GETDATE(), 101),
  14402. 0,
  14403. GETDATE(),
  14404. @ImportBatchUser,
  14405. 0,
  14406. 0
  14407. FROM #Import_Staging tmp
  14408. WHERE tmp.CS_Survey_RecID IS NULL
  14409. AND tmp.ConfigType IS NOT NULL
  14410.  
  14411. -- Capture RecIDs for newly inserted config types
  14412. UPDATE tmp
  14413. SET tmp.CS_Survey_RecID = css.CS_Survey_RecID
  14414. FROM #Import_Staging tmp
  14415. INNER JOIN CS_Survey css
  14416. ON css.Survey_Name = tmp.ConfigType
  14417. AND tmp.CS_Survey_RecID IS NULL
  14418. AND css.Updated_By = @ImportBatchUser
  14419. END
  14420.  
  14421.  
  14422. -- Prepare custom question records for each spreadsheet row
  14423. INSERT INTO #Questions
  14424. (
  14425. ExcelRowNumber,
  14426. ConfigType,
  14427. Question,
  14428. CS_Survey_RecID,
  14429. CS_Survey_Detail_RecID,
  14430. SF_Field_Type_ID,
  14431. SF_Entry_Type_ID,
  14432. IsRequired,
  14433. Max_Decimals,
  14434. Decimals_Flag,
  14435. Answer,
  14436. HasValueList,
  14437. Spreadsheet_Flag
  14438. )
  14439.  
  14440. SELECT
  14441. ISNULL(stag.ExcelRowNumber, qs.[ExcelRowNumber]),
  14442. ct.ConfigType,
  14443. ISNULL(qs.Question, csd.Question),
  14444. ct.CS_Survey_RecID,
  14445. csd.CS_Survey_Detail_RecID,
  14446. csd.SF_Field_Type_ID,
  14447. csd.SF_Entry_Type_ID,
  14448. CASE WHEN csd.Required_Flag = 1 THEN 1 ELSE 0 END,
  14449. csd.Nbr_Decimals,
  14450. CASE WHEN csd.SF_Entry_Type_ID IN('L', 'O') THEN 1 ELSE 0 END,
  14451. LEFT(ISNULL(qs.Answer, csv.CS_Survey_Value), 1000),
  14452. CASE WHEN csv.CS_Survey_Value IS NOT NULL THEN 1 ELSE 0 END,
  14453. CASE WHEN qs.Answer IS NOT NULL THEN 1 ELSE 0 END
  14454. FROM CS_Survey_Detail csd
  14455. INNER JOIN CS_Survey css
  14456. ON css.CS_Survey_RecID = csd.CS_Survey_RecID
  14457. AND csd.Inactive_Flag = 0
  14458. INNER JOIN #Import_Staging stag
  14459. ON stag.CS_Survey_RecID = css.CS_Survey_RecID
  14460. FULL OUTER JOIN #QuestionSource qs
  14461. ON qs.Question = csd.Question
  14462. AND qs.ExcelRowNumber = stag.ExcelRowNumber
  14463. OUTER APPLY
  14464. (
  14465. SELECT TOP 1 csv.CS_Survey_Value
  14466. FROM CS_Survey_Value csv
  14467. WHERE csv.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID
  14468. AND csv.Default_Flag = 1
  14469. ) csv
  14470. CROSS APPLY(SELECT TOP 1 ConfigType, CS_Survey_RecID FROM #Import_Staging stag WHERE stag.ExcelRowNumber = qs.ExcelRowNumber) ct
  14471.  
  14472. -- Update blank string answers to null
  14473. UPDATE qu
  14474. SET qu.Answer = NULL
  14475. FROM #Questions qu
  14476. WHERE qu.Answer = ''
  14477.  
  14478. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  14479. IF Object_ID('tempdb..#Company') IS NOT NULL
  14480. BEGIN
  14481. DROP TABLE #Company
  14482. END
  14483.  
  14484. SELECT DISTINCT
  14485. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  14486. comp.Company_ID,
  14487. comp.Company_Name,
  14488. Delete_Flag,
  14489. LEFT(Company_Name, 3) AS Company_Match_Val,
  14490. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  14491. 0 AS Duplicate_Flag
  14492. INTO #Company
  14493. FROM dbo.Company comp
  14494. WHERE Delete_Flag = 0
  14495. AND (LEFT(Company_Name, 3) IN(SELECT Company_Match_Val FROM #Import_Staging)
  14496. OR Company_Name IN(SELECT ManufacturerCompanyName FROM #Import_Staging)
  14497. OR Company_RecID = (SELECT TOP 1 Company_RecID FROM dbo.Owner))
  14498.  
  14499. -- Table to hold contact information
  14500. IF Object_ID('tempdb..#Contact') IS NOT NULL
  14501. BEGIN
  14502. DROP TABLE #Contact
  14503. END
  14504.  
  14505. SELECT
  14506. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  14507. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  14508. First_Name,
  14509. Last_Name,
  14510. cont.Company_RecID,
  14511. Default_Flag
  14512. INTO #Contact
  14513. FROM dbo.Contact cont
  14514. INNER JOIN #Company comp
  14515. ON comp.Company_RecID = cont.Company_RecID
  14516.  
  14517. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  14518. BEGIN
  14519. SELECT @Legacy_Flag = 1
  14520. EXEC usp_Import_Match_Legacy @TableName, 'Configuration'
  14521. END
  14522.  
  14523. IF @Legacy_Flag = 0
  14524. BEGIN
  14525. -- Match companies and contacts
  14526. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  14527. END
  14528.  
  14529. -- Update blank string answers to null
  14530. UPDATE qu
  14531. SET qu.Answer = NULL
  14532. FROM #Questions qu
  14533. WHERE qu.Answer = ''
  14534. -- Get RecID for Manufacturer
  14535. UPDATE tmp
  14536. SET tmp.Manufacturer_RecID = mfg.Manufacturer_RecID
  14537. FROM #Import_Staging tmp
  14538. INNER JOIN dbo.Manufacturer mfg
  14539. ON mfg.Manufacturer_Name = tmp.Manufacturer
  14540.  
  14541. -- If @ForceMode = 1, create references as needed
  14542. IF(@Forcemode = 1)
  14543. BEGIN
  14544.  
  14545. INSERT INTO dbo.CS_Survey_Detail
  14546. (
  14547. CS_Survey_RecID,
  14548. Seq_Nbr,
  14549. Question,
  14550. SF_Field_Type_ID,
  14551. Nbr_Decimals,
  14552. SF_Entry_Type_ID,
  14553. Required_Flag,
  14554. Inactive_Flag,
  14555. Last_Update,
  14556. Updated_By
  14557. )
  14558.  
  14559. SELECT
  14560. qu.CS_Survey_RecID,
  14561. ISNULL(MAX(csd.Seq_Nbr), 0.00) + Row_Number() OVER(PARTITION BY qu.CS_Survey_RecID ORDER BY qu.CS_Survey_RecID ASC) AS Seq_Nbr,
  14562. qu.Question,
  14563. CASE WHEN MAX(LEN(qu.Answer)) > 100 THEN 'A' ELSE 'T' END AS SF_Field_Type_ID,
  14564. 0 AS Nbr_Decimals,
  14565. 'E' AS SF_Entry_Type_ID,
  14566. 0 AS Required_Flag,
  14567. 0 AS Inactive_Flag,
  14568. GETDATE() AS Last_Update,
  14569. @ImportBatchUser AS Updated_By
  14570.  
  14571. FROM #Questions qu
  14572. CROSS APPLY(SELECT MAX(Seq_Nbr) AS Seq_Nbr FROM CS_Survey_Detail csd WHERE csd.CS_Survey_RecID = qu.CS_Survey_RecID) csd
  14573. WHERE qu.CS_Survey_Detail_RecID IS NULL
  14574. AND qu.CS_Survey_RecID IS NOT NULL
  14575. AND qu.Answer IS NOT NULL
  14576. GROUP BY CS_Survey_RecID, Question
  14577.  
  14578. -- Update #Questions with appropriate information for newly inserted questions
  14579. UPDATE qu
  14580. SET qu.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID,
  14581. qu.SF_Field_Type_ID = csd.SF_Field_Type_ID,
  14582. qu.SF_Entry_Type_ID = 'E',
  14583. qu.Max_Decimals = 0
  14584. FROM #Questions qu
  14585. CROSS APPLY(SELECT TOP 1 * FROM CS_Survey_Detail csd WHERE csd.CS_Survey_RecID = qu.CS_Survey_RecID AND csd.Question = qu.Question AND csd.Updated_By = @ImportBatchUser) csd
  14586. WHERE qu.CS_Survey_Detail_RecID IS NULL
  14587.  
  14588. -- Vendor company
  14589. IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
  14590. BEGIN
  14591. INSERT INTO dbo.Company
  14592. (
  14593. Company_ID,
  14594. Company_Name,
  14595. Updated_By,
  14596. Company_Type_RecID,
  14597. Company_Status_RecID,
  14598. Delete_Flag,
  14599. Entered_by,
  14600. Options_Last_Update_UTC,
  14601. Options_Updated_by
  14602. )
  14603.  
  14604. SELECT DISTINCT
  14605. 'M-' + LEFT(ManufacturerCompanyName, 48),
  14606. SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
  14607. @ImportBatchUser,
  14608. ctype.Company_Type_RecID,
  14609. cstat.Company_Status_RecID,
  14610. 0,
  14611. @ImportBatchUser,
  14612. GETUTCDATE(),
  14613. 'zAdmin'
  14614. FROM #Import_Staging tmp
  14615. LEFT OUTER JOIN #Company comp
  14616. ON comp.Company_Name = tmp.ManufacturerCompanyName
  14617. INNER JOIN Company_Type ctype
  14618. ON ctype.[Description] = 'Vendor'
  14619. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
  14620. WHERE tmp.ManufacturerCompanyName IS NOT NULL
  14621. AND comp.Company_RecID IS NULL
  14622. END
  14623.  
  14624. IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company')
  14625. AND NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
  14626. BEGIN
  14627. INSERT INTO dbo.Company
  14628. (
  14629. Company_ID,
  14630. Company_Name,
  14631. Updated_By,
  14632. Company_Type_RecID,
  14633. Company_Status_RecID,
  14634. Delete_Flag,
  14635. Entered_by
  14636. )
  14637.  
  14638. SELECT DISTINCT
  14639. 'M-' + LEFT(ManufacturerCompanyName, 48),
  14640. SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
  14641. @ImportBatchUser,
  14642. ctype.Company_Type_RecID,
  14643. cstat.Company_Status_RecID,
  14644. 0,
  14645. @ImportBatchUser
  14646. FROM #Import_Staging tmp
  14647. LEFT OUTER JOIN #Company comp
  14648. ON comp.Company_Name = tmp.ManufacturerCompanyName
  14649. INNER JOIN Company_Type ctype
  14650. ON ctype.[Description] = 'Vendor'
  14651. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
  14652. WHERE tmp.ManufacturerCompanyName IS NOT NULL
  14653. AND comp.Company_RecID IS NULL
  14654. END
  14655.  
  14656. IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company')
  14657. AND NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
  14658. BEGIN
  14659. INSERT INTO dbo.Company
  14660. (
  14661. Company_ID,
  14662. Company_Name,
  14663. Updated_By,
  14664. Company_Type_RecID,
  14665. Company_Status_RecID,
  14666. Delete_Flag
  14667. )
  14668.  
  14669. SELECT DISTINCT
  14670. 'M-' + LEFT(ManufacturerCompanyName, 48),
  14671. SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
  14672. @ImportBatchUser,
  14673. ctype.Company_Type_RecID,
  14674. cstat.Company_Status_RecID,
  14675. 0
  14676. FROM #Import_Staging tmp
  14677. LEFT OUTER JOIN #Company comp
  14678. ON comp.Company_Name = tmp.ManufacturerCompanyName
  14679. INNER JOIN Company_Type ctype
  14680. ON ctype.[Description] = 'Vendor'
  14681. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
  14682. WHERE tmp.ManufacturerCompanyName IS NOT NULL
  14683. AND comp.Company_RecID IS NULL
  14684. END
  14685.  
  14686. -- If more than one company inserted with same name, raise error
  14687. -- This would be due to 2 or more types named 'Vendor' or 2 or more statuses set to Import_Flag = 1
  14688. IF EXISTS(SELECT Company_Name FROM dbo.Company WHERE Updated_By = @ImportBatchUser GROUP BY Company_Name HAVING COUNT(*) > 1)
  14689. BEGIN
  14690. RAISERROR('More than one company reference created - check company types and statuses.', 16, 1)
  14691. END
  14692.  
  14693. -- -- Insert a 'Main' site record for any manufacturer company created
  14694. -- IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
  14695. -- BEGIN
  14696. -- INSERT INTO dbo.Company_Address
  14697. -- (
  14698. -- Owner_ID,
  14699. -- Company_RecID,
  14700. -- Zip, -- Place a dot in zip code because at least one address field must be filled out per PSA validation
  14701. -- Default_Flag,
  14702. -- Updated_By,
  14703. -- [Description],
  14704. -- Entered_By
  14705. -- )
  14706.  
  14707. -- SELECT DISTINCT
  14708. -- 1,
  14709. -- Company_RecID,
  14710. -- '.',
  14711. -- 1,
  14712. -- @ImportBatchUser,
  14713. -- 'Main',
  14714. -- @ImportBatchUser
  14715. -- FROM dbo.Company
  14716. -- WHERE Updated_By = @ImportBatchUser
  14717. -- -- Hack to suppress structural errors
  14718. -- AND NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE 1=2)
  14719. -- END
  14720.  
  14721.  
  14722. --IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
  14723. --BEGIN
  14724. -- INSERT INTO dbo.Company_Address
  14725. -- (
  14726. -- Owner_ID,
  14727. -- Company_RecID,
  14728. -- Zip, -- Place a dot in zip code because at least one address field must be filled out per PSA validation
  14729. -- Default_Flag,
  14730. -- Updated_By,
  14731. -- [Description]
  14732. -- )
  14733.  
  14734. -- SELECT DISTINCT
  14735. -- 1,
  14736. -- Company_RecID,
  14737. -- '.',
  14738. -- 1,
  14739. -- @ImportBatchUser,
  14740. -- 'Main'
  14741. -- FROM dbo.Company
  14742. -- WHERE Updated_By = @ImportBatchUser
  14743. -- AND NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE 1=2)
  14744. --END
  14745.  
  14746. -- Insert newly created companies to @Company
  14747. INSERT INTO #Company
  14748. (
  14749. Company_RecID,
  14750. Company_ID,
  14751. Company_Name,
  14752. Delete_Flag,
  14753. Duplicate_Flag
  14754. )
  14755.  
  14756. SELECT
  14757. Company_RecID,
  14758. Company_ID,
  14759. Company_Name,
  14760. Delete_Flag,
  14761. 0
  14762. FROM dbo.Company
  14763. WHERE Updated_By = @ImportBatchUser
  14764.  
  14765. -- Configuration Status
  14766. INSERT INTO dbo.Config_Status
  14767. (
  14768. [Description],
  14769. Closed_Flag,
  14770. Updated_By,
  14771. Default_Flag
  14772. )
  14773.  
  14774. SELECT DISTINCT
  14775. tmp.ConfigStatus,
  14776. 0,
  14777. @ImportBatchUser,
  14778. 0
  14779. FROM #Import_Staging tmp
  14780. LEFT OUTER JOIN Config_Status cfs
  14781. ON dbo.ufn_Import_Trim(cfs.[Description]) = tmp.ConfigStatus
  14782. WHERE tmp.ConfigStatus IS NOT NULL
  14783. AND cfs.Config_Status_RecID IS NULL
  14784.  
  14785. -- Update invalid 'Installed By' members to 'zAdmin'
  14786. UPDATE tmp
  14787. SET tmp.InstalledBy = 'zAdmin'
  14788. FROM #Import_Staging tmp
  14789. LEFT OUTER JOIN Member mem
  14790. ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.InstalledBy
  14791. WHERE tmp.InstalledBy IS NOT NULL
  14792. AND mem.Member_RecID IS NULL
  14793.  
  14794. -- Truncate model numbers > 50 characters
  14795. UPDATE tmp
  14796. SET tmp.ModelNumber = SUBSTRING(tmp.ModelNumber, 1, 50)
  14797. FROM #Import_Staging tmp
  14798.  
  14799. -- Insert manufacturer if missing
  14800. INSERT INTO dbo.Manufacturer
  14801. (
  14802. Manufacturer_Name,
  14803. Inactive_Flag,
  14804. Last_Update,
  14805. Updated_By
  14806. )
  14807.  
  14808. SELECT DISTINCT
  14809. Manufacturer,
  14810. 0,
  14811. GETDATE(),
  14812. @ImportBatchUser
  14813. FROM #Import_Staging
  14814. WHERE Manufacturer IS NOT NULL
  14815. AND Manufacturer_RecID IS NULL
  14816.  
  14817. END
  14818.  
  14819. -- Update manufacturer RecID in source table so that validation passes
  14820. UPDATE tmp
  14821. SET tmp.Manufacturer_RecID = mfg.Manufacturer_RecID
  14822. FROM #Import_Staging tmp
  14823. INNER JOIN dbo.Manufacturer mfg
  14824. ON mfg.Manufacturer_Name = tmp.Manufacturer
  14825.  
  14826. -- Encrypt password answers
  14827. UPDATE qu
  14828. SET qu.Answer = dbo.udf_EncrDecr(Answer, 'E')
  14829. FROM #Questions qu
  14830. WHERE qu.SF_Field_Type_ID = 'W'
  14831.  
  14832. -- For checkbox questions - convert various forms of T/F to True/False
  14833. UPDATE qu
  14834. SET qu.Answer =
  14835. CASE
  14836. WHEN qu.Answer IN('Y', 'True', 'T', 'Yes', '1') THEN 'True'
  14837. WHEN qu.Answer IN('N', 'False', 'F', 'No', '0') THEN 'False'
  14838. END
  14839. FROM #Questions qu
  14840. WHERE qu.SF_Field_Type_ID = 'K'
  14841. AND qu.Answer IS NOT NULL
  14842.  
  14843. -- Get number of decimals for decimal fields
  14844. UPDATE qu
  14845. SET Num_Decimals = LEN(PARSENAME(qu.Answer, 1))
  14846. FROM #Questions qu
  14847. WHERE qu.Answer IS NOT NULL
  14848. AND qu.Decimals_Flag = 1
  14849. AND qu.Answer LIKE('%.%')
  14850. AND ISNUMERIC(qu.Answer + 'e0') = 1
  14851. AND qu.HasValueList = 0
  14852.  
  14853. -- Convert decimal fields to proper number of decimals based on question type
  14854. UPDATE qu
  14855. SET Answer = CONVERT(Decimal(30,0), Answer)
  14856. FROM #Questions qu
  14857. WHERE qu.Decimals_Flag = 1
  14858. AND ISNUMERIC(qu.Answer + 'e0') = 1
  14859. AND qu.Max_Decimals = 0
  14860. AND qu.Num_Decimals > qu.Max_Decimals
  14861. AND qu.HasValueList = 0
  14862.  
  14863. UPDATE qu
  14864. SET Answer = CONVERT(Decimal(30,1), Answer)
  14865. FROM #Questions qu
  14866. WHERE qu.Decimals_Flag = 1
  14867. AND ISNUMERIC(qu.Answer + 'e0') = 1
  14868. AND qu.Max_Decimals = 1
  14869. AND qu.Num_Decimals > qu.Max_Decimals
  14870. AND qu.HasValueList = 0
  14871.  
  14872. UPDATE qu
  14873. SET Answer = CONVERT(Decimal(30,2), Answer)
  14874. FROM #Questions qu
  14875. WHERE qu.Decimals_Flag = 1
  14876. AND ISNUMERIC(qu.Answer + 'e0') = 1
  14877. AND qu.Max_Decimals = 2
  14878. AND qu.Num_Decimals > qu.Max_Decimals
  14879. AND qu.HasValueList = 0
  14880.  
  14881. UPDATE qu
  14882. SET Answer = CONVERT(Decimal(30,3), Answer)
  14883. FROM #Questions qu
  14884. WHERE qu.Decimals_Flag = 1
  14885. AND ISNUMERIC(qu.Answer + 'e0') = 1
  14886. AND qu.Max_Decimals = 3
  14887. AND qu.Num_Decimals > qu.Max_Decimals
  14888. AND qu.HasValueList = 0
  14889.  
  14890. UPDATE qu
  14891. SET Answer = CONVERT(Decimal(30,4), Answer)
  14892. FROM #Questions qu
  14893. WHERE qu.Decimals_Flag = 1
  14894. AND ISNUMERIC(qu.Answer + 'e0') = 1
  14895. AND qu.Max_Decimals = 4
  14896. AND qu.Num_Decimals > qu.Max_Decimals
  14897. AND qu.HasValueList = 0
  14898.  
  14899. UPDATE qu
  14900. SET Answer = CONVERT(Decimal(30,5), Answer)
  14901. FROM #Questions qu
  14902. WHERE qu.Decimals_Flag = 1
  14903. AND ISNUMERIC(qu.Answer + 'e0') = 1
  14904. AND qu.Max_Decimals = 5
  14905. AND qu.Num_Decimals > qu.Max_Decimals
  14906. AND qu.HasValueList = 0
  14907.  
  14908. -- Grab RecIDs & fields needed to start import
  14909. -- Manufacturer company
  14910. UPDATE stag
  14911. SET stag.Mfg_Company_RecID = comp.Company_RecID
  14912. FROM #Company comp
  14913. INNER JOIN #Import_Staging stag
  14914. ON comp.Company_Name = stag.ManufacturerCompanyName
  14915. WHERE comp.Delete_Flag = 0
  14916. AND stag.ManufacturerCompanyName IS NOT NULL
  14917.  
  14918. -- Installed by
  14919. UPDATE stag
  14920. SET stag.InstalledBy_RecID = mem.Member_RecID
  14921. FROM #Import_Staging stag
  14922. INNER JOIN Member mem
  14923. ON dbo.ufn_Import_Trim(mem.Member_ID) = stag.InstalledBy
  14924. OR stag.InstalledBy = ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, '')
  14925. WHERE stag.InstalledBy IS NOT NULL
  14926.  
  14927. -- Configuration status
  14928. UPDATE stag
  14929. SET stag.Config_Status_RecID = cs.Config_Status_RecID
  14930. FROM #Import_Staging stag
  14931. INNER JOIN Config_Status cs
  14932. ON dbo.ufn_Import_Trim(cs.[Description]) = stag.ConfigStatus
  14933. WHERE stag.ConfigStatus IS NOT NULL
  14934.  
  14935. -- Get default config status if not specified
  14936. UPDATE stag
  14937. SET stag.Config_Status_RecID = cs.Config_Status_RecID
  14938. FROM #Import_Staging stag
  14939. INNER JOIN Config_Status cs
  14940. ON cs.Default_Flag = 1
  14941. WHERE stag.ConfigStatus IS NULL
  14942.  
  14943. -- Company address site
  14944. UPDATE stag
  14945. SET stag.Company_Address_RecID = cad.Company_Address_RecID
  14946. FROM #Import_Staging stag
  14947. INNER JOIN Company_Address cad
  14948. ON cad.Company_RecID = stag.Company_RecID
  14949. AND (cad.[Description] = stag.CompanyAddressSiteName OR cad.Address_Line1 = stag.CompanyAddressSiteName)
  14950. WHERE stag.CompanyAddressSiteName IS NOT NULL
  14951. AND @Legacy_Flag = 0
  14952.  
  14953. -- Company address site (where not specified)
  14954. UPDATE stag
  14955. SET stag.Company_Address_RecID = cad.Company_Address_RecID
  14956. FROM #Import_Staging stag
  14957. INNER JOIN Company_Address cad
  14958. ON cad.Company_RecID = stag.Company_RecID
  14959. AND cad.Default_Flag = 1
  14960. WHERE stag.CompanyAddressSiteName IS NULL
  14961. AND Legacy_Site_ID IS NULL
  14962.  
  14963. -- Location (owner_level)
  14964. UPDATE stag
  14965. SET stag.Owner_Level_RecID = ol.Owner_Level_RecID
  14966. FROM #Import_Staging stag
  14967. INNER JOIN Owner_Level ol
  14968. ON ol.[Description] = stag.Location
  14969. WHERE stag.Location IS NOT NULL
  14970.  
  14971. -- Group
  14972. UPDATE stag
  14973. SET stag.Billing_Unit_RecID = bu.Billing_Unit_RecID
  14974. FROM #Import_Staging stag
  14975. INNER JOIN Billing_Unit_Loc bul
  14976. ON stag.Owner_Level_RecID = bul.Owner_Level_RecID
  14977. INNER JOIN Billing_Unit bu
  14978. ON dbo.ufn_Import_Trim(bu.[Description]) = stag.[Group]
  14979. AND bu.Billing_Unit_RecID = bul.Billing_Unit_RecID
  14980. WHERE stag.[Group] IS NOT NULL
  14981.  
  14982. -- Get zAdmin RecID
  14983. SELECT @zAdmin_Member_RecID = Member_RecID
  14984. FROM dbo.Member
  14985. WHERE Member_ID = 'zadmin'
  14986.  
  14987. -- Error if no zAdmin user
  14988. IF @zAdmin_Member_RecID IS NULL
  14989. BEGIN
  14990. RAISERROR('zAdmin user not found for this implementation - required for import', 16, 2)
  14991. END
  14992.  
  14993. -- Check required fields
  14994. UPDATE stag
  14995. SET stag.ConvertMessage =
  14996. CASE
  14997. WHEN stag.CS_Survey_RecID IS NULL THEN 'Invalid configuration type'
  14998. WHEN stag.Mfg_Company_RecID IS NULL AND stag.ManufacturerCompanyName IS NOT NULL THEN 'Invalid Vendor'
  14999. WHEN stag.InstalledBy_RecID IS NULL AND stag.InstalledBy IS NOT NULL THEN 'Invalid Installed By Member'
  15000. WHEN stag.Config_Status_RecID IS NULL THEN 'Invalid Configuration Status'
  15001. WHEN stag.Company_RecID IS NULL THEN 'Invalid Company Name'
  15002. WHEN stag.Contact_RecID IS NULL THEN 'Invalid Contact'
  15003. WHEN stag.Company_Address_RecID IS NULL AND stag.CompanyAddressSiteName IS NOT NULL THEN 'Invalid site name'
  15004. WHEN stag.Owner_Level_RecID IS NULL AND stag.Location IS NOT NULL THEN 'Invalid location'
  15005. WHEN stag.Billing_Unit_RecID IS NULL AND stag.[Group] IS NOT NULL THEN 'Invalid Group'
  15006. WHEN stag.Manufacturer_RecID IS NULL AND stag.Manufacturer IS NOT NULL THEN 'Invalid Manufacturer'
  15007. END
  15008. FROM #Import_Staging stag
  15009.  
  15010. UPDATE que
  15011. SET que.ConvertMessage =
  15012. CASE
  15013. WHEN que.CS_Survey_Detail_RecID IS NULL THEN 'Invalid Question: ' + ISNULL(que.Question, '[Blank]')
  15014. END
  15015. FROM #Questions que
  15016.  
  15017. -- If a required field is missing return failure message
  15018. IF EXISTS(SELECT '1' FROM #Import_Staging WHERE ConvertMessage IS NOT NULL UNION ALL SELECT '1' FROM #Questions WHERE ConvertMessage IS NOT NULL)
  15019. BEGIN
  15020. -- Raise error w/ 16 severity to jump to catch
  15021. RAISERROR('Validation Error', 16, 2)
  15022. END
  15023.  
  15024. ELSE
  15025.  
  15026. -- Validation suceeded - begin push
  15027. -- Get expected rowcount for insert to dbo.Config
  15028. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE [Configuration RecID] IS NULL
  15029.  
  15030. -- Perform insert to dbo.Config
  15031. -- Insert script is conditional based on CW version - Entered_by may or may not appear in table
  15032. -- Table to force compilation regardless of structure
  15033. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  15034. DROP TABLE #Force_Compile
  15035.  
  15036. CREATE TABLE #Force_Compile
  15037. (
  15038. Column_Name VARCHAR(20)
  15039. )
  15040.  
  15041. IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(Object_ID) = 'Config')
  15042. BEGIN
  15043. INSERT INTO dbo.Config
  15044. (
  15045. CS_Survey_RecID,
  15046. Config_Name,
  15047. Mfg_Company_RecID,
  15048. Manufacturer_RecID,
  15049. Serial_Number,
  15050. Date_Purchased,
  15051. Date_Installed,
  15052. Installed_By,
  15053. Date_Expiration,
  15054. Company_RecID,
  15055. Contact_RecID,
  15056. Company_Address_RecID,
  15057. Owner_Level_RecID,
  15058. Billing_Unit_RecID,
  15059. Notes,
  15060. Last_Update,
  15061. Updated_By,
  15062. Model_Number,
  15063. Tag_Number,
  15064. Config_Status_RecID,
  15065. Backup_Year,
  15066. Custom_Field,
  15067. OS_Info
  15068. )
  15069. OUTPUT INSERTED.OS_Info, INSERTED.Config_RecID, 'Configuration' INTO Import_Legacy_ID_Custom
  15070. SELECT
  15071. stag.CS_Survey_RecID,
  15072. stag.ConfigName,
  15073. stag.Mfg_Company_RecID,
  15074. stag.Manufacturer_RecID,
  15075. stag.SerialNumber,
  15076. CONVERT(DATETIME, stag.PurchaseDate),
  15077. CONVERT(DATETIME, stag.InstalledDate),
  15078. stag.InstalledBy_RecID,
  15079. CONVERT(DATETIME, stag.WarrantyDate),
  15080. stag.Company_RecID,
  15081. stag.Contact_RecID,
  15082. stag.Company_Address_RecID,
  15083. stag.Owner_Level_RecID,
  15084. stag.Billing_Unit_RecID,
  15085. stag.ConfigNotes,
  15086. GETDATE(),
  15087. @ImportBatchUser,
  15088. stag.ModelNumber,
  15089. stag.TagNumber,
  15090. stag.Config_Status_RecID,
  15091. stag.ExcelRowNumber,
  15092. stag.Vendor_Notes,
  15093. stag.Legacy_ID
  15094. FROM #Import_Staging stag
  15095. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  15096. WHERE stag.[Configuration RecID] IS NULL
  15097. ORDER BY stag.ExcelRowNumber ASC
  15098. END
  15099.  
  15100. IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(Object_ID) = 'Config')
  15101. BEGIN
  15102. INSERT INTO dbo.Config
  15103. (
  15104. CS_Survey_RecID,
  15105. Config_Name,
  15106. Mfg_Company_RecID,
  15107. Manufacturer_RecID,
  15108. Serial_Number,
  15109. Date_Purchased,
  15110. Date_Installed,
  15111. Installed_By,
  15112. Date_Expiration,
  15113. Company_RecID,
  15114. Contact_RecID,
  15115. Company_Address_RecID,
  15116. Owner_Level_RecID,
  15117. Billing_Unit_RecID,
  15118. Notes,
  15119. Last_Update,
  15120. Updated_By,
  15121. Model_Number,
  15122. Tag_Number,
  15123. Config_Status_RecID,
  15124. Backup_Year,
  15125. Custom_Field,
  15126. Entered_By,
  15127. OS_Info
  15128.  
  15129. )
  15130. OUTPUT INSERTED.OS_Info, INSERTED.Config_RecID, 'Configuration' INTO Import_Legacy_ID_Custom
  15131. SELECT
  15132. stag.CS_Survey_RecID,
  15133. stag.ConfigName,
  15134. stag.Mfg_Company_RecID,
  15135. stag.Manufacturer_RecID,
  15136. stag.SerialNumber,
  15137. CONVERT(DATETIME, stag.PurchaseDate),
  15138. CONVERT(DATETIME, stag.InstalledDate),
  15139. stag.InstalledBy_RecID,
  15140. CONVERT(DATETIME, stag.WarrantyDate),
  15141. stag.Company_RecID,
  15142. stag.Contact_RecID,
  15143. stag.Company_Address_RecID,
  15144. stag.Owner_Level_RecID,
  15145. stag.Billing_Unit_RecID,
  15146. stag.ConfigNotes,
  15147. GETDATE(),
  15148. @ImportBatchUser,
  15149. stag.ModelNumber,
  15150. stag.TagNumber,
  15151. stag.Config_Status_RecID,
  15152. stag.ExcelRowNumber,
  15153. stag.Vendor_Notes,
  15154. 'zAdmin',
  15155. stag.Legacy_ID
  15156. FROM #Import_Staging stag
  15157. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  15158. WHERE stag.[Configuration RecID] IS NULL
  15159. ORDER BY stag.ExcelRowNumber ASC
  15160. END
  15161.  
  15162. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  15163. DROP TABLE #Force_Compile
  15164.  
  15165. -- Join final table back to staging to capture new identities
  15166. UPDATE stag
  15167. SET stag.Config_RecID = conf.Config_RecID
  15168. FROM #Import_Staging stag
  15169. INNER JOIN dbo.Config conf
  15170. ON stag.ExcelRowNumber = conf.Backup_Year
  15171. AND conf.Updated_By = @ImportBatchUser
  15172. AND stag.[Configuration RecID] IS NULL
  15173.  
  15174. -- Update existing configuration records to match values specified in spreadsheet (for cases where a config already exists on combination of config type and Serial Number)
  15175. UPDATE conf
  15176. SET conf.Config_Name = stag.ConfigName,
  15177. conf.Company_RecID = stag.Company_RecID,
  15178. conf.Mfg_Company_RecID = stag.Mfg_Company_RecID,
  15179. conf.Model_Number = stag.ModelNumber,
  15180. conf.Tag_Number = stag.TagNumber,
  15181. conf.Date_Purchased = CONVERT(DATETIME, stag.PurchaseDate),
  15182. conf.Date_Installed = CONVERT(DATETIME, stag.InstalledDate),
  15183. conf.Installed_By = stag.InstalledBy_RecID,
  15184. conf.Date_Expiration = CONVERT(DATETIME, stag.WarrantyDate),
  15185. conf.Contact_RecID = stag.Contact_RecID,
  15186. conf.Company_Address_RecID = stag.Company_Address_RecID,
  15187. conf.Owner_Level_RecID = stag.Owner_Level_RecID,
  15188. conf.Billing_Unit_RecID = stag.Billing_Unit_RecID,
  15189. conf.Manufacturer_RecID = stag.Manufacturer_RecID,
  15190. conf.Updated_By = @ImportBatchUser,
  15191. conf.Last_Update = GETDATE(),
  15192. conf.Config_Status_RecID = stag.Config_Status_RecID
  15193. FROM dbo.Config conf
  15194. INNER JOIN #Import_Staging stag
  15195. ON stag.[Configuration RecID] = conf.Config_RecID
  15196.  
  15197. -- If Manufacturer_RecID exists in dbo.Config, update final record with Manufacturer_RecID (Column does not exist in earlier versions of CW)
  15198. IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Manufacturer_RecID' AND object_name(object_ID) = 'Config')
  15199. BEGIN
  15200. UPDATE conf
  15201. SET conf.Manufacturer_RecID = stag.Manufacturer_RecID
  15202. FROM dbo.Config conf
  15203. INNER JOIN #Import_Staging stag
  15204. ON conf.Manufacturer_RecID = stag.Manufacturer_RecID
  15205. WHERE stag.Manufacturer_RecID IS NOT NULL
  15206. END
  15207.  
  15208. -- Update Backup_Year, OS_Info to NULL for newly inserted records
  15209. UPDATE conf
  15210. SET conf.Backup_Year = NULL,
  15211. conf.OS_Info = NULL
  15212. FROM dbo.Config conf
  15213. WHERE conf.Updated_By = @ImportBatchUser
  15214.  
  15215. -- Join Question table to staging and grab newly inserted identities
  15216. UPDATE que
  15217. SET que.Config_RecID = stag.Config_RecID
  15218. FROM #Questions que
  15219. INNER JOIN #Import_Staging stag
  15220. ON stag.ExcelRowNumber = que.ExcelRowNumber
  15221.  
  15222. -- Grab identities for configs to be updated
  15223. UPDATE que
  15224. SET que.Config_RecID = stag.[Configuration RecID]
  15225. FROM #Questions que
  15226. INNER JOIN #Import_Staging stag
  15227. ON stag.ExcelRowNumber = que.ExcelRowNumber
  15228. AND stag.[Configuration RecID] IS NOT NULL
  15229.  
  15230. -- Perform updates to CS_Result_Detail as necessary
  15231. UPDATE crd
  15232. SET CS_Result_RecID = 0,
  15233. Answer = que.Answer,
  15234. Last_Update = GETDATE(),
  15235. Updated_By = @ImportBatchUser
  15236. FROM CS_Result_Detail crd
  15237. INNER JOIN #Questions que
  15238. ON que.Config_RecID = crd.Config_Recid
  15239. AND que.CS_Survey_Detail_RecID = crd.CS_Survey_Detail_RecID
  15240. -- Filter rows where column did not appear on spreadsheet
  15241. WHERE que.Spreadsheet_Flag = 1
  15242.  
  15243.  
  15244. -- Perform insert to CS_Result_Detail
  15245. INSERT INTO CS_Result_Detail
  15246. (
  15247. CS_Result_RecID,
  15248. CS_Survey_Detail_RecID,
  15249. Answer,
  15250. Config_Recid,
  15251. Last_Update,
  15252. Updated_By
  15253. )
  15254.  
  15255. SELECT
  15256. 0,
  15257. que.CS_Survey_Detail_RecID,
  15258. ISNULL(que.Answer, ''),
  15259. que.Config_RecID,
  15260. GETDATE(),
  15261. @ImportBatchUser
  15262. FROM #Questions que
  15263. LEFT OUTER JOIN CS_Result_Detail crd
  15264. ON crd.Config_Recid = que.Config_RecID
  15265. AND crd.CS_Survey_Detail_RecID = que.CS_Survey_Detail_RecID
  15266. WHERE crd.CS_Result_Detail_RecID IS NULL
  15267.  
  15268. -- If debug mode and successful, select the rows that were inserted
  15269. -- and rollback transaction
  15270. IF @DebugMode = 1 AND @@ERROR = 0
  15271. BEGIN
  15272. SELECT * FROM Config WHERE Config_RecID IN(SELECT Config_RecID FROM #Import_Staging)
  15273. SELECT * FROM CS_Result_Detail WHERE Config_RecID IN(SELECT Config_RecID FROM #Import_Staging)
  15274.  
  15275. ROLLBACK TRANSACTION CFG_Import
  15276. END
  15277.  
  15278. IF @DebugMode = 2 AND @@ERROR = 0
  15279. BEGIN
  15280. SELECT
  15281. 1 AS Success,
  15282. NULL AS ExcelRowNumber,
  15283. NULL AS ErrorDetails
  15284. ROLLBACK TRANSACTION CFG_Import
  15285. END
  15286.  
  15287. IF @DebugMode = 0 AND @@Error = 0
  15288. BEGIN
  15289.  
  15290. DROP TABLE #Import_Staging
  15291.  
  15292. SELECT
  15293. 1 AS Success,
  15294. NULL AS ExcelRowNumber,
  15295. NULL AS ErrorDetails
  15296.  
  15297. COMMIT TRANSACTION CFG_Import
  15298. END
  15299.  
  15300. END TRY
  15301.  
  15302. BEGIN CATCH
  15303.  
  15304. -- An error has occured - determine if validation error
  15305. IF ERROR_MESSAGE() = 'Validation Error'
  15306. BEGIN
  15307. -- Return details of error from staging table
  15308. SELECT
  15309. 0 AS Success,
  15310. stag.ExcelRowNumber,
  15311. stag.ConvertMessage AS ErrorDetails
  15312. FROM #Import_Staging stag
  15313. WHERE stag.ConvertMessage IS NOT NULL
  15314.  
  15315. UNION ALL
  15316.  
  15317. SELECT
  15318. 0 AS Success,
  15319. que.ExcelRowNumber,
  15320. que.ConvertMessage AS ErrorDetails
  15321. FROM #Questions que
  15322. WHERE que.ConvertMessage IS NOT NULL
  15323.  
  15324.  
  15325. ROLLBACK TRANSACTION
  15326.  
  15327. END
  15328. ELSE
  15329. -- Not a validation error - return SQL error message encountered
  15330. SELECT
  15331. 0 AS Success,
  15332. 'Unknown' AS ExcelRowNumber,
  15333. ERROR_MESSAGE() + ' Line:' + CONVERT(VARCHAR(10), ERROR_LINE()) AS ErrorDetails
  15334.  
  15335. -- Rollback transaction
  15336. IF @@TRANCOUNT > 0
  15337. ROLLBACK TRANSACTION CFG_Import
  15338.  
  15339. END CATCH
  15340. GO
  15341.  
  15342.  
  15343.  
  15344.  
  15345. ----------------------
  15346. -- Companies/Contacts
  15347. ----------------------
  15348. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Comp_ImportValidate')
  15349. BEGIN
  15350. EXEC('CREATE PROCEDURE [dbo].[usp_Comp_ImportValidate] AS SELECT 1')
  15351. END
  15352.  
  15353. GO
  15354.  
  15355. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Comp_ImportPush')
  15356. BEGIN
  15357. EXEC('CREATE PROCEDURE [dbo].[usp_Comp_ImportPush] AS SELECT 1')
  15358. END
  15359. GO
  15360.  
  15361. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Contact_ImportValidate')
  15362. BEGIN
  15363. EXEC('CREATE PROCEDURE [dbo].[usp_Contact_ImportValidate] AS SELECT 1')
  15364. END
  15365. GO
  15366.  
  15367. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Contact_ImportPush')
  15368. BEGIN
  15369. EXEC('CREATE PROCEDURE [dbo].[usp_Contact_ImportPush] AS SELECT 1')
  15370. END
  15371. GO
  15372.  
  15373.  
  15374. -- =============================================
  15375. -- Author: m.gray
  15376. -- Create date: 05/07/2013
  15377. -- Description: Validates data from spreadsheet
  15378. -- for company Import
  15379. -- Sample call: exec usp_Comp_ImportValidate 'Comp_Import_Test', 1
  15380. -- =============================================
  15381.  
  15382. ALTER PROCEDURE [dbo].[usp_Comp_ImportValidate]
  15383. @TableName VARCHAR(MAX),
  15384. @DiffMode BIT = 0, -- Differential mode - (for custom imports) does not import records which already exist on Company name
  15385. @Forcemode BIT = 1
  15386. AS
  15387. BEGIN TRY
  15388.  
  15389. -- Turn off diff mode - no longer used
  15390. SELECT @DiffMode = 0
  15391.  
  15392. SET NOCOUNT ON
  15393.  
  15394. -- Set date format to MDY to validate dates from excel
  15395. SET DATEFORMAT MDY
  15396.  
  15397. -- Variable declaration
  15398. -- Table to hold results of procedure
  15399. IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
  15400. BEGIN
  15401. DROP TABLE #tblResults
  15402. END
  15403.  
  15404. CREATE TABLE #tblResults
  15405. (
  15406. RowNumber INT,
  15407. ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
  15408. InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15409. ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15410. Warning_Flag BIT DEFAULT 0
  15411. )
  15412.  
  15413. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  15414.  
  15415. -- Table to hold condensed summary results
  15416. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  15417. BEGIN
  15418. DROP TABLE #ResultsCondensed
  15419. END
  15420.  
  15421. CREATE TABLE #ResultsCondensed
  15422. (
  15423. RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15424. ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  15425. )
  15426.  
  15427. -- Dynamic statement to insert to validation table
  15428. DECLARE @DSQL VARCHAR(MAX)
  15429.  
  15430. -- Fully qualified name of source table
  15431. DECLARE @SourceTable VARCHAR(300)
  15432. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  15433.  
  15434. -- Object_ID of source table
  15435. DECLARE @Source_Object_ID INT
  15436. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  15437.  
  15438. -- Flag to indicate migration being matched on Legacy_ID
  15439. DECLARE @Legacy_Flag BIT = 0
  15440.  
  15441.  
  15442. -- Unique value to identify records created by this import in updated_by fields
  15443. DECLARE @ImportBatchUser VARCHAR(15)
  15444.  
  15445. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  15446. SELECT @ImportBatchUser =
  15447. 'CONV_'
  15448. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  15449. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  15450. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  15451. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  15452.  
  15453.  
  15454. -- Add Tax Code ID field if it doesn't exist (field is optional to accommodate legacy templates)
  15455. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Tax Code ID')
  15456. BEGIN
  15457. SELECT @DSQL =
  15458. '
  15459. ALTER TABLE ' + @SourceTable + '
  15460. ADD [Tax Code ID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  15461. '
  15462.  
  15463. EXEC(@DSQL)
  15464.  
  15465. END
  15466.  
  15467. -- Add Billing Site field if it doesn't exist (field is optional to accommodate legacy templates)
  15468. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Billing Site')
  15469. BEGIN
  15470. SELECT @DSQL =
  15471. '
  15472. ALTER TABLE ' + @SourceTable + '
  15473. ADD [Billing Site] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  15474. '
  15475.  
  15476. EXEC(@DSQL)
  15477.  
  15478. END
  15479.  
  15480. -- Add Legacy_ID field if it doesn't exist (field is optional to accommodate legacy templates)
  15481. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_ID')
  15482. BEGIN
  15483. SELECT @DSQL =
  15484. '
  15485. ALTER TABLE ' + @SourceTable + '
  15486. ADD Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  15487. '
  15488.  
  15489. EXEC(@DSQL)
  15490.  
  15491. END
  15492.  
  15493. -- Pre-validation
  15494. -- Create & populate table variable with list of required columns
  15495. DECLARE @RequiredColumns TABLE
  15496. (
  15497. ColumnName VARCHAR(255)
  15498. )
  15499.  
  15500. INSERT INTO @RequiredColumns
  15501. (
  15502. ColumnName
  15503. )
  15504.  
  15505. SELECT 'Company Name' UNION ALL
  15506. SELECT 'Company ID' UNION ALL
  15507. SELECT 'Company Type' UNION ALL
  15508. SELECT 'Ownership Type' UNION ALL
  15509. SELECT 'Company Status' UNION ALL
  15510. SELECT 'Company Market' UNION ALL
  15511. SELECT 'Track' UNION ALL
  15512. SELECT 'Source List' UNION ALL
  15513. SELECT 'Mark As Lead' UNION ALL
  15514. SELECT 'Territory Name' UNION ALL
  15515. SELECT 'Time Zone' UNION ALL
  15516. SELECT 'Company Group' UNION ALL
  15517. SELECT 'Company TaxID' UNION ALL
  15518. SELECT 'Payment Terms' UNION ALL
  15519. SELECT 'User Field 1' UNION ALL
  15520. SELECT 'User Field 2' UNION ALL
  15521. SELECT 'User Field 3' UNION ALL
  15522. SELECT 'User Field 4' UNION ALL
  15523. SELECT 'User Field 5' UNION ALL
  15524. SELECT 'User Field 6' UNION ALL
  15525. SELECT 'User Field 7' UNION ALL
  15526. SELECT 'User Field 8' UNION ALL
  15527. SELECT 'User Field 9' UNION ALL
  15528. SELECT 'User Field 10' UNION ALL
  15529. SELECT 'Phone Number' UNION ALL
  15530. SELECT 'Fax Number' UNION ALL
  15531. SELECT 'Site Name' UNION ALL
  15532. SELECT 'Address Line 1' UNION ALL
  15533. SELECT 'Address Line 2' UNION ALL
  15534. SELECT 'City' UNION ALL
  15535. SELECT 'State' UNION ALL
  15536. SELECT 'Zip Code' UNION ALL
  15537. SELECT 'Country' UNION ALL
  15538. SELECT 'Website URL' UNION ALL
  15539. SELECT 'Annual Revenue' UNION ALL
  15540. SELECT 'Number Of Employees' UNION ALL
  15541. SELECT 'SIC Code' UNION ALL
  15542. SELECT 'Company Account' UNION ALL
  15543. SELECT 'Company Note' UNION ALL
  15544. SELECT 'Tax Code ID'
  15545.  
  15546. -- Table variable to hold column names from source table
  15547. DECLARE @SourceColumns TABLE
  15548. (
  15549. ColumnName VARCHAR(255)
  15550. )
  15551.  
  15552. -- Populate @SourceColumns
  15553. INSERT INTO @SourceColumns
  15554. (
  15555. ColumnName
  15556. )
  15557.  
  15558. SELECT
  15559. name
  15560. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  15561.  
  15562. -- Check that all required columns exist in @SourceColumns
  15563. INSERT INTO #tblResults
  15564. (
  15565. RowNumber,
  15566. ValMsg
  15567. )
  15568.  
  15569. SELECT
  15570. 0,
  15571. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  15572. FROM @RequiredColumns rq
  15573.  
  15574. EXCEPT
  15575.  
  15576. SELECT
  15577. 0,
  15578. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  15579. FROM @SourceColumns sc
  15580.  
  15581. -- If a column is missing, stop here and return results
  15582. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  15583. BEGIN
  15584. SELECT
  15585. 0 AS ValPassed,
  15586. RowNumber,
  15587. ValMsg
  15588. FROM #tblResults
  15589. ORDER BY RowNumber, ValMsg
  15590.  
  15591. ROLLBACK TRANSACTION
  15592.  
  15593. RETURN
  15594. END
  15595.  
  15596. -- Table to hold source data for this batch from temp table
  15597. IF(OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL)
  15598. BEGIN
  15599. DROP TABLE #Import_Staging
  15600. END
  15601. CREATE TABLE #Import_Staging
  15602. (
  15603. ExcelRowNumber INT NULL,
  15604. Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15605. Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15606. Company_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15607. Company_Status nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15608. Company_Market nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15609. Track nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15610. SourceList nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15611. MarkAsLead nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15612. Territory nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15613. [Group] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15614. PhoneNbr_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15615. PhoneNbr_Fax nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15616. Site_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15617. Address_Line1_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15618. Address_Line2_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15619. City_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15620. State_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15621. Zip_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15622. Country_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15623. Website_URL nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15624. Annual_Revenue nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15625. Nbr_Employees nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15626. SIC_Code_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15627. Account_Nbr nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15628. Note_Comp nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  15629. Parent_Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15630. Ownership_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15631. TimeZone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15632. TaxID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  15633. PaymentTerms NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  15634. UserField1 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15635. UserField2 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15636. UserField3 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15637. UserField4 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15638. UserField5 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15639. UserField6 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15640. UserField7 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15641. UserField8 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15642. UserField9 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15643. UserField10 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15644. Company_RecID INT,
  15645. Company_Type_RecID INT,
  15646. Company_Status_RecID INT,
  15647. Market_RecID INT,
  15648. WF_Track_Header_RecID INT,
  15649. Territory_Owner_Level_RecID INT,
  15650. Group_Type_RecID INT,
  15651. Site_Company_Address_RecID INT,
  15652. Comp_State_RecID INT,
  15653. State_ID VARCHAR(50) COLLATE DATABASE_DEFAULT,
  15654. Comp_Country_RecID INT,
  15655. Parent_Company_RecID INT,
  15656. Ownership_Type_RecID INT,
  15657. Time_Zone_RecID INT,
  15658. Billing_Terms_RecID INT,
  15659. Contact_RecID INT,
  15660. Contact_Type_RecID INT,
  15661. Note_Type_RecID INT,
  15662. UserField1Used BIT,
  15663. UserField2Used BIT,
  15664. UserField3Used BIT,
  15665. UserField4Used BIT,
  15666. UserField5Used BIT,
  15667. UserField6Used BIT,
  15668. UserField7Used BIT,
  15669. UserField8Used BIT,
  15670. UserField9Used BIT,
  15671. UserField10Used BIT,
  15672. NewCompany BIT,
  15673. Tax_Code_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15674. Tax_Code_RecID INT,
  15675. Billing_Site NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  15676. Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  15677. Legacy_Company_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  15678. Company_Address_RecID INT,
  15679. SR_Service_RecID INT,
  15680. SO_Opportunity_RecID INT,
  15681. Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  15682. Diff_Exclude_Flag BIT,
  15683. Legacy_Contact_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  15684. Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  15685. Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT
  15686. )
  15687.  
  15688. CREATE INDEX IX_Legacy_ID ON #Import_Staging(Legacy_ID)
  15689. CREATE INDEX IX_ExcelRow ON #Import_Staging(ExcelRowNumber)
  15690. CREATE INDEX IX_Legacy_Site_ID ON #Import_Staging(Legacy_Site_ID)
  15691.  
  15692. IF NOT EXISTS(SELECT 1 FROM tempdb.sys.indexes WHERE OBJECT_ID = @Source_Object_ID AND Name = 'IX_ExcelRow')
  15693. BEGIN
  15694. EXEC('CREATE INDEX IX_ExcelRow ON tempdb.dbo.' + @TableName + '([Excel Row Number])')
  15695. END
  15696.  
  15697. -- Build statement to populate validation temp table
  15698. -- Convert blank string or single space to null
  15699. SELECT @DSQL = '
  15700. INSERT INTO #Import_Staging
  15701. (
  15702. ExcelRowNumber,
  15703. Company_Name,
  15704. Company_Type,
  15705. Company_Status,
  15706. Company_Market,
  15707. Track,
  15708. SourceList,
  15709. MarkAsLead,
  15710. Territory,
  15711. [Group],
  15712. Company_ID,
  15713. PhoneNbr_Comp,
  15714. PhoneNbr_Fax,
  15715. Site_Name,
  15716. Address_Line1_Comp,
  15717. Address_Line2_Comp,
  15718. City_Comp,
  15719. State_Comp,
  15720. Zip_Comp,
  15721. Country_Comp,
  15722. Website_URL,
  15723. Annual_Revenue,
  15724. Nbr_Employees,
  15725. SIC_Code_ID,
  15726. Account_Nbr,
  15727. Note_Comp,
  15728. Ownership_Type,
  15729. TimeZone,
  15730. TaxID,
  15731. PaymentTerms,
  15732. UserField1,
  15733. UserField2,
  15734. UserField3,
  15735. UserField4,
  15736. UserField5,
  15737. UserField6,
  15738. UserField7,
  15739. UserField8,
  15740. UserField9,
  15741. UserField10,
  15742. Tax_Code_ID,
  15743. Billing_Site,
  15744. Legacy_ID
  15745. )
  15746.  
  15747. SELECT
  15748. [Excel Row Number],
  15749. [Company Name],
  15750. [Company Type],
  15751. [Company Status],
  15752. [Company Market],
  15753. [Track],
  15754. [Source List],
  15755. [Mark As Lead],
  15756. [Territory Name],
  15757. [Company Group],
  15758. [Company ID],
  15759. [Phone Number],
  15760. [Fax Number],
  15761. [Site Name],
  15762. [Address Line 1],
  15763. [Address Line 2],
  15764. [City],
  15765. [State],
  15766. [Zip Code],
  15767. [Country],
  15768. [Website URL],
  15769. [Annual Revenue],
  15770. [Number Of Employees],
  15771. [SIC Code],
  15772. [Company Account],
  15773. [Company Note],
  15774. [Ownership Type],
  15775. [Time Zone],
  15776. [Company TaxID],
  15777. [Payment Terms],
  15778. [User Field 1],
  15779. [User Field 2],
  15780. [User Field 3],
  15781. [User Field 4],
  15782. [User Field 5],
  15783. [User Field 6],
  15784. [User Field 7],
  15785. [User Field 8],
  15786. [User Field 9],
  15787. [User Field 10],
  15788. [Tax Code ID],
  15789. [Billing Site],
  15790. Legacy_ID
  15791. FROM ' + @SourceTable
  15792.  
  15793. EXEC(@DSQL)
  15794.  
  15795. BEGIN TRANSACTION Comp_Validate
  15796.  
  15797. -- Update single space or blank strings to null in validation table
  15798. UPDATE #Import_Staging SET
  15799. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  15800. Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
  15801. Company_Type = CASE WHEN Company_Type IN('', ' ') THEN NULL ELSE Company_Type END,
  15802. Company_Status = CASE WHEN Company_Status IN('', ' ') THEN NULL ELSE Company_Status END,
  15803. Company_Market = CASE WHEN Company_Market IN('', ' ') THEN NULL ELSE Company_Market END,
  15804. Track = CASE WHEN Track IN('', ' ') THEN NULL ELSE Track END,
  15805. SourceList = CASE WHEN SourceList IN('', ' ') THEN NULL ELSE SourceList END,
  15806. MarkAsLead = CASE WHEN MarkAsLead IN('', ' ') THEN NULL ELSE MarkAsLead END,
  15807. Territory = CASE WHEN Territory IN('', ' ') THEN NULL ELSE Territory END,
  15808. [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
  15809. Company_ID = CASE WHEN Company_ID IN('', ' ') THEN NULL ELSE Company_ID END,
  15810. PhoneNbr_Comp = CASE WHEN PhoneNbr_Comp IN('', ' ') THEN NULL ELSE PhoneNbr_Comp END,
  15811. PhoneNbr_Fax = CASE WHEN PhoneNbr_Fax IN('', ' ') THEN NULL ELSE PhoneNbr_Fax END,
  15812. Site_Name = CASE WHEN Site_Name IN('', ' ') THEN NULL ELSE Site_Name END,
  15813. Address_Line1_Comp = CASE WHEN Address_Line1_Comp IN('', ' ') THEN NULL ELSE Address_Line1_Comp END,
  15814. Address_Line2_Comp = CASE WHEN Address_Line2_Comp IN('', ' ') THEN NULL ELSE Address_Line2_Comp END,
  15815. City_Comp = CASE WHEN City_Comp IN('', ' ') THEN NULL ELSE City_Comp END,
  15816. State_Comp = CASE WHEN State_Comp IN('', ' ') THEN NULL ELSE State_Comp END,
  15817. Zip_Comp = CASE WHEN Zip_Comp IN('', ' ') THEN NULL ELSE Zip_Comp END,
  15818. Country_Comp = CASE WHEN Country_Comp IN('', ' ') THEN NULL ELSE Country_Comp END,
  15819. Website_URL = CASE WHEN Website_URL IN('', ' ') THEN NULL ELSE Website_URL END,
  15820. Annual_Revenue = CASE WHEN Annual_Revenue IN('', ' ') THEN NULL ELSE Annual_Revenue END,
  15821. Nbr_Employees = CASE WHEN Nbr_Employees IN('', ' ') THEN NULL ELSE Nbr_Employees END,
  15822. SIC_Code_ID = CASE WHEN SIC_Code_ID IN('', ' ') THEN NULL ELSE SIC_Code_ID END,
  15823. Account_Nbr = CASE WHEN Account_Nbr IN('', ' ') THEN NULL ELSE Account_Nbr END,
  15824. Note_Comp = CASE WHEN Note_Comp IN('', ' ') THEN NULL ELSE Note_Comp END,
  15825. Parent_Company_ID = CASE WHEN Parent_Company_ID IN('', ' ') THEN NULL ELSE Parent_Company_ID END,
  15826. Ownership_Type = CASE WHEN Ownership_Type IN('', ' ') THEN NULL ELSE Ownership_Type END,
  15827. TimeZone = CASE WHEN TimeZone IN('', ' ') THEN NULL ELSE TimeZone END,
  15828. TaxID = CASE WHEN TaxID IN('', ' ') THEN NULL ELSE TaxID END,
  15829. PaymentTerms = CASE WHEN PaymentTerms IN('', ' ') THEN NULL ELSE PaymentTerms END,
  15830. UserField1 = CASE WHEN UserField1 IN('', ' ') THEN NULL ELSE UserField1 END,
  15831. UserField2 = CASE WHEN UserField2 IN('', ' ') THEN NULL ELSE UserField2 END,
  15832. UserField3 = CASE WHEN UserField3 IN('', ' ') THEN NULL ELSE UserField3 END,
  15833. UserField4 = CASE WHEN UserField4 IN('', ' ') THEN NULL ELSE UserField4 END,
  15834. UserField5 = CASE WHEN UserField5 IN('', ' ') THEN NULL ELSE UserField5 END,
  15835. UserField6 = CASE WHEN UserField6 IN('', ' ') THEN NULL ELSE UserField6 END,
  15836. UserField7 = CASE WHEN UserField7 IN('', ' ') THEN NULL ELSE UserField7 END,
  15837. UserField8 = CASE WHEN UserField8 IN('', ' ') THEN NULL ELSE UserField8 END,
  15838. UserField9 = CASE WHEN UserField9 IN('', ' ') THEN NULL ELSE UserField9 END,
  15839. UserField10 = CASE WHEN UserField10 IN('', ' ') THEN NULL ELSE UserField10 END,
  15840. Tax_Code_ID = CASE WHEN Tax_Code_ID IN('', ' ') THEN NULL ELSE Tax_Code_ID END,
  15841. Billing_Site = CASE WHEN Billing_Site IN('', ' ') THEN NULL ELSE Billing_Site END,
  15842. Legacy_ID = CASE WHEN Legacy_ID IN('', ' ') THEN NULL ELSE Legacy_ID END
  15843.  
  15844. UPDATE #Import_Staging
  15845. SET Company_Name = '[No Name]'
  15846. WHERE Company_Name IS NULL
  15847.  
  15848. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  15849. BEGIN
  15850. SELECT @Legacy_Flag = 1
  15851. EXEC usp_Import_Match_Legacy @TableName, 'Company'
  15852. EXEC usp_Import_Match_Legacy @TableName, 'Site'
  15853. END
  15854.  
  15855. -- Clean up Number of Employees field by stripping any commas
  15856. UPDATE #Import_Staging
  15857. SET Nbr_Employees = REPLACE(Nbr_Employees, ',', '')
  15858.  
  15859. ---- If differential mode, delete records which match an existing site -- no longer used
  15860. --DELETE tmp
  15861. --FROM #Import_Staging tmp
  15862. -- INNER JOIN dbo.Company comp
  15863. -- ON comp.Company_Name = tmp.Company_Name
  15864. -- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_RecID = comp.Company_RecID AND (cad.Address_Line1 = tmp.Address_Line1_Comp OR tmp.Address_Line1_Comp IS NULL))cad
  15865. --WHERE @DiffMode = 1
  15866. -- AND @Legacy_Flag = 0
  15867.  
  15868. ---- If adding a site, inherit company_id from existing company
  15869. --UPDATE tmp
  15870. -- SET tmp.Company_ID = comp.Company_ID
  15871. --FROM #Import_Staging tmp
  15872. -- CROSS APPLY(SELECT TOP 1 * FROM Company comp WHERE comp.Company_Name = tmp.Company_Name) comp
  15873. --WHERE tmp.Company_ID IS NULL
  15874.  
  15875. -- Company_RecID - (for companies which already exist)
  15876. UPDATE tmp
  15877. SET tmp.Company_RecID = comp.Company_RecID
  15878. FROM #Import_Staging tmp
  15879. CROSS APPLY(SELECT TOP 1 Company_RecID FROM dbo.Company comp WHERE comp.Company_Name = tmp.Company_Name AND comp.Company_ID = tmp.Company_ID)comp
  15880. WHERE @Legacy_Flag = 0
  15881.  
  15882. -- Tax_Code_RecID
  15883. UPDATE tmp
  15884. SET tmp.Tax_Code_RecID = tc.Tax_Code_RecID
  15885. FROM #Import_Staging tmp
  15886. INNER JOIN dbo.Tax_Code tc
  15887. ON tc.Tax_Code_ID = tmp.Tax_Code_ID
  15888. WHERE tmp.Tax_Code_ID IS NOT NULL
  15889. AND GETDATE() BETWEEN Date_Effective AND ISNULL(Date_Cancel, '1/1/2900')
  15890.  
  15891. -- Company_Type_RecID
  15892. UPDATE tmp
  15893. SET tmp.Company_Type_RecID = ct.Company_Type_RecID
  15894. FROM #Import_Staging tmp
  15895. INNER JOIN dbo.Company_Type ct
  15896. ON ct.[Description] = tmp.Company_Type
  15897.  
  15898. -- If company type not specified, grab default if exists
  15899. UPDATE tmp
  15900. SET tmp.Company_Type_RecID = ct.Company_Type_RecID
  15901. FROM #Import_Staging tmp
  15902. CROSS APPLY(SELECT TOP 1 Company_Type_RecID FROM dbo.Company_Type ct WHERE ct.Default_Flag = 1)ct
  15903. WHERE tmp.Company_Type IS NULL
  15904.  
  15905. -- Company_Status_RecID
  15906. UPDATE tmp
  15907. SET tmp.Company_Status_RecID = cst.Company_Status_RecID
  15908. FROM #Import_Staging tmp
  15909. INNER JOIN dbo.Company_Status cst
  15910. ON cst.[Description] = tmp.Company_Status
  15911.  
  15912. -- Get default company status if not specified
  15913. UPDATE tmp
  15914. SET tmp.Company_Status_RecID = cst.Company_Status_RecID
  15915. FROM #Import_Staging tmp
  15916. INNER JOIN dbo.Company_Status cst
  15917. ON cst.Inactive_Flag = 0
  15918. AND cst.Default_Flag =1
  15919. AND tmp.Company_Status IS NULL
  15920.  
  15921. -- Market_RecID
  15922. UPDATE tmp
  15923. SET tmp.Market_RecID = mk.Market_RecID
  15924. FROM #Import_Staging tmp
  15925. INNER JOIN dbo.Market mk
  15926. ON mk.[Description] = tmp.Company_Market
  15927.  
  15928. ---- WF_Track_Header_RecID
  15929. --UPDATE tmp
  15930. -- SET tmp.WF_Track_Header_RecID = wf.WF_Track_Header_RecID
  15931. --FROM #Import_Staging tmp
  15932. -- INNER JOIN dbo.WF_Track_Header wf
  15933. -- ON wf.[Description] = tmp.Track
  15934. -- AND wf.Inactive_Flag = 0
  15935.  
  15936. -- Territory_Owner_Level_RecID
  15937. UPDATE tmp
  15938. SET tmp.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
  15939. FROM #Import_Staging tmp
  15940. INNER JOIN dbo.Owner_Level ol
  15941. ON ol.[Description] = tmp.Territory
  15942. AND ol.Sales_Territory_Flag = 1
  15943.  
  15944. -- If territory not found on name, match on manager member_id
  15945. UPDATE tmp
  15946. SET tmp.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
  15947. FROM #Import_Staging tmp
  15948. INNER JOIN dbo.Owner_Level ol
  15949. ON ol.Member_ID = tmp.Territory
  15950. AND ol.Sales_Territory_Flag = 1
  15951. WHERE tmp.Territory_Owner_Level_RecID IS NULL
  15952. AND tmp.Territory IS NOT NULL
  15953. AND ol.Member_ID <> ''
  15954.  
  15955.  
  15956. -- Group_Type_RecID
  15957. UPDATE tmp
  15958. SET tmp.Group_Type_RecID = gt.Group_Type_RecID
  15959. FROM #Import_Staging tmp
  15960. INNER JOIN dbo.Group_Type gt
  15961. ON gt.Company_Group_Name = tmp.[Group]
  15962. AND gt.Company_Flag = 1
  15963.  
  15964. -- Site_Company_Address_RecID
  15965. UPDATE tmp
  15966. SET tmp.Site_Company_Address_RecID = ca.Company_Address_RecID
  15967. FROM #Import_Staging tmp
  15968. INNER JOIN dbo.Company_Address ca
  15969. ON tmp.Company_RecID = ca.Company_RecID
  15970. AND ca.[Description] = tmp.Site_Name
  15971.  
  15972. -- Get State_ID
  15973. UPDATE tmp
  15974. SET tmp.State_ID = st.State_ID
  15975. FROM #Import_Staging tmp
  15976. INNER JOIN dbo.States st
  15977. ON st.[Description] = tmp.State_Comp
  15978. OR st.[State_ID] = tmp.State_Comp
  15979.  
  15980. -- Comp_Country_RecID
  15981. UPDATE tmp
  15982. SET tmp.Comp_Country_RecID = co.Country_RecID
  15983. FROM #Import_Staging tmp
  15984. INNER JOIN dbo.Country co
  15985. ON co.Country = tmp.Country_Comp
  15986.  
  15987. -- Parent_Company_RecID
  15988. UPDATE tmp
  15989. SET tmp.Parent_Company_RecID = cmp.Company_RecID
  15990. FROM #Import_Staging tmp
  15991. INNER JOIN dbo.Company cmp
  15992. ON cmp.Company_ID = tmp.Parent_Company_ID
  15993. AND cmp.Delete_Flag = 0
  15994.  
  15995. -- Ownership_Type_RecID
  15996. UPDATE tmp
  15997. SET tmp.Ownership_Type_RecID = ot.Ownership_Type_RecID
  15998. FROM #Import_Staging tmp
  15999. INNER JOIN dbo.Ownership_Type ot
  16000. ON ot.[Description] = tmp.Ownership_Type
  16001.  
  16002. -- Time_Zone_RecID
  16003. UPDATE tmp
  16004. SET tmp.Time_Zone_RecID = tz.Time_Zone_RecID
  16005. FROM #Import_Staging tmp
  16006. INNER JOIN dbo.Time_Zone tz
  16007. ON tz.Time_Zone_Name = tmp.TimeZone
  16008. --OR tz.Hours_Offset = tmp.TimeZone
  16009.  
  16010. -- Billing_Terms_RecID
  16011. UPDATE tmp
  16012. SET tmp.Billing_Terms_RecID = bt.Billing_Terms_RecID
  16013. FROM #Import_Staging tmp
  16014. INNER JOIN dbo.Billing_Terms bt
  16015. ON bt.[Description] = tmp.PaymentTerms
  16016.  
  16017. -- Note_Type_RecID
  16018. UPDATE tmp
  16019. SET tmp.Note_Type_RecID = nt.Note_Type_RecID
  16020. FROM #Import_Staging tmp
  16021. INNER JOIN Note_Type nt ON nt.Default_Flag = 1
  16022.  
  16023. -- Determine if each user defined field is used
  16024. ;WITH ufstatus AS
  16025. (
  16026. SELECT TOP 1
  16027. CASE WHEN Company_Userfield_1 = 'Not Used' THEN 0 ELSE 1 END AS UserField1Used,
  16028. CASE WHEN Company_Userfield_2 = 'Not Used' THEN 0 ELSE 1 END AS UserField2Used,
  16029. CASE WHEN Company_Userfield_3 = 'Not Used' THEN 0 ELSE 1 END AS UserField3Used,
  16030. CASE WHEN Company_Userfield_4 = 'Not Used' THEN 0 ELSE 1 END AS UserField4Used,
  16031. CASE WHEN Company_Userfield_5 = 'Not Used' THEN 0 ELSE 1 END AS UserField5Used,
  16032. CASE WHEN Company_Userfield_6 = 'Not Used' THEN 0 ELSE 1 END AS UserField6Used,
  16033. CASE WHEN Company_Userfield_7 = 'Not Used' THEN 0 ELSE 1 END AS UserField7Used,
  16034. CASE WHEN Company_Userfield_8 = 'Not Used' THEN 0 ELSE 1 END AS UserField8Used,
  16035. CASE WHEN Company_Userfield_9 = 'Not Used' THEN 0 ELSE 1 END AS UserField9Used,
  16036. CASE WHEN Company_Userfield_10 = 'Not Used' THEN 0 ELSE 1 END AS UserField10Used
  16037. FROM dbo.[Owner]
  16038. )
  16039.  
  16040. UPDATE tmp
  16041. SET tmp.UserField1Used = ufstatus.UserField1Used,
  16042. tmp.UserField2Used = ufstatus.UserField2Used,
  16043. tmp.UserField3Used = ufstatus.UserField3Used,
  16044. tmp.UserField4Used = ufstatus.UserField4Used,
  16045. tmp.UserField5Used = ufstatus.UserField5Used,
  16046. tmp.UserField6Used = ufstatus.UserField6Used,
  16047. tmp.UserField7Used = ufstatus.UserField7Used,
  16048. tmp.UserField8Used = ufstatus.UserField8Used,
  16049. tmp.UserField9Used = ufstatus.UserField9Used,
  16050. tmp.UserField10Used = ufstatus.UserField10Used
  16051. FROM #Import_Staging tmp
  16052. CROSS APPLY ufstatus
  16053.  
  16054. -- Determine if each record will constitute a new company
  16055. UPDATE tmp
  16056. SET tmp.NewCompany = 1
  16057. FROM #Import_Staging tmp
  16058. WHERE Company_RecID IS NULL
  16059. AND ExcelRowNumber IN(SELECT MIN(ExcelRowNumber) FROM #Import_Staging WHERE Company_RecID IS NULL GROUP BY Company_Name)
  16060.  
  16061. -- Update Site_Name to 'Main' for new company records
  16062. UPDATE tmp
  16063. SET tmp.Site_Name = 'Main'
  16064. FROM #Import_Staging tmp
  16065. WHERE NewCompany = 1
  16066. AND tmp.Site_Name IS NULL
  16067.  
  16068. -- Generate Site_Name for sites being added to new company records
  16069. ;WITH gsn AS
  16070. (
  16071. SELECT
  16072. ExcelRowNumber,
  16073. 'Site ' + CAST(ROW_NUMBER() OVER(PARTITION BY Company_Name ORDER BY ExcelRowNumber) AS VARCHAR(50)) AS Site_Name
  16074. FROM #Import_Staging stag
  16075. WHERE stag.Site_Name IS NULL
  16076. AND stag.Company_RecID IS NULL
  16077. )
  16078.  
  16079. UPDATE stag
  16080. SET stag.Site_Name = gsn.Site_Name
  16081. FROM #Import_Staging stag
  16082. INNER JOIN gsn
  16083. ON gsn.ExcelRowNumber = stag.ExcelRowNumber
  16084.  
  16085. -- Table to Force compilation regardless of structure
  16086. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  16087. DROP TABLE #Force_Compile
  16088.  
  16089. CREATE TABLE #Force_Compile
  16090. (
  16091. Column_Name VARCHAR(20)
  16092. )
  16093.  
  16094. -- If running in 'Force Mode', create necessary references
  16095. IF @ForceMode = 1
  16096. BEGIN
  16097.  
  16098. -- Insert states
  16099. -- Pre-2017.1
  16100. IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(OBJECT_ID) = 'States')
  16101. BEGIN
  16102. INSERT INTO dbo.States
  16103. (
  16104. State_ID,
  16105. [Description],
  16106. Last_Update,
  16107. Updated_By
  16108. )
  16109.  
  16110. SELECT DISTINCT
  16111. SUBSTRING(State_Comp, 1, 50),
  16112. SUBSTRING(State_Comp, 1, 50),
  16113. GETDATE(),
  16114. @ImportBatchUser
  16115. FROM #Import_Staging tmp
  16116. WHERE tmp.State_Comp IS NOT NULL
  16117. AND tmp.State_ID IS NULL
  16118. END
  16119.  
  16120. -- Post-2017.1
  16121. IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(OBJECT_ID) = 'States')
  16122. BEGIN
  16123. INSERT INTO dbo.States
  16124. (
  16125. State_ID,
  16126. [Description],
  16127. Last_Update,
  16128. Updated_By,
  16129. Entered_By,
  16130. Date_Entered_UTC
  16131. )
  16132.  
  16133. SELECT DISTINCT
  16134. SUBSTRING(State_Comp, 1, 50),
  16135. SUBSTRING(State_Comp, 1, 50),
  16136. GETDATE(),
  16137. @ImportBatchUser,
  16138. 'zAdmin',
  16139. GETUTCDATE()
  16140. FROM #Import_Staging tmp
  16141. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  16142. WHERE tmp.State_Comp IS NOT NULL
  16143. AND tmp.State_ID IS NULL
  16144. END
  16145.  
  16146. -- Get State_ID for newly inserted records
  16147. UPDATE tmp
  16148. SET tmp.State_ID = st.State_ID
  16149. FROM #Import_Staging tmp
  16150. INNER JOIN dbo.States st
  16151. ON st.[Description] = tmp.State_Comp
  16152. OR st.[State_ID] = tmp.State_Comp
  16153. WHERE st.Updated_By = @ImportBatchUser
  16154.  
  16155. -- Insert countries
  16156. INSERT INTO dbo.Country
  16157. (
  16158. Owner_ID,
  16159. Country,
  16160. City_Caption,
  16161. State_Caption,
  16162. Zip_Caption,
  16163. Updated_By,
  16164. Currency_ID
  16165. )
  16166.  
  16167. SELECT DISTINCT
  16168. 1,
  16169. Country_Comp,
  16170. 'City',
  16171. 'State',
  16172. 'Zip',
  16173. @ImportBatchUser,
  16174. 'USD'
  16175. FROM #Import_Staging tmp
  16176. WHERE tmp.Country_Comp IS NOT NULL
  16177. AND tmp.Comp_Country_RecID IS NULL
  16178.  
  16179. -- Get Country_RecID for newly inserted records
  16180. UPDATE tmp
  16181. SET tmp.Comp_Country_RecID = cn.Country_RecID
  16182. FROM #Import_Staging tmp
  16183. INNER JOIN dbo.Country cn
  16184. ON cn.Country = tmp.Country_Comp
  16185. WHERE cn.Updated_By = @ImportBatchUser
  16186.  
  16187. -- Insert Markets
  16188. INSERT INTO dbo.Market
  16189. (
  16190. Owner_ID,
  16191. [Description],
  16192. Updated_By
  16193. )
  16194. SELECT DISTINCT
  16195. 1,
  16196. Company_Market,
  16197. @ImportBatchUser
  16198. FROM #Import_Staging tmp
  16199. WHERE tmp.Market_RecID IS NULL
  16200. AND tmp.Company_Market IS NOT NULL
  16201.  
  16202. -- Market_RecID
  16203. UPDATE stag
  16204. SET stag.Market_RecID = mk.Market_RecID
  16205. FROM #Import_Staging stag
  16206. INNER JOIN dbo.Market mk
  16207. ON mk.[Description] = stag.Company_Market
  16208. WHERE mk.Updated_By = @ImportBatchUser
  16209. AND stag.Market_RecID IS NULL
  16210. AND stag.Company_Market IS NOT NULL
  16211.  
  16212. -- Insert company types
  16213. INSERT INTO Company_Type
  16214. (
  16215. [Description],
  16216. Company_Type_ID,
  16217. Updated_By
  16218. )
  16219.  
  16220. SELECT DISTINCT
  16221. Company_Type,
  16222. SUBSTRING(Company_Type, 1, 5),
  16223. @ImportBatchUser
  16224. FROM #Import_Staging tmp
  16225. WHERE tmp.Company_Type_RecID IS NULL
  16226.  
  16227. -- Company_Type_RecID
  16228. UPDATE tmp
  16229. SET tmp.Company_Type_RecID = ct.Company_Type_RecID
  16230. FROM #Import_Staging tmp
  16231. INNER JOIN dbo.Company_Type ct
  16232. ON ct.[Description] = tmp.Company_Type
  16233. AND ct.Updated_By = @ImportBatchUser
  16234.  
  16235. -- Insert Payment Terms
  16236. INSERT INTO Billing_terms
  16237. (
  16238. Owner_ID,
  16239. [Description],
  16240. Default_Flag,
  16241. Updated_By,
  16242. --Last_Update,
  16243. Due_Days,
  16244. Terms_Xref
  16245. )
  16246.  
  16247. SELECT DISTINCT
  16248. 1,
  16249. PaymentTerms,
  16250. 0,
  16251. @ImportBatchUser,
  16252. --GETDATE(),
  16253. 0,
  16254. ''
  16255. FROM #Import_Staging tmp
  16256. WHERE tmp.PaymentTerms IS NOT NULL
  16257. AND tmp.Billing_Terms_RecID IS NULL
  16258.  
  16259. -- Billing_Terms_RecID
  16260. UPDATE tmp
  16261. SET tmp.Billing_Terms_RecID = bt.Billing_Terms_RecID
  16262. FROM #Import_Staging tmp
  16263. INNER JOIN dbo.Billing_Terms bt
  16264. ON bt.[Description] = tmp.PaymentTerms
  16265.  
  16266. -- Insert company statuses
  16267. INSERT INTO dbo.Company_Status
  16268. (
  16269. Owner_ID,
  16270. Company_Status_ID,
  16271. [Description],
  16272. Default_Flag,
  16273. Inactive_Flag,
  16274. Last_Update,
  16275. Updated_By,
  16276. Import_Flag,
  16277. Survey_RecID,
  16278. Notify_Flag,
  16279. Notify_Message,
  16280. StandardNote_Flag,
  16281. CustomNote_Flag,
  16282. Cancel_Track_Flag
  16283. )
  16284.  
  16285. SELECT DISTINCT
  16286. 1,
  16287. '',
  16288. tmp.Company_Status,
  16289. 0,
  16290. 0,
  16291. GETDATE(),
  16292. @ImportBatchUser,
  16293. 0,
  16294. 0,
  16295. 0,
  16296. '',
  16297. 0,
  16298. 0,
  16299. 0
  16300. FROM #Import_Staging tmp
  16301. WHERE tmp.Company_Status_RecID IS NULL
  16302. AND tmp.Company_Status IS NOT NULL
  16303.  
  16304. -- Company_Status_RecID
  16305. UPDATE tmp
  16306. SET tmp.Company_Status_RecID = cst.Company_Status_RecID
  16307. FROM #Import_Staging tmp
  16308. INNER JOIN dbo.Company_Status cst
  16309. ON cst.[Description] = tmp.Company_Status
  16310.  
  16311. -- If company name already exists for another company name, place a 'z' at the front (used for CW migration)
  16312. UPDATE tmp
  16313. SET tmp.Company_ID = 'z' + tmp.Company_ID
  16314. FROM #Import_Staging tmp
  16315. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_ID = tmp.Company_ID AND comp.Company_Name <> tmp.Company_Name) comp
  16316. WHERE @Legacy_Flag = 0
  16317.  
  16318. -- Billing site cannot exist for target company
  16319. UPDATE tmp
  16320. SET tmp.[Billing_Site] = 0
  16321. FROM #Import_Staging tmp
  16322. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_RecID = tmp.Company_ReciD AND cad.Default_Bill_Flag = 1)cad
  16323. WHERE tmp.Billing_Site = 1
  16324. AND @Legacy_Flag = 1
  16325.  
  16326. END
  16327.  
  16328. -- Begin validation
  16329. INSERT INTO #tblResults
  16330. (
  16331. RowNumber,
  16332. ValMsg
  16333. )
  16334.  
  16335. -- Company name is required
  16336. SELECT
  16337. tmp.ExcelRowNumber,
  16338. 'Company name is required'
  16339. FROM #Import_Staging tmp
  16340. WHERE tmp.Company_Name IS NULL
  16341. AND @Legacy_Flag = 0
  16342.  
  16343. UNION ALL
  16344.  
  16345. -- Company_ID is required if a company with the same name already exists
  16346. SELECT
  16347. tmp.ExcelRowNumber,
  16348. 'One or more companies already exist named: "' + comp.Company_Name + '" - if you are trying to add a site, please provide a matching Company_ID in the spreadsheet - if you are adding another company with the same name, please supply a NEW Company_ID in the spreadsheet'
  16349. FROM #Import_Staging tmp
  16350. INNER JOIN dbo.Company comp
  16351. ON comp.Company_Name = tmp.Company_Name
  16352. AND tmp.Company_ID IS NULL
  16353. AND comp.Delete_Flag = 0
  16354. AND @Legacy_Flag = 0
  16355.  
  16356. UNION ALL
  16357.  
  16358. -- Company name cannot exceed 50 characters
  16359. SELECT
  16360. tmp.ExcelRowNumber,
  16361. 'Company name cannot exceed 50 characters'
  16362. FROM #Import_Staging tmp
  16363. WHERE LEN(Company_Name) > 50
  16364.  
  16365. UNION ALL
  16366.  
  16367. -- Company with the same Company_ID cannot exist with a different company name (even if deleted - mirrored from PSA validation)
  16368. SELECT
  16369. tmp.ExcelRowNumber,
  16370. 'The Company_ID: "' + tmp.Company_ID + '" cannot be associated with Company: "' + tmp.Company_Name + '" because it is already associated with an existing company named: "' + comp.Company_Name + '"'
  16371. FROM #Import_Staging tmp
  16372. INNER JOIN dbo.Company comp
  16373. ON comp.Company_ID = tmp.Company_ID
  16374. AND comp.Company_Name <> tmp.Company_Name
  16375. WHERE tmp.Company_Name IS NOT NULL
  16376. AND tmp.Company_ID IS NOT NULL
  16377. AND @Legacy_Flag = 0
  16378.  
  16379. UNION ALL
  16380.  
  16381. -- Can't have companies with duplicate company_id but different name in spreadsheet
  16382. SELECT
  16383. tmp.ExcelRowNumber,
  16384. 'The Company_ID: "' + ISNULL(tmp.Company_ID, '[BLANK]') + '" is specified more than once in this spreadsheet for different company names. If you want to add multiple sites for a company, the company name must match
  16385.  
  16386. exactly'
  16387. FROM #Import_Staging tmp
  16388. INNER JOIN #Import_Staging tmp2
  16389. ON tmp.Company_ID = tmp2.Company_ID
  16390. AND tmp.Company_Name <> tmp2.Company_Name
  16391. WHERE tmp.Company_ID IS NOT NULL
  16392. AND tmp.Company_Name IS NOT NULL
  16393. AND @Legacy_Flag = 0
  16394.  
  16395. UNION ALL
  16396.  
  16397. -- If adding a site/address, site name is required (Same as PSA)
  16398. SELECT
  16399. tmp.ExcelRowNumber,
  16400. 'A company named: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '" with Company_ID: "' + ISNULL(tmp.Company_ID, '[BLANK]') + '" already exists. If you are adding a site to this company, the Site_Name field is required.'
  16401. FROM #Import_Staging tmp
  16402. INNER JOIN dbo.Company comp
  16403. ON tmp.Company_RecID = comp.Company_RecID
  16404. WHERE tmp.Site_Name IS NULL
  16405. AND @Legacy_Flag = 0
  16406.  
  16407. UNION ALL
  16408.  
  16409. -- Site name cannot exceed 50 characters
  16410. SELECT
  16411. tmp.ExcelRowNumber,
  16412. 'Site name cannot exceed 50 characters'
  16413. FROM #Import_Staging tmp
  16414. WHERE LEN(tmp.Site_Name) > 50
  16415.  
  16416. UNION ALL
  16417.  
  16418. -- Can't add a site to a deleted company
  16419. SELECT
  16420. tmp.ExcelRowNumber,
  16421. 'Unable to add a site to the deleted company: "' + tmp.Company_Name + '"'
  16422. FROM #Import_Staging tmp
  16423. INNER JOIN dbo.Company comp
  16424. ON tmp.Company_RecID = comp.Company_RecID
  16425. WHERE comp.Delete_Flag = 1
  16426. AND @Legacy_Flag = 0
  16427.  
  16428. UNION ALL
  16429.  
  16430. -- Company_Type is required and must be a valid reference
  16431. SELECT
  16432. tmp.ExcelRowNumber,
  16433. CASE
  16434. WHEN tmp.Company_Type IS NULL THEN 'No company type was supplied and no default type exists'
  16435. WHEN tmp.Company_Type_RecID IS NULL THEN 'The company type: "' + tmp.Company_Type + '" does not exist. [Setup] -> [Setup Tables] -> [Company Type]'
  16436. END
  16437. FROM #Import_Staging tmp
  16438. WHERE Company_Type_RecID IS NULL
  16439.  
  16440. UNION ALL
  16441.  
  16442. -- Company_Status is required and must be a valid reference
  16443. SELECT
  16444. tmp.ExcelRowNumber,
  16445. CASE
  16446. WHEN tmp.Company_Status IS NULL THEN 'No company status was supplied and no default status exists'
  16447. WHEN tmp.Company_Status_RecID IS NULL THEN 'The company status: "' + tmp.Company_Status + '" does not exist. [Setup] -> [Setup Tables] -> [Company Status]'
  16448. END
  16449. FROM #Import_Staging tmp
  16450. WHERE tmp.Company_Status_RecID IS NULL
  16451.  
  16452. UNION ALL
  16453.  
  16454. -- If specified, market must be valid
  16455. SELECT
  16456. tmp.ExcelRowNumber,
  16457. 'Invalid Market: "' + tmp.Company_Market + '" [Setup] -> [Setup Tables] -> [Market Description]'
  16458. FROM #Import_Staging tmp
  16459. WHERE tmp.Market_RecID IS NULL
  16460. AND tmp.Company_Market IS NOT NULL
  16461.  
  16462. UNION ALL
  16463.  
  16464. ---- If specified, track must be valid
  16465. --SELECT
  16466. -- tmp.ExcelRowNumber,
  16467. -- 'Invalid Track: "' + tmp.Track + '" track does not exist or is inactive - [Setup] -> [Setup Tables] -> [Tracks]'
  16468. --FROM #Import_Staging tmp
  16469. --WHERE tmp.WF_Track_Header_RecID IS NULL
  16470. -- AND tmp.Track IS NOT NULL
  16471.  
  16472. --UNION ALL
  16473.  
  16474. ---- Track must not already be assigned to company
  16475. --SELECT
  16476. -- tmp.ExcelRowNumber,
  16477. -- 'Track: ' + tr.[Description] + ' is already assigned to Company: "' + tmp.Company_Name
  16478. --FROM #Import_Staging tmp
  16479. -- INNER JOIN WF_Track_Attach_Header tr
  16480. -- ON tr.Table_Reference = 'company'
  16481. -- AND tr.RecID_Field = 'Company_RecID'
  16482. -- AND tr.RecID = tmp.Company_RecID
  16483. -- AND (tr.Date_End IS NULL OR tr.Date_End >= GETDATE())
  16484. -- AND tmp.WF_Track_Header_RecID = tr.WF_Track_Header_RecID
  16485.  
  16486. --UNION ALL
  16487.  
  16488. -- Source List cannot exceed 50 characters
  16489. SELECT
  16490. tmp.ExcelRowNumber,
  16491. 'Source list cannot exceed 50 characters'
  16492. FROM #Import_Staging tmp
  16493. WHERE LEN(tmp.SourceList) > 50
  16494.  
  16495. UNION ALL
  16496.  
  16497. -- MarkAsLead must evaluate to True or False (null assumes no)
  16498. SELECT
  16499. tmp.ExcelRowNumber,
  16500. 'If specified, "Mark as Lead" must be Yes or No'
  16501. FROM #Import_Staging tmp
  16502. WHERE MarkAsLead IS NOT NULL
  16503. AND MarkAsLead NOT IN('Y', 'N', '0', '1', 'Yes', 'No', 'T', 'F', 'True', 'False')
  16504.  
  16505. UNION ALL
  16506.  
  16507. -- Territory must be a valid reference if specified
  16508. SELECT
  16509. tmp.ExcelRowNumber,
  16510. 'Invalid territory: "' + tmp.Territory + '" - does not exist or is not marked as a territory'
  16511. FROM #Import_Staging tmp
  16512. WHERE tmp.Territory_Owner_Level_RecID IS NULL
  16513. AND tmp.Territory IS NOT NULL
  16514.  
  16515. UNION ALL
  16516.  
  16517. -- Group must be a valid reference if specified
  16518. SELECT
  16519. tmp.ExcelRowNumber,
  16520. 'Invalid group: "' + tmp.[Group] + '" does not exist, or is not configured as a company group [Setup] -> [Setup Tables] -> [Group]'
  16521. FROM #Import_Staging tmp
  16522. WHERE tmp.[Group] IS NOT NULL
  16523. AND tmp.Group_Type_RecID IS NULL
  16524.  
  16525. UNION ALL
  16526.  
  16527. -- Company Phone number cannot exceed 30 characters
  16528. SELECT
  16529. tmp.ExcelRowNumber,
  16530. 'Company Phone number cannot exceed 30 characters'
  16531. FROM #Import_Staging tmp
  16532. WHERE LEN(tmp.PhoneNbr_Comp) > 30
  16533. AND @ForceMode <> 1
  16534.  
  16535. UNION ALL
  16536.  
  16537. -- Company fax number cannot exceed 30 characters
  16538. SELECT
  16539. tmp.ExcelRowNumber,
  16540. 'Company fax number cannot exceed 30 characters'
  16541. FROM #Import_Staging tmp
  16542. WHERE LEN(tmp.PhoneNbr_Fax) > 30
  16543. AND @ForceMode <> 1
  16544.  
  16545. UNION ALL
  16546.  
  16547. -- Company address line 1 cannot exceed 50 characters
  16548. SELECT
  16549. tmp.ExcelRowNumber,
  16550. 'Company address line 1 cannot exceed 50 characters'
  16551. FROM #Import_Staging tmp
  16552. WHERE LEN(tmp.Address_Line1_Comp) > 50
  16553.  
  16554.  
  16555. UNION ALL
  16556.  
  16557. -- Company address line 2 cannot exceed 50 characters
  16558. SELECT
  16559. tmp.ExcelRowNumber,
  16560. 'Company address line 2 cannot exceed 50 characters'
  16561. FROM #Import_Staging tmp
  16562. WHERE LEN(tmp.Address_Line2_Comp) > 50
  16563.  
  16564. UNION ALL
  16565.  
  16566. -- City cannot exceed 50 characters
  16567. SELECT
  16568. tmp.ExcelRowNumber,
  16569. 'City cannot exceed 50 characters'
  16570. FROM #Import_Staging tmp
  16571. WHERE LEN(tmp.City_Comp) > 50
  16572.  
  16573. UNION ALL
  16574.  
  16575. -- Tax_Code_ID must be a valid reference
  16576. SELECT
  16577. tmp.ExcelRowNumber,
  16578. 'Tax_Code_ID: "' + tmp.Tax_Code_ID + '" is invalid or inactive.'
  16579. FROM #Import_Staging tmp
  16580. WHERE tmp.Tax_Code_ID IS NOT NULL
  16581. AND tmp.Tax_Code_RecID IS NULL
  16582.  
  16583. UNION ALL
  16584.  
  16585. -- State must be a valid reference if entered
  16586. SELECT
  16587. tmp.ExcelRowNumber,
  16588. 'Invalid State: "' + tmp.State_Comp + '" [Setup] -> [Setup Tables] -> [State]'
  16589. FROM #Import_Staging tmp
  16590. WHERE tmp.State_ID IS NULL
  16591. AND State_Comp IS NOT NULL
  16592.  
  16593. UNION ALL
  16594.  
  16595. -- Country must be a valid reference if entered
  16596. SELECT
  16597. tmp.ExcelRowNumber,
  16598. 'Invalid Country: "' + tmp.Country_Comp + '" [Setup] -> [Setup Tables] -> [Country]'
  16599. FROM #Import_Staging tmp
  16600. WHERE tmp.Comp_Country_RecID IS NULL
  16601. AND tmp.Country_Comp IS NOT NULL
  16602.  
  16603. UNION ALL
  16604.  
  16605. -- Website URL cannot exceed 50 characters
  16606. SELECT
  16607. tmp.ExcelRowNumber,
  16608. 'Website URL cannot exceed 250 characters'
  16609. FROM #Import_Staging tmp
  16610. WHERE LEN(tmp.Website_URL) > 250
  16611. AND @Forcemode = 0
  16612.  
  16613. UNION ALL
  16614.  
  16615. -- Annual Revenue must be numeric
  16616. SELECT
  16617. tmp.ExcelRowNumber,
  16618. 'Annual revenue must be numeric with no punctuation or symbols'
  16619. FROM #Import_Staging tmp
  16620. WHERE ISNUMERIC(tmp.Annual_Revenue + 'e0') <> 1
  16621. AND tmp.Annual_Revenue IS NOT NULL
  16622.  
  16623. UNION ALL
  16624.  
  16625. -- Cannot have more than one billing site
  16626. SELECT
  16627. MIN(tmp.ExcelRowNumber),
  16628. 'Cannot have more than one billing site for company ' + Company_Name
  16629. FROM #Import_Staging tmp
  16630. WHERE Billing_Site = 1
  16631. AND @Legacy_Flag = 0
  16632. GROUP BY Company_Name
  16633. HAVING COUNT(*) > 1
  16634.  
  16635. UNION ALL
  16636.  
  16637. SELECT
  16638. MIN(tmp.ExcelRowNumber),
  16639. 'Cannot have more than one billing site for legacy company ' + Legacy_ID
  16640. FROM #Import_Staging tmp
  16641. WHERE Billing_Site = 1
  16642. AND @Legacy_Flag = 1
  16643. GROUP BY Legacy_ID
  16644. HAVING COUNT(*) > 1
  16645.  
  16646. UNION ALL
  16647.  
  16648. -- Billing site must be 0 or 1
  16649. SELECT
  16650. tmp.ExcelRowNumber,
  16651. 'Billing Site must be 0 or 1'
  16652. FROM #Import_Staging tmp
  16653. WHERE Billing_Site IS NOT NULL
  16654. AND Billing_Site NOT IN('0', '1')
  16655.  
  16656. UNION ALL
  16657.  
  16658. -- Billing site cannot exist for target company
  16659. SELECT
  16660. tmp.ExcelRowNumber,
  16661. 'A billing site already exists for company : ' + tmp.Company_Name
  16662. FROM #Import_Staging tmp
  16663. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_Name = tmp.Company_Name) comp
  16664. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_RecID = comp.Company_ReciD AND cad.Default_Bill_Flag = 1)cad
  16665. WHERE tmp.Billing_Site = 1
  16666. AND @Legacy_Flag = 0
  16667.  
  16668. UNION ALL
  16669.  
  16670.  
  16671. -- Billing site cannot exist for target company
  16672. SELECT
  16673. tmp.ExcelRowNumber,
  16674. 'A billing site already exists for company : ' + tmp.Legacy_Company_ID
  16675. FROM #Import_Staging tmp
  16676. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = tmp.Company_RecID) comp
  16677. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_RecID = comp.Company_ReciD AND cad.Default_Bill_Flag = 1)cad
  16678. WHERE tmp.Billing_Site = 1
  16679. AND @Legacy_Flag = 1
  16680.  
  16681. UNION ALL
  16682.  
  16683. -- Number of employees must be an integer
  16684. SELECT
  16685. tmp.ExcelRowNumber,
  16686. 'Number of employees must be a whole number (no decimals)'
  16687. FROM #Import_Staging tmp
  16688. WHERE ISNUMERIC(tmp.Nbr_Employees + '.e0') <> 1
  16689. AND tmp.Nbr_Employees IS NOT NULL
  16690.  
  16691. UNION ALL
  16692.  
  16693. -- SIC_Code_ID must be a valid reference if specified
  16694. SELECT
  16695. tmp.ExcelRowNumber,
  16696. 'Invalid SIC_Code_ID: "' + tmp.SIC_Code_ID + '"'
  16697. FROM #Import_Staging tmp
  16698. LEFT OUTER JOIN dbo.SIC_Code sc
  16699. ON dbo.ufn_Import_Trim(sc.SIC_Code_ID) = tmp.SIC_Code_ID
  16700. WHERE tmp.SIC_Code_ID IS NULL
  16701. AND tmp.SIC_Code_ID IS NOT NULL
  16702.  
  16703. UNION ALL
  16704.  
  16705. -- Account_Nbr cannot exceed 100 characters
  16706. SELECT
  16707. tmp.ExcelRowNumber,
  16708. 'Account number cannot exceed 100 characters'
  16709. FROM #Import_Staging tmp
  16710. WHERE LEN(tmp.Account_Nbr) > 100
  16711.  
  16712. UNION ALL
  16713.  
  16714. -- If company notes are provided, there must be a default note type
  16715. SELECT DISTINCT
  16716. 0,
  16717. 'In order to enter company notes, there must be a default note type set up. [Setup] -> [Setup Tables] -> [Note Type]'
  16718. FROM #Import_Staging tmp
  16719. WHERE tmp.Note_Type_RecID IS NULL
  16720.  
  16721.  
  16722. UNION ALL
  16723.  
  16724. -- Parent company must exist in Company table or elsewhere in spreadsheet
  16725. SELECT
  16726. tmp.ExcelRowNumber,
  16727. 'Invalid parent company - No company with the Company_ID: "' + tmp.Parent_Company_ID + '" exists in ConnectWise, or in this spreadsheet.'
  16728. FROM #Import_Staging tmp
  16729. LEFT OUTER JOIN #Import_Staging tmp2
  16730. ON tmp.Parent_Company_ID = tmp2.Company_ID
  16731. AND tmp.ExcelRowNumber <> tmp2.ExcelRowNumber
  16732. WHERE tmp.Parent_Company_ID IS NOT NULL
  16733. AND tmp.Parent_Company_RecID IS NULL
  16734. AND tmp2.Company_ID IS NULL
  16735. AND @Legacy_Flag = 0
  16736.  
  16737. UNION ALL
  16738.  
  16739. -- Ownership_Type must be a valid reference if entered
  16740. SELECT
  16741. tmp.ExcelRowNumber,
  16742. 'Invalid ownership type: "' + tmp.Ownership_Type + '" [Setup] -> [Setup Tables] -> [Ownership Type]'
  16743. FROM #Import_Staging tmp
  16744. WHERE tmp.Ownership_Type IS NOT NULL
  16745. AND tmp.Ownership_Type_RecID IS NULL
  16746.  
  16747. UNION ALL
  16748.  
  16749. -- Time_Zone must be a valid reference if entered
  16750. SELECT
  16751. tmp.ExcelRowNumber,
  16752. 'Invalid time zone: "' + tmp.TimeZone + '"'
  16753. FROM #Import_Staging tmp
  16754. WHERE tmp.TimeZone IS NOT NULL
  16755. AND tmp.Time_Zone_RecID IS NULL
  16756.  
  16757. UNION ALL
  16758.  
  16759. -- TaxID cannot exceed 50 characters
  16760. SELECT
  16761. tmp.ExcelRowNumber,
  16762. 'Tax ID cannot exceed 50 characters'
  16763. FROM #Import_Staging tmp
  16764. WHERE LEN(tmp.TaxID) > 50
  16765.  
  16766. UNION ALL
  16767.  
  16768. -- Payment terms must be a valid reference if entered
  16769. SELECT
  16770. tmp.ExcelRowNumber,
  16771. 'Invalid payment terms: "' + tmp.PaymentTerms + '" [Setup] -> [Setup Tables] -> [Billing Terms]'
  16772. FROM #Import_Staging tmp
  16773. WHERE tmp.PaymentTerms IS NOT NULL
  16774. AND tmp.Billing_Terms_RecID IS NULL
  16775.  
  16776. UNION ALL
  16777.  
  16778. -- User fields can't be entered if 'Not used' in dbo.Owner
  16779. SELECT
  16780. tmp.ExcelRowNumber,
  16781. 'User Field 1 cannot be entered because no question has been defined for that field'
  16782. FROM #Import_Staging tmp
  16783. WHERE UserField1 IS NOT NULL
  16784. AND UserField1Used = 0
  16785.  
  16786. UNION ALL
  16787.  
  16788. SELECT
  16789. tmp.ExcelRowNumber,
  16790. 'User Field 2 cannot be entered because no question has been defined for that field'
  16791. FROM #Import_Staging tmp
  16792. WHERE UserField2 IS NOT NULL
  16793. AND UserField2Used = 0
  16794.  
  16795. UNION ALL
  16796.  
  16797. SELECT
  16798. tmp.ExcelRowNumber,
  16799. 'User Field 3 cannot be entered because no question has been defined for that field'
  16800. FROM #Import_Staging tmp
  16801. WHERE UserField3 IS NOT NULL
  16802. AND UserField3Used = 0
  16803.  
  16804. UNION ALL
  16805.  
  16806. SELECT
  16807. tmp.ExcelRowNumber,
  16808. 'User Field 4 cannot be entered because no question has been defined for that field'
  16809. FROM #Import_Staging tmp
  16810. WHERE UserField4 IS NOT NULL
  16811. AND UserField4Used = 0
  16812.  
  16813. UNION ALL
  16814.  
  16815. SELECT
  16816. tmp.ExcelRowNumber,
  16817. 'User Field 5 cannot be entered because no question has been defined for that field'
  16818. FROM #Import_Staging tmp
  16819. WHERE UserField5 IS NOT NULL
  16820. AND UserField5Used = 0
  16821.  
  16822. UNION ALL
  16823.  
  16824. SELECT
  16825. tmp.ExcelRowNumber,
  16826. 'User Field 6 cannot be entered because no question has been defined for that field'
  16827. FROM #Import_Staging tmp
  16828. WHERE UserField6 IS NOT NULL
  16829. AND UserField6Used = 0
  16830.  
  16831. UNION ALL
  16832.  
  16833. SELECT
  16834. tmp.ExcelRowNumber,
  16835. 'User Field 7 cannot be entered because no question has been defined for that field'
  16836. FROM #Import_Staging tmp
  16837. WHERE UserField7 IS NOT NULL
  16838. AND UserField7Used = 0
  16839.  
  16840. UNION ALL
  16841.  
  16842. SELECT
  16843. tmp.ExcelRowNumber,
  16844. 'User Field 8 cannot be entered because no question has been defined for that field'
  16845. FROM #Import_Staging tmp
  16846. WHERE UserField8 IS NOT NULL
  16847. AND UserField8Used = 0
  16848.  
  16849. UNION ALL
  16850.  
  16851. SELECT
  16852. tmp.ExcelRowNumber,
  16853. 'User Field 9 cannot be entered because no question has been defined for that field'
  16854. FROM #Import_Staging tmp
  16855. WHERE UserField9 IS NOT NULL
  16856. AND UserField9Used = 0
  16857.  
  16858. UNION ALL
  16859.  
  16860. SELECT
  16861. tmp.ExcelRowNumber,
  16862. 'User Field 10 cannot be entered because no question has been defined for that field'
  16863. FROM #Import_Staging tmp
  16864. WHERE UserField10 IS NOT NULL
  16865. AND UserField10Used = 0
  16866.  
  16867. UNION ALL
  16868.  
  16869. -- User fields cannot exceed 50 characters
  16870. SELECT
  16871. tmp.ExcelRowNumber,
  16872. 'User field 1 cannot exceed 50 characters'
  16873. FROM #Import_Staging tmp
  16874. WHERE LEN(UserField1) > 50
  16875. AND UserField1Used = 1
  16876.  
  16877. UNION ALL
  16878.  
  16879. SELECT
  16880. tmp.ExcelRowNumber,
  16881. 'User field 2 cannot exceed 50 characters'
  16882. FROM #Import_Staging tmp
  16883. WHERE LEN(UserField2) > 50
  16884. AND UserField2Used = 1
  16885.  
  16886. UNION ALL
  16887.  
  16888. SELECT
  16889. tmp.ExcelRowNumber,
  16890. 'User field 3 cannot exceed 50 characters'
  16891. FROM #Import_Staging tmp
  16892. WHERE LEN(UserField3) > 50
  16893. AND UserField3Used = 1
  16894.  
  16895. UNION ALL
  16896.  
  16897. SELECT
  16898. tmp.ExcelRowNumber,
  16899. 'User field 4 cannot exceed 50 characters'
  16900. FROM #Import_Staging tmp
  16901. WHERE LEN(UserField4) > 50
  16902. AND UserField4Used = 1
  16903.  
  16904. UNION ALL
  16905.  
  16906. SELECT
  16907. tmp.ExcelRowNumber,
  16908. 'User field 5 cannot exceed 50 characters'
  16909. FROM #Import_Staging tmp
  16910. WHERE LEN(UserField5) > 50
  16911. AND UserField5Used = 1
  16912.  
  16913. UNION ALL
  16914.  
  16915. SELECT
  16916. tmp.ExcelRowNumber,
  16917. 'User field 6 cannot exceed 50 characters'
  16918. FROM #Import_Staging tmp
  16919. WHERE LEN(UserField6) > 50
  16920. AND UserField6Used = 1
  16921.  
  16922. UNION ALL
  16923.  
  16924. SELECT
  16925. tmp.ExcelRowNumber,
  16926. 'User field 7 cannot exceed 50 characters'
  16927. FROM #Import_Staging tmp
  16928. WHERE LEN(UserField7) > 50
  16929. AND UserField7Used = 1
  16930.  
  16931. UNION ALL
  16932.  
  16933. SELECT
  16934. tmp.ExcelRowNumber,
  16935. 'User field 8 cannot exceed 50 characters'
  16936. FROM #Import_Staging tmp
  16937. WHERE LEN(UserField8) > 50
  16938. AND UserField8Used = 1
  16939.  
  16940. UNION ALL
  16941.  
  16942. SELECT
  16943. tmp.ExcelRowNumber,
  16944. 'User field 9 cannot exceed 50 characters'
  16945. FROM #Import_Staging tmp
  16946. WHERE LEN(UserField9) > 50
  16947. AND UserField9Used = 1
  16948.  
  16949. UNION ALL
  16950.  
  16951. SELECT
  16952. tmp.ExcelRowNumber,
  16953. 'User field 10 cannot exceed 50 characters'
  16954. FROM #Import_Staging tmp
  16955. WHERE LEN(UserField10) > 50
  16956. AND UserField10Used = 1
  16957.  
  16958. -- Clean up
  16959. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  16960. DROP TABLE #Force_Compile
  16961.  
  16962.  
  16963. -- Return results
  16964. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  16965. BEGIN
  16966. UPDATE #tblResults SET ValMsg = '<NULL>' WHERE ValMsg IS NULL
  16967. exec dbo.usp_Condense_Validation_Results
  16968.  
  16969. SELECT
  16970. 0 AS ValPassed,
  16971. 0 AS RowNumber,
  16972. ValMsg
  16973. FROM #ResultsCondensed
  16974.  
  16975. ROLLBACK TRANSACTION
  16976.  
  16977. END
  16978. ELSE
  16979. BEGIN
  16980. -- Insert warning for duplicate on company name but different Company_ID:
  16981. INSERT INTO #tblResults
  16982. (
  16983. RowNumber,
  16984. ValMsg,
  16985. Warning_Flag
  16986. )
  16987.  
  16988. SELECT
  16989. tmp.ExcelRowNumber,
  16990. 'DUPLICATE COMPANY WARNING: A company already exists with the name "' + tmp.Company_Name + '" but with a different Company_ID. Proceeding with this import will create another company with this name.',
  16991. 1
  16992. FROM #Import_Staging tmp
  16993. INNER JOIN dbo.Company comp
  16994. ON comp.Company_Name = tmp.Company_Name
  16995. AND ISNULL(comp.Company_ID, 'zxCompany_ID') <> ISNULL(tmp.Company_ID, 'zxCompany_ID')
  16996. WHERE tmp.Company_Name IS NOT NULL
  16997. AND comp.Delete_Flag = 0
  16998. AND tmp.Company_RecID IS NULL
  16999. AND @Legacy_Flag = 0
  17000.  
  17001. -- If force mode = 1, insert notification messages for any created references
  17002. IF @ForceMode = 1
  17003. BEGIN
  17004. INSERT INTO #tblResults
  17005. (
  17006. RowNumber,
  17007. ValMsg,
  17008. Warning_Flag,
  17009. ReferenceType
  17010. )
  17011. SELECT
  17012. NULL,
  17013. [Description],
  17014. 1,
  17015. 'State(s)'
  17016. FROM dbo.States
  17017. WHERE Updated_By = @ImportBatchUser
  17018.  
  17019. UNION ALL
  17020.  
  17021. SELECT
  17022. NULL,
  17023. Country,
  17024. 1,
  17025. 'Country(s)'
  17026. FROM dbo.Country
  17027. WHERE Updated_By = @ImportBatchUser
  17028.  
  17029. UNION ALL
  17030.  
  17031. SELECT
  17032. NULL,
  17033. [Description],
  17034. 1,
  17035. 'Market(s)'
  17036. FROM dbo.Market
  17037. WHERE Updated_by = @ImportBatchUser
  17038.  
  17039. UNION ALL
  17040.  
  17041. SELECT
  17042. NULL,
  17043. [Description],
  17044. 1,
  17045. 'Company Type(s)'
  17046. FROM dbo.Company_Type
  17047. WHERE Updated_by = @ImportBatchUser
  17048.  
  17049. UNION ALL
  17050.  
  17051. SELECT
  17052. NULL,
  17053. [Description],
  17054. 1,
  17055. 'Payment Term(s)'
  17056. FROM dbo.Billing_Terms
  17057. WHERE Updated_by = @ImportBatchUser
  17058.  
  17059. UNION ALL
  17060.  
  17061. SELECT
  17062. NULL,
  17063. [Description],
  17064. 1,
  17065. 'Payment Term(s)'
  17066. FROM dbo.Company_Status
  17067. WHERE Updated_by = @ImportBatchUser
  17068.  
  17069.  
  17070. END
  17071.  
  17072. -- Warn about duplicate site names (not applicable in differential mode)
  17073. IF @DiffMode = 0
  17074. BEGIN
  17075. INSERT INTO #tblResults
  17076. (
  17077. RowNumber,
  17078. ValMsg,
  17079. Warning_Flag
  17080. )
  17081.  
  17082. SELECT
  17083. tmp.ExcelRowNumber,
  17084. 'DUPLICATE SITE WARNING: A site named "' + tmp.Site_Name + '" already exists for Company: "' + tmp.Company_Name + '" with Company_ID: "' + ISNULL(tmp.Company_ID, '[No Company_ID Specified]') + '". Proceeding with this import will create another site with this name',
  17085. 1
  17086. FROM #Import_Staging tmp
  17087. INNER JOIN dbo.Company comp
  17088. ON comp.Company_RecID = tmp.Company_RecID
  17089. INNER JOIN Company_Address ca
  17090. ON ca.Company_RecID = comp.Company_RecID
  17091. AND dbo.ufn_Import_Trim(ca.[Description]) = tmp.Site_Name
  17092. AND ca.Inactive_Flag = 0
  17093. AND @Legacy_Flag = 0
  17094. END
  17095.  
  17096. -- Return results
  17097. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
  17098. BEGIN
  17099.  
  17100. exec dbo.usp_Condense_Validation_Results
  17101.  
  17102. SELECT
  17103. 2 AS ValPassed,
  17104. 0 AS RowNumber,
  17105. ValMsg
  17106. FROM #ResultsCondensed res
  17107.  
  17108. UNION ALL
  17109.  
  17110. SELECT
  17111. 2 AS ValPassed,
  17112. 0 AS RowNumber,
  17113. LEFT('The following ' + ReferenceType + ' will be created: '+
  17114. STUFF(
  17115. (SELECT ', ' + ValMsg
  17116. FROM #tblResults
  17117. WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
  17118. FOR XML PATH (''))
  17119. , 1, 1, ''), 750) AS ValMsg
  17120. FROM #tblResults res
  17121. WHERE ReferenceType IS NOT NULL
  17122. GROUP BY ReferenceType
  17123.  
  17124. ROLLBACK TRANSACTION
  17125. EXEC usp_Import_Record_Validation @TableName
  17126.  
  17127. END
  17128. ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  17129. BEGIN
  17130. SELECT
  17131. 1 AS ValPassed,
  17132. NULL AS RowNumber,
  17133. NULL AS ValMsg
  17134.  
  17135. ROLLBACK TRANSACTION
  17136. EXEC usp_Import_Record_Validation @TableName
  17137. END
  17138. END
  17139.  
  17140. END TRY
  17141.  
  17142. BEGIN CATCH
  17143.  
  17144. -- Return error information and rollback transaction
  17145. SELECT
  17146. 0 AS ValPassed,
  17147. ERROR_LINE() AS ExcelRowNumber,
  17148. ERROR_MESSAGE() AS ErrorDetails
  17149.  
  17150. ROLLBACK TRANSACTION
  17151.  
  17152. END CATCH
  17153.  
  17154.  
  17155.  
  17156. GO
  17157.  
  17158.  
  17159.  
  17160.  
  17161.  
  17162.  
  17163. -- =============================================
  17164. -- Author: m.gray
  17165. -- Create date: 05/08/2013
  17166. -- Description: Performs final insert of data
  17167. -- from import spreadsheet for Company Import
  17168. -- Sample call: exec usp_Comp_ImportPush 'Comp_Import_Test', 0, 1
  17169. -- =============================================
  17170. ALTER PROCEDURE [dbo].[usp_Comp_ImportPush]
  17171. @TableName VARCHAR(MAX),
  17172. @DiffMode BIT = 0, -- Differential mode - (for custom imports) does not import records where company_name already exists
  17173. @Forcemode BIT = 1
  17174. AS
  17175. BEGIN TRY
  17176.  
  17177. SET NOCOUNT ON
  17178.  
  17179. -- Turn off diff mode - no longer used
  17180. SELECT @DiffMode = 0
  17181.  
  17182. -- Set date format to MDY to validate dates from excel
  17183. SET DATEFORMAT MDY
  17184.  
  17185. -- Variable declaration
  17186. DECLARE
  17187. @ExpRowCount INT, -- Expected rowcount for inserts
  17188. @ImportBatchID INT, -- Import batch number used for mass-maintenance
  17189. @ImportBatchUser VARCHAR(15), -- Member_ID to use for 'UpdatedBy' to identify this batch (i.e. Import3049)
  17190. @ErrorMsg VARCHAR(1500),
  17191. @Curr_Track_Dtl_Record INT -- Identity used to drive the loop to insert track detail records
  17192.  
  17193. -- Flag to indicate migration being matched on Legacy_ID
  17194. DECLARE @Legacy_Flag BIT = 0
  17195.  
  17196. -- Dynamic statement to insert to validation table
  17197. DECLARE @DSQL VARCHAR(MAX)
  17198.  
  17199. -- Fully qualified name of source table
  17200. DECLARE @SourceTable VARCHAR(300)
  17201. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  17202.  
  17203. -- Object_ID of source table
  17204. DECLARE @Source_Object_ID INT
  17205. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  17206.  
  17207. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  17208. SELECT @ImportBatchUser =
  17209. 'CONV_'
  17210. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  17211. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  17212. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  17213. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  17214.  
  17215. -- Table to hold trimmed company names and company_ids from dbo.company
  17216. -- Prevents need to join on trim function each time we touch company table (performance concern)
  17217. DECLARE @Company TABLE
  17218. (
  17219. Company_RecID INT,
  17220. Company_ID VARCHAR(50),
  17221. Company_Name VARCHAR(50),
  17222. Delete_Flag BIT
  17223. )
  17224.  
  17225. INSERT INTO @Company
  17226. (
  17227. Company_RecID,
  17228. Company_ID,
  17229. Company_Name,
  17230. Delete_Flag
  17231. )
  17232.  
  17233. SELECT
  17234. Company_RecID,
  17235. Company_ID,
  17236. Company_Name,
  17237. Delete_Flag
  17238. FROM dbo.Company
  17239.  
  17240. -- Add Tax Code ID field if it doesn't exist (field is optional to accommodate legacy templates)
  17241. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Tax Code ID')
  17242. BEGIN
  17243. SELECT @DSQL =
  17244. '
  17245. ALTER TABLE ' + @SourceTable + '
  17246. ADD [Tax Code ID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  17247. '
  17248.  
  17249. EXEC(@DSQL)
  17250.  
  17251. END
  17252.  
  17253. -- Add Billing Site field if it doesn't exist (field is optional to accommodate legacy templates)
  17254. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Billing Site')
  17255. BEGIN
  17256. SELECT @DSQL =
  17257. '
  17258. ALTER TABLE ' + @SourceTable + '
  17259. ADD [Billing Site] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  17260. '
  17261.  
  17262. EXEC(@DSQL)
  17263.  
  17264. END
  17265.  
  17266. -- Add Legacy_ID field if it doesn't exist
  17267. IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_ID')
  17268. BEGIN
  17269. SELECT @DSQL =
  17270. '
  17271. ALTER TABLE ' + @SourceTable + '
  17272. ADD [Legacy_ID] NVARCHAR(250) COLLATE DATABASE_DEFAULT
  17273. '
  17274.  
  17275. EXEC(@DSQL)
  17276.  
  17277. END
  17278.  
  17279. -- Table to hold source data for this batch from temp table
  17280. IF (OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL)
  17281. BEGIN
  17282. DROP TABLE #Import_Staging
  17283. END
  17284.  
  17285. CREATE TABLE #Import_Staging
  17286. (
  17287. ExcelRowNumber INT NULL,
  17288. Company_Name varchar(50) COLLATE DATABASE_DEFAULT NULL,
  17289. Company_ID varchar(50) COLLATE DATABASE_DEFAULT NULL,
  17290. Company_Type varchar(50) COLLATE DATABASE_DEFAULT NULL,
  17291. Company_Status varchar(50) COLLATE DATABASE_DEFAULT NULL,
  17292. Company_Market varchar(50) COLLATE DATABASE_DEFAULT NULL,
  17293. Track nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17294. SourceList nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17295. MarkAsLead nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17296. Territory nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17297. [Group] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17298. PhoneNbr_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17299. PhoneNbr_Fax nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17300. Site_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17301. Address_Line1_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17302. Address_Line2_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17303. City_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17304. State_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17305. Zip_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17306. Country_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17307. Website_URL nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17308. Annual_Revenue nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17309. Nbr_Employees nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17310. SIC_Code_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17311. Account_Nbr nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17312. Note_Comp nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  17313. Parent_Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17314. Ownership_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17315. TimeZone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17316. TaxID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  17317. PaymentTerms NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  17318. UserField1 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17319. UserField2 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17320. UserField3 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17321. UserField4 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17322. UserField5 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17323. UserField6 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17324. UserField7 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17325. UserField8 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17326. UserField9 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17327. UserField10 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17328. BatchID UNIQUEIDENTIFIER NULL,
  17329. Company_RecID INT,
  17330. Company_Type_RecID INT,
  17331. Company_Status_RecID INT,
  17332. Market_RecID INT,
  17333. WF_Track_Header_RecID INT,
  17334. Territory_Owner_Level_RecID INT,
  17335. Group_Type_RecID INT,
  17336. Site_Company_Address_RecID INT,
  17337. State_ID VARCHAR(50) COLLATE DATABASE_DEFAULT,
  17338. Comp_Country_RecID INT,
  17339. Parent_Company_RecID INT,
  17340. Ownership_Type_RecID INT,
  17341. Time_Zone_RecID INT,
  17342. Billing_Terms_RecID INT,
  17343. Contact_RecID INT,
  17344. Contact_Type_RecID INT,
  17345. Note_Type_RecID INT,
  17346. NewCompany BIT,
  17347. EnteredBy VARCHAR(15) COLLATE DATABASE_DEFAULT,
  17348. InsertOrder INT,
  17349. PhoneCleanupReq BIT,
  17350. FaxCleanupReq BIT,
  17351. New_Identity INT,
  17352. Company_Address_RecID_New INT,
  17353. Owner_ID INT,
  17354. Auto_Company_ID BIT,
  17355. WF_Track_Attach_Header_RecID INT,
  17356. Track_Detail_Processed BIT,
  17357. Tax_Code_ID VARCHAR(50) COLLATE DATABASE_DEFAULT,
  17358. Tax_Code_RecID INT,
  17359. Billing_Delivery_RecID INT,
  17360. Billing_Site NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  17361. Legacy_ID NVARCHAR(250) COLLATE DATABASE_DEFAULT,
  17362. Exclude BIT DEFAULT 0,
  17363. Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  17364. Legacy_Company_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  17365. Company_Address_RecID INT,
  17366. SR_Service_RecID INT,
  17367. SO_Opportunity_RecID INT,
  17368. Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  17369. Legacy_Ticket_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  17370. Legacy_Opp_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
  17371. Diff_Exclude_Flag BIT
  17372. )
  17373.  
  17374. CREATE INDEX IX_Legacy_ID ON #Import_Staging(Legacy_ID)
  17375. CREATE INDEX IX_ExcelRow ON #Import_Staging(ExcelRowNumber)
  17376.  
  17377. IF NOT EXISTS(SELECT 1 FROM tempdb.sys.indexes WHERE OBJECT_ID = @Source_Object_ID AND Name = 'IX_ExcelRow')
  17378. BEGIN
  17379. EXEC('CREATE INDEX IX_ExcelRow ON tempdb.dbo.' + @TableName + '([Excel Row Number])')
  17380. END
  17381.  
  17382.  
  17383. -- Build statement to populate staging table
  17384. -- Convert blank string or single space to null
  17385. SELECT @DSQL = '
  17386. INSERT INTO #Import_Staging
  17387. (
  17388. ExcelRowNumber,
  17389. Company_Name,
  17390. Company_Type,
  17391. Company_Status,
  17392. Company_Market,
  17393. Track,
  17394. SourceList,
  17395. MarkAsLead,
  17396. Territory,
  17397. [Group],
  17398. Company_ID,
  17399. PhoneNbr_Comp,
  17400. PhoneNbr_Fax,
  17401. Site_Name,
  17402. Address_Line1_Comp,
  17403. Address_Line2_Comp,
  17404. City_Comp,
  17405. State_Comp,
  17406. Zip_Comp,
  17407. Country_Comp,
  17408. Website_URL,
  17409. Annual_Revenue,
  17410. Nbr_Employees,
  17411. SIC_Code_ID,
  17412. Account_Nbr,
  17413. Note_Comp,
  17414. Ownership_Type,
  17415. TimeZone,
  17416. TaxID,
  17417. PaymentTerms,
  17418. UserField1,
  17419. UserField2,
  17420. UserField3,
  17421. UserField4,
  17422. UserField5,
  17423. UserField6,
  17424. UserField7,
  17425. UserField8,
  17426. UserField9,
  17427. UserField10,
  17428. NewCompany,
  17429. Track_Detail_Processed,
  17430. Tax_Code_ID,
  17431. Billing_Site,
  17432. Legacy_ID
  17433. )
  17434.  
  17435. SELECT
  17436. [Excel Row Number],
  17437. LEFT([Company Name], 50),
  17438. LEFT([Company Type], 50),
  17439. LEFT([Company Status], 50),
  17440. LEFT([Company Market], 50),
  17441. [Track],
  17442. [Source List],
  17443. [Mark As Lead],
  17444. [Territory Name],
  17445. [Company Group],
  17446. LEFT([Company ID], 50),
  17447. [Phone Number],
  17448. [Fax Number],
  17449. [Site Name],
  17450. [Address Line 1],
  17451. [Address Line 2],
  17452. [City],
  17453. [State],
  17454. [Zip Code],
  17455. [Country],
  17456. [Website URL],
  17457. [Annual Revenue],
  17458. [Number Of Employees],
  17459. [SIC Code],
  17460. [Company Account],
  17461. [Company Note],
  17462. [Ownership Type],
  17463. [Time Zone],
  17464. [Company TaxID],
  17465. [Payment Terms],
  17466. [User Field 1],
  17467. [User Field 2],
  17468. [User Field 3],
  17469. [User Field 4],
  17470. [User Field 5],
  17471. [User Field 6],
  17472. [User Field 7],
  17473. [User Field 8],
  17474. [User Field 9],
  17475. [User Field 10],
  17476. 0,
  17477. 0,
  17478. LEFT([Tax Code ID], 50),
  17479. [Billing Site],
  17480. Legacy_ID
  17481. FROM ' + @SourceTable
  17482.  
  17483. EXEC(@DSQL)
  17484.  
  17485. BEGIN TRANSACTION Comp_Import
  17486.  
  17487. -- Convert empty string or single space to null in source table
  17488. UPDATE #Import_Staging SET
  17489. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  17490. Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
  17491. Company_Type = CASE WHEN Company_Type IN('', ' ') THEN NULL ELSE Company_Type END,
  17492. Company_Status = CASE WHEN Company_Status IN('', ' ') THEN NULL ELSE Company_Status END,
  17493. Company_Market = CASE WHEN Company_Market IN('', ' ') THEN NULL ELSE Company_Market END,
  17494. Track = CASE WHEN Track IN('', ' ') THEN NULL ELSE Track END,
  17495. SourceList = CASE WHEN SourceList IN('', ' ') THEN NULL ELSE SourceList END,
  17496. MarkAsLead = CASE WHEN MarkAsLead IN('', ' ') THEN NULL ELSE MarkAsLead END,
  17497. Territory = CASE WHEN Territory IN('', ' ') THEN NULL ELSE Territory END,
  17498. [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
  17499. Company_ID = CASE WHEN Company_ID IN('', ' ') THEN NULL ELSE Company_ID END,
  17500. PhoneNbr_Comp = CASE WHEN PhoneNbr_Comp IN('', ' ') THEN NULL ELSE PhoneNbr_Comp END,
  17501. PhoneNbr_Fax = CASE WHEN PhoneNbr_Fax IN('', ' ') THEN NULL ELSE PhoneNbr_Fax END,
  17502. Site_Name = CASE WHEN Site_Name IN('', ' ') THEN NULL ELSE Site_Name END,
  17503. Address_Line1_Comp = CASE WHEN Address_Line1_Comp IN('', ' ') THEN NULL ELSE Address_Line1_Comp END,
  17504. Address_Line2_Comp = CASE WHEN Address_Line2_Comp IN('', ' ') THEN NULL ELSE Address_Line2_Comp END,
  17505. City_Comp = CASE WHEN City_Comp IN('', ' ') THEN NULL ELSE City_Comp END,
  17506. State_Comp = CASE WHEN State_Comp IN('', ' ') THEN NULL ELSE State_Comp END,
  17507. Zip_Comp = CASE WHEN Zip_Comp IN('', ' ') THEN NULL ELSE Zip_Comp END,
  17508. Country_Comp = CASE WHEN Country_Comp IN('', ' ') THEN NULL ELSE Country_Comp END,
  17509. Website_URL = CASE WHEN Website_URL IN('', ' ') THEN NULL ELSE Website_URL END,
  17510. Annual_Revenue = CASE WHEN Annual_Revenue IN('', ' ') THEN NULL ELSE Annual_Revenue END,
  17511. Nbr_Employees = CASE WHEN Nbr_Employees IN('', ' ') THEN NULL ELSE Nbr_Employees END,
  17512. SIC_Code_ID = CASE WHEN SIC_Code_ID IN('', ' ') THEN NULL ELSE SIC_Code_ID END,
  17513. Account_Nbr = CASE WHEN Account_Nbr IN('', ' ') THEN NULL ELSE Account_Nbr END,
  17514. Note_Comp = CASE WHEN Note_Comp IN('', ' ') THEN NULL ELSE Note_Comp END,
  17515. Parent_Company_ID = CASE WHEN Parent_Company_ID IN('', ' ') THEN NULL ELSE Parent_Company_ID END,
  17516. Ownership_Type = CASE WHEN Ownership_Type IN('', ' ') THEN NULL ELSE Ownership_Type END,
  17517. TimeZone = CASE WHEN TimeZone IN('', ' ') THEN NULL ELSE TimeZone END,
  17518. TaxID = CASE WHEN TaxID IN('', ' ') THEN NULL ELSE TaxID END,
  17519. PaymentTerms = CASE WHEN PaymentTerms IN('', ' ') THEN NULL ELSE PaymentTerms END,
  17520. UserField1 = CASE WHEN UserField1 IN('', ' ') THEN NULL ELSE UserField1 END,
  17521. UserField2 = CASE WHEN UserField2 IN('', ' ') THEN NULL ELSE UserField2 END,
  17522. UserField3 = CASE WHEN UserField3 IN('', ' ') THEN NULL ELSE UserField3 END,
  17523. UserField4 = CASE WHEN UserField4 IN('', ' ') THEN NULL ELSE UserField4 END,
  17524. UserField5 = CASE WHEN UserField5 IN('', ' ') THEN NULL ELSE UserField5 END,
  17525. UserField6 = CASE WHEN UserField6 IN('', ' ') THEN NULL ELSE UserField6 END,
  17526. UserField7 = CASE WHEN UserField7 IN('', ' ') THEN NULL ELSE UserField7 END,
  17527. UserField8 = CASE WHEN UserField8 IN('', ' ') THEN NULL ELSE UserField8 END,
  17528. UserField9 = CASE WHEN UserField9 IN('', ' ') THEN NULL ELSE UserField9 END,
  17529. UserField10 = CASE WHEN UserField10 IN('', ' ') THEN NULL ELSE UserField10 END,
  17530. Tax_Code_ID = CASE WHEN Tax_Code_ID IN('', ' ') THEN NULL ELSE Tax_Code_ID END
  17531.  
  17532. UPDATE stag
  17533. SET stag.Company_Name = '[No Name]'
  17534. FROM #Import_Staging stag
  17535. WHERE stag.Company_Name IS NULL
  17536.  
  17537. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  17538. BEGIN
  17539. SELECT @Legacy_Flag = 1
  17540. EXEC usp_Import_Match_Legacy @TableName, 'Company'
  17541. EXEC usp_Import_Match_Legacy @TableName, 'Site'
  17542. END
  17543.  
  17544. -- If adding a site, inherit company_id from existing company
  17545. UPDATE tmp
  17546. SET tmp.Company_ID = comp.Company_ID
  17547. FROM #Import_Staging tmp
  17548. CROSS APPLY(SELECT TOP 1 * FROM Company comp WHERE comp.Company_Name = tmp.Company_Name) comp
  17549. WHERE tmp.Company_ID IS NULL
  17550. AND @Legacy_Flag = 0
  17551.  
  17552. -- Clean up number of employees field by stripping commas
  17553. UPDATE #Import_Staging
  17554. SET Nbr_Employees = REPLACE(Nbr_Employees, ',', '')
  17555.  
  17556. -- Set Annual_Revenue to 0.00 if NULL
  17557. UPDATE #Import_Staging
  17558. SET Annual_Revenue = '0.00'
  17559. WHERE Annual_Revenue IS NULL
  17560.  
  17561. -- Company_RecID - (for companies which already exist)
  17562. UPDATE stag
  17563. SET stag.Company_RecID = comp.Company_RecID
  17564. FROM #Import_Staging stag
  17565. INNER JOIN @Company comp
  17566. ON comp.Company_Name = stag.Company_Name
  17567. AND comp.Company_ID = stag.Company_ID
  17568. WHERE @Legacy_Flag = 0
  17569.  
  17570. -- Site_Company_Address_RecID
  17571. UPDATE stag
  17572. SET stag.Site_Company_Address_RecID = ca.Company_Address_RecID
  17573. FROM #Import_Staging stag
  17574. INNER JOIN dbo.Company_Address ca
  17575. ON ca.[Description] = stag.Site_Name
  17576. AND stag.Company_RecID = ca.Company_RecID
  17577. WHERE @Legacy_Flag = 0
  17578.  
  17579. -- Company_Type_RecID
  17580. UPDATE stag
  17581. SET stag.Company_Type_RecID = ct.Company_Type_RecID
  17582. FROM #Import_Staging stag
  17583. INNER JOIN dbo.Company_Type ct
  17584. ON ct.[Description] = stag.Company_Type
  17585.  
  17586. -- If company type not specified, grab default if exists
  17587. UPDATE stag
  17588. SET stag.Company_Type_RecID = ct.Company_Type_RecID
  17589. FROM #Import_Staging stag
  17590. INNER JOIN dbo.Company_Type ct
  17591. ON ct.Default_Flag = 1
  17592. AND stag.Company_Type IS NULL
  17593.  
  17594. -- Tax_Code_RecID
  17595. UPDATE tmp
  17596. SET tmp.Tax_Code_RecID = tc.Tax_Code_RecID
  17597. FROM #Import_Staging tmp
  17598. INNER JOIN dbo.Tax_Code tc
  17599. ON tc.Tax_Code_ID = tmp.Tax_Code_ID
  17600. WHERE GETDATE() BETWEEN Date_Effective AND ISNULL(Date_Cancel, '1/1/2900')
  17601.  
  17602. -- Company_Status_RecID
  17603. UPDATE stag
  17604. SET stag.Company_Status_RecID = cst.Company_Status_RecID
  17605. FROM #Import_Staging stag
  17606. INNER JOIN dbo.Company_Status cst
  17607. ON cst.[Description] = stag.Company_Status
  17608.  
  17609. -- Get default company status if not specified
  17610. UPDATE stag
  17611. SET stag.Company_Status_RecID = cst.Company_Status_RecID
  17612. FROM #Import_Staging stag
  17613. INNER JOIN dbo.Company_Status cst
  17614. ON cst.Inactive_Flag = 0
  17615. AND cst.Default_Flag =1
  17616. AND stag.Company_Status IS NULL
  17617.  
  17618. -- Market_RecID
  17619. UPDATE stag
  17620. SET stag.Market_RecID = mk.Market_RecID
  17621. FROM #Import_Staging stag
  17622. INNER JOIN dbo.Market mk
  17623. ON mk.[Description] = stag.Company_Market
  17624.  
  17625. -- WF_Track_Header_RecID
  17626. UPDATE stag
  17627. SET stag.WF_Track_Header_RecID = wf.WF_Track_Header_RecID
  17628. FROM #Import_Staging stag
  17629. INNER JOIN dbo.WF_Track_Header wf
  17630. ON wf.[Description] = stag.Track
  17631.  
  17632. -- Territory_Owner_Level_RecID
  17633. UPDATE stag
  17634. SET stag.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
  17635. FROM #Import_Staging stag
  17636. INNER JOIN dbo.Owner_Level ol
  17637. ON ol.[Description] = stag.Territory
  17638. AND (ol.Sales_Territory_Flag = 1 OR ol.Location_Flag = 1)
  17639.  
  17640. -- Owner_Level_RecID (if null, default to top location)
  17641. UPDATE stag
  17642. SET stag.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
  17643. FROM #Import_Staging stag
  17644. CROSS APPLY(SELECT TOP 1 * FROM dbo.Owner_Level ol WHERE ol.Location_Flag = 1 ORDER BY Owner_Level_ID ASC) ol
  17645. WHERE stag.Territory IS NULL
  17646.  
  17647. -- If territory not found on name, match on manager member_id
  17648. UPDATE tmp
  17649. SET tmp.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
  17650. FROM #Import_Staging tmp
  17651. INNER JOIN dbo.Owner_Level ol
  17652. ON ol.Member_ID = tmp.Territory
  17653. AND ol.Sales_Territory_Flag = 1
  17654. WHERE tmp.Territory_Owner_Level_RecID IS NULL
  17655. AND tmp.Territory IS NOT NULL
  17656. AND ol.Member_ID <> ''
  17657.  
  17658. -- Group_Type_RecID
  17659. UPDATE stag
  17660. SET stag.Group_Type_RecID = gt.Group_Type_RecID
  17661. FROM #Import_Staging stag
  17662. INNER JOIN dbo.Group_Type gt
  17663. ON gt.Company_Group_Name = stag.[Group]
  17664. AND gt.Company_Flag = 1
  17665.  
  17666. -- Get State_ID
  17667. UPDATE stag
  17668. SET stag.State_ID = st.State_ID
  17669. FROM #Import_Staging stag
  17670. INNER JOIN dbo.States st
  17671. ON st.[Description] = stag.State_Comp
  17672. OR st.[State_ID] = stag.State_Comp
  17673.  
  17674. -- Comp_Country_RecID
  17675. UPDATE stag
  17676. SET stag.Comp_Country_RecID = co.Country_RecID
  17677. FROM #Import_Staging stag
  17678. INNER JOIN dbo.Country co
  17679. ON co.Country = stag.Country_Comp
  17680.  
  17681. -- Ownership_Type_RecID
  17682. UPDATE stag
  17683. SET stag.Ownership_Type_RecID = ot.Ownership_Type_RecID
  17684. FROM #Import_Staging stag
  17685. INNER JOIN dbo.Ownership_Type ot
  17686. ON ot.[Description] = stag.Ownership_Type
  17687.  
  17688. -- Time_Zone_RecID
  17689. UPDATE stag
  17690. SET stag.Time_Zone_RecID = tz.Time_Zone_RecID
  17691. FROM #Import_Staging stag
  17692. INNER JOIN dbo.Time_Zone tz
  17693. ON tz.Time_Zone_Name = stag.TimeZone
  17694. --OR tz.Hours_Offset = stag.TimeZone
  17695.  
  17696. -- Note_Type_RecID
  17697. UPDATE stag
  17698. SET stag.Note_Type_RecID = nt.Note_Type_RecID
  17699. FROM #Import_Staging stag
  17700. INNER JOIN dbo.Note_Type nt ON nt.Default_Flag = 1
  17701.  
  17702. -- Billing_Terms_RecID
  17703. UPDATE stag
  17704. SET stag.Billing_Terms_RecID = ISNULL(bt.Billing_Terms_RecID, def.Billing_Terms_RecID)
  17705. FROM #Import_Staging stag
  17706. INNER JOIN dbo.Billing_Terms bt
  17707. ON bt.[Description] = stag.PaymentTerms
  17708. CROSS APPLY(SELECT TOP 1 * FROM dbo.Billing_Terms def WHERE def.Default_Flag = 1) def
  17709.  
  17710. -- Billing_Delivery_RecID
  17711. UPDATE stag
  17712. SET stag.Billing_Delivery_RecID = def.Billing_Delivery_RecID
  17713. FROM #Import_Staging stag
  17714. CROSS APPLY(SELECT TOP 1 * FROM dbo.Billing_Delivery def WHERE def.Default_Flag =1) def
  17715.  
  17716. -- Evaluate MarkAsLead and set accordingly
  17717. UPDATE stag
  17718. SET stag.MarkAsLead =
  17719. CASE
  17720. WHEN stag.MarkAsLead IN('Y', '1', 'Yes', 'T', 'True') THEN '1'
  17721. WHEN stag.MarkAsLead IN('N', '0', 'No', 'F', 'False') THEN '0'
  17722. WHEN stag.MarkAsLead IS NULL THEN '0'
  17723. END
  17724. FROM #Import_Staging stag
  17725.  
  17726. -- Owner_ID
  17727. UPDATE stag
  17728. SET stag.Owner_ID = (SELECT TOP 1 Owner_ID FROM dbo.[Owner] ORDER BY Owner_ID ASC)
  17729. FROM #Import_Staging stag
  17730.  
  17731. ---- Determine phone/fax numbers that need cleanup (pre-processing step to save on resource intensive string cleanup operation)
  17732. --UPDATE #Import_Staging
  17733. --SET PhoneCleanupReq = 1
  17734. --WHERE PATINDEX('%[^0-9()-+ ]%', PhoneNbr_Comp) > 0
  17735.  
  17736. --UPDATE #Import_Staging
  17737. --SET FaxCleanupReq = 1
  17738. --WHERE PATINDEX('%[^0-9()-+ ]%', PhoneNbr_Fax) > 0
  17739.  
  17740. ---- Cleanup phone numbers that have non-numeric characters
  17741. --;WITH Num1 (n) AS
  17742. -- (SELECT 1 UNION ALL SELECT 1),
  17743. --Num2 (n) AS
  17744. -- (SELECT 1 FROM Num1 AS X, Num1 AS Y),
  17745. --Num3 (n) AS
  17746. -- (SELECT 1 FROM Num2 AS X, Num2 AS Y),
  17747. --Num4 (n) AS
  17748. -- (SELECT 1 FROM Num3 AS X, Num3 AS Y),
  17749. --Nums (n) AS
  17750. -- (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
  17751. --Cleaner AS
  17752. -- (
  17753. -- SELECT PhoneNbr_Comp, (
  17754.  
  17755. -- SELECT CASE WHEN SUBSTRING(PhoneNbr_Comp, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(PhoneNbr_Comp, n, 1) ELSE '' END + ''
  17756. -- FROM Nums
  17757. -- WHERE n <= LEN(PhoneNbr_Comp)
  17758. -- FOR XML PATH('')) AS PhoneNbr_Comp_clean
  17759. -- FROM #Import_Staging
  17760. -- WHERE PhoneCleanupReq = 1
  17761. -- )
  17762.  
  17763. --UPDATE stag
  17764. -- SET PhoneNbr_Comp = REPLACE(cl.PhoneNbr_Comp_clean, '&#x20;', ' ')
  17765. --FROM #Import_Staging stag
  17766. -- INNER JOIN Cleaner cl
  17767. -- ON cl.PhoneNbr_Comp = stag.PhoneNbr_Comp
  17768.  
  17769. ---- Cleanup fax numbers that have non-numeric characters
  17770. --;WITH Num1 (n) AS
  17771. -- (SELECT 1 UNION ALL SELECT 1),
  17772. --Num2 (n) AS
  17773. -- (SELECT 1 FROM Num1 AS X, Num1 AS Y),
  17774. --Num3 (n) AS
  17775. -- (SELECT 1 FROM Num2 AS X, Num2 AS Y),
  17776. --Num4 (n) AS
  17777. -- (SELECT 1 FROM Num3 AS X, Num3 AS Y),
  17778. --Nums (n) AS
  17779. -- (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
  17780. --Cleaner AS
  17781. -- (
  17782. -- SELECT PhoneNbr_Fax, (
  17783.  
  17784. -- SELECT CASE WHEN SUBSTRING(PhoneNbr_Fax, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(PhoneNbr_Fax, n, 1) ELSE '' END + ''
  17785. -- FROM Nums
  17786. -- WHERE n <= LEN(PhoneNbr_Fax)
  17787. -- FOR XML PATH('')) AS PhoneNbr_Fax_clean
  17788. -- FROM #Import_Staging
  17789. -- WHERE FaxCleanupReq = 1
  17790. -- )
  17791.  
  17792. --UPDATE stag
  17793. -- SET PhoneNbr_Fax = REPLACE(cl.PhoneNbr_Fax_clean, '&#x20;', ' ')
  17794. --FROM #Import_Staging stag
  17795. -- INNER JOIN Cleaner cl
  17796. -- ON cl.PhoneNbr_Fax = stag.PhoneNbr_Fax
  17797.  
  17798. -- set billing site to '0' if null
  17799. UPDATE stag
  17800. SET stag.Billing_Site = 0
  17801. FROM #Import_Staging stag
  17802. WHERE stag.Billing_Site IS NULL
  17803.  
  17804. -- Table to Force compilation regardless of structure
  17805. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  17806. DROP TABLE #Force_Compile
  17807.  
  17808. CREATE TABLE #Force_Compile
  17809. (
  17810. Column_Name VARCHAR(20)
  17811. )
  17812.  
  17813. -- If running in 'Force Mode', create necessary references & perform cleanup
  17814. IF @ForceMode = 1
  17815. BEGIN
  17816.  
  17817. -- Truncate website_url to 50 characters
  17818. UPDATE #Import_Staging
  17819. SET Website_URL = LEFT(Website_URL, 50)
  17820. FROM #Import_Staging
  17821.  
  17822. -- Insert states
  17823. -- Pre-2017.1
  17824. IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(OBJECT_ID) = 'States')
  17825. BEGIN
  17826. INSERT INTO dbo.States
  17827. (
  17828. State_ID,
  17829. [Description],
  17830. Last_Update,
  17831. Updated_By
  17832. )
  17833.  
  17834. SELECT DISTINCT
  17835. SUBSTRING(State_Comp, 1, 50),
  17836. SUBSTRING(State_Comp, 1, 50),
  17837. GETDATE(),
  17838. @ImportBatchUser
  17839. FROM #Import_Staging tmp
  17840. WHERE tmp.State_Comp IS NOT NULL
  17841. AND tmp.State_ID IS NULL
  17842. END
  17843.  
  17844. -- Post-2017.1
  17845. IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(OBJECT_ID) = 'States')
  17846. BEGIN
  17847. INSERT INTO dbo.States
  17848. (
  17849. State_ID,
  17850. [Description],
  17851. Last_Update,
  17852. Updated_By,
  17853. Entered_By,
  17854. Date_Entered_UTC
  17855. )
  17856.  
  17857. SELECT DISTINCT
  17858. SUBSTRING(State_Comp, 1, 50),
  17859. SUBSTRING(State_Comp, 1, 50),
  17860. GETDATE(),
  17861. @ImportBatchUser,
  17862. 'zAdmin',
  17863. GETUTCDATE()
  17864. FROM #Import_Staging tmp
  17865. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  17866. WHERE tmp.State_Comp IS NOT NULL
  17867. AND tmp.State_ID IS NULL
  17868. END
  17869.  
  17870. -- Get State_ID for newly inserted records
  17871. UPDATE tmp
  17872. SET tmp.State_ID = st.State_ID
  17873. FROM #Import_Staging tmp
  17874. INNER JOIN dbo.States st
  17875. ON st.[Description] = tmp.State_Comp
  17876. OR st.[State_ID] = tmp.State_Comp
  17877. WHERE st.Updated_By = @ImportBatchUser
  17878.  
  17879. -- Insert countries
  17880. INSERT INTO dbo.Country
  17881. (
  17882. Owner_ID,
  17883. Country,
  17884. City_Caption,
  17885. State_Caption,
  17886. Zip_Caption,
  17887. Updated_By,
  17888. Currency_ID
  17889. )
  17890.  
  17891. SELECT DISTINCT
  17892. 1,
  17893. Country_Comp,
  17894. 'City',
  17895. 'State',
  17896. 'Zip',
  17897. @ImportBatchUser,
  17898. 'USD'
  17899. FROM #Import_Staging tmp
  17900. WHERE tmp.Country_Comp IS NOT NULL
  17901. AND tmp.Comp_Country_RecID IS NULL
  17902.  
  17903. -- Get Country_RecID for newly inserted records
  17904. UPDATE tmp
  17905. SET tmp.Comp_Country_RecID = cn.Country_RecID
  17906. FROM #Import_Staging tmp
  17907. INNER JOIN dbo.Country cn
  17908. ON cn.Country = tmp.Country_Comp
  17909. WHERE cn.Updated_By = @ImportBatchUser
  17910.  
  17911. -- Insert Markets
  17912. INSERT INTO dbo.Market
  17913. (
  17914. Owner_ID,
  17915. [Description],
  17916. Updated_By
  17917. )
  17918. SELECT DISTINCT
  17919. 1,
  17920. Company_Market,
  17921. @ImportBatchUser
  17922. FROM #Import_Staging tmp
  17923. WHERE tmp.Market_RecID IS NULL
  17924. AND tmp.Company_Market IS NOT NULL
  17925.  
  17926. -- Market_RecID
  17927. UPDATE stag
  17928. SET stag.Market_RecID = mk.Market_RecID
  17929. FROM #Import_Staging stag
  17930. INNER JOIN dbo.Market mk
  17931. ON mk.[Description] = stag.Company_Market
  17932. WHERE mk.Updated_By = @ImportBatchUser
  17933. AND stag.Market_RecID IS NULL
  17934. AND stag.Company_Market IS NOT NULL
  17935.  
  17936. -- Insert company types
  17937. INSERT INTO Company_Type
  17938. (
  17939. [Description],
  17940. Company_Type_ID,
  17941. Updated_By
  17942. )
  17943.  
  17944. SELECT DISTINCT
  17945. Company_Type,
  17946. SUBSTRING(Company_Type, 1, 5),
  17947. @ImportBatchUser
  17948. FROM #Import_Staging tmp
  17949. WHERE tmp.Company_Type_RecID IS NULL
  17950.  
  17951. -- Company_Type_RecID
  17952. UPDATE tmp
  17953. SET tmp.Company_Type_RecID = ct.Company_Type_RecID
  17954. FROM #Import_Staging tmp
  17955. INNER JOIN dbo.Company_Type ct
  17956. ON ct.[Description] = tmp.Company_Type
  17957. AND ct.Updated_By = @ImportBatchUser
  17958.  
  17959. -- Insert Payment Terms
  17960. INSERT INTO Billing_terms
  17961. (
  17962. Owner_ID,
  17963. [Description],
  17964. Default_Flag,
  17965. Updated_By,
  17966. --Last_Update,
  17967. Due_Days,
  17968. Terms_Xref
  17969. )
  17970.  
  17971. SELECT DISTINCT
  17972. 1,
  17973. PaymentTerms,
  17974. 0,
  17975. @ImportBatchUser,
  17976. --GETDATE(),
  17977. 0,
  17978. ''
  17979. FROM #Import_Staging tmp
  17980. WHERE tmp.PaymentTerms IS NOT NULL
  17981. AND tmp.Billing_Terms_RecID IS NULL
  17982.  
  17983. -- Billing_Terms_RecID
  17984. UPDATE tmp
  17985. SET tmp.Billing_Terms_RecID = bt.Billing_Terms_RecID
  17986. FROM #Import_Staging tmp
  17987. INNER JOIN dbo.Billing_Terms bt
  17988. ON bt.[Description] = tmp.PaymentTerms
  17989.  
  17990. -- Insert company statuses
  17991. INSERT INTO dbo.Company_Status
  17992. (
  17993. Owner_ID,
  17994. Company_Status_ID,
  17995. [Description],
  17996. Default_Flag,
  17997. Inactive_Flag,
  17998. Last_Update,
  17999. Updated_By,
  18000. Import_Flag,
  18001. Survey_RecID,
  18002. Notify_Flag,
  18003. Notify_Message,
  18004. StandardNote_Flag,
  18005. CustomNote_Flag,
  18006. Cancel_Track_Flag
  18007. )
  18008.  
  18009. SELECT DISTINCT
  18010. 1,
  18011. '',
  18012. tmp.Company_Status,
  18013. 0,
  18014. 0,
  18015. GETDATE(),
  18016. @ImportBatchUser,
  18017. 0,
  18018. 0,
  18019. 0,
  18020. '',
  18021. 0,
  18022. 0,
  18023. 0
  18024. FROM #Import_Staging tmp
  18025. WHERE tmp.Company_Status_RecID IS NULL
  18026. AND tmp.Company_Status IS NOT NULL
  18027.  
  18028. -- Company_Status_RecID
  18029. UPDATE tmp
  18030. SET tmp.Company_Status_RecID = cst.Company_Status_RecID
  18031. FROM #Import_Staging tmp
  18032. INNER JOIN dbo.Company_Status cst
  18033. ON cst.[Description] = tmp.Company_Status
  18034.  
  18035. -- If company id already exists for another company name, place a 'z' at the front (used for CW migration)
  18036. UPDATE tmp
  18037. SET tmp.Company_ID = 'z' + tmp.Company_ID
  18038. FROM #Import_Staging tmp
  18039. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_ID = tmp.Company_ID AND comp.Company_Name <> tmp.Company_Name) comp
  18040.  
  18041. -- Billing site cannot exist for target company
  18042. UPDATE tmp
  18043. SET tmp.[Billing_Site] = 0
  18044. FROM #Import_Staging tmp
  18045. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_RecID = tmp.Company_ReciD AND cad.Default_Bill_Flag = 1)cad
  18046. WHERE tmp.Billing_Site = 1
  18047. AND @Legacy_Flag = 1
  18048.  
  18049.  
  18050. END
  18051.  
  18052. -- Begin Push
  18053. -- Insert to dbo.Lead_Import_Batch to generate new batch
  18054. INSERT INTO Lead_Import_Batch
  18055. (
  18056. [Description]
  18057. )
  18058. SELECT 'Company Batch: ' + CONVERT(NVARCHAR(25), GETDATE())
  18059.  
  18060. -- Set Member_ID for Updated_By and Mass Maintenance import batch ID
  18061. SELECT
  18062. @ImportBatchID = CAST(SCOPE_IDENTITY() AS VARCHAR(9)),
  18063. @ImportBatchUser = 'Import' + CAST(SCOPE_IDENTITY() AS VARCHAR(9))
  18064.  
  18065. -- If matching on Legacy_ID - auto-assign missing Company_IDs and make sure that site records inherit Company_Name and Company_ID from parent
  18066. IF @Legacy_Flag = 1
  18067. BEGIN
  18068.  
  18069. IF OBJECT_ID('tempdb..#Master_Company_Records') IS NOT NULL
  18070. DROP TABLE #Master_Company_Records
  18071.  
  18072. SELECT
  18073. MIN(ExcelRowNumber) AS ExcelRowNumber,
  18074. Legacy_ID
  18075. INTO #Master_Company_Records
  18076. FROM #Import_Staging
  18077. WHERE Company_RecID IS NULL
  18078. GROUP BY Legacy_ID
  18079.  
  18080. -- Determine if each record will constitute a new company
  18081. UPDATE stag
  18082. SET stag.NewCompany = 1
  18083. FROM #Import_Staging stag
  18084. CROSS APPLY(SELECT TOP 1 * FROM #Master_Company_Records mas WHERE mas.ExcelRowNumber = stag.ExcelRowNumber)mas
  18085. WHERE stag.Company_RecID IS NULL
  18086.  
  18087. -- Strip non-alpha from Company_ID where exists
  18088. UPDATE stag
  18089. SET stag.Company_ID = LEFT(ISNULL(ReducedString, NEWID()), 25)
  18090. FROM #Import_Staging stag
  18091. CROSS APPLY dbo.udf_Import_StripNonAlpha(stag.Company_Name, '%[a-zA-Z0-9]%')
  18092. WHERE Company_ID IS NOT NULL
  18093. AND Company_RecID IS NULL
  18094.  
  18095. -- Assign Company_ID for rows where it does not exist
  18096. UPDATE stag
  18097. SET stag.Company_ID = LEFT(ISNULL(ReducedString, NEWID()), 25),
  18098. stag.Auto_Company_ID = 1
  18099. FROM #Import_Staging stag
  18100. CROSS APPLY(SELECT TOP 1 * FROM #Master_Company_Records mas WHERE mas.ExcelRowNumber = stag.ExcelRowNumber)mas
  18101. CROSS APPLY dbo.udf_Import_StripNonAlpha(stag.Company_Name, '%[a-zA-Z0-9]%')
  18102. WHERE Company_ID IS NULL
  18103. AND Company_RecID IS NULL
  18104.  
  18105. -- Strip invalid characters from generated company ID's
  18106. UPDATE stag
  18107. SET stag.Company_ID = REPLACE(REPLACE(REPLACE(REPLACE(Company_ID, ',', ''), '-', ''), '&', ''), '.', '')
  18108. FROM #Import_Staging stag
  18109. WHERE stag.Auto_Company_ID = 1
  18110.  
  18111.  
  18112.  
  18113.  
  18114. -- Handle duplicate company id's which already exist in CW
  18115. UPDATE stag
  18116. SET stag.Company_ID = LEFT(stag.Company_ID, 22) + LEFT(NewID(), 3)
  18117. FROM #Import_Staging stag
  18118. CROSS APPLY(SELECT TOP 1 Company_ID FROM dbo.Company comp WHERE comp.Company_ID = stag.Company_ID)comp
  18119. WHERE stag.Company_ID IS NOT NULL
  18120. AND stag.Company_ID <> ''
  18121. AND stag.Company_RecID IS NULL
  18122. AND stag.NewCompany = 1
  18123.  
  18124. -- Handle duplicate company id's within spreadsheet
  18125. UPDATE stag
  18126. SET stag.Company_ID = LEFT(stag.Company_ID, 20) + LEFT(NewID(), 5)
  18127. FROM #Import_Staging stag
  18128. WHERE EXISTS(SELECT 1 FROM #Import_Staging dup WHERE dup.Company_ID = stag.Company_ID AND dup.ExcelRowNumber <> stag.ExcelRowNumber)
  18129. OR EXISTS(SELECT 1 FROM dbo.Company dup2 WHERE dup2.Company_ID = stag.Company_ID)
  18130.  
  18131. ---- Make sure that child/site records inherit Company_ID and Company_Name from parent
  18132. --UPDATE chld
  18133. -- SET chld.Company_Name = par.Company_Name,
  18134. -- chld.Company_ID = par.Company_ID
  18135. --FROM #Import_Staging chld
  18136. -- CROSS APPLY(SELECT TOP 1 * FROM #Master_Company_Records mas WHERE mas.Legacy_ID = chld.Legacy_ID)mas
  18137. -- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging par WHERE par.ExcelRowNumber = mas.ExcelRowNumber)par
  18138. END
  18139.  
  18140. -- Determine if each record will constitute a new company
  18141. UPDATE stag
  18142. SET stag.NewCompany = 1
  18143. FROM #Import_Staging stag
  18144. WHERE Company_RecID IS NULL
  18145. AND ExcelRowNumber IN(SELECT MIN(ExcelRowNumber) FROM #Import_Staging WHERE Company_RecID IS NULL GROUP BY Company_Name, Company_ID)
  18146. AND @Legacy_Flag = 0
  18147.  
  18148. -- Assign Company_ID for rows where it does not exist
  18149. UPDATE stag
  18150. SET stag.Company_ID = dbo.udf_GetCompanyID(stag.Company_Name),
  18151. stag.Auto_Company_ID = 1
  18152. FROM #Import_Staging stag
  18153. WHERE Company_ID IS NULL
  18154. AND @Legacy_Flag = 0
  18155.  
  18156. -- Strip invalid characters from generated company ID's
  18157. UPDATE stag
  18158. SET stag.Company_ID = REPLACE(REPLACE(REPLACE(REPLACE(Company_ID, ',', ''), '-', ''), '&', ''), '.', '')
  18159. FROM #Import_Staging stag
  18160. WHERE stag.Auto_Company_ID = 1
  18161. AND @Legacy_Flag = 0
  18162.  
  18163. -- If any auto-assigned company_id has a duplicate in staging, append with number to make distinct prior to comparing to final table
  18164. ;WITH dupids AS
  18165. (
  18166. SELECT
  18167. stag.ExcelRowNumber,
  18168. SUBSTRING(stag.Company_ID, 1, 23) + LEFT(NEWID(), 5) AS Reassign
  18169. FROM #Import_Staging stag
  18170. INNER JOIN #Import_Staging dup
  18171. ON stag.ExcelRowNumber <> dup.ExcelRowNumber
  18172. AND stag.Company_ID = dup.Company_ID
  18173. AND stag.Auto_Company_ID = 1
  18174. AND (dup.Auto_Company_ID = 0 OR dup.Company_Name <> stag.Company_Name)
  18175. )
  18176.  
  18177. UPDATE stag
  18178. SET stag.Company_ID = dupids.Reassign
  18179. FROM #Import_Staging stag
  18180. INNER JOIN dupids
  18181. ON dupids.ExcelRowNumber = stag.ExcelRowNumber
  18182. WHERE @Legacy_Flag = 0
  18183.  
  18184. -- Throw error in the event that auto-assigned Company_ID is still not unique from final table
  18185. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging stag INNER JOIN dbo.Company comp on stag.Auto_Company_ID = 1 AND comp.Company_ID = stag.Company_ID)
  18186. BEGIN
  18187. SELECT * FROM #Import_Staging stag INNER JOIN dbo.Company comp on stag.Auto_Company_ID = 1 AND comp.Company_ID = stag.Company_ID
  18188. SELECT @ErrorMsg = 'Conflict encountered while assigning a default Company_ID - Please try again. If this issue persists, please consider assigning the Company_ID in the spreadsheet'
  18189. RAISERROR(@ErrorMsg, 16, 1)
  18190. END
  18191.  
  18192. -- Update Site_Name to 'Main' for new company records
  18193. UPDATE stag
  18194. SET stag.Site_Name = 'Main'
  18195. FROM #Import_Staging stag
  18196. WHERE NewCompany = 1
  18197. AND stag.Site_Name IS NULL
  18198.  
  18199. -- Generate Site_Name for sites being added to new company records
  18200. ;WITH gsn AS
  18201. (
  18202. SELECT
  18203. ExcelRowNumber,
  18204. 'Site ' + CAST(ROW_NUMBER() OVER(PARTITION BY Company_Name, Company_ID ORDER BY ExcelRowNumber) AS VARCHAR(50)) AS Site_Name
  18205. FROM #Import_Staging stag
  18206. WHERE stag.Site_Name IS NULL
  18207. AND stag.Company_RecID IS NULL
  18208. )
  18209.  
  18210. UPDATE stag
  18211. SET stag.Site_Name = gsn.Site_Name
  18212. FROM #Import_Staging stag
  18213. INNER JOIN gsn
  18214. ON gsn.ExcelRowNumber = stag.ExcelRowNumber
  18215. AND stag.Site_Name IS NULL
  18216.  
  18217. -- Update Company_ID for site records to match 'Main' site record
  18218. UPDATE stag
  18219. SET stag.Company_ID = stagmain.Company_ID
  18220. FROM #Import_Staging stag
  18221. INNER JOIN #Import_Staging stagmain
  18222. ON stag.Company_Name = stagmain.Company_Name
  18223. AND stagmain.NewCompany = 1
  18224. AND stag.NewCompany = 0
  18225. AND @Legacy_Flag = 0
  18226. WHERE NOT EXISTS(SELECT 1 FROM #Import_Staging exm WHERE exm.Company_ID = stag.Company_ID AND exm.NewCompany = 1)
  18227.  
  18228. -- Get expected rowcount for dbo.Company insert
  18229. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE NewCompany = 1 AND Exclude = 0
  18230.  
  18231. UPDATE stag
  18232. SET stag.Tax_Code_RecID = tx.Tax_Code_RecID
  18233. FROM #Import_Staging stag
  18234. CROSS APPLY(SELECT TOP 1 * FROM dbo.Tax_Code tx WHERE tx.Default_Flag = 1)tx
  18235. WHERE stag.Tax_Code_RecID IS NULL
  18236.  
  18237. -- Insert new companies to dbo.Company
  18238. -- Repurpose Revenue_Year field to catch excel row number from source table (Update to 0 after insert)
  18239. -- Repurpose Keywords column to catch Legacy_ID
  18240. -- Perform conditional insert based on structure of dbo.Company
  18241. IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Options_Updated_By' AND OBJECT_NAME(Object_ID) = 'Company')
  18242. BEGIN
  18243. INSERT INTO dbo.Company WITH(TABLOCK)
  18244. (
  18245. Company_ID,
  18246. Company_Name,
  18247. PhoneNbr,
  18248. PhoneNbr_Fax,
  18249. Website_URL,
  18250. Account_Nbr,
  18251. Time_Zone_RecID,
  18252. SIC_Code_ID,
  18253. Tax_ID,
  18254. Updated_By,
  18255. Company_Type_RecID,
  18256. Company_Status_RecID,
  18257. Owner_Level_RecID,
  18258. Userfield_1,
  18259. Userfield_2,
  18260. Userfield_3,
  18261. Userfield_4,
  18262. Userfield_5,
  18263. Userfield_6,
  18264. Userfield_7,
  18265. Userfield_8,
  18266. Userfield_9,
  18267. Userfield_10,
  18268. Market_RecID,
  18269. Lead_Flag,
  18270. Lead_Source,
  18271. Annual_Revenue,
  18272. Nbr_Employees,
  18273. Date_Entered_UTC,
  18274. Ownership_Type_RecID,
  18275. Billing_Terms_RecID,
  18276. Date_Acquired_UTC,
  18277. Revenue_Year, -- Holds identity of staging table row to join back and capture Company_RecID
  18278. Tax_Code_RecID,
  18279. Billing_Delivery_RecID,
  18280. Entered_By,
  18281. Keywords,
  18282. Options_Last_Update_UTC,
  18283. Options_Updated_By
  18284.  
  18285. )
  18286. OUTPUT INSERTED.Keywords, INSERTED.Company_RecID, 'Company' INTO Import_Legacy_ID_Custom
  18287. SELECT
  18288. LEFT(Company_ID, 50),
  18289. LEFT(Company_Name, 50),
  18290. SUBSTRING(PhoneNbr_Comp, 1, 30),
  18291. SUBSTRING(PhoneNbr_Fax, 1, 30),
  18292. LEFT(Website_URL, 50),
  18293. Account_Nbr,
  18294. Time_Zone_RecID,
  18295. LEFT(SIC_Code_ID, 10),
  18296. LEFT(TaxID, 50),
  18297. @ImportBatchUser,
  18298. Company_Type_RecID,
  18299. Company_Status_RecID,
  18300. Territory_Owner_Level_RecID,
  18301. UserField1,
  18302. UserField2,
  18303. UserField3,
  18304. UserField4,
  18305. UserField5,
  18306. UserField6,
  18307. UserField7,
  18308. UserField8,
  18309. UserField9,
  18310. UserField10,
  18311. Market_RecID,
  18312. MarkAsLead,
  18313. SourceList,
  18314. Annual_Revenue,
  18315. Nbr_Employees,
  18316. GETUTCDATE(),
  18317. Ownership_Type_RecID,
  18318. Billing_Terms_RecID,
  18319. GETUTCDATE(),
  18320. ExcelRowNumber,
  18321. ISNULL(stag.Tax_Code_RecID, tx.Tax_Code_RecID),
  18322. Billing_Delivery_RecID,
  18323. @ImportBatchUser,
  18324. Legacy_ID,
  18325. GETUTCDATE(),
  18326. 'zAdmin'
  18327. FROM #Import_Staging stag
  18328. OUTER APPLY(SELECT TOP 1 Tax_Code_RecID FROM Tax_Code tc ORDER BY Default_Flag DESC)tx
  18329. WHERE stag.NewCompany = 1
  18330. ORDER BY stag.ExcelRowNumber ASC
  18331.  
  18332.  
  18333. END
  18334.  
  18335. IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Date_Acquired' AND OBJECT_NAME(Object_ID) = 'Company')
  18336. AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Options_Updated_By' AND OBJECT_NAME(OBJECT_ID) = 'Company')
  18337. BEGIN
  18338. INSERT INTO dbo.Company WITH(TABLOCK)
  18339. (
  18340. Company_ID,
  18341. Company_Name,
  18342. PhoneNbr,
  18343. PhoneNbr_Fax,
  18344. Website_URL,
  18345. Account_Nbr,
  18346. Time_Zone_RecID,
  18347. SIC_Code_ID,
  18348. Tax_ID,
  18349. Updated_By,
  18350. Company_Type_RecID,
  18351. Company_Status_RecID,
  18352. Owner_Level_RecID,
  18353. Userfield_1,
  18354. Userfield_2,
  18355. Userfield_3,
  18356. Userfield_4,
  18357. Userfield_5,
  18358. Userfield_6,
  18359. Userfield_7,
  18360. Userfield_8,
  18361. Userfield_9,
  18362. Userfield_10,
  18363. Market_RecID,
  18364. Lead_Flag,
  18365. Lead_Source,
  18366. Annual_Revenue,
  18367. Nbr_Employees,
  18368. Date_Entered,
  18369. Ownership_Type_RecID,
  18370. Billing_Terms_RecID,
  18371. Date_Acquired,
  18372. Revenue_Year, -- Holds identity of staging table row to join back and capture Company_RecID
  18373. Tax_Code_RecID,
  18374. Billing_Delivery_RecID,
  18375. Keywords
  18376. )
  18377. OUTPUT INSERTED.Keywords, INSERTED.Company_RecID, 'Company' INTO Import_Legacy_ID_Custom
  18378. SELECT
  18379. LEFT(Company_ID, 50),
  18380. LEFT(Company_Name, 50),
  18381. SUBSTRING(PhoneNbr_Comp, 1, 30),
  18382. SUBSTRING(PhoneNbr_Fax, 1, 30),
  18383. LEFT(Website_URL, 50),
  18384. Account_Nbr,
  18385. Time_Zone_RecID,
  18386. LEFT(SIC_Code_ID, 10),
  18387. LEFT(TaxID, 50),
  18388. @ImportBatchUser,
  18389. Company_Type_RecID,
  18390. Company_Status_RecID,
  18391. Territory_Owner_Level_RecID,
  18392. UserField1,
  18393. UserField2,
  18394. UserField3,
  18395. UserField4,
  18396. UserField5,
  18397. UserField6,
  18398. UserField7,
  18399. UserField8,
  18400. UserField9,
  18401. UserField10,
  18402. Market_RecID,
  18403. MarkAsLead,
  18404. SourceList,
  18405. Annual_Revenue,
  18406. Nbr_Employees,
  18407. GETDATE(),
  18408. Ownership_Type_RecID,
  18409. Billing_Terms_RecID,
  18410. GETDATE(),
  18411. ExcelRowNumber,
  18412. ISNULL(stag.Tax_Code_RecID, tx.Tax_Code_RecID),
  18413. Billing_Delivery_RecID,
  18414. Legacy_ID
  18415. FROM #Import_Staging stag
  18416. OUTER APPLY(SELECT TOP 1 Tax_Code_RecID FROM Tax_Code tc ORDER BY Default_Flag DESC)tx
  18417. WHERE stag.NewCompany = 1
  18418. ORDER BY stag.ExcelRowNumber ASC
  18419.  
  18420.  
  18421. END
  18422.  
  18423. IF NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Date_Acquired' AND OBJECT_NAME(Object_ID) = 'Company')
  18424. AND EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Date_Acquired_UTC' AND OBJECT_NAME(Object_ID) = 'Company')
  18425. AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Options_Updated_By' AND OBJECT_NAME(OBJECT_ID) = 'Company')
  18426. BEGIN
  18427. INSERT INTO dbo.Company WITH(TABLOCK)
  18428. (
  18429. Company_ID,
  18430. Company_Name,
  18431. PhoneNbr,
  18432. PhoneNbr_Fax,
  18433. Website_URL,
  18434. Account_Nbr,
  18435. Time_Zone_RecID,
  18436. SIC_Code_ID,
  18437. Tax_ID,
  18438. Updated_By,
  18439. Company_Type_RecID,
  18440. Company_Status_RecID,
  18441. Owner_Level_RecID,
  18442. Userfield_1,
  18443. Userfield_2,
  18444. Userfield_3,
  18445. Userfield_4,
  18446. Userfield_5,
  18447. Userfield_6,
  18448. Userfield_7,
  18449. Userfield_8,
  18450. Userfield_9,
  18451. Userfield_10,
  18452. Market_RecID,
  18453. Lead_Flag,
  18454. Lead_Source,
  18455. Annual_Revenue,
  18456. Nbr_Employees,
  18457. Date_Entered_UTC,
  18458. Ownership_Type_RecID,
  18459. Billing_Terms_RecID,
  18460. Date_Acquired_UTC,
  18461. Revenue_Year, -- Holds identity of staging table row to join back and capture Company_RecID
  18462. Tax_Code_RecID,
  18463. Billing_Delivery_RecID,
  18464. Entered_By,
  18465. Keywords
  18466. )
  18467. OUTPUT INSERTED.Keywords, INSERTED.Company_RecID, 'Company' INTO Import_Legacy_ID_Custom
  18468. SELECT
  18469. LEFT(Company_ID, 50),
  18470. LEFT(Company_Name, 50),
  18471. SUBSTRING(PhoneNbr_Comp, 1, 30),
  18472. SUBSTRING(PhoneNbr_Fax, 1, 30),
  18473. LEFT(Website_URL, 50),
  18474. Account_Nbr,
  18475. Time_Zone_RecID,
  18476. LEFT(SIC_Code_ID, 10),
  18477. LEFT(TaxID, 50),
  18478. @ImportBatchUser,
  18479. Company_Type_RecID,
  18480. Company_Status_RecID,
  18481. Territory_Owner_Level_RecID,
  18482. UserField1,
  18483. UserField2,
  18484. UserField3,
  18485. UserField4,
  18486. UserField5,
  18487. UserField6,
  18488. UserField7,
  18489. UserField8,
  18490. UserField9,
  18491. UserField10,
  18492. Market_RecID,
  18493. MarkAsLead,
  18494. SourceList,
  18495. Annual_Revenue,
  18496. Nbr_Employees,
  18497. GETUTCDATE(),
  18498. Ownership_Type_RecID,
  18499. Billing_Terms_RecID,
  18500. GETUTCDATE(),
  18501. ExcelRowNumber,
  18502. ISNULL(stag.Tax_Code_RecID, tx.Tax_Code_RecID),
  18503. Billing_Delivery_RecID,
  18504. @ImportBatchUser,
  18505. Legacy_ID
  18506. FROM #Import_Staging stag
  18507. OUTER APPLY(SELECT TOP 1 Tax_Code_RecID FROM Tax_Code tc ORDER BY Default_Flag DESC)tx
  18508. WHERE stag.NewCompany = 1
  18509. ORDER BY stag.ExcelRowNumber ASC
  18510. END
  18511.  
  18512. -- Get new identities from legacy_Id table
  18513. IF @Legacy_Flag = 1
  18514. BEGIN
  18515. UPDATE stag
  18516. SET stag.New_Identity = leg.CW_RecID
  18517. FROM #Import_Staging stag
  18518. CROSS APPLY(SELECT TOP 1 * FROM Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_ID AND leg.Record_Type = 'Company')leg
  18519. END
  18520.  
  18521. -- Join dbo.Company back to staging table to get new identities
  18522. IF @Legacy_Flag = 0
  18523. BEGIN
  18524. UPDATE stag
  18525. SET stag.New_Identity = comp.Company_RecID
  18526. FROM #Import_Staging stag
  18527. INNER JOIN dbo.Company comp
  18528. ON comp.Revenue_Year = stag.ExcelRowNumber
  18529. AND comp.Updated_By = @ImportBatchUser
  18530. END
  18531.  
  18532. -- Set Revenue_Year, Keywords to NULL for inserted rows
  18533. IF @Legacy_Flag = 0
  18534. BEGIN
  18535. UPDATE dbo.Company
  18536. SET Revenue_Year = NULL,
  18537. Keywords = NULL,
  18538. Remit_To_RecID = Company_RecID
  18539. WHERE Updated_By = @ImportBatchUser
  18540.  
  18541. -- For all records whose dbo.Company record was just inserted, populate the Company_RecID
  18542. UPDATE stag
  18543. SET stag.Company_RecID = stagpop.New_Identity
  18544. FROM #Import_Staging stag
  18545. INNER JOIN #Import_Staging stagpop
  18546. ON stag.Company_Name = stagpop.Company_Name
  18547. AND ISNULL(stag.Company_ID, 'zxCompany_ID') = ISNULL(stagpop.Company_ID, 'zxCompany_ID')
  18548. AND stagpop.New_Identity IS NOT NULL
  18549. AND @Legacy_Flag = 0
  18550.  
  18551. -- Update dbo.Company with appropriate Parent_Company_RecID from staging table
  18552. UPDATE comp
  18553. SET comp.Parent_Company_RecID = par.Company_RecID
  18554. FROM dbo.Company comp
  18555. INNER JOIN #Import_Staging chi
  18556. ON chi.Company_ID = comp.Company_ID
  18557. AND chi.Parent_Company_ID IS NOT NULL
  18558. INNER JOIN dbo.Company par
  18559. ON par.Company_ID = chi.Parent_Company_ID
  18560.  
  18561. END
  18562.  
  18563. IF @Legacy_Flag = 1
  18564. BEGIN
  18565. UPDATE comp
  18566. SET comp.Revenue_Year = NULL,
  18567. comp.Keywords = NULL,
  18568. comp.Remit_To_RecID = comp.Company_RecID
  18569. FROM dbo.Company comp
  18570. WHERE EXISTS(SELECT 1 FROM #Import_Staging stag WHERE stag.New_Identity = comp.Company_RecID)
  18571.  
  18572. UPDATE stag
  18573. SET stag.Company_RecID = stagpop.New_Identity
  18574. FROM #Import_Staging stag
  18575. CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging stagpop WHERE stagpop.Legacy_ID = stag.Legacy_ID AND stagpop.New_Identity IS NOT NULL AND stag.Company_RecID IS NULL)stagpop
  18576. WHERE @Legacy_Flag = 1
  18577. AND stag.Company_RecID IS NULL
  18578.  
  18579. END
  18580.  
  18581. -- All records should have a Company_RecID now - error/rollback if not
  18582. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Company_RecID IS NULL)
  18583. BEGIN
  18584. RAISERROR('NULL Company_RecID after insert to dbo.Company', 16, 1)
  18585. END
  18586.  
  18587. -- Update expected rowcount for 'Main' site insert to dbo.Company_Address
  18588. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE NewCompany = 1 AND Exclude = 0
  18589.  
  18590. -- Insert to dbo.Company_Address for new companies - 'Main' site
  18591. -- Repurpose Owner_ID field to catch excel row from source table (Update Owner_ID to proper value after insert)
  18592. -- Repurpose Company_Name field to catch Legacy_Site_ID
  18593. IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
  18594. BEGIN
  18595. INSERT INTO dbo.Company_Address WITH(TABLOCK)
  18596. (
  18597. Owner_ID,
  18598. Company_RecID,
  18599. Address_Line1,
  18600. Address_Line2,
  18601. City,
  18602. State_ID,
  18603. Zip,
  18604. PhoneNbr,
  18605. PhoneNbr_Fax,
  18606. Default_Flag,
  18607. Updated_By,
  18608. [Description],
  18609. Country_RecID,
  18610. tax_code_recid,
  18611. Default_Bill_Flag,
  18612. Entered_By,
  18613. Company_Name
  18614. )
  18615. OUTPUT INSERTED.Company_Name, INSERTED.Company_Address_RecID, 'Site' INTO Import_Legacy_ID_Custom
  18616. SELECT
  18617. ExcelRowNumber, -- Use row number from staging table to join back to source
  18618. New_Identity,
  18619. SUBSTRING(Address_Line1_Comp, 1, 50),
  18620. SUBSTRING(Address_Line2_Comp, 1, 50),
  18621. SUBSTRING(City_Comp, 1, 50),
  18622. SUBSTRING(State_ID, 1, 50),
  18623. SUBSTRING(Zip_Comp, 1, 12),
  18624. SUBSTRING(PhoneNbr_Comp, 1, 30),
  18625. SUBSTRING(PhoneNbr_Fax, 1, 30),
  18626. 1,
  18627. @ImportBatchUser,
  18628. ISNULL(SUBSTRING(Site_Name, 1, 50), 'Main'),
  18629. Comp_Country_RecID,
  18630. tax_code_recid,
  18631. Billing_Site,
  18632. @ImportBatchUser,
  18633. Legacy_Site_ID
  18634. FROM #Import_Staging stag
  18635. WHERE stag.New_Identity IS NOT NULL
  18636. AND stag.NewCompany = 1
  18637. ORDER BY stag.ExcelRowNumber ASC
  18638. END
  18639.  
  18640. IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
  18641. BEGIN
  18642. INSERT INTO dbo.Company_Address WITH(TABLOCK)
  18643. (
  18644. Owner_ID,
  18645. Company_RecID,
  18646. Address_Line1,
  18647. Address_Line2,
  18648. City,
  18649. State_ID,
  18650. Zip,
  18651. PhoneNbr,
  18652. PhoneNbr_Fax,
  18653. Default_Flag,
  18654. Updated_By,
  18655. [Description],
  18656. Country_RecID,
  18657. tax_code_recid,
  18658. Default_Bill_Flag,
  18659. Company_Name
  18660. )
  18661. OUTPUT INSERTED.Company_Name, INSERTED.Company_Address_RecID, 'Site' INTO Import_Legacy_ID_Custom
  18662. SELECT
  18663. ExcelRowNumber, -- Use row number from staging table to join back to source
  18664. New_Identity,
  18665. SUBSTRING(Address_Line1_Comp, 1, 50),
  18666. SUBSTRING(Address_Line2_Comp, 1, 50),
  18667. SUBSTRING(City_Comp, 1, 50),
  18668. SUBSTRING(State_ID, 1, 50),
  18669. SUBSTRING(Zip_Comp, 1, 12),
  18670. SUBSTRING(PhoneNbr_Comp, 1, 30),
  18671. SUBSTRING(PhoneNbr_Fax, 1, 30),
  18672. 1,
  18673. @ImportBatchUser,
  18674. ISNULL(SUBSTRING(Site_Name, 1, 50), 'Main'),
  18675. Comp_Country_RecID,
  18676. tax_code_recid,
  18677. Billing_Site,
  18678. Legacy_Site_ID
  18679. FROM #Import_Staging stag
  18680. WHERE stag.New_Identity IS NOT NULL
  18681. AND stag.NewCompany = 1
  18682. ORDER BY stag.ExcelRowNumber ASC
  18683. END
  18684.  
  18685. ---- Compare expected rowcount to actual - error on mistmatch to force rollback
  18686. --IF @@ROWCOUNT <> @ExpRowCount
  18687. --BEGIN
  18688. -- SELECT @ErrorMsg = 'dbo.Company_Address insert fails for "Main" sites - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
  18689. -- RAISERROR(@ErrorMsg, 16, 1)
  18690. --END
  18691.  
  18692. -- Join dbo.Company_Address back to staging table to get new identities
  18693. UPDATE stag
  18694. SET stag.Company_Address_RecID_New = cad.Company_Address_RecID
  18695. FROM #Import_Staging stag
  18696. INNER JOIN dbo.Company_Address cad
  18697. ON cad.Owner_ID = stag.ExcelRowNumber
  18698. AND cad.Updated_By = @ImportBatchUser
  18699.  
  18700. -- Update Owner_ID, Company_Name to appropriate value for inserted records
  18701. UPDATE cad
  18702. SET cad.Owner_ID = stag.Owner_ID,
  18703. cad.Company_Name = NULL
  18704. FROM dbo.Company_Address cad
  18705. INNER JOIN #Import_Staging stag
  18706. ON stag.Company_Address_RecID_New = cad.Company_Address_RecID
  18707. WHERE cad.Updated_By = @ImportBatchUser
  18708.  
  18709. -- Get expected Rowcount for 'site' record insert
  18710. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Company_Address_RecID_New IS NULL AND Exclude = 0
  18711.  
  18712. -- Insert to dbo.Company_Address for 'site' records
  18713. -- Repurpose Owner_ID field to catch identity from source table (Update Owner_ID to proper value after insert)
  18714. IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
  18715. BEGIN
  18716. INSERT INTO dbo.Company_Address
  18717. (
  18718. Owner_ID, -- Use identity from staging table to join back to source
  18719. Company_RecID,
  18720. Address_Line1,
  18721. Address_Line2,
  18722. City,
  18723. State_ID,
  18724. Zip,
  18725. PhoneNbr,
  18726. PhoneNbr_Fax,
  18727. Default_Flag,
  18728. Updated_By,
  18729. [Description],
  18730. Country_RecID,
  18731. tax_code_recid,
  18732. Default_Bill_Flag,
  18733. Company_Name
  18734. )
  18735. OUTPUT INSERTED.Company_Name, INSERTED.Company_Address_RecID, 'Site' INTO Import_Legacy_ID_Custom
  18736. SELECT
  18737. ExcelRowNumber,
  18738. Company_RecID,
  18739. Address_Line1_Comp,
  18740. Address_Line2_Comp,
  18741. City_Comp,
  18742. State_ID,
  18743. Zip_Comp,
  18744. SUBSTRING(PhoneNbr_Comp, 1, 30),
  18745. SUBSTRING(PhoneNbr_Fax, 1, 30),
  18746. 0,
  18747. @ImportBatchUser,
  18748. Site_Name,
  18749. Comp_Country_RecID,
  18750. Tax_Code_RecID,
  18751. Billing_Site,
  18752. Legacy_Site_ID
  18753. FROM #Import_Staging stag
  18754. WHERE Company_Address_RecID_New IS NULL
  18755. ORDER BY stag.ExcelRowNumber ASC
  18756. END
  18757.  
  18758. IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
  18759. BEGIN
  18760. INSERT INTO dbo.Company_Address
  18761. (
  18762. Owner_ID, -- Use identity from staging table to join back to source
  18763. Company_RecID,
  18764. Address_Line1,
  18765. Address_Line2,
  18766. City,
  18767. State_ID,
  18768. Zip,
  18769. PhoneNbr,
  18770. PhoneNbr_Fax,
  18771. Default_Flag,
  18772. Updated_By,
  18773. [Description],
  18774. Country_RecID,
  18775. tax_code_recid,
  18776. Default_Bill_Flag,
  18777. Entered_By,
  18778. Company_Name
  18779. )
  18780. OUTPUT INSERTED.Company_Name, INSERTED.Company_Address_RecID, 'Site' INTO Import_Legacy_ID_Custom
  18781. SELECT
  18782. ExcelRowNumber,
  18783. Company_RecID,
  18784. Address_Line1_Comp,
  18785. Address_Line2_Comp,
  18786. City_Comp,
  18787. State_ID,
  18788. Zip_Comp,
  18789. SUBSTRING(PhoneNbr_Comp, 1, 30),
  18790. SUBSTRING(PhoneNbr_Fax, 1, 30),
  18791. 0,
  18792. @ImportBatchUser,
  18793. Site_Name,
  18794. Comp_Country_RecID,
  18795. Tax_Code_RecID,
  18796. Billing_Site,
  18797. @ImportBatchUser,
  18798. Legacy_Site_ID
  18799. FROM #Import_Staging stag
  18800. WHERE Company_Address_RecID_New IS NULL
  18801. ORDER BY stag.ExcelRowNumber ASC
  18802. END
  18803.  
  18804.  
  18805. -- Join dbo.Company_Address back to staging table to get new identities
  18806. UPDATE stag
  18807. SET stag.Company_Address_RecID_New = cad.Company_Address_RecID
  18808. FROM #Import_Staging stag
  18809. INNER JOIN dbo.Company_Address cad
  18810. ON stag.ExcelRowNumber = cad.Owner_ID
  18811. AND cad.Updated_By = @ImportBatchUser
  18812. AND stag.Exclude = 0
  18813.  
  18814. -- Update Owner_ID, Company_Name to appropriate value for inserted records
  18815. UPDATE cad
  18816. SET cad.Owner_ID = stag.Owner_ID,
  18817. cad.Company_Name = NULL
  18818. FROM dbo.Company_Address cad
  18819. INNER JOIN #Import_Staging stag
  18820. ON stag.Company_Address_RecID_New = cad.Company_Address_RecID
  18821. WHERE cad.Updated_By = @ImportBatchUser
  18822. AND stag.Exclude = 0
  18823.  
  18824. -- Perform insert to dbo.Company_Note
  18825. -- Only bring over distinct notes
  18826. INSERT INTO dbo.Company_Note
  18827. (
  18828. Owner_ID,
  18829. Company_RecID,
  18830. Note_Type_RecID,
  18831. Notes,
  18832. Updated_By
  18833. )
  18834. SELECT DISTINCT
  18835. Owner_ID,
  18836. Company_RecID,
  18837. Note_Type_RecID,
  18838. Note_Comp,
  18839. @ImportBatchUser
  18840. FROM #Import_Staging
  18841. WHERE Note_Comp IS NOT NULL
  18842.  
  18843. ---- Clear WF_Track_Header_RecID for duplicate on Company and Track (a track should only be inserted once per company)
  18844. --;with duptracks AS
  18845. --(
  18846. -- SELECT
  18847. -- ExcelRowNumber,
  18848. -- Row_Number() OVER(PARTITION BY Company_RecID, WF_Track_Header_RecID ORDER BY ExcelRowNumber ASC) AS Order_Num
  18849. -- FROM #Import_Staging
  18850. --)
  18851.  
  18852. --UPDATE stag
  18853. -- SET WF_Track_Header_RecID = NULL
  18854. --FROM #Import_Staging stag
  18855. -- INNER JOIN duptracks
  18856. -- ON duptracks.ExcelRowNumber = stag.ExcelRowNumber
  18857. --WHERE duptracks.Order_Num > 1
  18858.  
  18859. ---- Perform insert to dbo.WF_Track_Attach_Header
  18860. ---- Repurpose Attached_By field to catch RecID from source table (update to appropriate value afterwards)
  18861. --INSERT INTO dbo.WF_Track_Attach_Header
  18862. --(
  18863. -- RecID,
  18864. -- Table_Reference,
  18865. -- WF_Track_Header_RecID,
  18866. -- [Description],
  18867. -- RecID_Field,
  18868. -- date_attached,
  18869. -- Attached_By, -- Re-purposed to catch source table identity
  18870. -- Last_Update,
  18871. -- Updated_By
  18872. --)
  18873.  
  18874. --SELECT
  18875. -- stag.Company_RecID,
  18876. -- 'company',
  18877. -- stag.WF_Track_Header_RecID,
  18878. -- head.[Description],
  18879. -- 'company_recid',
  18880. -- GETDATE(),
  18881. -- ExcelRowNumber,
  18882. -- GETDATE(),
  18883. -- @ImportBatchUser
  18884. --FROM #Import_Staging stag
  18885. -- INNER JOIN WF_Track_Header head
  18886. -- ON head.WF_Track_Header_RecID = stag.WF_Track_Header_RecID
  18887. --WHERE stag.WF_Track_Header_RecID IS NOT NULL
  18888. -- AND stag.Exclude = 0
  18889.  
  18890. ---- Join WF_Track_Attach_Header back to staging table to get new identities
  18891. --UPDATE stag
  18892. -- SET stag.WF_Track_Attach_Header_RecID = wta.WF_Track_Attach_Header_RecID
  18893. --FROM #Import_Staging stag
  18894. -- INNER JOIN WF_Track_Attach_Header wta
  18895. -- ON CAST(stag.ExcelRowNumber AS VARCHAR(20)) = wta.Attached_By
  18896.  
  18897. ---- Update Attached_By to appropriate value for imported records
  18898. --UPDATE WF_Track_Attach_Header
  18899. -- SET Attached_By = @ImportBatchUser
  18900. --WHERE Updated_By = @ImportBatchUser
  18901.  
  18902. ---- Create track detail records
  18903. --WHILE EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE WF_Track_Attach_Header_RecID IS NOT NULL AND Track_Detail_Processed = 0)
  18904. --BEGIN
  18905. -- -- Get current record for processing
  18906. -- SELECT @Curr_Track_Dtl_Record = (SELECT TOP 1 ExcelRowNumber FROM #Import_Staging WHERE WF_Track_Attach_Header_RecID IS NOT NULL AND Track_Detail_Processed = 0)
  18907.  
  18908. -- -- Build procedure call based on values in staging table
  18909. -- SELECT
  18910. -- @DSQL = 'EXEC usp_CreateWFTrackAttachDtlRecords ' + CAST(WF_Track_Header_RecID AS NVARCHAR(25)) + ', ' + CAST(WF_Track_Attach_Header_RecID AS NVARCHAR(25)) + ', ''' + @ImportBatchUser + ''''
  18911. -- FROM #Import_Staging stag
  18912. -- WHERE stag.ExcelRowNumber = @Curr_Track_Dtl_Record
  18913.  
  18914. -- -- Call procedure
  18915. -- EXEC(@DSQL)
  18916.  
  18917. -- -- Set current record as processed
  18918. -- UPDATE #Import_Staging
  18919. -- SET Track_Detail_Processed = 1
  18920. -- WHERE ExcelRowNumber = @Curr_Track_Dtl_Record
  18921. --END
  18922.  
  18923. -- Insert Company_Group record
  18924. INSERT INTO dbo.Company_Group
  18925. (
  18926. Owner_ID,
  18927. Group_Type_RecID,
  18928. Company_RecID,
  18929. DefaultContact_Flag,
  18930. [Description],
  18931. Last_Update,
  18932. Updated_By
  18933. )
  18934. SELECT DISTINCT
  18935. stag.Owner_ID,
  18936. stag.Group_Type_RecID,
  18937. stag.Company_RecID,
  18938. 1,
  18939. '',
  18940. GETDATE(),
  18941. @ImportBatchUser
  18942. FROM #Import_Staging stag
  18943. WHERE stag.Group_Type_RecID IS NOT NULL
  18944. AND stag.Exclude = 0
  18945.  
  18946. -- Insert to dbo.LeadImport
  18947. INSERT INTO dbo.Lead_Import
  18948. (
  18949. Lead_Import_Batch_RecID,
  18950. L_Company_Name,
  18951. L_PhoneNbr,
  18952. L_PhoneNbr_Fax,
  18953. L_Address_Line1,
  18954. L_Address_Line2,
  18955. L_City,
  18956. L_State_ID,
  18957. L_Zip,
  18958. L_Country,
  18959. L_Website,
  18960. L_Revenue,
  18961. L_Nbr_Employees,
  18962. L_SIC_Code,
  18963. L_Account,
  18964. L_Company_Note,
  18965. L_Company_RecID,
  18966. L_NewCompany_Flag,
  18967. L_Site_Name
  18968. )
  18969.  
  18970. SELECT
  18971. @ImportBatchID,
  18972. SUBSTRING(Company_Name, 1, 50),
  18973. SUBSTRING(PhoneNbr_Comp, 1, 50),
  18974. SUBSTRING(PhoneNbr_Fax, 1, 50),
  18975. SUBSTRING(Address_Line1_Comp, 1, 50),
  18976. SUBSTRING(Address_Line2_Comp, 1, 50),
  18977. SUBSTRING(City_Comp,1, 50),
  18978. SUBSTRING(State_Comp, 1, 50),
  18979. SUBSTRING(Zip_Comp, 1, 50),
  18980. SUBSTRING(Country_Comp, 1, 10),
  18981. SUBSTRING(Website_URL, 1, 50),
  18982. SUBSTRING(Annual_Revenue, 1, 50),
  18983. SUBSTRING(Nbr_Employees, 1, 50),
  18984. SUBSTRING(SIC_Code_ID, 1, 50),
  18985. SUBSTRING(Account_Nbr, 1, 50),
  18986. SUBSTRING(Note_Comp, 1, 5000),
  18987. Company_RecID,
  18988. NewCompany,
  18989. SUBSTRING(Site_Name, 1, 50)
  18990. FROM #Import_Staging
  18991. WHERE Exclude = 0
  18992.  
  18993. EXEC usp_Import_UDF @TableName, 'Company'
  18994.  
  18995. -- Clean up
  18996. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  18997. DROP TABLE #Force_Compile
  18998.  
  18999. -- Commit transaction
  19000. IF @@Error = 0 AND XACT_STATE() = 1
  19001. BEGIN
  19002.  
  19003. -- Commit and return
  19004. COMMIT TRANSACTION Comp_Import
  19005. SELECT
  19006. 1 AS Success,
  19007. @ImportBatchID AS Import_Batch_ID,
  19008. COUNT(*) AS Companies_Imported,
  19009. (SELECT COUNT (*) FROM Company_Address WHERE Updated_By = @ImportBatchUser) AS SitesImported
  19010. FROM dbo.Company
  19011. WHERE Updated_By = @ImportBatchUser
  19012. END
  19013.  
  19014. END TRY
  19015. BEGIN CATCH
  19016.  
  19017. -- An error occured, display error info
  19018. SELECT
  19019. ERROR_NUMBER() AS ErrorNumber,
  19020. ERROR_SEVERITY() AS ErrorSeverity,
  19021. ERROR_STATE() AS ErrorState,
  19022. ERROR_PROCEDURE() AS ErrorProcedure,
  19023. ERROR_LINE() AS ErrorLine,
  19024. ERROR_MESSAGE() AS ErrorMessage
  19025.  
  19026.  
  19027.  
  19028. -- Determine whether transaction needs to be rolled back and act accordingly
  19029. IF(XACT_STATE()) IN(-1, 1)
  19030. BEGIN
  19031. ROLLBACK TRANSACTION Comp_Import
  19032. END
  19033.  
  19034. END CATCH
  19035.  
  19036.  
  19037.  
  19038.  
  19039.  
  19040. GO
  19041.  
  19042.  
  19043.  
  19044.  
  19045.  
  19046. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Contact_ImportValidate')
  19047. BEGIN
  19048. EXEC('CREATE PROCEDURE [dbo].[usp_Contact_ImportValidate] AS SELECT 1')
  19049. END
  19050. GO
  19051.  
  19052. -- =============================================
  19053. -- Author: m.gray
  19054. -- Create date: 05/17/2013
  19055. -- Description: Validates data in temp table
  19056. -- tempdb.dbo.TMP_Contacts_Import - for Contacts
  19057. -- Import
  19058. -- Sample call: exec usp_Contact_ImportValidate '769E2AAC-C0D6-483B-AC09-8326F7851F1C', 0
  19059. -- =============================================
  19060.  
  19061. ALTER PROCEDURE [dbo].[usp_Contact_ImportValidate]
  19062. @TableName VARCHAR(MAX),
  19063. @DiffMode BIT = 0, -- Differential mode - does not import contacts with existing duplicates on name/company
  19064. @Forcemode BIT = 0
  19065. AS
  19066. BEGIN
  19067.  
  19068. -- Turn off diff mode - no longer used
  19069. SELECT @DiffMode = 0
  19070.  
  19071. SET NOCOUNT ON
  19072.  
  19073. -- Set date format to MDY to validate dates from excel
  19074. SET DATEFORMAT MDY
  19075.  
  19076. -- Variable declaration
  19077. -- Table to hold results of procedure
  19078. CREATE TABLE #tblResults
  19079. (
  19080. RowNumber INT,
  19081. ValMsg VARCHAR(750),
  19082. Warning_Flag BIT DEFAULT 0,
  19083. ReferenceType NVARCHAR(MAX)
  19084. )
  19085.  
  19086. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  19087.  
  19088. -- Table to hold condensed summary results
  19089. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  19090. BEGIN
  19091. DROP TABLE #ResultsCondensed
  19092. END
  19093.  
  19094. CREATE TABLE #ResultsCondensed
  19095. (
  19096. RowNumber NVARCHAR(MAX),
  19097. ValMsg NVARCHAR(MAX)
  19098. )
  19099.  
  19100. -- Schedule_Type_RecID for activities
  19101. DECLARE @Schedule_Type_RecID INT
  19102.  
  19103. -- Flag to indicate custom conversion (i.e. Autotask)
  19104. DECLARE @CustomMigration BIT
  19105.  
  19106. SELECT @CustomMigration = 0
  19107.  
  19108. -- Flag to indicate migration being matched on Legacy_ID
  19109. DECLARE @Legacy_Flag BIT = 0
  19110.  
  19111. -- Default SO_Act_Status_RecID for activity status
  19112. DECLARE @SO_Act_Status_RecID INT
  19113.  
  19114. -- Default SR_Location_RecID for activity status
  19115. DECLARE @SR_Location_RecID INT
  19116.  
  19117. -- Dynamic statement to insert to validation table
  19118. DECLARE @DSQL VARCHAR(MAX)
  19119.  
  19120. -- Fully qualified name of source table
  19121. DECLARE @SourceTable VARCHAR(300)
  19122. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  19123.  
  19124. -- Object_ID of source table
  19125. DECLARE @Source_Object_ID INT
  19126. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  19127.  
  19128. -- Pre-validation
  19129. -- Create & populate table variable with list of required columns
  19130. DECLARE @RequiredColumns TABLE
  19131. (
  19132. ColumnName VARCHAR(255)
  19133. )
  19134.  
  19135. INSERT INTO @RequiredColumns
  19136. (
  19137. ColumnName
  19138. )
  19139. SELECT 'Company Name' UNION ALL
  19140. SELECT 'Company ID' UNION ALL
  19141. SELECT 'Site Name' UNION ALL
  19142. SELECT 'First Name' UNION ALL
  19143. SELECT 'Last Name' UNION ALL
  19144. SELECT 'Contact Type' UNION ALL
  19145. SELECT 'Relationship' UNION ALL
  19146. SELECT 'Department' UNION ALL
  19147. SELECT 'Job Title' UNION ALL
  19148. SELECT 'Direct Phone' UNION ALL
  19149. SELECT 'Direct Extension' UNION ALL
  19150. SELECT 'Email Address' UNION ALL
  19151. SELECT 'Home Phone' UNION ALL
  19152. SELECT 'Cell Phone' UNION ALL
  19153. SELECT 'Primary Contact' UNION ALL
  19154. SELECT 'Billing Contact' UNION ALL
  19155. SELECT 'User Field 1' UNION ALL
  19156. SELECT 'User Field 2' UNION ALL
  19157. SELECT 'User Field 3' UNION ALL
  19158. SELECT 'User Field 4' UNION ALL
  19159. SELECT 'User Field 5' UNION ALL
  19160. SELECT 'User Field 6' UNION ALL
  19161. SELECT 'User Field 7' UNION ALL
  19162. SELECT 'User Field 8' UNION ALL
  19163. SELECT 'User Field 9' UNION ALL
  19164. SELECT 'User Field 10' UNION ALL
  19165. SELECT 'Contact Notes'
  19166.  
  19167. -- Table variable to hold column names from source table
  19168. DECLARE @SourceColumns TABLE
  19169. (
  19170. ColumnName VARCHAR(255)
  19171. )
  19172.  
  19173. -- Populate @SourceColumns
  19174. INSERT INTO @SourceColumns
  19175. (
  19176. ColumnName
  19177. )
  19178.  
  19179. SELECT
  19180. name
  19181. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  19182.  
  19183. -- Check that all required columns exist in @SourceColumns
  19184. INSERT INTO #tblResults
  19185. (
  19186. RowNumber,
  19187. ValMsg
  19188. )
  19189.  
  19190. SELECT
  19191. 0,
  19192. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  19193. FROM @RequiredColumns rq
  19194.  
  19195. EXCEPT
  19196.  
  19197. SELECT
  19198. 0,
  19199. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  19200. FROM @SourceColumns sc
  19201.  
  19202. -- If a column is missing, stop here and return results
  19203. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  19204. BEGIN
  19205. SELECT
  19206. 0 AS ValPassed,
  19207. RowNumber,
  19208. ValMsg
  19209. FROM #tblResults
  19210. ORDER BY RowNumber, ValMsg
  19211.  
  19212. RETURN
  19213. END
  19214.  
  19215. -- Table to hold source data for this batch from temp table
  19216. IF (OBJECT_ID('#Import_Staging') IS NOT NULL)
  19217. BEGIN
  19218. DROP TABLE #Import_Staging
  19219. END
  19220.  
  19221. CREATE TABLE #Import_Staging
  19222. (
  19223. ExcelRowNumber INT NULL,
  19224. Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19225. Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19226. First_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19227. Last_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19228. Site_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19229. Contact_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19230. Relationship nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19231. Department nvarchar(30) COLLATE DATABASE_DEFAULT NULL,
  19232. Job_Title nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19233. Direct_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19234. Direct_Extension nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19235. Email_Address nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19236. Home_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19237. Cell_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19238. Activity_Assign_To_Member_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19239. Activity_Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19240. Activity_Subject nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19241. Activity_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  19242. Activity_Due_Date NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19243. Activity_Marketing_Campaign NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19244. Primary_Contact nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19245. Billing_Contact nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  19246. Contact_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  19247. Company_RecID INT,
  19248. Department_RecID INT,
  19249. Company_Address_RecID INT,
  19250. Contact_Type_RecID INT,
  19251. Note_Type_RecID INT,
  19252. Activity_Member_RecID INT,
  19253. SO_Activity_Type_RecID INT,
  19254. Marketing_Campaign_RecID INT,
  19255. Invalid_Email BIT,
  19256. User_Field_1 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19257. User_Field_2 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19258. User_Field_3 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19259. User_Field_4 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19260. User_Field_5 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19261. User_Field_6 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19262. User_Field_7 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19263. User_Field_8 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19264. User_Field_9 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19265. User_Field_10 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19266. User_Field_1_Used BIT NULL,
  19267. User_Field_2_Used BIT NULL,
  19268. User_Field_3_Used BIT NULL,
  19269. User_Field_4_Used BIT NULL,
  19270. User_Field_5_Used BIT NULL,
  19271. User_Field_6_Used BIT NULL,
  19272. User_Field_7_Used BIT NULL,
  19273. User_Field_8_Used BIT NULL,
  19274. User_Field_9_Used BIT NULL,
  19275. User_Field_10_Used BIT NULL,
  19276. Portal_Security_Level_IN NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19277. Portal_PW NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19278. CM_Password NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  19279. Portal_Security_Level_OUT INT,
  19280. Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  19281. Legacy_Company_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  19282. Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  19283. Legacy_Contact_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  19284. Contact_RecID INT,
  19285. Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  19286. SR_Service_RecID INT,
  19287. Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  19288. SO_Opportunity_RecID INT,
  19289. Diff_Exclude_Flag BIT
  19290.  
  19291. )
  19292.  
  19293. -- Build statement to populate validation temp table
  19294. SELECT @DSQL = '
  19295. INSERT INTO #Import_Staging
  19296. (
  19297. ExcelRowNumber,
  19298. Company_Name,
  19299. Company_ID,
  19300. First_Name,
  19301. Last_Name,
  19302. Site_Name,
  19303. Contact_Type,
  19304. Relationship,
  19305. Department,
  19306. Job_Title,
  19307. Direct_Phone,
  19308. Direct_Extension,
  19309. Email_Address,
  19310. Home_Phone,
  19311. Cell_Phone,
  19312. Activity_Assign_To_Member_ID,
  19313. Activity_Type,
  19314. Activity_Subject,
  19315. Activity_Notes,
  19316. Activity_Due_Date,
  19317. Activity_Marketing_Campaign,
  19318. Primary_Contact,
  19319. Billing_Contact,
  19320. Contact_Notes,
  19321. User_Field_1,
  19322. User_Field_2,
  19323. User_Field_3,
  19324. User_Field_4,
  19325. User_Field_5,
  19326. User_Field_6,
  19327. User_Field_7,
  19328. User_Field_8,
  19329. User_Field_9,
  19330. User_Field_10
  19331. )
  19332.  
  19333. SELECT
  19334. [Excel Row Number],
  19335. [Company Name],
  19336. [Company ID],
  19337. [First Name],
  19338. [Last Name],
  19339. [Site Name],
  19340. [Contact Type],
  19341. [Relationship],
  19342. LEFT([Department],30),
  19343. [Job Title],
  19344. [Direct Phone],
  19345. [Direct Extension],
  19346. [Email Address],
  19347. [Home Phone],
  19348. [Cell Phone],
  19349. NULL,
  19350. NULL,
  19351. NULL,
  19352. NULL,
  19353. NULL,
  19354. NULL,
  19355. [Primary Contact],
  19356. [Billing Contact],
  19357. [Contact Notes],
  19358. [User Field 1],
  19359. [User Field 2],
  19360. [User Field 3],
  19361. [User Field 4],
  19362. [User Field 5],
  19363. [User Field 6],
  19364. [User Field 7],
  19365. [User Field 8],
  19366. [User Field 9],
  19367. [User Field 10]
  19368. FROM ' + @SourceTable
  19369.  
  19370. -- Pull data into validation table
  19371. EXEC(@DSQL)
  19372.  
  19373. -- Update temp table with optional field values if they exist
  19374. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Portal Security Level')
  19375. BEGIN
  19376. SELECT @DSQL = '
  19377. UPDATE tmp
  19378. SET tmp.Portal_Security_Level_IN = src.[Portal Security Level]
  19379. FROM #Import_Staging tmp
  19380. INNER JOIN ' + @SourceTable + ' src
  19381. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  19382.  
  19383. EXEC(@DSQL)
  19384. END
  19385.  
  19386. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Portal Password')
  19387. BEGIN
  19388. SELECT @DSQL = '
  19389. UPDATE tmp
  19390. SET tmp.Portal_PW = src.[Portal Password]
  19391. FROM #Import_Staging tmp
  19392. INNER JOIN ' + @SourceTable + ' src
  19393. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  19394.  
  19395. EXEC(@DSQL)
  19396. END
  19397.  
  19398. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
  19399. BEGIN
  19400. SELECT @DSQL = '
  19401. UPDATE tmp
  19402. SET tmp.Legacy_ID = src.Legacy_ID
  19403. FROM #Import_Staging tmp
  19404. INNER JOIN ' + @SourceTable + ' src
  19405. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  19406.  
  19407. EXEC(@DSQL)
  19408.  
  19409.  
  19410. END
  19411.  
  19412. BEGIN TRANSACTION Contact_Val
  19413.  
  19414. -- Update empty string or single space to null in validation table
  19415. UPDATE #Import_Staging SET
  19416. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  19417. Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
  19418. Company_ID = CASE WHEN Company_ID IN('', ' ') THEN NULL ELSE Company_ID END,
  19419. First_Name = CASE WHEN First_Name IN('', ' ') THEN NULL ELSE First_Name END,
  19420. Last_Name = CASE WHEN Last_Name IN('', ' ') THEN NULL ELSE Last_Name END,
  19421. Site_Name = CASE WHEN Site_Name IN('', ' ') THEN NULL ELSE Site_Name END,
  19422. Contact_Type = CASE WHEN Contact_Type IN('', ' ') THEN NULL ELSE Contact_Type END,
  19423. Relationship = CASE WHEN Relationship IN('', ' ') THEN NULL ELSE Relationship END,
  19424. Department = CASE WHEN Department IN('', ' ') THEN NULL ELSE Department END,
  19425. Job_Title = CASE WHEN Job_Title IN('', ' ') THEN NULL ELSE Job_Title END,
  19426. Direct_Phone = CASE WHEN Direct_Phone IN('', ' ') THEN NULL ELSE Direct_Phone END,
  19427. Direct_Extension = CASE WHEN Direct_Extension IN('', ' ') THEN NULL ELSE Direct_Extension END,
  19428. Email_Address = CASE WHEN Email_Address IN('', ' ') THEN NULL ELSE Email_Address END,
  19429. Home_Phone = CASE WHEN Home_Phone IN('', ' ') THEN NULL ELSE Home_Phone END,
  19430. Cell_Phone = CASE WHEN Cell_Phone IN('', ' ') THEN NULL ELSE Cell_Phone END,
  19431. Activity_Assign_To_Member_ID = CASE WHEN Activity_Assign_To_Member_ID IN('', ' ') THEN NULL ELSE Activity_Assign_To_Member_ID END,
  19432. Activity_Type = CASE WHEN Activity_Type IN('', ' ') THEN NULL ELSE Activity_Type END,
  19433. Activity_Subject = CASE WHEN Activity_Subject IN('', ' ') THEN NULL ELSE Activity_Subject END,
  19434. Activity_Notes = CASE WHEN Activity_Notes IN('', ' ') THEN NULL ELSE Activity_Notes END,
  19435. Activity_Due_Date = CASE WHEN Activity_Due_Date IN('', ' ') THEN NULL ELSE Activity_Due_Date END,
  19436. Activity_Marketing_Campaign = CASE WHEN Activity_Marketing_Campaign IN('', ' ') THEN NULL ELSE Activity_Marketing_Campaign END,
  19437. Primary_Contact = CASE WHEN Primary_Contact IN('', ' ') THEN NULL ELSE Primary_Contact END,
  19438. Billing_Contact = CASE WHEN Billing_Contact IN('', ' ') THEN NULL ELSE Billing_Contact END,
  19439. Contact_Notes = CASE WHEN Contact_Notes IN('', ' ') THEN NULL ELSE Contact_Notes END,
  19440. User_Field_1 = CASE WHEN User_Field_1 IN('', ' ') THEN NULL ELSE User_Field_1 END,
  19441. User_Field_2 = CASE WHEN User_Field_2 IN('', ' ') THEN NULL ELSE User_Field_2 END,
  19442. User_Field_3 = CASE WHEN User_Field_3 IN('', ' ') THEN NULL ELSE User_Field_3 END,
  19443. User_Field_4 = CASE WHEN User_Field_4 IN('', ' ') THEN NULL ELSE User_Field_4 END,
  19444. User_Field_5 = CASE WHEN User_Field_5 IN('', ' ') THEN NULL ELSE User_Field_5 END,
  19445. User_Field_6 = CASE WHEN User_Field_6 IN('', ' ') THEN NULL ELSE User_Field_6 END,
  19446. User_Field_7 = CASE WHEN User_Field_7 IN('', ' ') THEN NULL ELSE User_Field_7 END,
  19447. User_Field_8 = CASE WHEN User_Field_8 IN('', ' ') THEN NULL ELSE User_Field_8 END,
  19448. User_Field_9 = CASE WHEN User_Field_9 IN('', ' ') THEN NULL ELSE User_Field_9 END,
  19449. User_Field_10 = CASE WHEN User_Field_10 IN('', ' ') THEN NULL ELSE User_Field_10 END,
  19450. Portal_Security_Level_IN = CASE WHEN Portal_Security_Level_IN IN('', ' ') THEN NULL ELSE Portal_Security_Level_IN END,
  19451. Portal_PW = CASE WHEN Portal_PW IN('', ' ') THEN NULL ELSE Portal_PW END
  19452.  
  19453. -- Match contacts to companies/site
  19454. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  19455. BEGIN
  19456. SELECT @Legacy_Flag = 1
  19457. EXEC usp_Import_Match_Legacy @TableName, 'Contact'
  19458. END
  19459.  
  19460. -- Identify if Autotask/Custom conversion and handle appropriately
  19461. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Contact_Type = 'CW_Custom_Conversion')
  19462. BEGIN
  19463. -- Get rid of export config row created by SSIS
  19464. DELETE FROM #Import_Staging
  19465. WHERE Contact_Type = 'CW_Custom_Conversion'
  19466.  
  19467. -- Set flag to indicate custom migration
  19468. SELECT @CustomMigration = 1
  19469.  
  19470. END
  19471.  
  19472.  
  19473.  
  19474. -- Table to hold trimmed company names and company_ids from dbo.company
  19475. -- Prevents need to join on trim function each time we touch company table (performance concern)
  19476. -- Also filters rows that are unrelated to import batch
  19477. DECLARE @Company TABLE
  19478. (
  19479. Company_RecID INT,
  19480. Company_ID VARCHAR(50),
  19481. Company_Name VARCHAR(50),
  19482. Delete_Flag BIT
  19483. )
  19484.  
  19485. -- Populate @Company
  19486. INSERT INTO @Company
  19487. (
  19488. Company_RecID,
  19489. Company_ID,
  19490. Company_Name,
  19491. Delete_Flag
  19492. )
  19493.  
  19494. SELECT
  19495. Company_RecID,
  19496. LTRIM(RTRIM(Company_ID)),
  19497. LTRIM(RTRIM(Company_Name)),
  19498. Delete_Flag
  19499. FROM dbo.Company comp
  19500.  
  19501. -- Join to tables in CW to gather RecID's for references
  19502. -- Company_RecID
  19503. -- Get by Company_ID first
  19504. UPDATE tmp
  19505. SET tmp.Company_RecID = comp.Company_RecID
  19506. FROM #Import_Staging tmp
  19507. INNER JOIN @Company comp
  19508. ON comp.Company_ID = tmp.Company_ID
  19509. AND comp.Delete_Flag = 0
  19510. WHERE tmp.Company_ID IS NOT NULL
  19511.  
  19512. -- Get by Company name for records where Company_ID is null
  19513. UPDATE tmp
  19514. SET tmp.Company_RecID = comp.Company_RecID
  19515. FROM #Import_Staging tmp
  19516. INNER JOIN @Company comp
  19517. ON comp.Company_Name = tmp.Company_Name
  19518. AND comp.Delete_Flag = 0
  19519. WHERE tmp.Company_ID IS NULL
  19520.  
  19521. -- Portal security level
  19522. -- By security level caption
  19523. UPDATE tmp
  19524. SET tmp.Portal_Security_Level_Out =
  19525. CASE cc.Field_Name
  19526. WHEN 'portal_security_level_1' THEN 1
  19527. WHEN 'portal_security_level_2' THEN 2
  19528. WHEN 'portal_security_level_3' THEN 3
  19529. WHEN 'portal_security_level_4' THEN 4
  19530. WHEN 'portal_security_level_5' THEN 5
  19531. WHEN 'portal_security_level_6' THEN 6
  19532. ELSE NULL END
  19533. FROM #Import_Staging tmp
  19534. CROSS APPLY(SELECT TOP 1 * FROM dbo.Custom_Caption cc WHERE cc.Caption = tmp.Portal_Security_Level_IN AND cc.Field_Name LIKE('Portal_Security_Level_%')) cc
  19535. WHERE tmp.Portal_Security_Level_IN IS NOT NULL
  19536. AND tmp.Portal_Security_Level_IN <> ''
  19537.  
  19538. -- By security level number
  19539. UPDATE tmp
  19540. SET tmp.Portal_Security_Level_OUT = tmp.Portal_Security_Level_IN
  19541. FROM #Import_Staging tmp
  19542. WHERE ISNUMERIC(tmp.Portal_Security_Level_IN) = 1
  19543. AND tmp.Portal_Security_Level_IN BETWEEN 1 AND 6
  19544. AND tmp.Portal_Security_Level_OUT IS NULL
  19545.  
  19546. -- Get portal password
  19547. UPDATE tmp
  19548. SET tmp.CM_Password = dbo.udf_EncrDecr(Portal_PW, 'E')
  19549. FROM #Import_Staging tmp
  19550. WHERE tmp.Portal_PW IS NOT NULL
  19551. AND LEN(Portal_PW) <= 15
  19552.  
  19553. -- Department_RecID
  19554. UPDATE tmp
  19555. SET tmp.Department_RecID = dep.Department_RecID
  19556. FROM #Import_Staging tmp
  19557. INNER JOIN dbo.Department dep
  19558. ON dbo.ufn_Import_Trim(dep.Department_Name) = tmp.Department
  19559.  
  19560. -- Company_Address_RecID
  19561. -- If site name specified, get by site name
  19562. UPDATE tmp
  19563. SET tmp.Company_Address_RecID = cad.Company_Address_RecID
  19564. FROM #Import_Staging tmp
  19565. INNER JOIN dbo.Company_Address cad
  19566. ON cad.Company_RecID = tmp.Company_RecID
  19567. AND tmp.Site_Name = dbo.ufn_Import_Trim(cad.[Description])
  19568. WHERE tmp.Site_Name IS NOT NULL
  19569.  
  19570. -- If site name not specified, get default
  19571. UPDATE tmp
  19572. SET tmp.Company_Address_RecID = cad.Company_Address_RecID
  19573. FROM #Import_Staging tmp
  19574. INNER JOIN dbo.Company_Address cad
  19575. ON cad.Company_RecID = tmp.Company_RecID
  19576. AND cad.Default_Flag = 1
  19577. WHERE tmp.Site_Name IS NULL
  19578.  
  19579. -- Note_Type_RecID for default note type
  19580. UPDATE tmp
  19581. SET tmp.Note_Type_RecID = nt.Note_Type_RecID
  19582. FROM #Import_Staging tmp
  19583. INNER JOIN dbo.Note_Type nt
  19584. ON nt.Default_Flag = 1
  19585.  
  19586. -- Activity_Member_RecID
  19587. UPDATE tmp
  19588. SET tmp.Activity_Member_RecID = mem.Member_RecID
  19589. FROM #Import_Staging tmp
  19590. INNER JOIN dbo.Member mem
  19591. ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.Activity_Assign_To_Member_ID
  19592.  
  19593. -- Basic validation of email address
  19594. UPDATE #Import_Staging
  19595. SET Invalid_Email = 1
  19596. WHERE @CustomMigration <> 1 AND
  19597. (Email_Address LIKE '%[^a-z,0-9,@,.,_,-]%' OR Email_Address NOT like '%_@_%_.__%')
  19598.  
  19599.  
  19600. -- Contact_Type_RecID
  19601. UPDATE tmp
  19602. SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
  19603. FROM #Import_Staging tmp
  19604. INNER JOIN dbo.Contact_Type ct
  19605. ON tmp.Contact_Type = dbo.ufn_Import_Trim(ct.[Description])
  19606. WHERE tmp.Contact_Type IS NOT NULL
  19607.  
  19608. -- Get default contact type if not specified in spreadsheet
  19609. UPDATE tmp
  19610. SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
  19611. FROM #Import_Staging tmp
  19612. INNER JOIN dbo.Contact_Type ct
  19613. ON ct.Default_Flag = 1
  19614. WHERE tmp.Contact_Type IS NULL
  19615.  
  19616. -- Marketing_Campaign_RecID
  19617. UPDATE tmp
  19618. SET tmp.Marketing_Campaign_RecID = mc.Marketing_Campaign_RecID
  19619. FROM #Import_Staging tmp
  19620. INNER JOIN dbo.Marketing_Campaign mc
  19621. ON tmp.Activity_Marketing_Campaign = dbo.ufn_Import_Trim(mc.Marketing_ID)
  19622. WHERE tmp.Activity_Marketing_Campaign IS NOT NULL
  19623.  
  19624. -- SO_Activity_Type_RecID
  19625. UPDATE tmp
  19626. SET tmp.SO_Activity_Type_RecID = at.SO_Activity_Type_RecID
  19627. FROM #Import_Staging tmp
  19628. INNER JOIN dbo.SO_Activity_Type at
  19629. ON dbo.ufn_Import_Trim(at.[Description]) = tmp.Activity_Type
  19630. WHERE tmp.Activity_Type IS NOT NULL
  19631.  
  19632. -- Get default Activity_Type if not specified
  19633. UPDATE tmp
  19634. SET tmp.SO_Activity_Type_RecID = at.SO_Activity_Type_RecID
  19635. FROM #Import_Staging tmp
  19636. INNER JOIN dbo.SO_Activity_Type at
  19637. ON at.Default_Flag = 1
  19638. WHERE tmp.Activity_Type IS NULL
  19639. AND tmp.Activity_Assign_To_Member_ID IS NOT NULL
  19640.  
  19641. -- Get Schedule_Type_RecID for so_activity
  19642. SELECT @Schedule_Type_RecID = (SELECT TOP 1 Schedule_Type_RecID FROM dbo.Schedule_Type WHERE Table_Reference = 'so_activity')
  19643.  
  19644. -- Get default SO_Act_Status_RecID for activity status
  19645. SELECT @SO_Act_Status_RecID = (SELECT TOP 1 SO_Act_Status_RecID FROM dbo.SO_Act_Status WHERE Default_Flag = 1)
  19646.  
  19647. -- Get default SR_Location_RecID for activity location
  19648. SELECT @SR_Location_RecID = (SELECT TOP 1 SR_Location_RecID FROM dbo.SR_Location WHERE Default_Flag = 1)
  19649.  
  19650. -- Update boolean fields to 0 or 1
  19651. UPDATE tmp
  19652. SET tmp.Primary_Contact =
  19653. CASE
  19654. WHEN tmp.Primary_Contact IN('1', 'Y', 'Yes', 'True', 'T') THEN '1'
  19655. WHEN tmp.Primary_Contact IN('0', 'N', 'No', 'False', 'F') THEN '0'
  19656. WHEN tmp.Primary_Contact IS NULL THEN '0'
  19657. ELSE tmp.Primary_Contact
  19658. END,
  19659.  
  19660. tmp.Billing_Contact =
  19661. CASE
  19662. WHEN tmp.Billing_Contact IN('1', 'Y', 'Yes', 'True', 'T') THEN '1'
  19663. WHEN tmp.Billing_Contact IN('0', 'N', 'No', 'False', 'F') THEN '0'
  19664. WHEN tmp.Billing_Contact IS NULL THEN '0'
  19665. ELSE tmp.Billing_Contact
  19666. END
  19667. FROM #Import_Staging tmp
  19668.  
  19669. -- Determine if each user defined field is used
  19670. ;WITH ufstatus AS
  19671. (
  19672. SELECT TOP 1
  19673. CASE WHEN Company_Userfield_1 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_1_Used,
  19674. CASE WHEN Company_Userfield_2 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_2_Used,
  19675. CASE WHEN Company_Userfield_3 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_3_Used,
  19676. CASE WHEN Company_Userfield_4 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_4_Used,
  19677. CASE WHEN Company_Userfield_5 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_5_Used,
  19678. CASE WHEN Company_Userfield_6 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_6_Used,
  19679. CASE WHEN Company_Userfield_7 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_7_Used,
  19680. CASE WHEN Company_Userfield_8 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_8_Used,
  19681. CASE WHEN Company_Userfield_9 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_9_Used,
  19682. CASE WHEN Company_Userfield_10 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_10_Used
  19683. FROM dbo.[Owner]
  19684. )
  19685.  
  19686. UPDATE tmp
  19687. SET tmp.User_Field_1_Used = ufstatus.User_Field_1_Used,
  19688. tmp.User_Field_2_Used = ufstatus.User_Field_2_Used,
  19689. tmp.User_Field_3_Used = ufstatus.User_Field_3_Used,
  19690. tmp.User_Field_4_Used = ufstatus.User_Field_4_Used,
  19691. tmp.User_Field_5_Used = ufstatus.User_Field_5_Used,
  19692. tmp.User_Field_6_Used = ufstatus.User_Field_6_Used,
  19693. tmp.User_Field_7_Used = ufstatus.User_Field_7_Used,
  19694. tmp.User_Field_8_Used = ufstatus.User_Field_8_Used,
  19695. tmp.User_Field_9_Used = ufstatus.User_Field_9_Used,
  19696. tmp.User_Field_10_Used = ufstatus.User_Field_10_Used
  19697. FROM #Import_Staging tmp
  19698. CROSS APPLY ufstatus
  19699.  
  19700. -- Delete duplicates if running in differential mode
  19701. DELETE tmp
  19702. FROM #Import_Staging tmp
  19703. INNER JOIN dbo.Contact cont
  19704. ON @DiffMode = 1
  19705. AND tmp.Company_RecID = cont.Company_RecID
  19706. AND ISNULL(tmp.Last_Name, '') = ISNULL(cont.Last_Name, '')
  19707. AND ISNULL(tmp.First_Name, '') = ISNULL(cont.First_Name, '')
  19708. AND @Legacy_Flag = 0
  19709.  
  19710. -- Make adjustments to force if @ForceMode = 1
  19711. -- Set primary/billing contact to 0 where one exists
  19712. UPDATE tmp
  19713. SET tmp.Primary_Contact = 0
  19714. FROM #Import_Staging tmp
  19715. INNER JOIN dbo.Contact cont
  19716. ON tmp.Company_RecID = cont.Company_RecID
  19717. AND cont.Default_Flag = 1
  19718. AND tmp.Primary_Contact = 1
  19719. AND @ForceMode = 1
  19720.  
  19721. UPDATE tmp
  19722. SET tmp.Billing_Contact = 0
  19723. FROM #Import_Staging tmp
  19724. INNER JOIN dbo.Contact cont
  19725. ON tmp.Company_RecID = cont.Company_RecID
  19726. AND cont.Default_Billing_Flag = 1
  19727. AND tmp.Billing_Contact = 1
  19728. AND @ForceMode = 1
  19729.  
  19730. INSERT INTO dbo.Department
  19731. (
  19732. Owner_ID,
  19733. Department_Name,
  19734. Last_Update,
  19735. Updated_By
  19736. )
  19737.  
  19738. SELECT DISTINCT
  19739. 1,
  19740. Department,
  19741. GETDATE(),
  19742. 'Import'
  19743. FROM #Import_Staging tmp
  19744. WHERE tmp.Department IS NOT NULL
  19745. AND tmp.Department_RecID IS NULL
  19746. AND @ForceMode = 1
  19747.  
  19748. -- Department_RecID
  19749. UPDATE tmp
  19750. SET tmp.Department_RecID = dep.Department_RecID
  19751. FROM #Import_Staging tmp
  19752. INNER JOIN dbo.Department dep
  19753. ON dbo.ufn_Import_Trim(dep.Department_Name) = tmp.Department
  19754. WHERE tmp.Department IS NOT NULL
  19755. AND tmp.Department_RecID IS NULL
  19756. AND @ForceMode = 1
  19757.  
  19758. INSERT INTO Contact_Type
  19759. (
  19760. Contact_Type_ID,
  19761. [Description],
  19762. Default_Flag,
  19763. Last_Update,
  19764. Updated_By
  19765. )
  19766.  
  19767. SELECT DISTINCT
  19768. '',
  19769. tmp.Contact_Type,
  19770. 0,
  19771. GETDATE(),
  19772. 'Import'
  19773. FROM #Import_Staging tmp
  19774. WHERE Contact_Type IS NOT NULL
  19775. AND Contact_Type_RecID IS NULL
  19776. AND @ForceMode = 1
  19777.  
  19778.  
  19779. UPDATE tmp
  19780. SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
  19781. FROM #Import_Staging tmp
  19782. INNER JOIN dbo.Contact_Type ct
  19783. ON tmp.Contact_Type = dbo.ufn_Import_Trim(ct.[Description])
  19784. WHERE tmp.Contact_Type IS NOT NULL
  19785. AND tmp.Contact_Type_RecID IS NULL
  19786. AND @ForceMode = 1
  19787.  
  19788. -- Begin validation
  19789. INSERT INTO #tblResults
  19790. (
  19791. RowNumber,
  19792. ValMsg
  19793. )
  19794.  
  19795. -- Communication Type setup table must have defined values for 'Direct', 'Mobile', 'Home', and 'Email'
  19796. SELECT
  19797. NULL,
  19798. 'Import cannot be completed because there is no communication type named "Direct" for direct phone. [Setup] -> [Setup Tables] -> [Communication Type]'
  19799. WHERE NOT EXISTS(SELECT TOP 1 * FROM dbo.Communication_Type WHERE Communication_Name = 'Direct' AND Phone_Flag = 1)
  19800.  
  19801. UNION ALL
  19802.  
  19803. SELECT
  19804. NULL,
  19805. 'Import cannot be completed because there is no communication type named "Mobile" or "Cell" for mobile phone. [Setup] -> [Setup Tables] -> [Communication Type]'
  19806. WHERE NOT EXISTS(SELECT TOP 1 * FROM dbo.Communication_Type WHERE Communication_Name IN ('Mobile', 'Cell') AND Phone_Flag = 1)
  19807.  
  19808. UNION ALL
  19809.  
  19810. SELECT
  19811. NULL,
  19812. 'Import cannot be completed because there is no communication type named "Home" for Home phone. [Setup] -> [Setup Tables] -> [Communication Type]'
  19813. WHERE NOT EXISTS(SELECT TOP 1 * FROM dbo.Communication_Type WHERE Communication_Name IN ('Home', 'Home Phone') AND Phone_Flag = 1)
  19814.  
  19815. UNION ALL
  19816.  
  19817. SELECT
  19818. NULL,
  19819. 'Import cannot be completed because there is no communication type named "Email" for Email address. [Setup] -> [Setup Tables] -> [Communication Type]'
  19820. WHERE NOT EXISTS(SELECT TOP 1 * FROM dbo.Communication_Type WHERE Communication_Name = 'Email' AND Email_Flag = 1)
  19821.  
  19822. UNION ALL
  19823.  
  19824. -- If company is specified, it must be a valid reference
  19825. SELECT
  19826. tmp.ExcelRowNumber,
  19827. 'Invalid Company: "' + tmp.Company_Name + '" with Company_ID: "' + ISNULL(tmp.Company_ID, '[BLANK]') + '" does not exist or has been deleted.'
  19828. FROM #Import_Staging tmp
  19829. WHERE tmp.Company_Name IS NOT NULL
  19830. AND Company_RecID IS NULL
  19831.  
  19832. UNION ALL
  19833.  
  19834. -- If company_id entered, company_name must also be specified
  19835. SELECT
  19836. tmp.ExcelRowNumber,
  19837. 'If Company_ID is specified, Company_Name must also be entered.'
  19838. FROM #Import_Staging tmp
  19839. WHERE Company_ID IS NOT NULL
  19840. AND Company_Name IS NULL
  19841.  
  19842. UNION ALL
  19843.  
  19844. -- Company_ID is required if multiple companies with the same name already exist
  19845. SELECT
  19846. tmp.ExcelRowNumber,
  19847. 'Multiple companies exist named "' + MIN(tmp.Company_Name) + '". Please specify the Company_ID field to identify which company you are adding this contact to'
  19848. FROM #Import_Staging tmp
  19849. INNER JOIN @Company comp
  19850. ON Comp.company_name = tmp.Company_Name
  19851. AND comp.Delete_Flag = 0
  19852. WHERE tmp.Company_ID IS NULL
  19853. AND tmp.Company_Name IS NOT NULL
  19854. GROUP BY tmp.ExcelRowNumber, comp.Company_Name
  19855. HAVING COUNT(comp.Company_RecID) > 1
  19856.  
  19857. UNION ALL
  19858.  
  19859. -- Company with the same Company_ID cannot exist with a different company name (even if deleted - mirrored from PSA validation)
  19860. SELECT
  19861. tmp.ExcelRowNumber,
  19862. 'The Company_ID: "' + tmp.Company_ID + '" exists, but is not assigned to the company named: ' + tmp.Company_Name
  19863. FROM #Import_Staging tmp
  19864. INNER JOIN @Company comp
  19865. ON comp.Company_ID = tmp.Company_ID
  19866. AND comp.Company_Name <> tmp.Company_Name
  19867. WHERE tmp.Company_Name IS NOT NULL
  19868. AND tmp.Company_ID IS NOT NULL
  19869.  
  19870. UNION ALL
  19871.  
  19872. -- Company_ID must be a valid reference if supplied
  19873. SELECT
  19874. tmp.ExcelRowNUmber,
  19875. 'The Company_ID: "' + tmp.Company_ID + '" does not exist.'
  19876. FROM #Import_Staging tmp
  19877. LEFT OUTER JOIN @Company comp
  19878. ON tmp.Company_ID = comp.Company_ID
  19879. WHERE comp.Company_RecID IS NULL
  19880. AND tmp.Company_ID IS NOT NULL
  19881.  
  19882. UNION ALL
  19883.  
  19884. -- Site must exist if specified
  19885. SELECT
  19886. tmp.ExcelRowNumber,
  19887. 'No site named "' + tmp.Site_Name + '" exists for company: ' + tmp.Company_Name
  19888. FROM #Import_Staging tmp
  19889. INNER JOIN @Company comp
  19890. ON comp.Company_RecID = tmp.Company_RecID
  19891. LEFT OUTER JOIN dbo.Company_Address cad
  19892. ON cad.[Description] = tmp.Site_Name
  19893. WHERE comp.Company_RecID IS NOT NULL
  19894. AND cad.Company_Address_RecID IS NULL
  19895. AND tmp.Company_Name IS NOT NULL
  19896. AND tmp.Site_Name IS NOT NULL
  19897.  
  19898. UNION ALL
  19899.  
  19900. -- If site name not specified, company must have a default
  19901. SELECT
  19902. tmp.ExcelRowNumber,
  19903. 'No default site or address found for Company: "' + Company_Name + '" and no site name was specified in the spreadsheet.'
  19904. FROM #Import_Staging tmp
  19905. WHERE Company_Address_RecID IS NULL
  19906. AND Company_RecID IS NOT NULL
  19907. AND Site_Name IS NULL
  19908.  
  19909. UNION ALL
  19910.  
  19911. -- Department must exist if specified
  19912. SELECT
  19913. tmp.ExcelRowNumber,
  19914. 'Invalid department: "' + tmp.Department + '"'
  19915. FROM #Import_Staging tmp
  19916. WHERE tmp.Department IS NOT NULL
  19917. AND tmp.Department_RecID IS NULL
  19918.  
  19919. UNION ALL
  19920.  
  19921. -- Contact_Type must exist if specified
  19922. SELECT
  19923. tmp.ExcelRowNumber,
  19924. 'Invalid Contact Type: "' + tmp.Contact_Type + '"'
  19925. FROM #Import_Staging tmp
  19926. WHERE tmp.Contact_Type IS NOT NULL
  19927. AND tmp.Contact_Type_RecID IS NULL
  19928.  
  19929. UNION ALL
  19930.  
  19931. -- AssignTo must exist if specified
  19932. SELECT
  19933. tmp.ExcelRowNumber,
  19934. 'Invalid "Assign To" Member_ID: "' + tmp.Activity_Assign_To_Member_ID + '"'
  19935. FROM #Import_Staging tmp
  19936. WHERE Activity_Assign_To_Member_ID IS NOT NULL
  19937. AND tmp.Activity_Member_RecID IS NULL
  19938.  
  19939. UNION ALL
  19940.  
  19941. -- Due date, subject, marketing campaign, activity_type not allowed unless AssignTo specified
  19942. SELECT
  19943. tmp.ExcelRowNumber,
  19944. 'Activity Type, Due date, Subject, Notes, and Marketing campaign fields are invalid unless a Member_ID is specified to assign the activity to'
  19945. FROM #Import_Staging tmp
  19946. WHERE tmp.Activity_Assign_To_Member_ID IS NULL
  19947. AND COALESCE(tmp.Activity_Type, tmp.Activity_Subject, tmp.Activity_Due_Date, tmp.Activity_Marketing_Campaign, tmp.Activity_Notes) IS NOT NULL
  19948.  
  19949. UNION ALL
  19950.  
  19951. -- Activity_Due_Date must be a date
  19952. SELECT
  19953. tmp.ExcelRowNumber,
  19954. 'Activity due date must be a valid date: "' + tmp.Activity_Due_Date + '" is invalid. MM/DD/YYYY format is recommended'
  19955. FROM #Import_Staging tmp
  19956. WHERE tmp.Activity_Assign_To_Member_ID IS NOT NULL
  19957. AND tmp.Activity_Due_Date IS NOT NULL
  19958. AND ISDATE(tmp.Activity_Due_Date) = 0
  19959.  
  19960. UNION ALL
  19961.  
  19962. -- Activity marketing campaign must be valid
  19963. SELECT
  19964. tmp.ExcelRowNumber,
  19965. 'Invalid activity marketing campaign: "' + tmp.Activity_Marketing_Campaign + '"'
  19966. FROM #Import_Staging tmp
  19967. WHERE tmp.Marketing_Campaign_RecID IS NULL
  19968. AND tmp.Activity_Marketing_Campaign IS NOT NULL
  19969.  
  19970. UNION ALL
  19971.  
  19972. -- Activity type must be valid if specified
  19973. SELECT
  19974. tmp.ExcelRowNumber,
  19975. 'Invalid activity type: "' + tmp.Activity_Type + '"'
  19976. FROM #Import_Staging tmp
  19977. WHERE tmp.Activity_Type IS NOT NULL
  19978. AND tmp.SO_Activity_Type_RecID IS NULL
  19979.  
  19980. UNION ALL
  19981.  
  19982. -- Email must be valid
  19983. SELECT
  19984. tmp.ExcelRowNumber,
  19985. 'Invalid Email Address: "' + tmp.Email_Address
  19986. FROM #Import_Staging tmp
  19987. WHERE tmp.Invalid_Email = 1
  19988. AND @ForceMode = 0
  19989.  
  19990. UNION ALL
  19991.  
  19992. -- Check that boolean fields evaluate to true or false
  19993. SELECT
  19994. tmp.ExcelRowNumber,
  19995. 'Billing Contact must be 0 or 1'
  19996. FROM #Import_Staging tmp
  19997. WHERE tmp.Billing_Contact IS NOT NULL
  19998. AND tmp.Billing_Contact NOT IN('0', '1')
  19999.  
  20000. UNION ALL
  20001.  
  20002. SELECT TOP 1
  20003. NULL,
  20004. 'Cannot add activity because no default Activity Status is defined for new activities - [Setup tables] -> [Activities] -> [Activity Status-CRM]'
  20005. FROM #Import_Staging tmp
  20006. WHERE EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Activity_Member_RecID IS NOT NULL)
  20007. AND @SO_Act_Status_RecID IS NULL
  20008.  
  20009. UNION ALL
  20010.  
  20011. -- Primary contact must evaluate to 0 or 1
  20012. SELECT
  20013. tmp.ExcelRowNumber,
  20014. 'Primary Contact must be 0 or 1'
  20015. FROM #Import_Staging tmp
  20016. WHERE Primary_Contact IS NOT NULL
  20017. AND Primary_Contact NOT IN('0', '1')
  20018.  
  20019. UNION ALL
  20020.  
  20021. -- Site Name cannot be specified if contact is not associated with a company
  20022. SELECT
  20023. tmp.ExcelRowNumber,
  20024. 'Site Name cannot be specified if a contact is not associated with a company'
  20025. FROM #Import_Staging tmp
  20026. WHERE Site_Name IS NOT NULL
  20027. AND COALESCE(tmp.Company_Name, tmp.Company_ID) IS NULL
  20028.  
  20029. UNION ALL
  20030.  
  20031. -- Can't set primary contact = 1 if a primary contact already exists
  20032. SELECT
  20033. tmp.ExcelRowNumber,
  20034. 'A primary contact already exists for company: "' + ISNULL(tmp.Company_Name, tmp.Legacy_Company_ID) + '"'
  20035. FROM #Import_Staging tmp
  20036. WHERE Primary_Contact = '1'
  20037. AND EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Flag = 1)
  20038. AND @Legacy_Flag = 0
  20039. UNION ALL
  20040.  
  20041. -- Can't set billing contact = 1 if a primary contact already exists
  20042. SELECT
  20043. tmp.ExcelRowNumber,
  20044. 'A billing contact already exists for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
  20045. FROM #Import_Staging tmp
  20046. WHERE Primary_Contact = '1'
  20047. AND EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Billing_Flag = 1)
  20048. AND @Legacy_Flag = 0
  20049.  
  20050. UNION ALL
  20051.  
  20052. -- Cannot have more than one primary contact
  20053. SELECT
  20054. MIN(tmp.ExcelRowNumber),
  20055. 'Cannot have more than one primary contact for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
  20056. FROM #Import_Staging tmp
  20057. WHERE tmp.Primary_Contact = '1'
  20058. AND @Legacy_Flag = 0
  20059. AND NOT EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Flag = 1)
  20060. GROUP BY tmp.Company_Name, tmp.Company_RecID
  20061. HAVING COUNT(*) > 1
  20062.  
  20063. UNION ALL
  20064.  
  20065. -- Cannot have more than one billing contact
  20066. SELECT
  20067. MIN(tmp.ExcelRowNumber),
  20068. 'Cannot have more than one billing contact for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
  20069. FROM #Import_Staging tmp
  20070. WHERE tmp.Billing_Contact = '1'
  20071. AND @Legacy_Flag = 0
  20072. AND NOT EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Billing_Flag = 1)
  20073. GROUP BY tmp.Company_Name, tmp.Company_RecID
  20074. HAVING COUNT(*) > 1
  20075.  
  20076. UNION ALL
  20077.  
  20078. -- Check max-length for all non-reference fields
  20079. SELECT
  20080. tmp.ExcelRowNumber,
  20081. 'First name cannot exceed 30 characters'
  20082. FROM #Import_Staging tmp
  20083. WHERE LEN(tmp.First_Name) > 30
  20084.  
  20085. UNION ALL
  20086.  
  20087. SELECT
  20088. tmp.ExcelRowNumber,
  20089. 'Last name cannot exceed 30 characters'
  20090. FROM #Import_Staging tmp
  20091. WHERE LEN(tmp.Last_Name) > 30
  20092.  
  20093. UNION ALL
  20094.  
  20095. SELECT
  20096. tmp.ExcelRowNumber,
  20097. 'Job title cannot exceed 100 characters'
  20098. FROM #Import_Staging tmp
  20099. WHERE LEN(tmp.Job_Title) > 100
  20100.  
  20101. UNION ALL
  20102.  
  20103. SELECT
  20104. tmp.ExcelRowNumber,
  20105. 'Direct phone cannot exceed 50 characters'
  20106. FROM #Import_Staging tmp
  20107. WHERE LEN(tmp.Direct_Phone) > 50
  20108.  
  20109. UNION ALL
  20110.  
  20111. SELECT
  20112. tmp.ExcelRowNumber,
  20113. 'Extension cannot exceed 15 characters'
  20114. FROM #Import_Staging tmp
  20115. WHERE LEN(tmp.Direct_Extension) > 15
  20116.  
  20117. UNION ALL
  20118.  
  20119. SELECT
  20120. tmp.ExcelRowNumber,
  20121. 'Email address cannot exceed 250 characters'
  20122. FROM #Import_Staging tmp
  20123. WHERE LEN(tmp.Email_Address) > 250
  20124.  
  20125. UNION ALL
  20126.  
  20127. SELECT
  20128. tmp.ExcelRowNumber,
  20129. 'Home phone cannot exceed 50 characters'
  20130. FROM #Import_Staging tmp
  20131. WHERE LEN(tmp.Home_Phone) > 50
  20132.  
  20133. UNION ALL
  20134.  
  20135. SELECT
  20136. tmp.ExcelRowNumber,
  20137. 'Cell Phone cannot exceed 50 characters'
  20138. FROM #Import_Staging tmp
  20139. WHERE LEN(tmp.Cell_Phone) > 50
  20140.  
  20141. UNION ALL
  20142.  
  20143. SELECT
  20144. tmp.ExcelRowNumber,
  20145. 'Activity Subject cannot exceed 100 characters'
  20146. FROM #Import_Staging tmp
  20147. WHERE LEN(tmp.Activity_Subject) > 100
  20148.  
  20149. UNION ALL
  20150.  
  20151. SELECT
  20152. tmp.ExcelRowNumber,
  20153. 'Relationship cannot exceed 50 characters'
  20154. FROM #Import_Staging tmp
  20155. WHERE LEN(tmp.Relationship) > 50
  20156.  
  20157. UNION ALL
  20158.  
  20159. -- User fields cannot exceed 50 characters
  20160. SELECT
  20161. tmp.ExcelRowNumber,
  20162. 'User field 1 cannot exceed 50 characters'
  20163. FROM #Import_Staging tmp
  20164. WHERE LEN(User_Field_1) > 50
  20165. AND User_Field_1_Used = 1
  20166.  
  20167. UNION ALL
  20168.  
  20169. SELECT
  20170. tmp.ExcelRowNumber,
  20171. 'User field 2 cannot exceed 50 characters'
  20172. FROM #Import_Staging tmp
  20173. WHERE LEN(User_Field_2) > 50
  20174. AND User_Field_2_Used = 1
  20175.  
  20176. UNION ALL
  20177.  
  20178. SELECT
  20179. tmp.ExcelRowNumber,
  20180. 'User field 3 cannot exceed 50 characters'
  20181. FROM #Import_Staging tmp
  20182. WHERE LEN(User_Field_3) > 50
  20183. AND User_Field_3_Used = 1
  20184.  
  20185. UNION ALL
  20186.  
  20187. SELECT
  20188. tmp.ExcelRowNumber,
  20189. 'User field 4 cannot exceed 50 characters'
  20190. FROM #Import_Staging tmp
  20191. WHERE LEN(User_Field_4) > 50
  20192. AND User_Field_4_Used = 1
  20193.  
  20194. UNION ALL
  20195.  
  20196. SELECT
  20197. tmp.ExcelRowNumber,
  20198. 'User field 5 cannot exceed 50 characters'
  20199. FROM #Import_Staging tmp
  20200. WHERE LEN(User_Field_5) > 50
  20201. AND User_Field_5_Used = 1
  20202.  
  20203. UNION ALL
  20204.  
  20205. SELECT
  20206. tmp.ExcelRowNumber,
  20207. 'User field 6 cannot exceed 50 characters'
  20208. FROM #Import_Staging tmp
  20209. WHERE LEN(User_Field_6) > 50
  20210. AND User_Field_6_Used = 1
  20211.  
  20212. UNION ALL
  20213.  
  20214. SELECT
  20215. tmp.ExcelRowNumber,
  20216. 'User field 7 cannot exceed 50 characters'
  20217. FROM #Import_Staging tmp
  20218. WHERE LEN(User_Field_7) > 50
  20219. AND User_Field_7_Used = 1
  20220.  
  20221. UNION ALL
  20222.  
  20223. SELECT
  20224. tmp.ExcelRowNumber,
  20225. 'User field 8 cannot exceed 50 characters'
  20226. FROM #Import_Staging tmp
  20227. WHERE LEN(User_Field_8) > 50
  20228. AND User_Field_8_Used = 1
  20229.  
  20230. UNION ALL
  20231.  
  20232. SELECT
  20233. tmp.ExcelRowNumber,
  20234. 'User field 9 cannot exceed 50 characters'
  20235. FROM #Import_Staging tmp
  20236. WHERE LEN(User_Field_9) > 50
  20237. AND User_Field_9_Used = 1
  20238.  
  20239. UNION ALL
  20240.  
  20241. SELECT
  20242. tmp.ExcelRowNumber,
  20243. 'User field 10 cannot exceed 50 characters'
  20244. FROM #Import_Staging tmp
  20245. WHERE LEN(User_Field_10) > 50
  20246. AND User_Field_10_Used = 1
  20247.  
  20248. UNION ALL
  20249.  
  20250. -- User fields can't be entered if 'Not _Used' in dbo.Owner
  20251. SELECT
  20252. tmp.ExcelRowNumber,
  20253. 'User Field 1 cannot be entered because no question has been defined for that field'
  20254. FROM #Import_Staging tmp
  20255. WHERE User_Field_1 IS NOT NULL
  20256. AND User_Field_1_Used = 0
  20257.  
  20258. UNION ALL
  20259.  
  20260. SELECT
  20261. tmp.ExcelRowNumber,
  20262. 'User Field 2 cannot be entered because no question has been defined for that field'
  20263. FROM #Import_Staging tmp
  20264. WHERE User_Field_2 IS NOT NULL
  20265. AND User_Field_2_Used = 0
  20266.  
  20267. UNION ALL
  20268.  
  20269. SELECT
  20270. tmp.ExcelRowNumber,
  20271. 'User Field 3 cannot be entered because no question has been defined for that field'
  20272. FROM #Import_Staging tmp
  20273. WHERE User_Field_3 IS NOT NULL
  20274. AND User_Field_3_Used = 0
  20275.  
  20276. UNION ALL
  20277.  
  20278. SELECT
  20279. tmp.ExcelRowNumber,
  20280. 'User Field 4 cannot be entered because no question has been defined for that field'
  20281. FROM #Import_Staging tmp
  20282. WHERE User_Field_4 IS NOT NULL
  20283. AND User_Field_4_Used = 0
  20284.  
  20285. UNION ALL
  20286.  
  20287. SELECT
  20288. tmp.ExcelRowNumber,
  20289. 'User Field 5 cannot be entered because no question has been defined for that field'
  20290. FROM #Import_Staging tmp
  20291. WHERE User_Field_5 IS NOT NULL
  20292. AND User_Field_5_Used = 0
  20293.  
  20294. UNION ALL
  20295.  
  20296. SELECT
  20297. tmp.ExcelRowNumber,
  20298. 'User Field 6 cannot be entered because no question has been defined for that field'
  20299. FROM #Import_Staging tmp
  20300. WHERE User_Field_6 IS NOT NULL
  20301. AND User_Field_6_Used = 0
  20302.  
  20303. UNION ALL
  20304.  
  20305. SELECT
  20306. tmp.ExcelRowNumber,
  20307. 'User Field 7 cannot be entered because no question has been defined for that field'
  20308. FROM #Import_Staging tmp
  20309. WHERE User_Field_7 IS NOT NULL
  20310. AND User_Field_7_Used = 0
  20311.  
  20312. UNION ALL
  20313.  
  20314. SELECT
  20315. tmp.ExcelRowNumber,
  20316. 'User Field 8 cannot be entered because no question has been defined for that field'
  20317. FROM #Import_Staging tmp
  20318. WHERE User_Field_8 IS NOT NULL
  20319. AND User_Field_8_Used = 0
  20320.  
  20321. UNION ALL
  20322.  
  20323. SELECT
  20324. tmp.ExcelRowNumber,
  20325. 'User Field 9 cannot be entered because no question has been defined for that field'
  20326. FROM #Import_Staging tmp
  20327. WHERE User_Field_9 IS NOT NULL
  20328. AND User_Field_9_Used = 0
  20329.  
  20330. UNION ALL
  20331.  
  20332. SELECT
  20333. tmp.ExcelRowNumber,
  20334. 'User Field 10 cannot be entered because no question has been defined for that field'
  20335. FROM #Import_Staging tmp
  20336. WHERE User_Field_10 IS NOT NULL
  20337. AND User_Field_10_Used = 0
  20338.  
  20339. UNION ALL
  20340.  
  20341. -- Validate portal security level
  20342. SELECT
  20343. tmp.ExcelRowNumber,
  20344. 'Invalid portal security level'
  20345. FROM #Import_Staging tmp
  20346. WHERE Portal_Security_Level_IN IS NOT NULL
  20347. AND Portal_Security_Level_OUT IS NULL
  20348.  
  20349. UNION ALL
  20350.  
  20351. -- Validate portal password
  20352. SELECT
  20353. tmp.ExcelRowNumber,
  20354. 'Portal password cannot exceed 15 characters'
  20355. FROM #Import_Staging tmp
  20356. WHERE Portal_PW IS NOT NULL
  20357. AND CM_Password IS NULL
  20358.  
  20359. UNION ALL
  20360.  
  20361. -- Security level required if password specified
  20362. SELECT
  20363. tmp.ExcelRowNumber,
  20364. 'If a portal password is specified, portal security level is required'
  20365. FROM #Import_Staging tmp
  20366. WHERE Portal_PW IS NOT NULL
  20367. AND Portal_Security_Level_IN IS NULL
  20368.  
  20369. UNION ALL
  20370.  
  20371. -- Password required if security level specified
  20372. SELECT
  20373. tmp.ExcelRowNumber,
  20374. 'If a portal security level is specified, password is required'
  20375. FROM #Import_Staging tmp
  20376. WHERE Portal_PW IS NULL
  20377. AND Portal_Security_Level_IN IS NOT NULL
  20378.  
  20379. -- Return results
  20380. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  20381. BEGIN
  20382.  
  20383. exec dbo.usp_Condense_Validation_Results
  20384.  
  20385. SELECT
  20386. 0 AS ValPassed,
  20387. 0 AS RowNumber,
  20388. ValMsg
  20389. FROM #ResultsCondensed
  20390.  
  20391. ROLLBACK TRANSACTION
  20392. RETURN
  20393.  
  20394. END
  20395. ELSE
  20396. BEGIN
  20397. -- Insert warning for duplicate on Company, First_Name, and Last_Name in final table
  20398. INSERT INTO #tblResults
  20399. (
  20400. RowNumber,
  20401. ValMsg,
  20402. Warning_Flag
  20403. )
  20404.  
  20405. SELECT
  20406. tmp.ExcelRowNumber,
  20407. 'DUPLICATE CONTACT WARNING: A contact already exists named "' + ISNULL(tmp.First_Name, '[No first name]') + ' ' + ISNULL(tmp.Last_Name, '[No last name]') + '" for Company: "' + ISNULL(tmp.Company_Name, '[No company name]') + '". Proceeding with this import will create another contact with this name.',
  20408. 1
  20409. FROM #Import_Staging tmp
  20410. INNER JOIN dbo.Contact cont
  20411. ON ISNULL(dbo.ufn_Import_Trim(cont.First_Name), '') = ISNULL(tmp.First_Name, '')
  20412. AND ISNULL(dbo.ufn_Import_Trim(cont.Last_Name), '') = ISNULL(tmp.Last_Name, '')
  20413. AND cont.Company_RecID = tmp.Company_RecID
  20414. WHERE tmp.Company_Name IS NOT NULL
  20415.  
  20416. UNION ALL
  20417.  
  20418. -- Insert warning if more than one contact on Company, First_Name, Last_Name within this file
  20419. SELECT
  20420. 0,
  20421. 'Warning: This spreadsheet has more than one contact named "' + ISNULL(tmp.First_Name + ' ', '[No first name] ') + ISNULL(tmp.Last_Name, '[No last name]') + '" for Company: "' + ISNULL(tmp.Company_Name, '[No company name]') + '".',
  20422. 1
  20423. FROM #Import_Staging tmp
  20424. WHERE @Legacy_Flag = 0
  20425. GROUP BY tmp.First_name, tmp.Last_Name, tmp.Company_Name
  20426. HAVING COUNT(*) > 1
  20427.  
  20428. UNION ALL
  20429.  
  20430. SELECT
  20431. 0,
  20432. 'MULTIPLE ACTIVITY WARNING: This file contains ' + CAST(COUNT(*) AS VARCHAR(5)) + ' separate activities for the Company: "' + temp.Company_Name + '. Please verify that this was intended before proceeding.',
  20433. 1
  20434. FROM #Import_Staging temp
  20435. WHERE Activity_Assign_To_Member_ID IS NOT NULL
  20436. GROUP BY temp.Company_Name, temp.Company_RecID
  20437. HAVING COUNT(*) > 1
  20438.  
  20439. -- Insert a warning if no primary contact for a company
  20440. --;WITH noprim AS
  20441. --(
  20442. -- -- Get all companies
  20443. -- SELECT DISTINCT Company_Name FROM #Import_Staging WHERE Company_RecID IS NOT NULL
  20444. -- EXCEPT
  20445. -- -- Minus those which have a primary contact set within the spreadsheet
  20446. -- SELECT DISTINCT Company_Name FROM #Import_Staging tmp
  20447. -- WHERE Primary_Contact = '1'
  20448. -- EXCEPT
  20449. -- -- Minus those which have a primary contact set in CW
  20450. -- SELECT DISTINCT Company_Name FROM #Import_Staging tmp
  20451. -- WHERE EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Flag = 1)
  20452. --)
  20453.  
  20454. --INSERT INTO #tblResults
  20455. --(
  20456. -- RowNumber,
  20457. -- ValMsg,
  20458. -- Warning_Flag
  20459. --)
  20460.  
  20461. --SELECT
  20462. -- 0,
  20463. -- 'NO PRIMARY CONTACT WARNING: These companies do not have primary contacts. Consider adding them: "' +
  20464. -- STUFF(
  20465. -- (SELECT '", ' + ISNULL(noprim.Company_Name, '') FROM noprim WHERE Company_Name IS NOT NULL FOR XML PATH(''), TYPE)
  20466. -- .value('text()[1]','nvarchar(max)'),1,2,N''),
  20467. -- 1
  20468.  
  20469.  
  20470. -- If there are warnings, return warning messages, but pass validation
  20471. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
  20472. BEGIN
  20473.  
  20474. exec dbo.usp_Condense_Validation_Results
  20475.  
  20476. SELECT
  20477. 2 AS ValPassed,
  20478. 0 AS RowNumber,
  20479. ValMsg
  20480. FROM #ResultsCondensed res
  20481.  
  20482. ROLLBACK TRANSACTION
  20483. EXEC usp_Import_Record_Validation @TableName
  20484. RETURN
  20485.  
  20486. END
  20487.  
  20488. ELSE
  20489. BEGIN
  20490. SELECT
  20491. 1 AS ValPassed,
  20492. NULL AS RowNumber,
  20493. NULL AS Valmsg
  20494.  
  20495. ROLLBACK TRANSACTION
  20496. EXEC usp_Import_Record_Validation @TableName
  20497. RETURN
  20498. END
  20499.  
  20500. END
  20501. END
  20502. GO
  20503.  
  20504.  
  20505. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Contact_ImportPush')
  20506. BEGIN
  20507. EXEC('CREATE PROCEDURE [dbo].[usp_Contact_ImportPush] AS SELECT 1')
  20508. END
  20509. GO
  20510.  
  20511. -- =============================================
  20512. -- Author: m.gray
  20513. -- Create date: 05/22/2013
  20514. -- Description: Performs final validation and inserts
  20515. -- for contacts import
  20516. -- Sample call: exec usp_Contact_ImportPush '5954214F-479D-4FBB-A133-6B2EE862F9A9'
  20517. -- =============================================
  20518.  
  20519. ALTER PROCEDURE [dbo].[usp_Contact_ImportPush]
  20520. @TableName VARCHAR(MAX),
  20521. @DiffMode BIT = 0, -- Differential mode - (for custom imports) does not import records which already exist on combination of Company_Name, First_Name, and Last_Name
  20522. @ForceMode BIT = 0
  20523. AS
  20524. BEGIN TRY
  20525.  
  20526. -- Turn off diff mode - no longer used
  20527. SELECT @DiffMode = 0
  20528.  
  20529. SET NOCOUNT ON
  20530.  
  20531. -- Set date format to MDY to validate dates from excel
  20532. SET DATEFORMAT MDY
  20533.  
  20534. -- Variable declaration
  20535. DECLARE
  20536. @ExpRowCount INT, -- Expected rowcount for inserts
  20537. @ImportBatchUser VARCHAR(15), -- Member_ID to use for 'UpdatedBy' to identify this batch (i.e. Import3049)
  20538. @ImportBatchID INT, -- RecID from dbo.Lead_Import_Batch
  20539. @ErrorMsg VARCHAR(1500),
  20540. @Owner_ID INT,
  20541. @Communication_Type_RecID INT,
  20542. @Schedule_Type_RecID INT, -- Schedule_Type_RecID for activities
  20543. @Schedule_Type_ID CHAR(1), -- Schedule_Type_ID for activities
  20544. @SO_Act_Status_RecID INT, -- RecID for default activity status
  20545. @SR_Location_RecID INT, -- RecID for default service location
  20546. @Curr_Insert_RecID INT, -- RecID for staging record currently being inserted to Schedule_Detail in loop
  20547. @Max_RecID INT -- Holds max RecID prior to insert on various final tables (used for performance when capturing new identities)
  20548.  
  20549. -- Dynamic statement to insert to validation table
  20550. DECLARE @DSQL VARCHAR(MAX)
  20551.  
  20552. -- Fully qualified name of source table
  20553. DECLARE @SourceTable VARCHAR(300)
  20554. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  20555.  
  20556. -- Object_ID of source table
  20557. DECLARE @Source_Object_ID INT
  20558. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  20559.  
  20560. -- Flag to indicate custom conversion (i.e. Autotask)
  20561. DECLARE @CustomMigration BIT
  20562.  
  20563. SELECT @CustomMigration = 0
  20564.  
  20565. -- Flag to indicate migration being matched on Legacy_ID
  20566. DECLARE @Legacy_Flag BIT = 0
  20567.  
  20568. -- Table variable to hold column names from source table
  20569. DECLARE @SourceColumns TABLE
  20570. (
  20571. ColumnName VARCHAR(255)
  20572. )
  20573.  
  20574. -- Populate @SourceColumns
  20575. INSERT INTO @SourceColumns
  20576. (
  20577. ColumnName
  20578. )
  20579.  
  20580. SELECT
  20581. name
  20582. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  20583.  
  20584. -- Add optional columns to source
  20585. IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Portal Security Level')
  20586. EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Portal Security Level] NVARCHAR(100)')
  20587.  
  20588. IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Portal Password')
  20589. EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Portal Password] NVARCHAR(100)')
  20590.  
  20591. IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
  20592. EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Legacy_ID] NVARCHAR(100)')
  20593.  
  20594. IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
  20595. EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Legacy_Company_ID] NVARCHAR(100)')
  20596.  
  20597. IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Legacy_Site_ID')
  20598. EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Legacy_Site_ID] NVARCHAR(100)')
  20599.  
  20600. IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Inactive_Flag')
  20601. EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Inactive_Flag] NVARCHAR(100)')
  20602.  
  20603. -- Table to hold source data for this batch from temp table
  20604. IF (OBJECT_ID('#Import_Staging') IS NOT NULL)
  20605. BEGIN
  20606. DROP TABLE #Import_Staging
  20607. END
  20608.  
  20609. CREATE TABLE #Import_Staging
  20610. (
  20611. ExcelRowNumber INT NULL,
  20612. Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20613. Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20614. First_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20615. Last_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20616. Site_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20617. Contact_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20618. Relationship nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20619. Department nvarchar(30) COLLATE DATABASE_DEFAULT NULL,
  20620. Job_Title nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20621. Direct_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20622. Direct_Extension NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20623. Email_Address nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20624. Home_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20625. Cell_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20626. Activity_Assign_To_Member_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20627. Activity_Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20628. Activity_Subject nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20629. Activity_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  20630. Activity_Due_Date NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20631. Activity_Marketing_Campaign NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20632. Primary_Contact nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20633. Billing_Contact nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  20634. Contact_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  20635. User_Field_1 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20636. User_Field_2 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20637. User_Field_3 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20638. User_Field_4 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20639. User_Field_5 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20640. User_Field_6 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20641. User_Field_7 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20642. User_Field_8 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20643. User_Field_9 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20644. User_Field_10 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20645. BatchID uniqueidentifier NULL,
  20646. Company_RecID INT,
  20647. Department_RecID INT,
  20648. Company_Address_RecID INT,
  20649. Contact_Type_RecID INT,
  20650. Note_Type_RecID INT,
  20651. Relationship_RecID INT,
  20652. Activity_Member_RecID INT,
  20653. SO_Activity_Type_RecID INT,
  20654. Marketing_Campaign_RecID INT,
  20655. Invalid_Email BIT,
  20656. New_Identity INT,
  20657. Activity_RecID_New INT,
  20658. Schedule_RecID_New INT,
  20659. Contact_RecID_Dup INT,
  20660. Direct_Cleanup_Req BIT,
  20661. Home_Cleanup_Req BIT,
  20662. Cell_Cleanup_Req BIT,
  20663. InsertOrder INT,
  20664. DefaultCommType INT, -- Used to calculate which communication type should be default based on what is/isn't null
  20665. Schedule_Detail_Inserted BIT,
  20666. Portal_Security_Level_IN NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20667. Portal_PW NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20668. CM_Password NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  20669. Portal_Security_Level_OUT INT,
  20670. Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  20671. Legacy_Company_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  20672. Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  20673. Legacy_Contact_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  20674. Contact_RecID INT,
  20675. Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  20676. SR_Service_RecID INT,
  20677. Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
  20678. SO_Opportunity_RecID INT,
  20679. Diff_Exclude_Flag BIT,
  20680. Inactive_Flag BIT
  20681. )
  20682.  
  20683. -- Build statement to populate staging table
  20684. SELECT @DSQL = '
  20685. INSERT INTO #Import_Staging
  20686. (
  20687. ExcelRowNumber,
  20688. Company_Name,
  20689. Company_ID,
  20690. First_Name,
  20691. Last_Name,
  20692. Site_Name,
  20693. Contact_Type,
  20694. Relationship,
  20695. Department,
  20696. Job_Title,
  20697. Direct_Phone,
  20698. Direct_Extension,
  20699. Email_Address,
  20700. Home_Phone,
  20701. Cell_Phone,
  20702. Activity_Assign_To_Member_ID,
  20703. Activity_Type,
  20704. Activity_Subject,
  20705. Activity_Notes,
  20706. Activity_Due_Date,
  20707. Activity_Marketing_Campaign,
  20708. Primary_Contact,
  20709. Billing_Contact,
  20710. Contact_Notes,
  20711. User_Field_1,
  20712. User_Field_2,
  20713. User_Field_3,
  20714. User_Field_4,
  20715. User_Field_5,
  20716. User_Field_6,
  20717. User_Field_7,
  20718. User_Field_8,
  20719. User_Field_9,
  20720. User_Field_10,
  20721. Portal_Security_Level_IN,
  20722. Portal_PW,
  20723. Legacy_ID,
  20724. Legacy_Company_ID,
  20725. Legacy_Site_ID,
  20726. Inactive_Flag
  20727. )
  20728.  
  20729. SELECT
  20730. [Excel Row Number],
  20731. [Company Name],
  20732. [Company ID],
  20733. [First Name],
  20734. [Last Name],
  20735. [Site Name],
  20736. [Contact Type],
  20737. [Relationship],
  20738. LEFT([Department], 30),
  20739. [Job Title],
  20740. [Direct Phone],
  20741. [Direct Extension],
  20742. [Email Address],
  20743. [Home Phone],
  20744. [Cell Phone],
  20745. NULL,
  20746. NULL,
  20747. NULL,
  20748. NULL,
  20749. NULL,
  20750. NULL,
  20751. [Primary Contact],
  20752. [Billing Contact],
  20753. [Contact Notes],
  20754. [User Field 1],
  20755. [User Field 2],
  20756. [User Field 3],
  20757. [User Field 4],
  20758. [User Field 5],
  20759. [User Field 6],
  20760. [User Field 7],
  20761. [User Field 8],
  20762. [User Field 9],
  20763. [User Field 10],
  20764. [Portal Security Level],
  20765. [Portal Password],
  20766. Legacy_ID,
  20767. Legacy_Company_ID,
  20768. Legacy_Site_ID,
  20769. Inactive_Flag
  20770. FROM ' + @SourceTable
  20771.  
  20772. -- Pull data into staging table
  20773. EXEC(@DSQL)
  20774.  
  20775. ---- Update temp table with optional field values if they exist
  20776. --IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Portal Security Level')
  20777. --BEGIN
  20778. -- SELECT @DSQL = '
  20779. -- UPDATE tmp
  20780. -- SET tmp.Portal_Security_Level_IN = src.[Portal Security Level]
  20781. -- FROM #Import_Staging tmp
  20782. -- INNER JOIN ' + @SourceTable + ' src
  20783. -- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  20784.  
  20785. -- EXEC(@DSQL)
  20786. --END
  20787.  
  20788. --IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Portal Password')
  20789. --BEGIN
  20790. -- SELECT @DSQL = '
  20791. -- UPDATE tmp
  20792. -- SET tmp.Portal_PW = src.[Portal Password]
  20793. -- FROM #Import_Staging tmp
  20794. -- INNER JOIN ' + @SourceTable + ' src
  20795. -- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  20796.  
  20797. -- EXEC(@DSQL)
  20798. --END
  20799.  
  20800. --IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
  20801. --BEGIN
  20802. -- SELECT @DSQL = '
  20803. -- UPDATE tmp
  20804. -- SET tmp.Legacy_ID = src.Legacy_ID
  20805. -- FROM #Import_Staging tmp
  20806. -- INNER JOIN ' + @SourceTable + ' src
  20807. -- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  20808.  
  20809. -- EXEC(@DSQL)
  20810. --END
  20811.  
  20812. --IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Inactive_Flag')
  20813. --BEGIN
  20814. -- SELECT @DSQL = '
  20815. -- UPDATE tmp
  20816. -- SET tmp.Inactive_Flag = src.Inactive_Flag
  20817. -- FROM #Import_Staging tmp
  20818. -- CROSS APPLY(SELECT TOP 1 Inactive_Flag FROM ' + @SourceTable + ' src WHERE src.[Excel Row Number] = tmp.ExcelRowNumber)src
  20819. -- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  20820.  
  20821. -- EXEC(@DSQL)
  20822. --END
  20823.  
  20824. -- Update empty string or single space to null in staging table
  20825. UPDATE #Import_Staging SET
  20826. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  20827. Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
  20828. Company_ID = CASE WHEN Company_ID IN('', ' ') THEN NULL ELSE Company_ID END,
  20829. First_Name = CASE WHEN First_Name IN('', ' ') THEN NULL ELSE First_Name END,
  20830. Last_Name = CASE WHEN Last_Name IN('', ' ') THEN NULL ELSE Last_Name END,
  20831. Site_Name = CASE WHEN Site_Name IN('', ' ') THEN NULL ELSE Site_Name END,
  20832. Contact_Type = CASE WHEN Contact_Type IN('', ' ') THEN NULL ELSE Contact_Type END,
  20833. Relationship = CASE WHEN Relationship IN('', ' ') THEN NULL ELSE Relationship END,
  20834. Department = CASE WHEN Department IN('', ' ') THEN NULL ELSE Department END,
  20835. Job_Title = CASE WHEN Job_Title IN('', ' ') THEN NULL ELSE Job_Title END,
  20836. Direct_Phone = CASE WHEN Direct_Phone IN('', ' ') THEN NULL ELSE Direct_Phone END,
  20837. Direct_Extension = CASE WHEN Direct_Extension IN('', ' ') THEN NULL ELSE Direct_Extension END,
  20838. Email_Address = CASE WHEN Email_Address IN('', ' ') THEN NULL ELSE Email_Address END,
  20839. Home_Phone = CASE WHEN Home_Phone IN('', ' ') THEN NULL ELSE Home_Phone END,
  20840. Cell_Phone = CASE WHEN Cell_Phone IN('', ' ') THEN NULL ELSE Cell_Phone END,
  20841. Activity_Assign_To_Member_ID = CASE WHEN Activity_Assign_To_Member_ID IN('', ' ') THEN NULL ELSE Activity_Assign_To_Member_ID END,
  20842. Activity_Type = CASE WHEN Activity_Type IN('', ' ') THEN NULL ELSE Activity_Type END,
  20843. Activity_Subject = CASE WHEN Activity_Subject IN('', ' ') THEN NULL ELSE Activity_Subject END,
  20844. Activity_Notes = CASE WHEN Activity_Notes IN('', ' ') THEN NULL ELSE Activity_Notes END,
  20845. Activity_Due_Date = CASE WHEN Activity_Due_Date IN('', ' ') THEN NULL ELSE Activity_Due_Date END,
  20846. Activity_Marketing_Campaign = CASE WHEN Activity_Marketing_Campaign IN('', ' ') THEN NULL ELSE Activity_Marketing_Campaign END,
  20847. Primary_Contact = CASE WHEN Primary_Contact IN('', ' ') THEN NULL ELSE Primary_Contact END,
  20848. Billing_Contact = CASE WHEN Billing_Contact IN('', ' ') THEN NULL ELSE Billing_Contact END,
  20849. Contact_Notes = CASE WHEN Contact_Notes IN('', ' ') THEN NULL ELSE Contact_Notes END,
  20850. User_Field_1 = CASE WHEN User_Field_1 IN('', ' ') THEN NULL ELSE User_Field_1 END,
  20851. User_Field_2 = CASE WHEN User_Field_2 IN('', ' ') THEN NULL ELSE User_Field_2 END,
  20852. User_Field_3 = CASE WHEN User_Field_3 IN('', ' ') THEN NULL ELSE User_Field_3 END,
  20853. User_Field_4 = CASE WHEN User_Field_4 IN('', ' ') THEN NULL ELSE User_Field_4 END,
  20854. User_Field_5 = CASE WHEN User_Field_5 IN('', ' ') THEN NULL ELSE User_Field_5 END,
  20855. User_Field_6 = CASE WHEN User_Field_6 IN('', ' ') THEN NULL ELSE User_Field_6 END,
  20856. User_Field_7 = CASE WHEN User_Field_7 IN('', ' ') THEN NULL ELSE User_Field_7 END,
  20857. User_Field_8 = CASE WHEN User_Field_8 IN('', ' ') THEN NULL ELSE User_Field_8 END,
  20858. User_Field_9 = CASE WHEN User_Field_9 IN('', ' ') THEN NULL ELSE User_Field_9 END,
  20859. User_Field_10 = CASE WHEN User_Field_10 IN('', ' ') THEN NULL ELSE User_Field_10 END,
  20860. Portal_Security_Level_IN = CASE WHEN Portal_Security_Level_IN IN('', ' ') THEN NULL ELSE Portal_Security_Level_IN END,
  20861. Portal_PW = CASE WHEN Portal_PW IN('', ' ') THEN NULL ELSE Portal_PW END
  20862.  
  20863. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
  20864. BEGIN
  20865. SELECT @Legacy_Flag = 1
  20866. EXEC usp_Import_Match_Legacy @TableName, 'Contact'
  20867. END
  20868.  
  20869. -- Identify if Autotask/Custom conversion and handle appropriately
  20870. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Contact_Type = 'CW_Custom_Conversion')
  20871. BEGIN
  20872. -- Get rid of export config row created by SSIS
  20873. DELETE FROM #Import_Staging
  20874. WHERE Contact_Type = 'CW_Custom_Conversion'
  20875.  
  20876. -- Set flag to indicate custom migration
  20877. SELECT @CustomMigration = 1
  20878.  
  20879. END
  20880.  
  20881. -- Table to hold trimmed company names and company_ids from dbo.company
  20882. -- Prevents need to join on trim function each time we touch company table (performance concern)
  20883. -- Also filters rows that are unrelated to import batch
  20884. DECLARE @Company TABLE
  20885. (
  20886. Company_RecID INT,
  20887. Company_ID VARCHAR(50),
  20888. Company_Name VARCHAR(50),
  20889. Delete_Flag BIT
  20890. )
  20891.  
  20892. -- Populate @Company
  20893. INSERT INTO @Company
  20894. (
  20895. Company_RecID,
  20896. Company_ID,
  20897. Company_Name,
  20898. Delete_Flag
  20899. )
  20900. -- With rows that require trimming
  20901. SELECT
  20902. Company_RecID,
  20903. dbo.ufn_Import_Trim(Company_ID),
  20904. dbo.ufn_Import_Trim(Company_Name),
  20905. Delete_Flag
  20906. FROM dbo.Company comp
  20907. -- Use ASCII match to detect leading or trailing spaces
  20908. WHERE ASCII(LEFT(comp.Company_Name, 1)) = 32
  20909. OR ASCII(RIGHT(comp.Company_Name, 1)) = 32
  20910. OR ASCII(LEFT(comp.Company_ID, 1)) = 32
  20911. OR ASCII(RIGHT(comp.Company_Name, 1)) = 32
  20912.  
  20913. UNION
  20914.  
  20915. -- And rows that do not require trimming
  20916. SELECT
  20917. Company_RecID,
  20918. Company_ID,
  20919. Company_Name,
  20920. Delete_Flag
  20921. FROM dbo.Company
  20922. -- WHERE condition to exclude rows unrelated to import batch
  20923. WHERE Company_Name IN(SELECT Company_Name FROM #Import_Staging)
  20924. OR Company_ID IN(SELECT Company_ID FROM #Import_Staging)
  20925.  
  20926. -- Join to tables in CW to gather RecID's for references
  20927. -- Company_RecID
  20928. -- Get by Company_ID first
  20929. UPDATE tmp
  20930. SET tmp.Company_RecID = comp.Company_RecID
  20931. FROM #Import_Staging tmp
  20932. INNER JOIN @Company comp
  20933. ON comp.Company_ID = tmp.Company_ID
  20934. AND comp.Delete_Flag = 0
  20935. WHERE tmp.Company_ID IS NOT NULL
  20936.  
  20937. -- Get by Company name for records where Company_ID is null
  20938. UPDATE tmp
  20939. SET tmp.Company_RecID = comp.Company_RecID
  20940. FROM #Import_Staging tmp
  20941. INNER JOIN @Company comp
  20942. ON comp.Company_Name = tmp.Company_Name
  20943. AND comp.Delete_Flag = 0
  20944. WHERE tmp.Company_ID IS NULL
  20945.  
  20946. -- Department_RecID
  20947. UPDATE tmp
  20948. SET tmp.Department_RecID = dep.Department_RecID
  20949. FROM #Import_Staging tmp
  20950. INNER JOIN dbo.Department dep
  20951. ON dbo.ufn_Import_Trim(dep.Department_Name) = tmp.Department
  20952.  
  20953. -- Company_Address_RecID
  20954. -- If site name specified, get by site name
  20955. UPDATE tmp
  20956. SET tmp.Company_Address_RecID = cad.Company_Address_RecID
  20957. FROM #Import_Staging tmp
  20958. INNER JOIN dbo.Company_Address cad
  20959. ON cad.Company_RecID = tmp.Company_RecID
  20960. AND tmp.Site_Name = cad.[Description]
  20961. WHERE tmp.Site_Name IS NOT NULL
  20962.  
  20963. -- If site name not specified, get default
  20964. UPDATE tmp
  20965. SET tmp.Company_Address_RecID = cad.Company_Address_RecID
  20966. FROM #Import_Staging tmp
  20967. INNER JOIN dbo.Company_Address cad
  20968. ON cad.Company_RecID = tmp.Company_RecID
  20969. AND cad.Default_Flag = 1
  20970. WHERE tmp.Company_Address_RecID IS NULL
  20971.  
  20972. -- Note_Type_RecID for default note type
  20973. UPDATE tmp
  20974. SET tmp.Note_Type_RecID = nt.Note_Type_RecID
  20975. FROM #Import_Staging tmp
  20976. INNER JOIN dbo.Note_Type nt
  20977. ON nt.Default_Flag = 1
  20978.  
  20979. -- Activity_Member_RecID
  20980. UPDATE tmp
  20981. SET tmp.Activity_Member_RecID = mem.Member_RecID
  20982. FROM #Import_Staging tmp
  20983. INNER JOIN dbo.Member mem
  20984. ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.Activity_Assign_To_Member_ID
  20985.  
  20986. -- Contact_Type_RecID
  20987. UPDATE tmp
  20988. SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
  20989. FROM #Import_Staging tmp
  20990. INNER JOIN dbo.Contact_Type ct
  20991. ON tmp.Contact_Type = dbo.ufn_Import_Trim(ct.[Description])
  20992. WHERE tmp.Contact_Type IS NOT NULL
  20993.  
  20994. -- Get default contact type if not specified in spreadsheet
  20995. UPDATE tmp
  20996. SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
  20997. FROM #Import_Staging tmp
  20998. INNER JOIN dbo.Contact_Type ct
  20999. ON ct.Default_Flag = 1
  21000. WHERE tmp.Contact_Type IS NULL
  21001.  
  21002. -- Marketing_Campaign_RecID
  21003. UPDATE tmp
  21004. SET tmp.Marketing_Campaign_RecID = mc.Marketing_Campaign_RecID
  21005. FROM #Import_Staging tmp
  21006. INNER JOIN dbo.Marketing_Campaign mc
  21007. ON tmp.Activity_Marketing_Campaign = dbo.ufn_Import_Trim(mc.Marketing_ID)
  21008. WHERE tmp.Activity_Marketing_Campaign IS NOT NULL
  21009.  
  21010. -- SO_Activity_Type_RecID
  21011. UPDATE tmp
  21012. SET tmp.SO_Activity_Type_RecID = at.SO_Activity_Type_RecID
  21013. FROM #Import_Staging tmp
  21014. INNER JOIN dbo.SO_Activity_Type at
  21015. ON dbo.ufn_Import_Trim(at.[Description]) = tmp.Activity_Type
  21016. WHERE tmp.Activity_Type IS NOT NULL
  21017.  
  21018. -- Get default Activity_Type if not specified
  21019. UPDATE tmp
  21020. SET tmp.SO_Activity_Type_RecID = at.SO_Activity_Type_RecID
  21021. FROM #Import_Staging tmp
  21022. INNER JOIN dbo.SO_Activity_Type at
  21023. ON at.Default_Flag = 1
  21024. WHERE tmp.Activity_Type IS NULL
  21025. AND tmp.Activity_Assign_To_Member_ID IS NOT NULL
  21026.  
  21027. -- Get Schedule_Type ID and RecID for so_activity
  21028. SELECT @Schedule_Type_RecID = (SELECT TOP 1 Schedule_Type_RecID FROM dbo.Schedule_Type WHERE Table_Reference = 'so_activity')
  21029. SELECT @Schedule_Type_ID = (SELECT Schedule_Type_ID FROM dbo.Schedule_Type WHERE Schedule_Type_RecID = @Schedule_Type_RecID)
  21030.  
  21031. -- Get default SO_Act_Status_RecID
  21032. SELECT @SO_Act_Status_RecID = (SELECT TOP 1 SO_Act_Status_RecID FROM dbo.SO_Act_Status WHERE Default_Flag = 1)
  21033.  
  21034. -- Get default SR_Location_RecID for activity location
  21035. SELECT @SR_Location_RecID = (SELECT TOP 1 SR_Location_RecID FROM dbo.SR_Location WHERE Default_Flag = 1)
  21036.  
  21037. -- Update boolean fields to 0 or 1
  21038. UPDATE stag
  21039. SET stag.Primary_Contact = CASE WHEN stag.Primary_Contact IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' ELSE 0 END,
  21040. stag.Billing_Contact = CASE WHEN stag.Billing_Contact IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' ELSE 0 END
  21041. FROM #Import_Staging stag
  21042.  
  21043. UPDATE stag
  21044. SET stag.Inactive_Flag = '0'
  21045. FROM #Import_Staging stag
  21046. WHERE stag.Inactive_Flag IS NULL
  21047. OR stag.Inactive_Flag <> '1'
  21048.  
  21049. -- Determine if contacts have a duplicate on Company and Contact Name and remove from staging table (only for differential mode)
  21050. IF @DiffMode = 1 AND @Legacy_Flag = 0
  21051. BEGIN
  21052. DELETE stag
  21053. FROM #Import_Staging stag
  21054. INNER JOIN dbo.Contact cont
  21055. ON ISNULL(cont.Company_RecID, -1) = ISNULL(stag.Company_RecID, -1)
  21056. AND ISNULL(dbo.ufn_Import_Trim(cont.First_Name), '') = ISNULL(stag.First_Name, '')
  21057. AND ISNULL(dbo.ufn_Import_Trim(cont.Last_Name), '') = ISNULL(stag.Last_Name, '')
  21058. END
  21059.  
  21060. -- Determine phone numbers that need cleanup (pre-processing step to save on resource intensive string cleanup operation)
  21061. UPDATE #Import_Staging
  21062. SET Direct_Cleanup_Req = 1
  21063. WHERE PATINDEX('%[^0-9()-+ ]%', Direct_Phone) > 0
  21064.  
  21065. UPDATE #Import_Staging
  21066. SET Home_Cleanup_Req = 1
  21067. WHERE PATINDEX('%[^0-9()-+ ]%', Home_Phone) > 0
  21068.  
  21069. UPDATE #Import_Staging
  21070. SET Cell_Cleanup_Req = 1
  21071. WHERE PATINDEX('%[^0-9()-+ ]%', Cell_Phone) > 0
  21072.  
  21073. -- Cleanup phone numbers that have non-numeric characters
  21074. -- Direct Phone
  21075. ;WITH Num1 (n) AS
  21076. (SELECT 1 UNION ALL SELECT 1),
  21077. Num2 (n) AS
  21078. (SELECT 1 FROM Num1 AS X, Num1 AS Y),
  21079. Num3 (n) AS
  21080. (SELECT 1 FROM Num2 AS X, Num2 AS Y),
  21081. Num4 (n) AS
  21082. (SELECT 1 FROM Num3 AS X, Num3 AS Y),
  21083. Nums (n) AS
  21084. (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
  21085. Cleaner AS
  21086. (
  21087. SELECT Direct_Phone, (
  21088.  
  21089. SELECT CASE WHEN SUBSTRING(Direct_Phone, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(Direct_Phone, n, 1) ELSE '' END + ''
  21090. FROM Nums
  21091. WHERE n <= LEN(Direct_Phone)
  21092. FOR XML PATH('')) AS PhoneNbr_Comp_clean
  21093. FROM #Import_Staging
  21094. WHERE Direct_Cleanup_Req = 1
  21095. )
  21096.  
  21097. UPDATE stag
  21098. SET stag.Direct_Phone = REPLACE(cl.PhoneNbr_Comp_clean, '&#x20;', ' ')
  21099. FROM #Import_Staging stag
  21100. INNER JOIN Cleaner cl
  21101. ON cl.Direct_Phone = stag.Direct_Phone
  21102.  
  21103. -- Home Phone
  21104. ;WITH Num1 (n) AS
  21105. (SELECT 1 UNION ALL SELECT 1),
  21106. Num2 (n) AS
  21107. (SELECT 1 FROM Num1 AS X, Num1 AS Y),
  21108. Num3 (n) AS
  21109. (SELECT 1 FROM Num2 AS X, Num2 AS Y),
  21110. Num4 (n) AS
  21111. (SELECT 1 FROM Num3 AS X, Num3 AS Y),
  21112. Nums (n) AS
  21113. (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
  21114. Cleaner AS
  21115. (
  21116. SELECT Home_Phone, (
  21117.  
  21118. SELECT CASE WHEN SUBSTRING(Home_Phone, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(Home_Phone, n, 1) ELSE '' END + ''
  21119. FROM Nums
  21120. WHERE n <= LEN(Home_Phone)
  21121. FOR XML PATH('')) AS PhoneNbr_Comp_clean
  21122. FROM #Import_Staging
  21123. WHERE Home_Cleanup_Req = 1
  21124. )
  21125.  
  21126. UPDATE stag
  21127. SET stag.Home_Phone = REPLACE(cl.PhoneNbr_Comp_clean, '&#x20;', ' ')
  21128. FROM #Import_Staging stag
  21129. INNER JOIN Cleaner cl
  21130. ON cl.Home_Phone = stag.Home_Phone
  21131.  
  21132. -- Cell Phone
  21133. ;WITH Num1 (n) AS
  21134. (SELECT 1 UNION ALL SELECT 1),
  21135. Num2 (n) AS
  21136. (SELECT 1 FROM Num1 AS X, Num1 AS Y),
  21137. Num3 (n) AS
  21138. (SELECT 1 FROM Num2 AS X, Num2 AS Y),
  21139. Num4 (n) AS
  21140. (SELECT 1 FROM Num3 AS X, Num3 AS Y),
  21141. Nums (n) AS
  21142. (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
  21143. Cleaner AS
  21144. (
  21145. SELECT Cell_Phone, (
  21146.  
  21147. SELECT CASE WHEN SUBSTRING(Cell_Phone, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(Cell_Phone, n, 1) ELSE '' END + ''
  21148. FROM Nums
  21149. WHERE n <= LEN(Cell_Phone)
  21150. FOR XML PATH('')) AS PhoneNbr_Comp_clean
  21151. FROM #Import_Staging
  21152. WHERE Cell_Cleanup_Req = 1
  21153. )
  21154.  
  21155. UPDATE stag
  21156. SET stag.Cell_Phone = REPLACE(cl.PhoneNbr_Comp_clean, '&#x20;', ' ')
  21157. FROM #Import_Staging stag
  21158. INNER JOIN Cleaner cl
  21159. ON cl.Cell_Phone = stag.Cell_Phone
  21160.  
  21161. -- Determine which communication should be inserted as default for each contact (Preference order: Direct Phone -> Cell Phone -> Home Phone -> Email
  21162. UPDATE stag
  21163. SET stag.DefaultCommType =
  21164. CASE
  21165. WHEN Direct_Phone IS NOT NULL THEN 1
  21166. WHEN Cell_Phone IS NOT NULL THEN 2
  21167. WHEN Home_Phone IS NOT NULL THEN 3
  21168. WHEN Email_Address IS NOT NULL THEN 4
  21169. ELSE NULL
  21170. END
  21171. FROM #Import_Staging stag
  21172.  
  21173. -- Portal security level
  21174. -- By security level caption
  21175. UPDATE tmp
  21176. SET tmp.Portal_Security_Level_Out =
  21177. CASE cc.Field_Name
  21178. WHEN 'portal_security_level_1' THEN 1
  21179. WHEN 'portal_security_level_2' THEN 2
  21180. WHEN 'portal_security_level_3' THEN 3
  21181. WHEN 'portal_security_level_4' THEN 4
  21182. WHEN 'portal_security_level_5' THEN 5
  21183. WHEN 'portal_security_level_6' THEN 6
  21184. ELSE NULL END
  21185. FROM #Import_Staging tmp
  21186. CROSS APPLY(SELECT TOP 1 * FROM dbo.Custom_Caption cc WHERE cc.Caption = tmp.Portal_Security_Level_IN AND cc.Field_Name LIKE('Portal_Security_Level_%')) cc
  21187. WHERE tmp.Portal_Security_Level_IN IS NOT NULL
  21188. AND tmp.Portal_Security_Level_IN <> ''
  21189.  
  21190. -- By security level number
  21191. UPDATE tmp
  21192. SET tmp.Portal_Security_Level_OUT = tmp.Portal_Security_Level_IN
  21193. FROM #Import_Staging tmp
  21194. WHERE ISNUMERIC(tmp.Portal_Security_Level_IN) = 1
  21195. AND tmp.Portal_Security_Level_IN BETWEEN 1 AND 6
  21196. AND tmp.Portal_Security_Level_OUT IS NULL
  21197.  
  21198. -- Get portal password
  21199. UPDATE tmp
  21200. SET tmp.CM_Password = dbo.udf_EncrDecr(Portal_PW, 'E')
  21201. FROM #Import_Staging tmp
  21202. WHERE tmp.Portal_PW IS NOT NULL
  21203. AND LEN(Portal_PW) <= 15
  21204.  
  21205. -- Clean up/insert references as-necessary for force mode
  21206. UPDATE tmp
  21207. SET tmp.Primary_Contact = 0
  21208. FROM #Import_Staging tmp
  21209. INNER JOIN dbo.Contact cont
  21210. ON tmp.Company_RecID = cont.Company_RecID
  21211. AND cont.Default_Flag = 1
  21212. AND tmp.Primary_Contact = 1
  21213. WHERE @ForceMode = 1
  21214.  
  21215. UPDATE tmp
  21216. SET tmp.Billing_Contact = 0
  21217. FROM #Import_Staging tmp
  21218. INNER JOIN dbo.Contact cont
  21219. ON tmp.Company_RecID = cont.Company_RecID
  21220. AND cont.Default_Billing_Flag = 1
  21221. AND tmp.Billing_Contact = 1
  21222. WHERE @ForceMode = 1
  21223.  
  21224. INSERT INTO Contact_Type
  21225. (
  21226. Contact_Type_ID,
  21227. [Description],
  21228. Default_Flag,
  21229. Last_Update,
  21230. Updated_By
  21231. )
  21232.  
  21233. SELECT DISTINCT
  21234. '',
  21235. tmp.Contact_Type,
  21236. 0,
  21237. GETDATE(),
  21238. 'Import'
  21239. FROM #Import_Staging tmp
  21240. WHERE Contact_Type IS NOT NULL
  21241. AND Contact_Type_RecID IS NULL
  21242. AND @ForceMode = 1
  21243.  
  21244.  
  21245. UPDATE tmp
  21246. SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
  21247. FROM #Import_Staging tmp
  21248. INNER JOIN dbo.Contact_Type ct
  21249. ON tmp.Contact_Type = dbo.ufn_Import_Trim(ct.[Description])
  21250. WHERE tmp.Contact_Type IS NOT NULL
  21251. AND tmp.Contact_Type_RecID IS NULL
  21252. AND @ForceMode = 1
  21253.  
  21254. INSERT INTO dbo.Department
  21255. (
  21256. Owner_ID,
  21257. Department_Name,
  21258. Last_Update,
  21259. Updated_By
  21260. )
  21261.  
  21262. SELECT DISTINCT
  21263. 1,
  21264. Department,
  21265. GETDATE(),
  21266. 'Import'
  21267. FROM #Import_Staging tmp
  21268. WHERE tmp.Department IS NOT NULL
  21269. AND tmp.Department_RecID IS NULL
  21270. AND @ForceMode = 1
  21271.  
  21272. -- Department_RecID
  21273. UPDATE tmp
  21274. SET tmp.Department_RecID = dep.Department_RecID
  21275. FROM #Import_Staging tmp
  21276. INNER JOIN dbo.Department dep
  21277. ON dbo.ufn_Import_Trim(dep.Department_Name) = tmp.Department
  21278. WHERE Department IS NOT NULL
  21279. AND tmp.Department_RecID IS NULL
  21280. AND @ForceMode = 1
  21281.  
  21282. UPDATE #Import_Staging
  21283. SET First_Name = '[No Name]'
  21284. WHERE First_Name IS NULL
  21285. AND Last_Name IS NULL
  21286.  
  21287. -- Begin Push
  21288. BEGIN TRANSACTION Contact_Import
  21289.  
  21290. -- Insert to dbo.Lead_Import_Batch to generate new batch
  21291. INSERT INTO Lead_Import_Batch
  21292. (
  21293. [Description]
  21294. )
  21295. SELECT 'Contact import batch run at: ' + CAST(GETDATE() AS VARCHAR(25))
  21296.  
  21297. -- Get RecID FROM Lead_Import_Batch
  21298. SELECT @ImportBatchID = SCOPE_IDENTITY()
  21299.  
  21300. -- Set Member_ID to use for 'UpdatedBy' to identify this batch
  21301. SELECT @ImportBatchUser = 'Import' + CAST(@ImportBatchID AS VARCHAR(9))
  21302.  
  21303. -- Get expected rowcount for dbo.Contact insert
  21304. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging
  21305.  
  21306. -- Get Owner_ID for inserts
  21307. SELECT @Owner_ID = (SELECT TOP 1 Owner_ID FROM dbo.[Owner])
  21308.  
  21309. -- Handle case where site no longer exists (Phase 2 migration)
  21310. UPDATE stag
  21311. SET stag.Company_Address_RecID = pri.Company_Address_RecID
  21312. FROM #Import_Staging stag
  21313. OUTER APPLY(SELECT TOP 1 * FROM Company_Address pri WHERE pri.Company_RecID = stag.Company_RecID ORDER BY Default_Flag DESC)pri
  21314. WHERE NOT EXISTS(SELECT 1 FROM Company_Address cad WHERE cad.Company_Address_RecID = stag.Company_Address_RecID)
  21315.  
  21316. -- Insert new contacts to dbo.Contact
  21317. -- Repurpose Seq_Nbr field to catch identity from source table
  21318. -- Pre-2016.3
  21319. IF NOT EXISTS(SELECT TOP 1 * FROM sys.tables WHERE name = 'Contact_Portal_Access')
  21320. BEGIN
  21321. INSERT INTO dbo.Contact
  21322. (
  21323. Owner_ID,
  21324. Company_RecID,
  21325. First_Name,
  21326. Last_Name,
  21327. Title,
  21328. Relationship,
  21329. Default_Flag,
  21330. Last_Update,
  21331. Updated_By,
  21332. Contact_Type_RecID,
  21333. Userfield1,
  21334. Userfield2,
  21335. Userfield3,
  21336. Userfield4,
  21337. Userfield5,
  21338. Userfield6,
  21339. Userfield7,
  21340. Userfield8,
  21341. Userfield9,
  21342. Userfield10,
  21343. Company_Address_RecID,
  21344. Default_Billing_Flag,
  21345. Date_Entered,
  21346. Seq_Nbr,
  21347. Portal_Security_Level,
  21348. CM_Password,
  21349. Inactive_Flag
  21350. )
  21351.  
  21352. SELECT
  21353. @Owner_ID,
  21354. Company_RecID,
  21355. First_Name,
  21356. Last_Name,
  21357. Job_Title,
  21358. Relationship,
  21359. Primary_Contact,
  21360. GETDATE(),
  21361. @ImportBatchUser,
  21362. Contact_Type_RecID,
  21363. User_Field_1,
  21364. User_Field_2,
  21365. User_Field_3,
  21366. User_Field_4,
  21367. User_Field_5,
  21368. User_Field_6,
  21369. User_Field_7,
  21370. User_Field_8,
  21371. User_Field_9,
  21372. User_Field_10,
  21373. Company_Address_RecID,
  21374. Billing_Contact,
  21375. GETDATE(),
  21376. ExcelRowNumber,
  21377. Portal_Security_Level_OUT,
  21378. CM_Password,
  21379. Inactive_Flag
  21380. FROM #Import_Staging stag
  21381. ORDER BY ExcelRowNumber ASC
  21382. END
  21383.  
  21384. IF EXISTS(SELECT TOP 1 * FROM sys.tables WHERE name = 'Contact_Portal_Access')
  21385. BEGIN
  21386. INSERT INTO dbo.Contact
  21387. (
  21388. Owner_ID,
  21389. Company_RecID,
  21390. First_Name,
  21391. Last_Name,
  21392. Title,
  21393. Relationship,
  21394. Default_Flag,
  21395. Last_Update,
  21396. Updated_By,
  21397. Contact_Type_RecID,
  21398. Userfield1,
  21399. Userfield2,
  21400. Userfield3,
  21401. Userfield4,
  21402. Userfield5,
  21403. Userfield6,
  21404. Userfield7,
  21405. Userfield8,
  21406. Userfield9,
  21407. Userfield10,
  21408. Company_Address_RecID,
  21409. Default_Billing_Flag,
  21410. Date_Entered,
  21411. Seq_Nbr,
  21412. Inactive_Flag
  21413. )
  21414.  
  21415. SELECT
  21416. @Owner_ID,
  21417. Company_RecID,
  21418. First_Name,
  21419. Last_Name,
  21420. Job_Title,
  21421. Relationship,
  21422. Primary_Contact,
  21423. GETDATE(),
  21424. @ImportBatchUser,
  21425. Contact_Type_RecID,
  21426. User_Field_1,
  21427. User_Field_2,
  21428. User_Field_3,
  21429. User_Field_4,
  21430. User_Field_5,
  21431. User_Field_6,
  21432. User_Field_7,
  21433. User_Field_8,
  21434. User_Field_9,
  21435. User_Field_10,
  21436. Company_Address_RecID,
  21437. Billing_Contact,
  21438. GETDATE(),
  21439. ExcelRowNumber,
  21440. Inactive_Flag
  21441. FROM #Import_Staging stag
  21442. ORDER BY ExcelRowNumber ASC
  21443. END
  21444.  
  21445. -- Join dbo.Contact back to staging table to get new identities
  21446. UPDATE stag
  21447. SET stag.New_Identity = cont.Contact_RecID
  21448. FROM #Import_Staging stag
  21449. INNER JOIN dbo.Contact cont
  21450. ON cont.Seq_Nbr = stag.ExcelRowNumber
  21451. AND Updated_By = @ImportBatchUser
  21452.  
  21453. -- Contact_Portal_Access insert for 2016.3+
  21454. IF EXISTS(SELECT TOP 1 * FROM sys.tables WHERE name = 'Contact_Portal_Access')
  21455. BEGIN
  21456. INSERT INTO Contact_Portal_Access
  21457. (
  21458. Contact_RecID,
  21459. CM_Password,
  21460. Disable_Flag,
  21461. Portal_Security_Level,
  21462. Last_Update_UTC,
  21463. Updated_By,
  21464. Login_Attempts,
  21465. Account_Locked
  21466. )
  21467.  
  21468. SELECT
  21469. New_Identity,
  21470. CM_Password,
  21471. 0,
  21472. Portal_Security_Level_Out,
  21473. GETUTCDATE(),
  21474. @ImportBatchUser,
  21475. 0,
  21476. 0
  21477. FROM #Import_Staging
  21478. WHERE CM_Password IS NOT NULL
  21479. END
  21480.  
  21481. -- Reset Seq_Nbr to 0 for rows in this batch
  21482. UPDATE cont
  21483. SET cont.Seq_Nbr = 0
  21484. FROM dbo.Contact cont
  21485. WHERE Updated_By = @ImportBatchUser
  21486.  
  21487. -- All records should have a New_Identity now - error/rollback if not
  21488. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE New_Identity IS NULL)
  21489. BEGIN
  21490. RAISERROR('NULL New_Identity after insert to dbo.Contact', 16, 1)
  21491. END
  21492.  
  21493. -- Get rowcount for dbo.Contact_Note insert
  21494. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Contact_Notes IS NOT NULL
  21495.  
  21496. -- Perform insert to dbo.Contact_Note
  21497. INSERT INTO dbo.Contact_Note
  21498. (
  21499. Owner_ID,
  21500. Contact_RecID,
  21501. Note_Type_RecID,
  21502. Notes,
  21503. Entered_By,
  21504. Last_Update,
  21505. Updated_By
  21506. )
  21507.  
  21508. SELECT
  21509. @Owner_ID,
  21510. New_Identity,
  21511. Note_Type_RecID,
  21512. Contact_Notes,
  21513. @ImportBatchUser,
  21514. GETDATE(),
  21515. @ImportBatchUser
  21516. FROM #Import_Staging stag
  21517. WHERE stag.Contact_Notes IS NOT NULL
  21518.  
  21519. -- Compare expected rowcount to actual - error on mistmatch to force rollback
  21520. IF @@ROWCOUNT <> @ExpRowCount
  21521. BEGIN
  21522. SELECT @ErrorMsg = 'dbo.Contact_Note insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
  21523. RAISERROR(@ErrorMsg, 16, 1)
  21524. END
  21525.  
  21526. -- Set expected rowcount for direct number insert
  21527. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Direct_Phone IS NOT NULL
  21528.  
  21529. -- Set Communication_Type_RecID for Direct
  21530. SELECT @Communication_Type_RecID = (SELECT TOP 1 Communication_Type_RecID FROM dbo.Communication_Type WHERE Communication_Name = 'Direct' and Phone_Flag = 1)
  21531.  
  21532. -- Perform insert to dbo.Contact_Communication for direct phone
  21533. INSERT INTO dbo.Contact_Communication
  21534. (
  21535. Owner_ID,
  21536. Contact_RecID,
  21537. Communication_Type_RecID,
  21538. Default_Flag,
  21539. [Description],
  21540. Extension,
  21541. Last_Update,
  21542. Updated_By
  21543. )
  21544. SELECT
  21545. @Owner_ID,
  21546. New_Identity,
  21547. @Communication_Type_RecID,
  21548. 1,
  21549. Direct_Phone,
  21550. Direct_Extension,
  21551. GETDATE(),
  21552. @ImportBatchUser
  21553. FROM #Import_Staging stag
  21554. WHERE stag.Direct_Phone IS NOT NULL
  21555. ORDER BY ExcelRowNumber ASC
  21556.  
  21557. -- Compare expected rowcount to actual - error on mistmatch to force rollback
  21558. IF @@ROWCOUNT <> @ExpRowCount
  21559. BEGIN
  21560. SELECT @ErrorMsg = 'Direct phone insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
  21561. RAISERROR(@ErrorMsg, 16, 1)
  21562. END
  21563.  
  21564. -- Set expected rowcount for cell number insert
  21565. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Cell_Phone IS NOT NULL
  21566.  
  21567. -- Set Communication_Type_RecID for Cell phone
  21568. SELECT @Communication_Type_RecID = (SELECT TOP 1 Communication_Type_RecID FROM dbo.Communication_Type WHERE Communication_Name IN ('Mobile', 'Cell') and Phone_Flag = 1)
  21569.  
  21570. -- Perform insert to dbo.Contact_Communication for cell phone
  21571. INSERT INTO dbo.Contact_Communication
  21572. (
  21573. Owner_ID,
  21574. Contact_RecID,
  21575. Communication_Type_RecID,
  21576. Default_Flag,
  21577. [Description],
  21578. Last_Update,
  21579. Updated_By
  21580. )
  21581. SELECT
  21582. @Owner_ID,
  21583. New_Identity,
  21584. @Communication_Type_RecID,
  21585. CASE WHEN stag.DefaultCommType = 2 THEN 1 ELSE 0 END,
  21586. Cell_Phone,
  21587. GETDATE(),
  21588. @ImportBatchUser
  21589. FROM #Import_Staging stag
  21590. WHERE stag.Cell_Phone IS NOT NULL
  21591. ORDER BY ExcelRowNumber ASC
  21592.  
  21593. -- Compare expected rowcount to actual - error on mistmatch to force rollback
  21594. IF @@ROWCOUNT <> @ExpRowCount
  21595. BEGIN
  21596. SELECT @ErrorMsg = 'Cell phone insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
  21597. RAISERROR(@ErrorMsg, 16, 1)
  21598. END
  21599.  
  21600. -- Set expected rowcount for Home number insert
  21601. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Home_Phone IS NOT NULL
  21602.  
  21603. -- Set Communication_Type_RecID for Home phone
  21604. SELECT @Communication_Type_RecID = (SELECT TOP 1 Communication_Type_RecID FROM dbo.Communication_Type WHERE Communication_Name IN('Home', 'Home Phone') and Phone_Flag = 1)
  21605.  
  21606. -- Perform insert to dbo.Contact_Communication for Home phone
  21607. INSERT INTO dbo.Contact_Communication
  21608. (
  21609. Owner_ID,
  21610. Contact_RecID,
  21611. Communication_Type_RecID,
  21612. Default_Flag,
  21613. [Description],
  21614. Last_Update,
  21615. Updated_By
  21616. )
  21617. SELECT
  21618. @Owner_ID,
  21619. New_Identity,
  21620. @Communication_Type_RecID,
  21621. 0,
  21622. Home_Phone,
  21623. GETDATE(),
  21624. @ImportBatchUser
  21625. FROM #Import_Staging stag
  21626. WHERE stag.Home_Phone IS NOT NULL
  21627. ORDER BY ExcelRowNumber ASC
  21628.  
  21629. -- Compare expected rowcount to actual - error on mistmatch to force rollback
  21630. IF @@ROWCOUNT <> @ExpRowCount
  21631. BEGIN
  21632. SELECT @ErrorMsg = 'Home phone insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
  21633. RAISERROR(@ErrorMsg, 16, 1)
  21634. END
  21635.  
  21636. -- Set expected rowcount for email insert
  21637. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Email_Address IS NOT NULL
  21638.  
  21639. -- Set Communication_Type_RecID for Email
  21640. SELECT @Communication_Type_RecID = (SELECT TOP 1 Communication_Type_RecID FROM dbo.Communication_Type WHERE Communication_Name = 'Email' and Email_Flag = 1)
  21641.  
  21642. -- Perform insert to dbo.Contact_Communication for Email
  21643. INSERT INTO dbo.Contact_Communication
  21644. (
  21645. Owner_ID,
  21646. Contact_RecID,
  21647. Communication_Type_RecID,
  21648. Default_Flag,
  21649. [Description],
  21650. Last_Update,
  21651. Updated_By
  21652. )
  21653. SELECT
  21654. @Owner_ID,
  21655. New_Identity,
  21656. @Communication_Type_RecID,
  21657. 1,
  21658. Email_Address,
  21659. GETDATE(),
  21660. @ImportBatchUser
  21661. FROM #Import_Staging stag
  21662. WHERE stag.Email_Address IS NOT NULL
  21663. ORDER BY ExcelRowNumber ASC
  21664.  
  21665. -- Compare expected rowcount to actual - error on mismatch to force rollback
  21666. IF @@ROWCOUNT <> @ExpRowCount
  21667. BEGIN
  21668. SELECT @ErrorMsg = 'Email insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
  21669. RAISERROR(@ErrorMsg, 16, 1)
  21670. END
  21671.  
  21672. -- Get expected Rowcount for dbo.SO_Activity insert
  21673. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Activity_Assign_To_Member_ID IS NOT NULL
  21674.  
  21675. -- Set Schedule_Detail_Inserted for records to be inserted to Activity/Schedule/Schedule Detail
  21676. UPDATE stag
  21677. SET Schedule_Detail_Inserted = 0
  21678. FROM #Import_Staging stag
  21679. WHERE Activity_Assign_To_Member_ID IS NOT NULL
  21680.  
  21681. -- Perform insert to SO_Activity
  21682. -- Get Max RecID prior to insert
  21683. SELECT @Max_RecID = MAX(SO_Activity_RecID) FROM dbo.SO_Activity
  21684.  
  21685. -- Repurpose Owner_ID to catch identity from source table
  21686. INSERT INTO dbo.SO_Activity
  21687. (
  21688. Owner_ID,
  21689. Assign_To,
  21690. Company_RecID,
  21691. SO_Activity_Type_RecID,
  21692. [Subject],
  21693. Date_Entered,
  21694. Entered_By,
  21695. Contact_RecID,
  21696. --Notes,
  21697. Close_Flag,
  21698. Updated_By,
  21699. Last_Update,
  21700. --Read_Flag,
  21701. Notify_Complete_Flag,
  21702. Notification_Sent_Flag,
  21703. so_act_status_recid,
  21704. Marketing_Campaign_RecID,
  21705. assignto_recid,
  21706. SR_Location_RecID
  21707. )
  21708.  
  21709. SELECT
  21710. ExcelRowNumber,
  21711. Activity_Assign_To_Member_ID,
  21712. Company_RecID,
  21713. SO_Activity_Type_RecID,
  21714. Activity_Subject,
  21715. GETDATE(),
  21716. @ImportBatchUser,
  21717. New_Identity,
  21718. --Activity_Notes,
  21719. 0,
  21720. @ImportBatchUser,
  21721. GETDATE(),
  21722. --0,
  21723. 0,
  21724. 0,
  21725. @SO_Act_Status_RecID,
  21726. Marketing_Campaign_RecID,
  21727. Activity_Member_RecID,
  21728. @SR_Location_RecID
  21729. FROM #Import_Staging
  21730. WHERE Activity_Assign_To_Member_ID IS NOT NULL
  21731. ORDER BY ExcelRowNumber ASC
  21732.  
  21733. -- Compare expected rowcount to actual - error on mistmatch to force rollback
  21734. IF @@ROWCOUNT <> @ExpRowCount
  21735. BEGIN
  21736. SELECT @ErrorMsg = 'dbo.SO_Activity insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
  21737. RAISERROR(@ErrorMsg, 16, 1)
  21738. END
  21739.  
  21740. -- Join dbo.SO_Activity back to staging table to get new identities
  21741. UPDATE stag
  21742. SET stag.Activity_RecID_New = soa.SO_Activity_RecID
  21743. FROM #Import_Staging stag
  21744. INNER JOIN SO_Activity soa
  21745. ON stag.ExcelRowNumber = soa.Owner_ID
  21746. WHERE soa.SO_Activity_Recid > @Max_RecID
  21747.  
  21748. -- Update Owner_ID in SO_Activity to appropriate value
  21749. UPDATE dbo.SO_Activity
  21750. SET Owner_ID = @Owner_ID
  21751. WHERE Updated_By = @ImportBatchUser
  21752. AND SO_Activity_Recid > @Max_RecID
  21753.  
  21754. -- Perform insert to dbo.Schedule
  21755. -- Grab max RecID prior to insert
  21756. SELECT @MAX_RecID = MAX(Schedule_RecID) FROM dbo.Schedule
  21757.  
  21758. -- Repurpose Owner_ID to catch identity from source table
  21759. INSERT INTO dbo.Schedule
  21760. (
  21761. Owner_ID,
  21762. RecID,
  21763. Schedule_Type_RecID,
  21764. Member_ID,
  21765. Date_Time_Start,
  21766. Date_Time_End,
  21767. close_flag,
  21768. Hours_Estimated,
  21769. Schedule_Desc,
  21770. Last_Update,
  21771. Updated_By,
  21772. Syncable,
  21773. Reminder_Flag,
  21774. Reminder_Minutes,
  21775. All_Day_Flag,
  21776. Xref_Mbr_RecID,
  21777. Ack_Flag,
  21778. Billable_Flag
  21779. )
  21780.  
  21781. SELECT
  21782. ExcelRowNumber,
  21783. Activity_RecID_New,
  21784. @Schedule_Type_RecID,
  21785. Activity_Assign_To_Member_ID,
  21786. Activity_Due_Date,
  21787. Activity_Due_Date,
  21788. 0,
  21789. 0,
  21790. 'Follow up/' + COALESCE(Company_Name, (ISNULL(First_Name + ' ', '') + ISNULL(Last_Name, ''))),
  21791. GETDATE(),
  21792. @ImportBatchUser,
  21793. 1,
  21794. 0,
  21795. 0,
  21796. 0,
  21797. Activity_Member_RecID,
  21798. 0,
  21799. 0
  21800. FROM #Import_Staging
  21801. WHERE Activity_Assign_To_Member_ID IS NOT NULL
  21802. ORDER BY ExcelRowNumber ASC
  21803.  
  21804. -- Compare expected rowcount to actual - error on mistmatch to force rollback
  21805. IF @@ROWCOUNT <> @ExpRowCount
  21806. BEGIN
  21807. SELECT @ErrorMsg = 'dbo.Schedule insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
  21808. RAISERROR(@ErrorMsg, 16, 1)
  21809. END
  21810.  
  21811. -- Join dbo.Schedule back to staging table to get new identities
  21812. UPDATE stag
  21813. SET stag.Schedule_RecID_New = sched.Schedule_RecID
  21814. FROM #Import_Staging stag
  21815. INNER JOIN dbo.Schedule sched
  21816. ON sched.Owner_ID = stag.ExcelRowNumber
  21817. AND sched.Updated_By = @ImportBatchUser
  21818. WHERE sched.Schedule_RecID > @Max_RecID
  21819.  
  21820. -- Update Owner_ID in dbo.Schedule to appropriate value
  21821. UPDATE dbo.Schedule
  21822. SET Owner_ID = @Owner_ID
  21823. WHERE Updated_By = @ImportBatchUser
  21824. AND Schedule_RecID > @Max_RecID
  21825.  
  21826. -- Perform insert to dbo.Schedule_Detail
  21827. -- Records cannot be inserted as batch due to trigger on this table
  21828. WHILE EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Schedule_Detail_Inserted = 0)
  21829. BEGIN
  21830. -- Get identity for current record
  21831. SET @Curr_Insert_RecID = (SELECT TOP 1 ExcelRowNumber FROM #Import_Staging WHERE Schedule_Detail_Inserted = 0 ORDER BY InsertOrder ASC)
  21832.  
  21833. -- Perform insert
  21834. INSERT INTO dbo.Schedule_Detail
  21835. (
  21836. Schedule_RecID,
  21837. Date_Scheduled,
  21838. Hours_Scheduled,
  21839. Start_Time,
  21840. End_Time,
  21841. Member_RecID,
  21842. Schedule_Type_ID,
  21843. RecID,
  21844. Updated_By,
  21845. Last_Update
  21846. --Upd_Flag
  21847. )
  21848.  
  21849. SELECT
  21850. Schedule_RecID_New,
  21851. Activity_Due_Date,
  21852. 0,
  21853. Activity_Due_Date,
  21854. Activity_Due_Date,
  21855. Activity_Member_RecID,
  21856. @Schedule_Type_ID,
  21857. Activity_RecID_New,
  21858. @ImportBatchUser,
  21859. GETDATE()
  21860. --0
  21861. FROM #Import_Staging stag
  21862. WHERE stag.ExcelRowNumber = @Curr_Insert_RecID
  21863.  
  21864. -- Set Schedule_Detail_Inserted = 1
  21865. UPDATE #Import_Staging
  21866. SET Schedule_Detail_Inserted = 1
  21867. WHERE ExcelRowNumber = @Curr_Insert_RecID
  21868. END
  21869.  
  21870. -- Set expected rowcount for insert to dbo.Lead_Import
  21871. SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging
  21872.  
  21873. -- Perform insert to dbo.Lead_Import
  21874. INSERT INTO dbo.Lead_Import
  21875. (
  21876. Lead_Import_Batch_RecID,
  21877. L_Company_Name,
  21878. L_First_Name,
  21879. L_Last_Name,
  21880. L_Title,
  21881. L_Direct_Phone,
  21882. L_Direct_Ext,
  21883. L_Email_Address,
  21884. L_Cell_Phone,
  21885. L_Contact_Note,
  21886. L_Company_RecID,
  21887. L_Contact_RecID,
  21888. L_NewContact_Flag,
  21889. L_NewCompany_Flag,
  21890. L_Activity_Subject,
  21891. L_Activity_AssignTo,
  21892. L_Activity_RecID,
  21893. L_Marketing_ID,
  21894. L_Marketing_Campaign_RecID,
  21895. L_Site_Name
  21896. )
  21897.  
  21898. SELECT
  21899. @ImportBatchID,
  21900. LEFT(stag.Company_Name, 50),
  21901. LEFT(stag.First_Name, 50),
  21902. LEFT(stag.Last_Name, 50),
  21903. LEFT(stag.Job_Title, 50),
  21904. LEFT(stag.Direct_Phone, 50),
  21905. LEFT(stag.Direct_Extension, 50),
  21906. LEFT(stag.Email_Address, 100),
  21907. LEFT(stag.Cell_Phone, 50),
  21908. LEFT(stag.Contact_Notes, 5000),
  21909. stag.Company_RecID,
  21910. stag.New_Identity,
  21911. 1,
  21912. 0,
  21913. stag.Activity_Subject,
  21914. stag.Activity_Assign_To_Member_ID,
  21915. stag.Activity_RecID_New,
  21916. stag.Activity_Marketing_Campaign,
  21917. stag.Marketing_Campaign_RecID,
  21918. LEFT(stag.Site_Name, 50)
  21919. FROM #Import_Staging stag
  21920.  
  21921. -- Compare expected rowcount to actual - error on mistmatch to force rollback
  21922. IF @@ROWCOUNT <> @ExpRowCount
  21923. BEGIN
  21924. SELECT @ErrorMsg = 'dbo.Lead_Import insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
  21925. RAISERROR(@ErrorMsg, 16, 1)
  21926. END
  21927.  
  21928. EXEC usp_Import_UDF @TableName, 'Contact'
  21929.  
  21930. -- Commit transaction and return results
  21931. IF @@Error = 0 AND XACT_STATE() = 1
  21932. BEGIN
  21933.  
  21934. IF OBJECT_ID('tempdb..#Legacy_IDs') IS NOT NULL
  21935. DROP TABLE #Legacy_IDs
  21936.  
  21937. SELECT
  21938. Legacy_ID AS Legacy_ID,
  21939. New_Identity AS CW_RecID,
  21940. 'Contact' AS Record_Type
  21941. INTO #Legacy_IDs
  21942. FROM #Import_Staging stag
  21943. WHERE Legacy_ID IS NOT NULL
  21944.  
  21945. exec usp_Import_Legacy_IDs
  21946.  
  21947. COMMIT TRANSACTION Contact_Import
  21948. SELECT
  21949. 1 AS Success,
  21950. @ImportBatchID AS Import_Batch_ID,
  21951. COUNT(*) AS Contacts_Imported
  21952. FROM dbo.Contact
  21953. WHERE Updated_By = @ImportBatchUser
  21954. END
  21955.  
  21956. END TRY
  21957. BEGIN CATCH
  21958.  
  21959. -- An error occured, display error info
  21960. SELECT
  21961. ERROR_NUMBER() AS ErrorNumber,
  21962. ERROR_SEVERITY() AS ErrorSeverity,
  21963. ERROR_STATE() AS ErrorState,
  21964. ERROR_PROCEDURE() AS ErrorProcedure,
  21965. ERROR_LINE() AS ErrorLine,
  21966. ERROR_MESSAGE() AS ErrorMessage
  21967.  
  21968. -- Grab dump of data for debugging
  21969. SELECT
  21970. @ImportBatchID,
  21971. stag.Company_Name,
  21972. stag.First_Name,
  21973. stag.Last_Name,
  21974. stag.Job_Title,
  21975. stag.Direct_Phone,
  21976. stag.Direct_Extension,
  21977. stag.Email_Address,
  21978. stag.Cell_Phone,
  21979. stag.Contact_Notes,
  21980. stag.New_Identity,
  21981. 1,
  21982. stag.Activity_Subject,
  21983. stag.Activity_Assign_To_Member_ID,
  21984. stag.Activity_RecID_New,
  21985. stag.Activity_Marketing_Campaign,
  21986. stag.Marketing_Campaign_RecID,
  21987. stag.Site_Name
  21988. FROM #Import_Staging stag
  21989.  
  21990.  
  21991. -- Determine whether transaction needs to be rolled back and act accordingly
  21992. IF(XACT_STATE()) IN(-1, 1)
  21993. BEGIN
  21994. ROLLBACK TRANSACTION
  21995. END
  21996.  
  21997. END CATCH
  21998.  
  21999. GO
  22000.  
  22001.  
  22002.  
  22003. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_PR_ImportValidate')
  22004. BEGIN
  22005. EXEC('CREATE PROCEDURE [dbo].[usp_PR_ImportValidate] AS SELECT 1')
  22006. END
  22007. GO
  22008.  
  22009. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_PR_ImportPush')
  22010. BEGIN
  22011. EXEC('CREATE PROCEDURE [dbo].[usp_PR_ImportPush] AS SELECT 1')
  22012. END
  22013. GO
  22014.  
  22015.  
  22016. ALTER PROCEDURE [dbo].[usp_PR_ImportValidate]
  22017. @TableName VARCHAR(MAX),
  22018. @Forcemode BIT = 0
  22019. AS
  22020. BEGIN
  22021. SET NOCOUNT ON
  22022.  
  22023. -- Set date format to MDY to validate dates from excel
  22024. SET DATEFORMAT MDY
  22025.  
  22026. -- Variable declaration
  22027. -- Dynamic statement to insert to staging table
  22028. DECLARE @DSQL VARCHAR(MAX),
  22029. @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
  22030.  
  22031. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  22032. SELECT @ImportBatchUser =
  22033. 'CONV_'
  22034. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  22035. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  22036. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  22037. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  22038.  
  22039.  
  22040. -- Fully qualified name of source table
  22041. DECLARE @SourceTable VARCHAR(300)
  22042. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  22043.  
  22044. -- Object_ID of source table
  22045. DECLARE @Source_Object_ID INT
  22046. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  22047.  
  22048. -- Table to hold results of procedure
  22049. CREATE TABLE #tblResults
  22050. (
  22051. RowNumber INT,
  22052. ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
  22053. InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  22054. ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  22055. Warning_Flag BIT DEFAULT 0
  22056. )
  22057.  
  22058. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  22059.  
  22060. -- Table to hold condensed summary results
  22061. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  22062. BEGIN
  22063. DROP TABLE #ResultsCondensed
  22064. END
  22065.  
  22066. CREATE TABLE #ResultsCondensed
  22067. (
  22068. RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  22069. ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  22070. )
  22071.  
  22072. -- Table to hold serial numbers for validation
  22073. DECLARE @tblSerialNums TABLE
  22074. (
  22075. ExcelRowNumber INT,
  22076. ProductID NVARCHAR(MAX),
  22077. SerialNum VARCHAR(MAX)
  22078. )
  22079.  
  22080. -- Pre-validation
  22081. -- Create & populate table variable with list of required columns
  22082. DECLARE @RequiredColumns TABLE
  22083. (
  22084. ColumnName VARCHAR(255)
  22085. )
  22086.  
  22087. INSERT INTO @RequiredColumns
  22088. (
  22089. ColumnName
  22090. )
  22091. SELECT 'Product ID' UNION ALL
  22092. SELECT 'Description' UNION ALL
  22093. SELECT 'Long Description' UNION ALL
  22094. SELECT 'Category' UNION ALL
  22095. SELECT 'Sub-Category' UNION ALL
  22096. SELECT 'Product Type' UNION ALL
  22097. SELECT 'Product Class' UNION ALL
  22098. SELECT 'UOM' UNION ALL
  22099. SELECT 'Unit Price' UNION ALL
  22100. SELECT 'Unit Cost' UNION ALL
  22101. SELECT 'Serialized (Y/N)' UNION ALL
  22102. SELECT 'Taxable (Y/N)' UNION ALL
  22103. SELECT 'Manufacturer' UNION ALL
  22104. SELECT 'Manufacturer Part Number' UNION ALL
  22105. SELECT 'SOH' UNION ALL
  22106. SELECT 'Warehouse' UNION ALL
  22107. SELECT 'Warehouse Bin' UNION ALL
  22108. SELECT 'Serial Numbers'
  22109.  
  22110. -- Table variable to hold column names from source table
  22111. DECLARE @SourceColumns TABLE
  22112. (
  22113. ColumnName VARCHAR(255)
  22114. )
  22115.  
  22116. -- Populate @SourceColumns
  22117. INSERT INTO @SourceColumns
  22118. (
  22119. ColumnName
  22120. )
  22121.  
  22122. SELECT
  22123. name
  22124. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  22125.  
  22126. -- Check that all required columns exist in @SourceColumns
  22127. INSERT INTO #tblResults
  22128. (
  22129. RowNumber,
  22130. ValMsg
  22131. )
  22132.  
  22133. SELECT
  22134. 0,
  22135. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  22136. FROM @RequiredColumns rq
  22137.  
  22138. EXCEPT
  22139.  
  22140. SELECT
  22141. 0,
  22142. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  22143. FROM @SourceColumns sc
  22144.  
  22145. -- If a column is missing, stop here and return results
  22146. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  22147. BEGIN
  22148. SELECT
  22149. 0 AS ValPassed,
  22150. RowNumber,
  22151. ValMsg
  22152. FROM #tblResults
  22153. ORDER BY RowNumber, ValMsg
  22154.  
  22155. RETURN
  22156. END
  22157.  
  22158.  
  22159. -- Table to hold source data for this batch from temp table
  22160. IF EXISTS(SELECT * FROM tempdb.sys.tables WHERE Name LIKE('%PR_Import_Val_Temp%'))
  22161. BEGIN
  22162. DROP TABLE #PR_Import_Val_Temp
  22163. END
  22164.  
  22165. CREATE TABLE #PR_Import_Val_Temp
  22166. (
  22167. [ExcelRowNumber] [int] NULL,
  22168. [ProductID] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22169. [Description] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22170. [LongDesc] [varchar](max) COLLATE DATABASE_DEFAULT NULL,
  22171. [Category] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22172. [SubCategory] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22173. [ProductType] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22174. [ProductClass] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22175. [UOM] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22176. [UnitPrice] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22177. [UnitCost] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22178. [Serialized] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22179. [Taxable] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22180. [Manufacturer] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22181. [PartNumber] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22182. [SOH] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  22183. [Warehouse] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22184. [WarehouseBin] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  22185. [SerialNumbers] [varchar](max) COLLATE DATABASE_DEFAULT NULL,
  22186. [SerialNumbersXML][xml] NULL,
  22187. [SNCount] INT NULL,
  22188. [intSOH] INT NULL,
  22189. [SOHNumeric] BIT NULL,
  22190. [Price_Attribute] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  22191. IV_Price_Attribute_ID NVARCHAR(10) COLLATE DATABASE_DEFAULT,
  22192. Vendor_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  22193. Vendor_SKU NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  22194. Vendor_Company_RecID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  22195. Serialized_Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  22196. IV_Item_RecID INT
  22197. )
  22198.  
  22199. -- Build statement to populate validation temp table
  22200. SELECT @DSQL = '
  22201. INSERT INTO #PR_Import_Val_Temp
  22202. (
  22203. ExcelRowNumber,
  22204. ProductID,
  22205. Description,
  22206. LongDesc,
  22207. Category,
  22208. SubCategory,
  22209. ProductType,
  22210. ProductClass,
  22211. UOM,
  22212. UnitPrice,
  22213. UnitCost,
  22214. Serialized,
  22215. Taxable,
  22216. Manufacturer,
  22217. PartNumber,
  22218. SOH,
  22219. Warehouse,
  22220. WarehouseBin,
  22221. SerialNumbers
  22222. )
  22223. SELECT
  22224. [Excel Row Number],
  22225. [Product ID],
  22226. [Description],
  22227. [Long Description],
  22228. [Category],
  22229. [Sub-Category],
  22230. [Product Type],
  22231. [Product Class],
  22232. [UOM],
  22233. [Unit Price],
  22234. [Unit Cost],
  22235. [Serialized (Y/N)],
  22236. [Taxable (Y/N)],
  22237. [Manufacturer],
  22238. [Manufacturer Part Number],
  22239. [SOH],
  22240. [Warehouse],
  22241. [Warehouse Bin],
  22242. [Serial Numbers]
  22243. FROM ' + @SourceTable
  22244.  
  22245. EXEC(@DSQL)
  22246.  
  22247. BEGIN TRANSACTION
  22248.  
  22249. -- Update temp table with optional field values if they exist
  22250. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Price Attribute')
  22251. BEGIN
  22252. SELECT @DSQL = '
  22253. UPDATE tmp
  22254. SET tmp.Price_Attribute = src.[Price Attribute]
  22255. FROM #PR_Import_Val_Temp tmp
  22256. INNER JOIN ' + @SourceTable + ' src
  22257. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  22258.  
  22259. EXEC(@DSQL)
  22260. END
  22261.  
  22262. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Vendor')
  22263. BEGIN
  22264. SELECT @DSQL = '
  22265. UPDATE tmp
  22266. SET tmp.Vendor_Name = src.[Vendor]
  22267. FROM #PR_Import_Val_Temp tmp
  22268. INNER JOIN ' + @SourceTable + ' src
  22269. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  22270.  
  22271. EXEC(@DSQL)
  22272. END
  22273.  
  22274. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Vendor SKU')
  22275. BEGIN
  22276. SELECT @DSQL = '
  22277. UPDATE tmp
  22278. SET tmp.Vendor_SKU = LEFT(src.[Vendor SKU], 50)
  22279. FROM #PR_Import_Val_Temp tmp
  22280. INNER JOIN ' + @SourceTable + ' src
  22281. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  22282.  
  22283. EXEC(@DSQL)
  22284. END
  22285.  
  22286. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Serialized Cost')
  22287. BEGIN
  22288. SELECT @DSQL = '
  22289. UPDATE tmp
  22290. SET tmp.Serialized_Cost = LEFT(src.[Serialized Cost], 50)
  22291. FROM #PR_Import_Val_Temp tmp
  22292. INNER JOIN ' + @SourceTable + ' src
  22293. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  22294.  
  22295. EXEC(@DSQL)
  22296. END
  22297.  
  22298.  
  22299. -- Update blank string to null for all columns in staging table
  22300. UPDATE #PR_Import_Val_Temp SET
  22301. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  22302. ProductID = CASE WHEN ProductID IN('', ' ') THEN NULL ELSE ProductID END,
  22303. Description = CASE WHEN Description IN('', ' ') THEN NULL ELSE Description END,
  22304. LongDesc = CASE WHEN LongDesc IN('', ' ') THEN NULL ELSE LongDesc END,
  22305. Category = CASE WHEN Category IN('', ' ') THEN NULL ELSE Category END,
  22306. SubCategory = CASE WHEN SubCategory IN('', ' ') THEN NULL ELSE SubCategory END,
  22307. ProductType = CASE WHEN ProductType IN('', ' ') THEN NULL ELSE ProductType END,
  22308. ProductClass = CASE WHEN ProductClass IN('', ' ') THEN NULL ELSE ProductClass END,
  22309. UOM = CASE WHEN UOM IN('', ' ') THEN NULL ELSE UOM END,
  22310. UnitPrice = CASE WHEN UnitPrice IN('', ' ') THEN NULL ELSE UnitPrice END,
  22311. UnitCost = CASE WHEN UnitCost IN('', ' ') THEN NULL ELSE UnitCost END,
  22312. Serialized = CASE WHEN Serialized IN('', ' ') THEN NULL ELSE Serialized END,
  22313. Taxable = CASE WHEN Taxable IN('', ' ') THEN NULL ELSE Taxable END,
  22314. Manufacturer = CASE WHEN Manufacturer IN('', ' ') THEN NULL ELSE Manufacturer END,
  22315. PartNumber = CASE WHEN PartNumber IN('', ' ') THEN NULL ELSE PartNumber END,
  22316. SOH = CASE WHEN SOH IN('', ' ') THEN NULL ELSE SOH END,
  22317. Warehouse = CASE WHEN Warehouse IN('', ' ') THEN NULL ELSE Warehouse END,
  22318. WarehouseBin = CASE WHEN WarehouseBin IN('', ' ') THEN NULL ELSE WarehouseBin END,
  22319. SerialNumbers = CASE WHEN SerialNumbers IN('', ' ') THEN NULL ELSE SerialNumbers END,
  22320. Price_Attribute = CASE WHEN Price_Attribute IN('', ' ') THEN NULL ELSE Price_Attribute END,
  22321. Vendor_Name = CASE WHEN Vendor_Name IN('', ' ') THEN NULL ELSE Vendor_Name END,
  22322. Vendor_SKU = CASE WHEN Vendor_SKU IN('', ' ') THEN NULL ELSE Vendor_SKU END,
  22323. Serialized_Cost = CASE WHEN Serialized_Cost IN('', ' ') THEN NULL ELSE Serialized_Cost END
  22324.  
  22325. -- Remove SSIS import row if exists
  22326. DELETE FROM #PR_Import_Val_Temp
  22327. WHERE UnitPrice = 'Connectwise'
  22328. AND ProductID = 'Connectwise'
  22329. AND SOH = 'Connectwise'
  22330.  
  22331. -- Update class to 'I' if inventory, 'N' if Non-Inventory, 'S' if service, 'A' if 'Agreement', 'N' if null (default per spreadsheet instructions)
  22332. UPDATE tmp
  22333. SET tmp.ProductClass =
  22334. CASE tmp.ProductClass
  22335. WHEN 'Inventory' THEN 'I'
  22336. WHEN 'Non-Inventory' THEN 'N'
  22337. WHEN 'Non Inventory' THEN 'N'
  22338. WHEN 'Service' THEN 'S'
  22339. WHEN 'Services' THEN 'S'
  22340. WHEN 'Agreement' THEN 'A'
  22341. WHEN NULL THEN 'N'
  22342. ELSE tmp.ProductClass
  22343. END
  22344. FROM #PR_Import_Val_Temp tmp
  22345. WHERE tmp.ProductClass IN('Inventory', 'Non-Inventory', 'Non Inventory', 'Service', 'Agreement')
  22346. OR tmp.ProductClass IS NULL
  22347.  
  22348. -- Get IV_Price_Attribute_ID
  22349. UPDATE tmp
  22350. SET tmp.IV_Price_Attribute_ID = pa.IV_Price_Attribute_ID
  22351. FROM #PR_Import_Val_Temp tmp
  22352. CROSS APPLY(SELECT TOP 1 * FROM IV_Price_Attribute pa WHERE pa.IV_Price_Attribute_ID = tmp.Price_Attribute OR pa.[Description] = tmp.Price_Attribute) pa
  22353.  
  22354. -- Strip dollar sign and commas from price/cost fields (common cause of validation error)
  22355. UPDATE tmp
  22356. SET tmp.UnitPrice = REPLACE(tmp.UnitPrice, '$', ''),
  22357. tmp.UnitCost = REPLACE(tmp.UnitCost, '$', '')
  22358. FROM #PR_Import_Val_Temp tmp
  22359.  
  22360. UPDATE tmp
  22361. SET tmp.UnitPrice = REPLACE(tmp.UnitPrice, ',', ''),
  22362. tmp.UnitCost = REPLACE(tmp.UnitCost, ',', '')
  22363. FROM #PR_Import_Val_Temp tmp
  22364.  
  22365. -- Get IV_Item_RecID for existing products
  22366. UPDATE tmp
  22367. SET tmp.IV_Item_RecID = ivi.IV_Item_RecID
  22368. FROM #PR_Import_Val_Temp tmp
  22369. CROSS APPLY(SELECT TOP 1 * FROM dbo.IV_Item ivi WHERE ivi.Item_ID = tmp.ProductID) ivi
  22370.  
  22371. -- Assume 0 SOH if null
  22372. UPDATE #PR_Import_Val_Temp
  22373. SET SOH = '0'
  22374. WHERE SOH IS NULL
  22375.  
  22376. -- Convert SerialNumbers to XML
  22377. UPDATE tmp
  22378. SET SerialNumbersXML = CAST('<SerNum>' + REPLACE(tmp.SerialNumbers,',','</SerNum><SerNum>')+ '</SerNum>' AS XML)
  22379. FROM #PR_Import_Val_Temp tmp
  22380.  
  22381. -- Get Vendor_Company_RecID
  22382. UPDATE tmp
  22383. SET tmp.Vendor_Company_RecID = comp.Company_RecID
  22384. FROM #PR_Import_Val_Temp tmp
  22385. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_Name = tmp.Vendor_Name) comp
  22386.  
  22387. -- Insert list of serial numbers from XML to serial number table
  22388. INSERT INTO @tblSerialNums
  22389. (
  22390. ExcelRowNumber,
  22391. ProductID,
  22392. SerialNum
  22393. )
  22394.  
  22395. SELECT DISTINCT ExcelRowNumber, ProductID, RTRIM(LTRIM(SNums.Split.value('.', 'VARCHAR(8000)'))) AS 'SN'
  22396. FROM #PR_Import_Val_Temp
  22397. CROSS APPLY SerialNumbersXML.nodes('/SerNum') AS SNums(Split)
  22398.  
  22399. -- Update staging table with counts of serial numbers per row
  22400. ;with SNCounts
  22401. AS
  22402. (
  22403. SELECT ExcelRowNumber, Count(*) AS SNCount
  22404. FROM @tblSerialNums
  22405. GROUP BY ExcelRowNumber
  22406. )
  22407.  
  22408. UPDATE stag
  22409. SET stag.SNCount = counts.SNCount
  22410. FROM SNCounts counts
  22411. INNER JOIN #PR_Import_Val_Temp stag
  22412. ON stag.ExcelRowNumber = counts.ExcelRowNumber
  22413.  
  22414.  
  22415. -- Strip commas from SOH
  22416. UPDATE #PR_Import_Val_Temp
  22417. SET SOH = REPLACE(SOH, ',', '')
  22418.  
  22419. -- If SOH evaluates to integer, convert and capture in intSOH field
  22420. UPDATE #PR_Import_Val_Temp
  22421. SET SOHNumeric =
  22422. CASE
  22423. WHEN ISNUMERIC(SOH) = 0 THEN 0
  22424. WHEN SOH LIKE '%\[^-+ 0-9\]%' THEN 0
  22425. WHEN CAST(SOH AS NUMERIC(38, 0))
  22426. NOT BETWEEN -2147483648. AND 2147483647. THEN 0
  22427. ELSE 1
  22428. END
  22429.  
  22430. UPDATE #PR_Import_Val_Temp
  22431. SET intSOH = CONVERT(INT, CAST(SOH AS DECIMAL))
  22432. WHERE SOHNumeric = 1
  22433.  
  22434. -- If @ForceMode = 1, create necessary references
  22435. IF @Forcemode = 1
  22436. BEGIN
  22437. INSERT INTO dbo.Manufacturer
  22438. (
  22439. Manufacturer_Name,
  22440. Inactive_Flag,
  22441. Last_Update,
  22442. Updated_By
  22443. )
  22444.  
  22445. SELECT DISTINCT
  22446. tmp.Manufacturer,
  22447. 0,
  22448. GETDATE(),
  22449. @ImportBatchUser
  22450. FROM #PR_Import_Val_Temp tmp
  22451. LEFT OUTER JOIN Manufacturer mf
  22452. ON mf.Manufacturer_Name = tmp.Manufacturer
  22453. WHERE mf.Manufacturer_RecID IS NULL
  22454. AND tmp.Manufacturer IS NOT NULL
  22455.  
  22456. -- Category
  22457. INSERT INTO dbo.IV_Category
  22458. (
  22459. [Description],
  22460. Inactive_Flag,
  22461. Updated_By,
  22462. Last_Update
  22463. )
  22464.  
  22465. SELECT DISTINCT
  22466. tmp.Category,
  22467. 0,
  22468. @ImportBatchUser,
  22469. GETDATE()
  22470. FROM #PR_Import_Val_Temp tmp
  22471. LEFT OUTER JOIN IV_Category cat
  22472. ON cat.[Description] = tmp.Category
  22473. WHERE cat.IV_Cat_RecID IS NULL
  22474. AND tmp.Category IS NOT NULL
  22475.  
  22476. -- Subcategory
  22477. INSERT INTO dbo.IV_SubCategory
  22478. (
  22479. IV_Cat_RecID,
  22480. [Description],
  22481. Inactive_Flag,
  22482. Updated_By,
  22483. Last_Update
  22484. )
  22485.  
  22486. SELECT DISTINCT
  22487. cat.IV_Cat_RecID,
  22488. tmp.SubCategory,
  22489. 0,
  22490. @ImportBatchUser,
  22491. GETDATE()
  22492. FROM #PR_Import_Val_Temp tmp
  22493. INNER JOIN IV_Category cat
  22494. ON cat.[Description] = tmp.Category
  22495. LEFT OUTER JOIN IV_SubCategory subc
  22496. ON subc.[Description] = tmp.SubCategory
  22497. AND subc.IV_Cat_RecID = cat.IV_Cat_RecID
  22498. WHERE subc.IV_SubCat_RecID IS NULL
  22499. AND tmp.SubCategory IS NOT NULL
  22500. AND LEN(tmp.Subcategory) <= 50
  22501.  
  22502. -- Product Type
  22503. INSERT INTO IV_Type
  22504. (
  22505. Owner_ID,
  22506. [Description],
  22507. Inactive_Flag,
  22508. Updated_By,
  22509. Last_Update,
  22510. Item_Type_Xref
  22511. )
  22512.  
  22513. SELECT DISTINCT
  22514. 1,
  22515. tmp.ProductType,
  22516. 0,
  22517. @ImportBatchUser,
  22518. GETDATE(),
  22519. NULL
  22520. FROM #PR_Import_Val_Temp tmp
  22521. LEFT OUTER JOIN IV_Type ivt
  22522. ON ivt.[Description] = tmp.ProductType
  22523. WHERE ivt.IV_Type_RecID IS NULL
  22524. AND tmp.ProductType IS NOT NULL
  22525. AND LEN(tmp.ProductType) <= 50
  22526.  
  22527. -- Force short description by trimming to 50 characters
  22528. UPDATE #PR_Import_Val_Temp
  22529. SET [Description] = SUBSTRING([Description], 1, 50)
  22530. WHERE LEN([Description]) > 50
  22531. END
  22532.  
  22533. -- Begin validations
  22534. INSERT INTO #tblResults
  22535. (
  22536. RowNumber,
  22537. ValMsg
  22538. )
  22539.  
  22540. -- Product ID is required
  22541. SELECT
  22542. tmp.ExcelRowNumber,
  22543. 'Product ID cannot be blank'
  22544. FROM #PR_Import_Val_Temp tmp
  22545. WHERE ProductID IS NULL
  22546.  
  22547. UNION ALL
  22548.  
  22549. -- Product ID must be <= 30 characters
  22550. SELECT
  22551. tmp.ExcelRowNumber,
  22552. 'Product ID cannot exceed 60 characters'
  22553. FROM #PR_Import_Val_Temp tmp
  22554. WHERE LEN(ProductID) > 60
  22555.  
  22556. UNION ALL
  22557.  
  22558. -- Description is required
  22559. SELECT
  22560. tmp.ExcelRowNumber,
  22561. 'Description cannot be blank'
  22562. FROM #PR_Import_Val_Temp tmp
  22563. WHERE Description IS NULL
  22564.  
  22565. UNION ALL
  22566.  
  22567. -- Description must be <= 50 characters
  22568. SELECT
  22569. tmp.ExcelRowNumber,
  22570. 'Short Description cannot exceed 50 characters'
  22571. FROM #PR_Import_Val_Temp tmp
  22572. WHERE LEN([Description]) > 50
  22573.  
  22574. UNION ALL
  22575.  
  22576. -- Long description is required
  22577. SELECT
  22578. tmp.ExcelRowNumber,
  22579. 'Long description cannot be blank'
  22580. FROM #PR_Import_Val_Temp tmp
  22581. WHERE LongDesc IS NULL
  22582.  
  22583. UNION ALL
  22584.  
  22585. -- Long description cannot exceed 6000 characters
  22586. SELECT
  22587. tmp.ExcelRowNumber,
  22588. 'Long description cannot exceed 6000 characters'
  22589. FROM #PR_Import_Val_Temp tmp
  22590. WHERE LEN(LongDesc) > 6000
  22591.  
  22592. UNION ALL
  22593.  
  22594. -- Category is required
  22595. SELECT
  22596. tmp.ExcelRowNumber,
  22597. 'Category cannot be blank'
  22598. FROM #PR_Import_Val_Temp tmp
  22599. WHERE Category IS NULL
  22600.  
  22601. UNION ALL
  22602.  
  22603. -- Category cannot exceed 50 characters
  22604. SELECT
  22605. tmp.ExcelRowNumber,
  22606. 'Category cannot exceed 50 characters'
  22607. FROM #PR_Import_Val_Temp tmp
  22608. WHERE LEN(Category) > 50
  22609.  
  22610. UNION ALL
  22611.  
  22612. -- Category must be a valid reference
  22613. SELECT
  22614. tmp.ExcelRowNumber,
  22615. 'Invalid Category: "' + tmp.Category + '"'
  22616. FROM #PR_Import_Val_Temp tmp
  22617. LEFT OUTER JOIN IV_Category cat
  22618. ON cat.[Description] = tmp.Category
  22619. WHERE cat.IV_Cat_RecID IS NULL
  22620. AND tmp.Category IS NOT NULL
  22621. AND LEN(tmp.Category) <= 50
  22622.  
  22623. UNION ALL
  22624.  
  22625. -- Sub-category is required
  22626. SELECT
  22627. tmp.ExcelRowNumber,
  22628. 'Sub-Category cannot be blank'
  22629. FROM #PR_Import_Val_Temp tmp
  22630. WHERE SubCategory IS NULL
  22631.  
  22632. UNION ALL
  22633.  
  22634. -- Sub-category cannot exceed 50 characters
  22635. SELECT
  22636. tmp.ExcelRowNumber,
  22637. 'Sub-Category cannot exceed 50 characters'
  22638. FROM #PR_Import_Val_Temp tmp
  22639. WHERE LEN(tmp.SubCategory) > 50
  22640.  
  22641. UNION ALL
  22642.  
  22643. -- Sub-category must be a valid reference and map back to category
  22644. SELECT
  22645. tmp.ExcelRowNumber,
  22646. 'Sub-Category "' + tmp.SubCategory + '" does not exist for Category: "' + tmp.Category + '"'
  22647. FROM #PR_Import_Val_Temp tmp
  22648. INNER JOIN IV_Category cat
  22649. ON cat.[Description] = tmp.Category
  22650. LEFT OUTER JOIN IV_SubCategory subc
  22651. ON subc.[Description] = tmp.SubCategory
  22652. AND subc.IV_Cat_RecID = cat.IV_Cat_RecID
  22653. WHERE subc.IV_SubCat_RecID IS NULL
  22654. AND tmp.SubCategory IS NOT NULL
  22655. AND LEN(tmp.Subcategory) <= 50
  22656.  
  22657. UNION ALL
  22658.  
  22659. -- Product type is required
  22660. SELECT
  22661. tmp.ExcelRowNumber,
  22662. 'Product type cannot be blank'
  22663. FROM #PR_Import_Val_Temp tmp
  22664. WHERE tmp.ProductType IS NULL
  22665.  
  22666. UNION ALL
  22667.  
  22668. -- Product type must be <= 50 characters
  22669. SELECT
  22670. tmp.ExcelRowNumber,
  22671. 'Product type cannot exceed 50 characters'
  22672. FROM #PR_Import_Val_Temp tmp
  22673. WHERE LEN(tmp.ProductType) > 50
  22674.  
  22675. UNION ALL
  22676.  
  22677. -- Product type must be a valid reference
  22678. SELECT
  22679. tmp.ExcelRowNumber,
  22680. 'Invalid product type: "' + tmp.ProductType + '"'
  22681. FROM #PR_Import_Val_Temp tmp
  22682. LEFT OUTER JOIN IV_Type ivt
  22683. ON ivt.[Description] = tmp.ProductType
  22684. WHERE ivt.IV_Type_RecID IS NULL
  22685. AND tmp.ProductType IS NOT NULL
  22686. AND LEN(tmp.ProductType) <= 50
  22687.  
  22688. UNION ALL
  22689.  
  22690. -- Product class is required
  22691. SELECT
  22692. tmp.ExcelRowNumber,
  22693. 'Product class cannot be blank'
  22694. FROM #PR_Import_Val_Temp tmp
  22695. WHERE tmp.ProductClass IS NULL
  22696.  
  22697. UNION ALL
  22698.  
  22699. -- Product class must be 1 character
  22700. --SELECT
  22701. -- tmp.ExcelRowNumber,
  22702. -- 'Product class cannot exceed 1 character'
  22703. --FROM #PR_Import_Val_Temp tmp
  22704. --WHERE LEN(tmp.ProductClass) <> 1
  22705.  
  22706. --UNION ALL
  22707.  
  22708. -- Product class must be a valid reference
  22709. SELECT
  22710. tmp.ExcelRowNumber,
  22711. 'Invalid product class: "' + tmp.ProductClass + '"'
  22712. FROM #PR_Import_Val_Temp tmp
  22713. LEFT OUTER JOIN IV_Class ivc
  22714. ON ivc.IV_Class_ID = tmp.ProductClass
  22715. WHERE ivc.IV_Class_ID IS NULL
  22716. AND tmp.ProductClass IS NOT NULL
  22717.  
  22718. UNION ALL
  22719.  
  22720. -- Bundle class is not supported
  22721. SELECT
  22722. tmp.ExcelRowNumber,
  22723. 'Bundle class is not supported'
  22724. FROM #PR_Import_Val_Temp tmp
  22725. INNER JOIN IV_Class ivc
  22726. ON ivc.IV_Class_ID = tmp.ProductClass
  22727. OR Class_Description = tmp.ProductClass
  22728. WHERE ivc.IV_Class_ID = 'B'
  22729. AND tmp.ProductClass IS NOT NULL
  22730.  
  22731. UNION ALL
  22732.  
  22733. -- UOM is required
  22734. SELECT
  22735. tmp.ExcelRowNumber,
  22736. 'UOM cannot be blank'
  22737. FROM #PR_Import_Val_Temp tmp
  22738. WHERE tmp.UOM IS NULL
  22739.  
  22740. UNION ALL
  22741.  
  22742. -- UOM cannot exceed 50 characters
  22743. SELECT
  22744. tmp.ExcelRowNumber,
  22745. 'UOM cannot exceed 50 characters'
  22746. FROM #PR_Import_Val_Temp tmp
  22747. WHERE LEN(tmp.UOM) > 50
  22748.  
  22749. UNION ALL
  22750.  
  22751. -- UOM must be a valid reference
  22752. SELECT
  22753. tmp.ExcelRowNumber,
  22754. 'Invalid UOM: "' + tmp.UOM + '"'
  22755. FROM #PR_Import_Val_Temp tmp
  22756. LEFT OUTER JOIN IV_UOM uom
  22757. ON uom.[Description] = tmp.UOM
  22758. WHERE uom.IV_UOM_RecID IS NULL
  22759. AND tmp.UOM IS NOT NULL
  22760. AND LEN(tmp.UOM) < 50
  22761.  
  22762. UNION ALL
  22763.  
  22764. -- If entered, unit price must be numeric (decimal) with no formatting
  22765. SELECT
  22766. tmp.ExcelRowNumber,
  22767. 'Unit price must be numeric (decimal) with no formatting.'
  22768. FROM #PR_Import_Val_Temp tmp
  22769. WHERE ISNUMERIC(tmp.UnitPrice + 'e0') = 0
  22770. AND tmp.UnitPrice IS NOT NULL
  22771.  
  22772. UNION ALL
  22773.  
  22774. -- If entered, unit cost must be numeric (decimal) with no formatting
  22775. SELECT
  22776. tmp.ExcelRowNumber,
  22777. 'Unit cost must be numeric (decimal) with no formatting.'
  22778. FROM #PR_Import_Val_Temp tmp
  22779. WHERE ISNUMERIC(tmp.UnitCost + 'e0') = 0
  22780. AND tmp.UnitCost IS NOT NULL
  22781.  
  22782. UNION ALL
  22783.  
  22784. -- SOH must be an integer (test for decimal)
  22785. SELECT
  22786. tmp.ExcelRowNumber,
  22787. 'SOH must be an integer'
  22788. FROM #PR_Import_Val_Temp tmp
  22789. WHERE SOH IS NOT NULL
  22790. AND SOHNumeric IS NULL
  22791. OR SOHNumeric <> 1
  22792.  
  22793. UNION ALL
  22794.  
  22795. -- SOH must be an integer (test for non-numeric)
  22796. SELECT
  22797. tmp.ExcelRowNumber,
  22798. 'SOH must be an integer'
  22799. FROM #PR_Import_Val_Temp tmp
  22800. WHERE SOH IS NOT NULL
  22801. AND ISNUMERIC(SOH + 'e0') = 0
  22802.  
  22803. UNION ALL
  22804.  
  22805. -- SOH cannot be negative
  22806. SELECT
  22807. tmp.ExcelRowNumber,
  22808. 'SOH cannot be negative'
  22809. FROM #PR_Import_Val_Temp tmp
  22810. WHERE intSOH < 0
  22811.  
  22812. UNION ALL
  22813.  
  22814. -- If entered, Serialized cannot exceed 1 character
  22815. --SELECT
  22816. -- tmp.ExcelRowNumber,
  22817. -- 'Serialized cannot be more than 1 character'
  22818. --FROM #PR_Import_Val_Temp tmp
  22819. --WHERE LEN(tmp.Serialized) > 1
  22820.  
  22821. --UNION ALL
  22822.  
  22823. -- Serialized must evaluate to yes/no (1, 0, Y, N are acceptable values with NULL defaulting to N)
  22824. SELECT
  22825. tmp.ExcelRowNumber,
  22826. 'Serialized must be either "Y" or "N" - (1 or 0 are also acceptable)'
  22827. FROM #PR_Import_Val_Temp tmp
  22828. WHERE tmp.Serialized NOT IN('Y', 'N', '0', '1', 'True', 'False', 'Yes', 'No')
  22829.  
  22830. UNION ALL
  22831.  
  22832. -- Serialized cost must evaluate to yes/no (1, 0, Y, N are acceptable values with NULL defaulting to N)
  22833. SELECT
  22834. tmp.ExcelRowNumber,
  22835. 'Serialized cost must be either "Y" or "N" - (1 or 0 are also acceptable)'
  22836. FROM #PR_Import_Val_Temp tmp
  22837. WHERE tmp.Serialized_Cost NOT IN('Y', 'N', '0', '1', 'True', 'False')
  22838.  
  22839. UNION ALL
  22840.  
  22841. -- Only products with class of 'I' can be serialized
  22842. SELECT
  22843. tmp.ExcelRowNumber,
  22844. 'Only products with a class of "I" may be serialized'
  22845. FROM #PR_Import_Val_Temp tmp
  22846. WHERE tmp.ProductClass <> 'I'
  22847. AND tmp.Serialized IN('1', 'Y', 'True')
  22848.  
  22849. UNION ALL
  22850.  
  22851. SELECT
  22852. tmp.ExcelRowNumber,
  22853. 'Cannot add non-serialized inventory to a product which is serialized in ConnectWise.'
  22854. FROM #PR_Import_Val_Temp tmp
  22855. CROSS APPLY(SELECT TOP 1 * FROM dbo.IV_Item ivi WHERE ivi.Item_ID = tmp.ProductID AND ivi.Serialized_Flag = 1) ivi
  22856. WHERE (tmp.SNCount = 0 OR tmp.SNCount IS NULL)
  22857. AND tmp.intSOH > 0
  22858.  
  22859. UNION ALL
  22860.  
  22861.  
  22862. -- Only serialized products can have serialized cost
  22863. SELECT
  22864. tmp.ExcelRowNumber,
  22865. 'Only serialized products can have serialized cost'
  22866. FROM #PR_Import_Val_Temp tmp
  22867. WHERE (tmp.Serialized IS NULL OR tmp.Serialized NOT IN('1', 'Y', 'True'))
  22868. AND tmp.Serialized_cost IN('1', 'Y', 'True')
  22869.  
  22870. UNION ALL
  22871. -- Only products with a a class of 'I' may have SOH
  22872. SELECT
  22873. tmp.ExcelRowNumber,
  22874. 'Only products with a class of "I" may have SOH'
  22875. FROM #PR_Import_Val_Temp tmp
  22876. WHERE tmp.ProductClass <> 'I'
  22877. AND intSOH >= 1
  22878.  
  22879. UNION ALL
  22880.  
  22881. -- If entered, Taxable cannot exceed 1 character
  22882. --SELECT
  22883. -- tmp.ExcelRowNumber,
  22884. -- 'Taxable cannot be more than 1 character'
  22885. --FROM #PR_Import_Val_Temp tmp
  22886. --WHERE LEN(tmp.Taxable) > 1
  22887.  
  22888. --UNION ALL
  22889.  
  22890. -- Taxable must evaluate to yes/no (1, 0, Y, N are acceptable values with NULL defaulting to N)
  22891. SELECT
  22892. tmp.ExcelRowNumber,
  22893. 'Taxable must be either "Y" or "N" - (1 or 0 are also acceptable)'
  22894. FROM #PR_Import_Val_Temp tmp
  22895. WHERE tmp.Taxable NOT IN('Y', 'N', '0', '1', 'TRUE', 'FALSE')
  22896.  
  22897. UNION ALL
  22898.  
  22899. -- Cannot update product to serialized if inventory exists
  22900. SELECT
  22901. tmp.ExcelRowNumber,
  22902. 'Cannot update a non-serialized product to serialized - this change must be performed in the ConnectWise UI'
  22903. FROM #PR_Import_Val_Temp tmp
  22904. CROSS APPLY(SELECT TOP 1 * FROM dbo.IV_Item ivi WHERE ivi.Item_ID = tmp.ProductID AND ivi.Serialized_Flag = 0 AND tmp.Serialized IN('Y', 'Yes', '1', 'T', 'True'))ivi
  22905.  
  22906.  
  22907. UNION ALL
  22908.  
  22909. -- Cannot update product to non-serialized
  22910. SELECT
  22911. tmp.ExcelRowNumber,
  22912. 'Cannot update a non-serialized product to serialized - this change must be performed in the ConnectWise UI'
  22913. FROM #PR_Import_Val_Temp tmp
  22914. CROSS APPLY(SELECT TOP 1 * FROM dbo.IV_Item ivi WHERE ivi.Item_ID = tmp.ProductID AND ivi.Serialized_Flag = 1 AND (tmp.Serialized IS NULL OR tmp.Serialized IN('N', 'NO', '0', 'F', 'False')))ivi
  22915.  
  22916. UNION ALL
  22917.  
  22918.  
  22919. -- Unable to update class on agreement class products (mirrored from PSA)
  22920. SELECT
  22921. tmp.ExcelRowNumber,
  22922. 'Cannot update Product Class for an agreement class product'
  22923. FROM #PR_Import_Val_Temp tmp
  22924. CROSS APPLY(SELECT TOP 1 * FROM IV_Item ivi WHERE ivi.IV_Item_RecID = tmp.IV_Item_RecID AND ivi.IV_Class_ID = 'A' AND tmp.ProductClass <> 'A')ivi
  22925.  
  22926.  
  22927. UNION ALL
  22928.  
  22929. -- Manufacturer cannot exceed 50 characters
  22930. SELECT
  22931. tmp.ExcelRowNumber,
  22932. 'Manufacturer cannot be more than 50 characters'
  22933. FROM #PR_Import_Val_Temp tmp
  22934. WHERE LEN(tmp.Manufacturer) > 50
  22935.  
  22936. UNION ALL
  22937.  
  22938. -- Manufacturer must be a valid reference
  22939. SELECT
  22940. tmp.ExcelRowNumber,
  22941. 'Invalid Manufacturer: "' + tmp.Manufacturer
  22942. FROM #PR_Import_Val_Temp tmp
  22943. LEFT OUTER JOIN Manufacturer mf
  22944. ON mf.Manufacturer_Name = tmp.Manufacturer
  22945. WHERE mf.Manufacturer_RecID IS NULL
  22946. AND tmp.Manufacturer IS NOT NULL
  22947.  
  22948. UNION ALL
  22949.  
  22950. -- Manufacturer part number cannot exceed 50 characters
  22951. SELECT
  22952. tmp.ExcelRowNumber,
  22953. 'Manufacturer part number cannot be more than 50 characters'
  22954. FROM #PR_Import_Val_Temp tmp
  22955. WHERE LEN(tmp.PartNumber) > 50
  22956. AND tmp.PartNumber IS NOT NULL
  22957.  
  22958. UNION ALL
  22959.  
  22960. -- Warehouse cannot exceed 50 characters
  22961. SELECT
  22962. tmp.ExcelRowNumber,
  22963. 'Warehouse cannot be more than 50 characters'
  22964. FROM #PR_Import_Val_Temp tmp
  22965. WHERE LEN(tmp.Warehouse) > 50
  22966. AND tmp.Warehouse IS NOT NULL
  22967.  
  22968. UNION ALL
  22969.  
  22970. -- Warehouse must be a valid reference
  22971. SELECT
  22972. tmp.ExcelRowNumber,
  22973. 'Invalid warehouse: "' + tmp.Warehouse
  22974. FROM #PR_Import_Val_Temp tmp
  22975. LEFT OUTER JOIN Warehouse wh
  22976. ON tmp.Warehouse = wh.Warehouse_Name
  22977. WHERE tmp.Warehouse IS NOT NULL
  22978. AND wh.Warehouse_RecID IS NULL
  22979.  
  22980. UNION ALL
  22981.  
  22982. -- Warehouse required if SOH > 0
  22983. SELECT
  22984. tmp.ExcelRowNumber,
  22985. 'Warehouse must be specified if product has SOH'
  22986. FROM #PR_Import_Val_Temp tmp
  22987. WHERE SOH IS NOT NULL
  22988. AND intSOH > 0
  22989. AND Warehouse IS NULL
  22990.  
  22991. UNION ALL
  22992.  
  22993. -- Warehouse bin cannot exceed 50 characters
  22994. SELECT
  22995. tmp.ExcelRowNumber,
  22996. 'Warehouse bin must be 50 characters or less'
  22997. FROM #PR_Import_Val_Temp tmp
  22998. WHERE LEN(tmp.WarehouseBin) > 50
  22999.  
  23000. UNION ALL
  23001.  
  23002. -- Warehouse bin must be assigned to warehouse
  23003. SELECT
  23004. tmp.ExcelRowNumber,
  23005. 'Warehouse bin: "' + tmp.WarehouseBin + '" does not exist for Warehouse: "' + tmp.Warehouse + '"'
  23006. FROM #PR_Import_Val_Temp tmp
  23007. INNER JOIN Warehouse wh
  23008. ON wh.Warehouse_Name = tmp.Warehouse
  23009. LEFT OUTER JOIN Warehouse_Bin whb
  23010. ON whb.[Description] = tmp.WarehouseBin
  23011. AND whb.Warehouse_RecID = wh.Warehouse_RecID
  23012. WHERE whb.Warehouse_RecID IS NULL
  23013. AND tmp.WarehouseBin IS NOT NULL
  23014. AND tmp.Warehouse IS NOT NULL
  23015.  
  23016. UNION ALL
  23017.  
  23018. -- Warehouse bin required if SOH > 0
  23019. SELECT
  23020. tmp.ExcelRowNumber,
  23021. 'Warehouse bin must be specified if product has SOH'
  23022. FROM #PR_Import_Val_Temp tmp
  23023. WHERE SOH IS NOT NULL
  23024. AND intSOH > 0
  23025. AND WarehouseBin IS NULL
  23026.  
  23027. UNION ALL
  23028.  
  23029. -- Serial numbers only valid if Serialized is 'Y'
  23030. SELECT
  23031. tmp.ExcelRowNumber,
  23032. 'Serial numbers cannot be supplied unless a product is Serialized'
  23033. FROM #PR_Import_Val_Temp tmp
  23034. WHERE SerialNumbers IS NOT NULL
  23035. AND (Serialized NOT IN('Y', '1', 'TRUE', 'Yes') OR Serialized IS NULL)
  23036.  
  23037. UNION ALL
  23038.  
  23039. -- Serial numbers only valid if Product class = I
  23040. SELECT
  23041. tmp.ExcelRowNumber,
  23042. 'Serial numbers cannot be supplied unless product class is Inventory (I)'
  23043. FROM #PR_Import_Val_Temp tmp
  23044. WHERE (tmp.ProductClass IS NULL OR tmp.ProductClass <> 'I')
  23045. AND tmp.SerialNumbers IS NOT NULL
  23046.  
  23047. UNION ALL
  23048.  
  23049. -- If product is serialized AND SOH > 0, require serial numbers
  23050. SELECT
  23051. tmp.ExcelRowNumber,
  23052. 'Serial numbers must be entered when SOH is > 0'
  23053. FROM #PR_Import_Val_Temp tmp
  23054. WHERE intSOH > 0
  23055. AND ISNULL(SNCount, 0) = 0
  23056. AND ProductClass = 'I'
  23057. AND Serialized IN('Y', '1')
  23058.  
  23059. UNION ALL
  23060.  
  23061. -- Number of serial numbers must match number of product in inventory
  23062. SELECT
  23063. tmp.ExcelRowNumber,
  23064. 'Serial Number mismatch: Amount of serial numbers in list must match SOH quantity'
  23065. FROM #PR_Import_Val_Temp tmp
  23066. WHERE tmp.ProductClass = 'I'
  23067. AND tmp.SNCount > 0
  23068. AND tmp.SNCount <> tmp.intSOH
  23069.  
  23070. UNION ALL
  23071.  
  23072. -- Serial number cannot appear more than once per product id
  23073. SELECT
  23074. MAX(sn.ExcelRowNumber),
  23075. 'Serial number: "' + sn.SerialNum + '" cannot appear more than once for Product ID: "' + ProductID + '"'
  23076. FROM @tblSerialNums sn
  23077. GROUP BY SerialNum, ProductID
  23078. HAVING COUNT(*) > 1
  23079.  
  23080. UNION ALL
  23081.  
  23082. -- Serial number must not already exist in CW
  23083. SELECT
  23084. stag.ExcelRowNumber,
  23085. 'Serial Number: "' + sn.Serial_Number + '" already exists in ConnectWise'
  23086. FROM @tblSerialNums stag
  23087. CROSS APPLY(SELECT TOP 1 * FROM dbo.IV_Serial_Number sn WHERE sn.Serial_Number = stag.SerialNum) sn
  23088. CROSS APPLY(SELECT TOP 1 * FROM dbo.IV_Item itm WHERE itm.Item_ID = stag.ProductID AND itm.IV_Item_RecID = sn.IV_Item_RecID)itm
  23089.  
  23090. UNION ALL
  23091.  
  23092. -- If price attribute specified, must be valid
  23093. SELECT
  23094. tmp.ExcelRowNumber,
  23095. 'Invalid price attribute: "' + tmp.Price_Attribute + '"'
  23096. FROM #PR_Import_Val_Temp tmp
  23097. WHERE Price_Attribute IS NOT NULL
  23098. AND IV_Price_Attribute_ID IS NULL
  23099.  
  23100. UNION ALL
  23101.  
  23102. -- If price attribute specified, class must be 'S'
  23103. SELECT
  23104. tmp.ExcelRowNumber,
  23105. 'Price attribute can only be specified for Service class products'
  23106. FROM #PR_Import_Val_Temp tmp
  23107. WHERE Price_Attribute IS NOT NULL
  23108. AND ProductClass <> 'S'
  23109.  
  23110. UNION ALL
  23111.  
  23112. -- Vendor must exist if specified
  23113. SELECT
  23114. tmp.ExcelRowNumber,
  23115. 'Vendor not found: ' + Vendor_Name
  23116. FROM #PR_Import_Val_Temp tmp
  23117. WHERE Vendor_Name IS NOT NULL
  23118. AND Vendor_Company_RecID IS NULL
  23119.  
  23120. --UNION ALL
  23121.  
  23122. ---- Cannot have duplicate on ProductID, Warehouse, Warehouse Bin
  23123. --SELECT
  23124. -- MAX(tmp.ExcelRowNumber),
  23125. -- 'There are multiple rows for Product ID: "' + tmp.ProductID + '" Warehouse: "' + tmp.Warehouse + '" Bin: "' + tmp.WarehouseBin + '"'
  23126. --FROM #PR_Import_Val_Temp tmp
  23127. --WHERE tmp.ProductID IS NOT NULL
  23128. -- AND tmp.Warehouse IS NOT NULL
  23129. -- AND tmp.WarehouseBin IS NOT NULL
  23130. --GROUP BY tmp.ProductID, tmp.Warehouse, tmp.WarehouseBin
  23131. --HAVING COUNT(*) > 1
  23132.  
  23133. -- Insert notification messages for any created references
  23134. INSERT INTO #tblResults
  23135. (
  23136. RowNumber,
  23137. ValMsg,
  23138. Warning_Flag,
  23139. ReferenceType
  23140. )
  23141.  
  23142. SELECT
  23143. NULL,
  23144. Manufacturer_Name,
  23145. 1,
  23146. 'Manufacturer(s)'
  23147. FROM dbo.Manufacturer
  23148. WHERE Updated_By = @ImportBatchUser
  23149.  
  23150. UNION ALL
  23151.  
  23152. SELECT
  23153. NULL,
  23154. cat.[Description] + '->' + sc.[Description],
  23155. 1,
  23156. 'Category -> Subcategory Relationship(s)'
  23157. FROM dbo.IV_Category cat
  23158. INNER JOIN IV_SubCategory sc
  23159. ON cat.IV_Cat_RecID = sc.IV_Cat_RecID
  23160. WHERE sc.Updated_By = @ImportBatchUser
  23161.  
  23162. UNION ALL
  23163.  
  23164. SELECT
  23165. NULL,
  23166. cat.[Description],
  23167. 1,
  23168. 'Category(s)'
  23169. FROM dbo.IV_Category cat
  23170. WHERE cat.Updated_By = @ImportBatchUser
  23171.  
  23172. UNION ALL
  23173.  
  23174. SELECT
  23175. NULL,
  23176. ivt.[Description],
  23177. 1,
  23178. 'Product Type(s)'
  23179. FROM dbo.IV_Type ivt
  23180. WHERE ivt.Updated_By = @ImportBatchUser
  23181.  
  23182.  
  23183. -- Return results
  23184. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  23185. BEGIN
  23186.  
  23187. exec dbo.usp_Condense_Validation_Results
  23188.  
  23189. SELECT
  23190. 0 AS ValPassed,
  23191. 0 AS RowNumber,
  23192. ValMsg
  23193. FROM #ResultsCondensed
  23194.  
  23195. ROLLBACK TRANSACTION
  23196. RETURN
  23197.  
  23198. END
  23199. ELSE
  23200. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
  23201. BEGIN
  23202.  
  23203. exec dbo.usp_Condense_Validation_Results
  23204.  
  23205. SELECT
  23206. 2 AS ValPassed,
  23207. 0 AS RowNumber,
  23208. ValMsg
  23209. FROM #ResultsCondensed res
  23210.  
  23211. UNION ALL
  23212.  
  23213. SELECT
  23214. 2 AS ValPassed,
  23215. 0 AS RowNumber,
  23216. 'The following ' + ReferenceType + ' will be created: '+
  23217. STUFF(
  23218. (SELECT ', ' + ValMsg
  23219. FROM #tblResults
  23220. WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
  23221. FOR XML PATH (''))
  23222. , 1, 1, '') AS ValMsg
  23223. FROM #tblResults res
  23224. WHERE ReferenceType IS NOT NULL
  23225. GROUP BY ReferenceType
  23226.  
  23227. ROLLBACK TRANSACTION
  23228. EXEC usp_Import_Record_Validation @TableName
  23229. END
  23230. ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  23231. BEGIN
  23232. SELECT
  23233. 1 AS ValPassed,
  23234. NULL AS RowNumber,
  23235. NULL AS ValMsg
  23236. ROLLBACK TRANSACTION
  23237. EXEC usp_Import_Record_Validation @TableName
  23238. END
  23239.  
  23240.  
  23241. END
  23242.  
  23243.  
  23244.  
  23245.  
  23246. GO
  23247.  
  23248. -- ============================================
  23249. -- Author: m.gray
  23250. -- Create date: 04/08/2013
  23251. -- Description: Performs final validation
  23252. -- and inserts for products import
  23253. -- Sample call: exec usp_PR_ImportPush 'TMP_Import_3fd1bb4a474645abaf98c90d64389a80', 1, 1
  23254. -- =============================================
  23255. ALTER PROCEDURE [dbo].[usp_PR_ImportPush]
  23256. @TableName VARCHAR(MAX),
  23257. @DebugMode INT = 0,
  23258. @Forcemode BIT = 0
  23259. AS
  23260. BEGIN TRY
  23261.  
  23262. SET NOCOUNT ON
  23263.  
  23264. -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
  23265. IF OBJECT_ID('tempdb..#PR_Import_Staging') IS NOT NULL
  23266. BEGIN
  23267. DROP TABLE #PR_Import_Staging
  23268. END
  23269.  
  23270. -- Dynamic statement to insert to staging table
  23271. DECLARE @DSQL VARCHAR(MAX)
  23272.  
  23273. -- Fully qualified name of source table
  23274. DECLARE @SourceTable VARCHAR(300)
  23275. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  23276.  
  23277. -- Object_ID of source table
  23278. DECLARE @Source_Object_ID INT
  23279. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  23280.  
  23281. CREATE TABLE #PR_Import_Staging
  23282. (
  23283. [ExcelRowNumber] [int] NULL,
  23284. [ProductID] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23285. [Description] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23286. [LongDesc] [varchar](max) COLLATE DATABASE_DEFAULT NULL,
  23287. [Category] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23288. [SubCategory] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23289. [ProductType] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23290. [ProductClass] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23291. [UOM] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23292. [UnitPrice] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23293. [UnitCost] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23294. [Serialized] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23295. [Taxable] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23296. [Manufacturer] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23297. [PartNumber] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23298. [SOH] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  23299. [Warehouse] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23300. [WarehouseBin] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
  23301. [SerialNumbers] [varchar](max) COLLATE DATABASE_DEFAULT NULL,
  23302. [BatchID] [uniqueidentifier] NULL,
  23303. [SerialNumbersXML][xml] NULL,
  23304. [SNCount] INT NULL,
  23305. IV_Category_RecID INT NULL,
  23306. IV_Subcategory_RecID INT NULL,
  23307. IV_Type_RecID INT NULL,
  23308. IV_Class_ID NVARCHAR(5) COLLATE DATABASE_DEFAULT NULL,
  23309. IV_UOM_RecID INT NULL,
  23310. Manufacturer_RecID INT NULL,
  23311. Warehouse_RecID INT NULL,
  23312. Warehouse_Bin_RecID INT NULL,
  23313. Method VARCHAR(10) COLLATE DATABASE_DEFAULT NULL,
  23314. ConvertMessage VARCHAR(1000) COLLATE DATABASE_DEFAULT NULL,
  23315. Adjustment_RecID INT NULL,
  23316. IV_Item_RecID_New INT NULL,
  23317. New_Inventory_Record BIT NULL,
  23318. IV_Item_RecID INT NULL,
  23319. Inventory_By_Warehouse_RecID INT NULL,
  23320. IV_Adjustment_Detail_RecID INT NULL,
  23321. GL_Amount DECIMAL(18, 2),
  23322. GL_Inserted BIT NULL,
  23323. intSOH INT,
  23324. SOHNumeric BIT NULL,
  23325. SOHTotal INT NULL,
  23326. IV_Audit_RecID INT NULL,
  23327. [Price_Attribute] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  23328. IV_Price_Attribute_ID NVARCHAR(10) COLLATE DATABASE_DEFAULT,
  23329. Vendor_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  23330. Vendor_SKU NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  23331. Vendor_Company_RecID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  23332. Product_Notes NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  23333. Serialized_Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  23334. )
  23335.  
  23336. -- Variable declaration
  23337. DECLARE
  23338. @ExpRowCount INT, -- Expected rowcount inserts - Used for validation
  23339. @ErrorMsg VARCHAR(350), -- Variable to hold custom error message
  23340. @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
  23341. @IV_Adjustment_Type_RecID INT,
  23342. @ImportBatchUser VARCHAR(15), -- Unique value to identify records created by this import
  23343. @IV_Adjustment_RecID INT, -- IV_Adjustment_RecID for this batch
  23344. -- Variables needed for insert loop for GL records
  23345. @taxable bit,
  23346. @typeRecid int,
  23347. @billAmount decimal(18,2),
  23348. @glCost decimal(18,2),
  23349. @subCatRecid int,
  23350. @catRecid int,
  23351. @olRecid int,
  23352. @buRecid int,
  23353. @segmentNbr int,
  23354. @glCogs varchar(255),
  23355. @glInventory varchar(255),
  23356. @glItem varchar(255),
  23357. @glSalesCode varchar(255),
  23358. @seg1 varchar(255), @seg2 varchar(255), @seg3 varchar(255), @seg4 varchar(255), @seg5 varchar(255),
  23359. @seg6 varchar(255), @seg7 varchar(255), @seg8 varchar(255), @seg9 varchar(255), @seg10 varchar(255),
  23360. @Curr_Detail_RecID INT,
  23361. @Curr_Audit_Row INT,
  23362. @Prev_Quantity INT,
  23363. @Prev_Audit_RecID INT,
  23364. @Prev_Avg_Cost FLOAT,
  23365. @Total_Cost FLOAT,
  23366. @New_Avg_Cost FLOAT,
  23367. @Curr_Avg_Cost FLOAT,
  23368. @Curr_Quantity INT,
  23369. @IV_Audit_RecID INT,
  23370. @Curr_IV_Item_RecID INT,
  23371. @Curr_Warehouse_Bin_RecID INT
  23372.  
  23373. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  23374. SELECT @ImportBatchUser =
  23375. 'CONV_'
  23376. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  23377. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  23378. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  23379. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  23380.  
  23381. -- Table to hold serial numbers for validation
  23382. DECLARE @SerNums TABLE
  23383. (
  23384. ExcelRowNumber INT,
  23385. SerialNum VARCHAR(MAX)
  23386. )
  23387.  
  23388. -- Table for storing the GL Accounts based on heirarchy for adjustments
  23389. DECLARE @GLAccounts TABLE
  23390. (
  23391. GL_Item varchar(255),
  23392. GL_SalesCode varchar(255),
  23393. GL_Cogs varchar(255),
  23394. GL_Inventory varchar(255),
  23395. segment1 varchar(255),
  23396. segment2 varchar(255),
  23397. segment3 varchar(255),
  23398. segment4 varchar(255),
  23399. segment5 varchar(255),
  23400. segment6 varchar(255),
  23401. segment7 varchar(255),
  23402. segment8 varchar(255),
  23403. segment9 varchar(255),
  23404. segment10 varchar(255),
  23405. sort int
  23406. )
  23407.  
  23408. -- Build statement to populate validation temp table
  23409. SELECT @DSQL = '
  23410. INSERT INTO #PR_Import_Staging
  23411. (
  23412. ExcelRowNumber,
  23413. ProductID,
  23414. Description,
  23415. LongDesc,
  23416. Category,
  23417. SubCategory,
  23418. ProductType,
  23419. ProductClass,
  23420. UOM,
  23421. UnitPrice,
  23422. UnitCost,
  23423. Serialized,
  23424. Taxable,
  23425. Manufacturer,
  23426. PartNumber,
  23427. SOH,
  23428. Warehouse,
  23429. WarehouseBin,
  23430. SerialNumbers
  23431. )
  23432. SELECT
  23433. [Excel Row Number],
  23434. [Product ID],
  23435. [Description],
  23436. [Long Description],
  23437. [Category],
  23438. [Sub-Category],
  23439. [Product Type],
  23440. [Product Class],
  23441. [UOM],
  23442. [Unit Price],
  23443. [Unit Cost],
  23444. [Serialized (Y/N)],
  23445. [Taxable (Y/N)],
  23446. [Manufacturer],
  23447. [Manufacturer Part Number],
  23448. [SOH],
  23449. [Warehouse],
  23450. [Warehouse Bin],
  23451. [Serial Numbers]
  23452. FROM ' + @SourceTable
  23453.  
  23454. EXEC(@DSQL)
  23455.  
  23456. BEGIN TRANSACTION PR_Import
  23457.  
  23458. -- Table variable to hold column names from source table
  23459. DECLARE @SourceColumns TABLE
  23460. (
  23461. ColumnName VARCHAR(255)
  23462. )
  23463.  
  23464. -- Populate @SourceColumns
  23465. INSERT INTO @SourceColumns
  23466. (
  23467. ColumnName
  23468. )
  23469.  
  23470. SELECT
  23471. name
  23472. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  23473.  
  23474. -- Update temp table with optional field values if they exist
  23475. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Price Attribute')
  23476. BEGIN
  23477. SELECT @DSQL = '
  23478. UPDATE tmp
  23479. SET tmp.Price_Attribute = src.[Price Attribute]
  23480. FROM #PR_Import_Staging tmp
  23481. INNER JOIN ' + @SourceTable + ' src
  23482. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  23483.  
  23484. EXEC(@DSQL)
  23485. END
  23486.  
  23487. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Vendor')
  23488. BEGIN
  23489. SELECT @DSQL = '
  23490. UPDATE tmp
  23491. SET tmp.Vendor_Name = src.[Vendor]
  23492. FROM #PR_Import_Staging tmp
  23493. INNER JOIN ' + @SourceTable + ' src
  23494. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  23495.  
  23496. EXEC(@DSQL)
  23497. END
  23498.  
  23499. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Vendor SKU')
  23500. BEGIN
  23501. SELECT @DSQL = '
  23502. UPDATE tmp
  23503. SET tmp.Vendor_SKU = LEFT(src.[Vendor SKU], 50)
  23504. FROM #PR_Import_Staging tmp
  23505. INNER JOIN ' + @SourceTable + ' src
  23506. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  23507.  
  23508. EXEC(@DSQL)
  23509. END
  23510.  
  23511. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Product Notes')
  23512. BEGIN
  23513. SELECT @DSQL = '
  23514. UPDATE tmp
  23515. SET tmp.Product_Notes = src.[Product Notes]
  23516. FROM #PR_Import_Staging tmp
  23517. INNER JOIN ' + @SourceTable + ' src
  23518. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  23519.  
  23520. EXEC(@DSQL)
  23521. END
  23522.  
  23523. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Serialized Cost')
  23524. BEGIN
  23525. SELECT @DSQL = '
  23526. UPDATE tmp
  23527. SET tmp.Serialized_Cost = LEFT(src.[Serialized Cost], 50)
  23528. FROM #PR_Import_Staging tmp
  23529. INNER JOIN ' + @SourceTable + ' src
  23530. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  23531.  
  23532. EXEC(@DSQL)
  23533. END
  23534.  
  23535. -- Update blank string to null for all columns in staging table
  23536. UPDATE #PR_Import_Staging SET
  23537. ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
  23538. ProductID = CASE WHEN ProductID IN('', ' ') THEN NULL ELSE ProductID END,
  23539. Description = CASE WHEN Description IN('', ' ') THEN NULL ELSE Description END,
  23540. LongDesc = CASE WHEN LongDesc IN('', ' ') THEN NULL ELSE LongDesc END,
  23541. Category = CASE WHEN Category IN('', ' ') THEN NULL ELSE Category END,
  23542. SubCategory = CASE WHEN SubCategory IN('', ' ') THEN NULL ELSE SubCategory END,
  23543. ProductType = CASE WHEN ProductType IN('', ' ') THEN NULL ELSE ProductType END,
  23544. ProductClass = CASE WHEN ProductClass IN('', ' ') THEN NULL ELSE ProductClass END,
  23545. UOM = CASE WHEN UOM IN('', ' ') THEN NULL ELSE UOM END,
  23546. UnitPrice = CASE WHEN UnitPrice IN('', ' ') THEN NULL ELSE UnitPrice END,
  23547. UnitCost = CASE WHEN UnitCost IN('', ' ') THEN NULL ELSE UnitCost END,
  23548. Serialized = CASE WHEN Serialized IN('', ' ') THEN NULL ELSE Serialized END,
  23549. Taxable = CASE WHEN Taxable IN('', ' ') THEN NULL ELSE Taxable END,
  23550. Manufacturer = CASE WHEN Manufacturer IN('', ' ') THEN NULL ELSE Manufacturer END,
  23551. PartNumber = CASE WHEN PartNumber IN('', ' ') THEN NULL ELSE PartNumber END,
  23552. SOH = CASE WHEN SOH IN('', ' ') THEN NULL ELSE SOH END,
  23553. Warehouse = CASE WHEN Warehouse IN('', ' ') THEN NULL ELSE Warehouse END,
  23554. WarehouseBin = CASE WHEN WarehouseBin IN('', ' ') THEN NULL ELSE WarehouseBin END,
  23555. SerialNumbers = CASE WHEN SerialNumbers IN('', ' ') THEN NULL ELSE SerialNumbers END,
  23556. Price_Attribute = CASE WHEN Price_Attribute IN('', ' ') THEN NULL ELSE Price_Attribute END,
  23557. Vendor_Name = CASE WHEN Vendor_Name IN('', ' ') THEN NULL ELSE Vendor_Name END,
  23558. Vendor_SKU = CASE WHEN Vendor_SKU IN('', ' ') THEN NULL ELSE Vendor_SKU END,
  23559. Serialized_Cost = CASE WHEN Serialized_Cost IN('', ' ') THEN NULL ELSE Serialized_Cost END
  23560.  
  23561.  
  23562. -- Update class to 'I' if inventory, 'N' if Non-Inventory, 'S' if service
  23563. UPDATE stag
  23564. SET stag.ProductClass =
  23565. CASE stag.ProductClass
  23566. WHEN 'Inventory' THEN 'I'
  23567. WHEN 'Non-Inventory' THEN 'N'
  23568. WHEN 'Non Inventory' THEN 'N'
  23569. WHEN 'Service' THEN 'S'
  23570. WHEN 'Services' THEN 'S'
  23571. WHEN 'Agreement' THEN 'A'
  23572. WHEN NULL THEN 'N'
  23573. ELSE stag.ProductClass
  23574. END
  23575. FROM #PR_Import_Staging stag
  23576. WHERE stag.ProductClass IN('Inventory', 'Non-Inventory', 'Non Inventory', 'Service', 'Services', 'Agreement')
  23577. OR stag.ProductClass IS NULL
  23578.  
  23579. -- Get IV_Price_Attribute_ID
  23580. UPDATE tmp
  23581. SET tmp.IV_Price_Attribute_ID = pa.IV_Price_Attribute_ID
  23582. FROM #PR_Import_Staging tmp
  23583. CROSS APPLY(SELECT TOP 1 * FROM IV_Price_Attribute pa WHERE pa.IV_Price_Attribute_ID = tmp.Price_Attribute OR pa.[Description] = tmp.Price_Attribute) pa
  23584.  
  23585. -- Strip dollar sign and commas from price/cost fields (common cause of validation error)
  23586. UPDATE stag
  23587. SET stag.UnitPrice = REPLACE(stag.UnitPrice, '$', ''),
  23588. stag.UnitCost = REPLACE(stag.UnitCost, '$', '')
  23589. FROM #PR_Import_Staging stag
  23590.  
  23591. UPDATE stag
  23592. SET stag.UnitPrice = REPLACE(stag.UnitPrice, ',', ''),
  23593. stag.UnitCost = REPLACE(stag.UnitCost, ',', '')
  23594. FROM #PR_Import_Staging stag
  23595.  
  23596. -- Strip commas from SOH
  23597. UPDATE #PR_Import_Staging
  23598. SET SOH = REPLACE(SOH, ',', '')
  23599.  
  23600. -- Assume 0 SOH if null
  23601. UPDATE #PR_Import_Staging
  23602. SET SOH = '0'
  23603. WHERE SOH IS NULL
  23604.  
  23605. -- Remove SSIS import row if exists
  23606. DELETE FROM #PR_Import_Staging
  23607. WHERE UnitPrice = 'Connectwise'
  23608. AND ProductID = 'Connectwise'
  23609. AND SOH = 'Connectwise'
  23610.  
  23611. -- Get Vendor_Company_RecID
  23612. UPDATE tmp
  23613. SET tmp.Vendor_Company_RecID = comp.Company_RecID
  23614. FROM #PR_Import_Staging tmp
  23615. CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_Name = tmp.Vendor_Name) comp
  23616.  
  23617. -- Convert SerialNumbers to XML
  23618. UPDATE stag
  23619. SET SerialNumbersXML = CAST('<SerNum>' + REPLACE(stag.SerialNumbers,',','</SerNum><SerNum>')+ '</SerNum>' AS XML)
  23620. FROM #PR_Import_Staging stag
  23621. WHERE SerialNumbers IS NOT NULL
  23622.  
  23623. -- If SOH evaluates to integer, convert and capture in intSOH field
  23624. UPDATE #PR_Import_Staging
  23625. SET SOHNumeric =
  23626. CASE
  23627. WHEN ISNUMERIC(SOH) = 0 THEN 0
  23628. WHEN SOH LIKE '%\[^-+ 0-9\]%' THEN 0
  23629. WHEN CAST(SOH AS NUMERIC(38, 0))
  23630. NOT BETWEEN -2147483648. AND 2147483647. THEN 0
  23631. ELSE 1
  23632. END
  23633.  
  23634. UPDATE #PR_Import_Staging
  23635. SET intSOH = CONVERT(INT, CAST(SOH AS DECIMAL))
  23636. WHERE SOHNumeric = 1
  23637.  
  23638. -- Insert list of serial numbers from XML to serial number table
  23639. INSERT INTO @SerNums
  23640. (
  23641. ExcelRowNumber,
  23642. SerialNum
  23643. )
  23644.  
  23645. SELECT DISTINCT ExcelRowNumber, RTRIM(LTRIM(SNums.Split.value('.', 'VARCHAR(MAX)'))) AS 'SN'
  23646. FROM #PR_Import_Staging stag
  23647. CROSS APPLY SerialNumbersXML.nodes('/SerNum') AS SNums(Split)
  23648.  
  23649. -- If @ForceMode = 1, create necessary references
  23650. IF @Forcemode = 1
  23651. BEGIN
  23652. INSERT INTO dbo.Manufacturer
  23653. (
  23654. Manufacturer_Name,
  23655. Inactive_Flag,
  23656. Last_Update,
  23657. Updated_By
  23658. )
  23659.  
  23660. SELECT DISTINCT
  23661. tmp.Manufacturer,
  23662. 0,
  23663. GETDATE(),
  23664. @ImportBatchUser
  23665. FROM #PR_Import_Staging tmp
  23666. LEFT OUTER JOIN Manufacturer mf
  23667. ON mf.Manufacturer_Name = tmp.Manufacturer
  23668. WHERE mf.Manufacturer_RecID IS NULL
  23669. AND tmp.Manufacturer IS NOT NULL
  23670.  
  23671. -- Category
  23672. INSERT INTO dbo.IV_Category
  23673. (
  23674. [Description],
  23675. Inactive_Flag,
  23676. Updated_By,
  23677. Last_Update
  23678. )
  23679.  
  23680. SELECT DISTINCT
  23681. tmp.Category,
  23682. 0,
  23683. @ImportBatchUser,
  23684. GETDATE()
  23685. FROM #PR_Import_Staging tmp
  23686. LEFT OUTER JOIN IV_Category cat
  23687. ON cat.[Description] = tmp.Category
  23688. WHERE cat.IV_Cat_RecID IS NULL
  23689. AND tmp.Category IS NOT NULL
  23690.  
  23691. -- Subcategory
  23692. INSERT INTO dbo.IV_SubCategory
  23693. (
  23694. IV_Cat_RecID,
  23695. [Description],
  23696. Inactive_Flag,
  23697. Updated_By,
  23698. Last_Update
  23699. )
  23700.  
  23701. SELECT DISTINCT
  23702. cat.IV_Cat_RecID,
  23703. tmp.SubCategory,
  23704. 0,
  23705. @ImportBatchUser,
  23706. GETDATE()
  23707. FROM #PR_Import_Staging tmp
  23708. INNER JOIN IV_Category cat
  23709. ON cat.[Description] = tmp.Category
  23710. LEFT OUTER JOIN IV_SubCategory subc
  23711. ON subc.[Description] = tmp.SubCategory
  23712. AND subc.IV_Cat_RecID = cat.IV_Cat_RecID
  23713. WHERE subc.IV_SubCat_RecID IS NULL
  23714. AND tmp.SubCategory IS NOT NULL
  23715. AND LEN(tmp.Subcategory) <= 50
  23716.  
  23717. -- Product Type
  23718. INSERT INTO IV_Type
  23719. (
  23720. Owner_ID,
  23721. [Description],
  23722. Inactive_Flag,
  23723. Updated_By,
  23724. Last_Update,
  23725. Item_Type_Xref
  23726. )
  23727.  
  23728. SELECT DISTINCT
  23729. 1,
  23730. tmp.ProductType,
  23731. 0,
  23732. @ImportBatchUser,
  23733. GETDATE(),
  23734. NULL
  23735. FROM #PR_Import_Staging tmp
  23736. LEFT OUTER JOIN IV_Type ivt
  23737. ON ivt.[Description] = tmp.ProductType
  23738. WHERE ivt.IV_Type_RecID IS NULL
  23739. AND tmp.ProductType IS NOT NULL
  23740. AND LEN(tmp.ProductType) <= 50
  23741.  
  23742. -- Force short description by trimming to 50 characters
  23743. UPDATE #PR_Import_Staging
  23744. SET [Description] = SUBSTRING([Description], 1, 50)
  23745. WHERE LEN([Description]) > 50
  23746. END
  23747.  
  23748. -- Grab reference RecIDs needed to start import
  23749. -- Category & Sub-Category RecID
  23750. UPDATE stag
  23751. SET stag.IV_Category_RecID = ivc.IV_Cat_RecID,
  23752. stag.IV_SubCategory_RecID = ivsc.IV_Subcat_RecID
  23753. FROM IV_Category ivc
  23754. INNER JOIN IV_SubCategory ivsc
  23755. ON ivsc.IV_Cat_RecID = ivc.IV_Cat_RecID
  23756. INNER JOIN #PR_Import_Staging stag
  23757. ON stag.SubCategory = ivsc.[Description]
  23758. AND stag.Category = ivc.[Description]
  23759.  
  23760. -- Type
  23761. UPDATE stag
  23762. SET stag.IV_Type_RecID = ivt.IV_Type_RecID
  23763. FROM IV_Type ivt
  23764. INNER JOIN #PR_Import_Staging stag
  23765. ON ivt.[Description] = stag.ProductType
  23766.  
  23767. -- Class
  23768. UPDATE stag
  23769. SET stag.IV_Class_ID = ivc.IV_Class_ID
  23770. FROM #PR_Import_Staging stag
  23771. INNER JOIN IV_Class ivc
  23772. ON ivc.IV_Class_ID = stag.ProductClass
  23773.  
  23774. -- Manufacturer (where specified)
  23775. UPDATE stag
  23776. SET stag.Manufacturer_RecID = mn.Manufacturer_RecID
  23777. FROM #PR_Import_Staging stag
  23778. INNER JOIN Manufacturer mn
  23779. ON mn.Manufacturer_Name = stag.Manufacturer
  23780. WHERE stag.Manufacturer IS NOT NULL
  23781.  
  23782. -- Warehouse (where specified)
  23783. UPDATE stag
  23784. SET stag.Warehouse_RecID = wh.Warehouse_RecID
  23785. FROM #PR_Import_Staging stag
  23786. INNER JOIN Warehouse wh
  23787. ON wh.Warehouse_Name = stag.Warehouse
  23788.  
  23789. -- Warehouse bin (where specified)
  23790. UPDATE stag
  23791. SET stag.Warehouse_Bin_RecID = whb.Warehouse_Bin_RecID
  23792. FROM #PR_Import_Staging stag
  23793. INNER JOIN Warehouse_Bin whb
  23794. ON whb.Description = stag.WarehouseBin
  23795. INNER JOIN Warehouse wh
  23796. ON wh.Warehouse_RecID = whb.Warehouse_RecID
  23797.  
  23798. -- UOM
  23799. UPDATE stag
  23800. SET stag.IV_UOM_RecID = uom.IV_UOM_RecID
  23801. FROM #PR_Import_Staging stag
  23802. INNER JOIN IV_UOM uom
  23803. ON uom.[Description] = stag.UOM
  23804.  
  23805. -- Get zAdmin RecID
  23806. SELECT @zAdmin_Member_RecID = Member_RecID
  23807. FROM dbo.Member
  23808. WHERE Member_ID = 'zadmin'
  23809.  
  23810. -- Update serialized flag
  23811. UPDATE stag
  23812. SET stag.Serialized = CASE Serialized WHEN 'Y' THEN '1' WHEN 'N' THEN '0' WHEN NULL THEN '0' WHEN 'TRUE' THEN '1' WHEN 'FALSE' THEN '0' ELSE Serialized END
  23813. FROM #PR_Import_Staging stag
  23814.  
  23815. -- Update serialized cost flag
  23816. UPDATE stag
  23817. SET stag.Serialized_Cost = CASE Serialized_Cost WHEN 'Y' THEN '1' WHEN 'N' THEN '0' WHEN NULL THEN '0' WHEN 'TRUE' THEN '1' WHEN 'FALSE' THEN '0' ELSE '0' END
  23818. FROM #PR_Import_Staging stag
  23819.  
  23820. -- Update taxable flag
  23821. UPDATE stag
  23822. SET stag.Taxable = '0'
  23823. FROM #PR_Import_Staging stag
  23824. WHERE stag.Taxable IS NULL
  23825.  
  23826. UPDATE stag
  23827. SET stag.Taxable = CASE Taxable WHEN 'Y' THEN '1' WHEN 'N' THEN '0' WHEN NULL THEN '0' WHEN 'TRUE' THEN '1' WHEN 'FALSE' THEN '0' ELSE Taxable END
  23828. FROM #PR_Import_Staging stag
  23829.  
  23830. -- Strip dollar sign from price/cost
  23831. UPDATE stag
  23832. SET stag.UnitPrice = REPLACE(stag.UnitPrice, '$', ''),
  23833. stag.UnitCost = REPLACE(stag.UnitCost, '$', '')
  23834. FROM #PR_Import_Staging stag
  23835.  
  23836. -- Set ConvertMessage and error out if any invalid references
  23837. UPDATE stag
  23838. SET ConvertMessage =
  23839. CASE
  23840. WHEN IV_Category_RecID IS NULL THEN 'Invalid category: ' + ISNULL(Category, '[BLANK]') + '"'
  23841. WHEN IV_Subcategory_RecID IS NULL THEN 'Invalid subcategory: "' + ISNULL(SubCategory, '[BLANK]') + '"'
  23842. WHEN IV_Type_RecID IS NULL THEN 'Invalid type: "' + ISNULL(ProductType, '[BLANK]') + '"'
  23843. WHEN IV_Class_ID IS NULL THEN 'Invalid class: "' + ISNULL(ProductClass, '[BLANK]') + '"'
  23844. WHEN IV_UOM_RecID IS NULL THEN 'Invalid UOM: "' + ISNULL(UOM, '[BLANK]') + '"'
  23845. WHEN Manufacturer_RecID IS NULL AND Manufacturer IS NOT NULL THEN 'Invalid manufacturer: "' + ISNULL(Manufacturer, '[BLANK]') + '"'
  23846. WHEN Warehouse_RecID IS NULL AND Warehouse IS NOT NULL THEN 'Invalid warehouse: "' + ISNULL(Warehouse, '[BLANK]') + '"'
  23847. WHEN Warehouse_Bin_RecID IS NULL AND WarehouseBin IS NOT NULL THEN 'Invalid warehouse bin: "' + ISNULL(WarehouseBin, '[BLANK]') + '"'
  23848. END
  23849. FROM #PR_Import_Staging stag
  23850.  
  23851. -- If there is an invalid reference, raise error
  23852. IF EXISTS(SELECT * FROM #PR_Import_Staging WHERE ConvertMessage IS NOT NULL)
  23853. BEGIN
  23854. DECLARE @ConvError NVARCHAR(1000)
  23855. SELECT @ConvError = 'Validation Error - ' + (SELECT TOP 1 ConvertMessage FROM #PR_Import_Staging WHERE ConvertMessage IS NOT NULL)
  23856. RAISERROR(@ConvError, 16, 2)
  23857. END
  23858.  
  23859. -- Error if no zAdmin user
  23860. IF @zAdmin_Member_RecID IS NULL
  23861. BEGIN
  23862. RAISERROR('zAdmin user not found for this implementation - required for import', 16, 2)
  23863. END
  23864.  
  23865. ELSE
  23866.  
  23867. -- Validation success - begin push
  23868. -- Determine if adjustment record is needed
  23869. IF EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE intSOH > 0)
  23870. BEGIN
  23871. -- Update null taxable flag to 0 to prevent error on GL insert
  23872. UPDATE #PR_Import_Staging
  23873. SET Taxable = 0
  23874. WHERE Taxable IS NULL
  23875.  
  23876. -- If adjustment type for import utility does not exist, insert a type record
  23877. IF NOT EXISTS(SELECT TOP 1 * FROM IV_Adjustment_Type WHERE IV_Adjustment_Type_ID = 'Initial Count')
  23878. BEGIN
  23879.  
  23880. INSERT INTO IV_Adjustment_Type
  23881. (
  23882. IV_Adjustment_Type_ID,
  23883. [Description],
  23884. --Last_Update,
  23885. Updated_By
  23886. )
  23887. SELECT
  23888. 'Initial Count',
  23889. 'Initial Count',
  23890. --GETDATE(),
  23891. @ImportBatchUser
  23892. END
  23893.  
  23894. SELECT @IV_Adjustment_Type_RecID = (SELECT MIN(IV_Adjustment_Type_RecID) FROM IV_Adjustment_Type WHERE IV_Adjustment_Type_ID IN('Initial Count', 'Import Utility'))
  23895.  
  23896. -- Create adjustment
  23897. INSERT INTO IV_Adjustment
  23898. (
  23899. IV_Adjustment_Type_RecID,
  23900. [Description],
  23901. Reason,
  23902. Notes,
  23903. Updated_By,
  23904. Closed_Flag,
  23905. Date_Closed,
  23906. Closed_By
  23907. )
  23908.  
  23909. SELECT
  23910. @IV_Adjustment_Type_RecID,
  23911. 'Import Utility - ' + CAST(GETDATE() AS VARCHAR(50)),
  23912. 'Import Utility - ' + CAST(GETDATE() AS VARCHAR(50)),
  23913. 'Import Utility - ' + CAST(GETDATE() AS VARCHAR(50)),
  23914. @ImportBatchUser,
  23915. 1,
  23916. GETDATE(),
  23917. @ImportBatchUser
  23918.  
  23919. -- Capture IV_Adjustment_RecID for this batch
  23920. SELECT @IV_Adjustment_RecID = SCOPE_IDENTITY()
  23921.  
  23922. END
  23923.  
  23924. -- Determine whether each row should be inserted or updated
  23925. UPDATE stag
  23926. SET Method = 'UPDATE'
  23927. FROM #PR_Import_Staging stag
  23928. INNER JOIN dbo.IV_Item ivi
  23929. ON ivi.[Item_ID] = stag.ProductID
  23930.  
  23931. UPDATE stag
  23932. SET Method = 'UPDATE'
  23933. FROM #PR_Import_Staging stag
  23934. INNER JOIN dbo.IV_Item ivi
  23935. ON stag.Method = NULL
  23936. AND ivi.Item_ID LIKE(' %') OR ivi.Item_ID LIKE('% ')
  23937. AND dbo.ufn_Import_Trim(ivi.[Item_ID]) = stag.ProductID
  23938.  
  23939. UPDATE stag
  23940. SET Method = 'INSERT'
  23941. FROM #PR_Import_Staging stag
  23942. WHERE Method IS NULL
  23943.  
  23944. -- If there are multiple 'Insert' rows with the same Product_ID, set the first to 'INSERT' and subsequent to 'UPDATE'
  23945. ;WITH DupRows AS
  23946. (
  23947. SELECT stag.ProductID
  23948. FROM #PR_Import_Staging stag
  23949. GROUP BY stag.ProductID
  23950. HAVING COUNT(*) > 1
  23951. )
  23952.  
  23953. UPDATE stag2
  23954. SET stag2.Method = 'UPDATE'
  23955. FROM #PR_Import_Staging stag1
  23956. INNER JOIN DupRows dr
  23957. ON stag1.ProductID = dr.ProductID
  23958. INNER JOIN #PR_Import_Staging stag2
  23959. ON stag1.ProductID = stag2.ProductID
  23960. AND stag1.ExcelRowNumber > stag2.ExcelRowNumber
  23961.  
  23962. -- Perform Updates to IV_Item
  23963. UPDATE ivi
  23964. SET ivi.[Description] = stag.[Description],
  23965. ivi.IV_Type_RecID = stag.IV_Type_RecID,
  23966. ivi.IV_SubCat_RecID = stag.IV_Subcategory_RecID,
  23967. ivi.IV_UOM_RecID = stag.IV_UOM_RecID,
  23968. ivi.Current_Cost = stag.UnitCost,
  23969. ivi.List_Price = stag.UnitPrice,
  23970. ivi.Taxable_Flag = stag.Taxable,
  23971. ivi.Long_Description = stag.LongDesc,
  23972. ivi.Manufacturer_RecID = stag.Manufacturer_RecID,
  23973. ivi.Mfg_Item_ID = stag.PartNumber,
  23974. ivi.Updated_By = @ImportBatchUser,
  23975. ivi.Serialized_Flag = CASE WHEN stag.Serialized = '0' AND ivi.Serialized_Flag = '1' THEN '1' ELSE ivi.Serialized_Flag END, -- Do not change 1 to zero
  23976. ivi.IV_Price_Attribute_ID = stag.IV_Price_Attribute_ID,
  23977. ivi.Vendor_RecID = stag.Vendor_Company_RecID,
  23978. --ivi.Vendor_SKU = stag.Vendor_SKU,
  23979. ivi.Notes = stag.Product_Notes,
  23980. ivi.SerializedCost_Flag = stag.Serialized_Cost
  23981. FROM IV_Item ivi
  23982. INNER JOIN #PR_Import_Staging stag
  23983. ON stag.ProductID = ivi.Item_ID
  23984. WHERE stag.Method = 'UPDATE'
  23985.  
  23986. -- Get expected rowcount for insert to IV_Item
  23987. SELECT @ExpRowCount = COUNT(*) FROM #PR_Import_Staging WHERE Method = 'INSERT'
  23988.  
  23989. -- Perform insert to IV_Item
  23990. -- Temporarily repurpose Owner_ID to catch identity from source table
  23991. INSERT INTO IV_Item
  23992. (
  23993. Owner_ID,
  23994. Item_ID,
  23995. [Description],
  23996. IV_Type_RecID,
  23997. IV_SubCat_RecID,
  23998. IV_UOM_RecID,
  23999. Current_Cost,
  24000. List_Price,
  24001. Taxable_Flag,
  24002. Inactive_Flag,
  24003. Updated_By,
  24004. Last_Update,
  24005. Long_Description,
  24006. Serialized_Flag,
  24007. IV_Class_ID,
  24008. Manufacturer_RecID,
  24009. Mfg_Item_ID,
  24010. Short_Name,
  24011. Minimum_Stock,
  24012. IV_Price_Attribute_ID,
  24013. Vendor_RecID,
  24014. Vendor_SKU,
  24015. Notes,
  24016. SerializedCost_Flag,
  24017. Entered_By
  24018. )
  24019.  
  24020. SELECT
  24021. stag.ExcelRowNumber,
  24022. stag.ProductID,
  24023. stag.[Description],
  24024. stag.IV_Type_RecID,
  24025. stag.IV_Subcategory_RecID,
  24026. stag.IV_UOM_RecID,
  24027. ISNULL(stag.UnitCost, 0),
  24028. ISNULL(stag.UnitPrice, 0),
  24029. stag.Taxable,
  24030. 0,
  24031. @ImportBatchUser,
  24032. GETDATE(),
  24033. stag.LongDesc,
  24034. ISNULL(stag.Serialized, 0),
  24035. stag.IV_Class_ID,
  24036. stag.Manufacturer_RecID,
  24037. stag.PartNumber,
  24038. '',
  24039. 0,
  24040. IV_Price_Attribute_ID,
  24041. Vendor_Company_RecID,
  24042. Vendor_SKU,
  24043. Product_Notes,
  24044. Serialized_Cost,
  24045. @ImportBatchUser
  24046. FROM #PR_Import_Staging stag
  24047. WHERE stag.Method = 'INSERT'
  24048.  
  24049. -- If inserted rowcount does not match expected, raise error
  24050. IF @@RowCount <> @ExpRowCount
  24051. BEGIN
  24052. SELECT @ErrorMsg = 'Mismatch - This batch contains ' + CAST(@ExpRowCount AS VARCHAR(10)) + ' new products, but ' + CAST(@@Rowcount AS VARCHAR(15)) + ' rows were inserted to IV_Item. Import fails.'
  24053. RAISERROR(@ErrorMsg, 16, 2)
  24054. END
  24055.  
  24056. -- Join final table back to staging to capture identity of newly inserted rows
  24057. UPDATE stag
  24058. SET stag.IV_Item_RecID_New = ivi.IV_Item_RecID
  24059. FROM #PR_Import_Staging stag
  24060. INNER JOIN dbo.IV_Item ivi
  24061. ON ivi.Owner_ID = stag.ExcelRowNumber
  24062. AND ivi.Updated_By = @ImportBatchUser
  24063.  
  24064. -- Update Owner_ID in IV_Item to 1
  24065. UPDATE dbo.IV_Item
  24066. SET Owner_ID = 1
  24067. WHERE Updated_By = @ImportBatchUser
  24068.  
  24069. -- Every row should have a RecID in dbo.IV_Item now - Capture this so that inventory records can be inserted regardless of new vs. existing product
  24070. UPDATE stag
  24071. SET stag.IV_Item_RecID = ivi.IV_Item_RecID
  24072. FROM #PR_Import_Staging stag
  24073. INNER JOIN dbo.IV_Item ivi
  24074. ON stag.ProductID = dbo.ufn_Import_Trim(ivi.Item_ID)
  24075.  
  24076. -- No rows should have NULL IV_Item_RecID now - if so, throw error
  24077. IF EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE IV_Item_RecID IS NULL)
  24078. BEGIN
  24079. SELECT @ErrorMsg = 'ERROR: No IV_Item record was inserted for product: "' + (SELECT TOP 1 ProductID FROM #PR_Import_Staging WHERE IV_Item_RecID IS NULL) + '"'
  24080. RAISERROR(@ErrorMsg, 16, 2)
  24081. END
  24082.  
  24083. -- Determine which rows require a new record in dbo.Inventory_By_Warehouse
  24084. UPDATE stag
  24085. SET New_Inventory_Record = 1
  24086. FROM #PR_Import_Staging stag
  24087. LEFT OUTER JOIN dbo.Inventory_By_Warehouse ibw
  24088. ON ibw.IV_Item_RecID = stag.IV_Item_RecID
  24089. AND ibw.Warehouse_RecID = stag.Warehouse_RecID
  24090. AND ibw.Warehouse_Bin_RecID = stag.Warehouse_Bin_RecID
  24091. AND stag.intSOH IS NOT NULL
  24092. WHERE ibw.Inventory_By_Warehouse_RecID IS NULL
  24093. AND stag.intSOH > 0
  24094.  
  24095. -- Insert new records to dbo.Inventory_By_Warehouse
  24096. -- Initial count = 0, will update the entire batch at once
  24097. INSERT INTO Inventory_By_Warehouse
  24098. (
  24099. IV_Item_RecID,
  24100. Warehouse_RecID,
  24101. Warehouse_Bin_RecID,
  24102. Qty_On_Hand,
  24103. Last_Update,
  24104. Updated_By
  24105. )
  24106. SELECT DISTINCT
  24107. IV_Item_RecID,
  24108. Warehouse_RecID,
  24109. Warehouse_Bin_RecID,
  24110. 0,
  24111. GETDATE(),
  24112. @ImportBatchUser
  24113. FROM #PR_Import_Staging stag
  24114. WHERE stag.New_Inventory_Record = 1
  24115.  
  24116. -- Join back and grab Inventory_By_Warehouse RecID for all rows with SOH
  24117. UPDATE stag
  24118. SET stag.Inventory_By_Warehouse_RecID = ibw.Inventory_By_Warehouse_RecID
  24119. FROM #PR_Import_Staging stag
  24120. INNER JOIN dbo.Inventory_By_Warehouse ibw
  24121. ON ibw.IV_Item_RecID = stag.IV_Item_RecID
  24122. AND ibw.Warehouse_RecID = stag.Warehouse_RecID
  24123. AND ibw.Warehouse_Bin_RecID = stag.Warehouse_Bin_RecID
  24124. AND stag.intSOH > 0
  24125.  
  24126. -- Error if any rows with SOH are missing Inventory_By_Warehouse_RecID
  24127. IF EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE intSOH > 0 AND Inventory_By_Warehouse_RecID IS NULL)
  24128. BEGIN
  24129. SELECT @ErrorMsg = 'ERROR: No Inventory_By_Warehouse record was inserted for product: "' + (SELECT TOP 1 ProductID FROM #PR_Import_Staging WHERE intSOH > 0 AND Inventory_By_Warehouse_RecID IS NULL) + '"'
  24130. RAISERROR(@ErrorMsg, 16, 2)
  24131. END
  24132.  
  24133. -- Create adjustment detail record for all inventory records
  24134. -- Temporarily repurpose Updated_By to capture identity
  24135. INSERT INTO dbo.IV_Adjustment_Detail
  24136. (
  24137. IV_Adjustment_RecID,
  24138. IV_Item_RecID,
  24139. [Description],
  24140. Adjusted_Qty,
  24141. Updated_By,
  24142. Last_Update,
  24143. Warehouse_RecID,
  24144. Warehouse_Bin_RecID,
  24145. Unit_Cost
  24146. )
  24147. SELECT
  24148. @IV_Adjustment_RecID,
  24149. stag.IV_Item_RecID,
  24150. stag.[Description],
  24151. stag.intSOH,
  24152. ExcelRowNumber,
  24153. GETDATE(),
  24154. stag.Warehouse_RecID,
  24155. stag.Warehouse_Bin_RecID,
  24156. stag.UnitCost
  24157. FROM #PR_Import_Staging stag
  24158. WHERE stag.intSOH > 0
  24159.  
  24160. -- Join dbo.IV_Adjustment_Detail back to staging table to capture IV_Adjustment_Detail_RecID
  24161. UPDATE stag
  24162. SET stag.IV_Adjustment_Detail_RecID = ivad.IV_Adjustment_Detail_RecID
  24163. FROM #PR_Import_Staging stag
  24164. INNER JOIN IV_Adjustment_Detail ivad
  24165. ON ivad.IV_Adjustment_RecID = @IV_Adjustment_RecID
  24166. AND ivad.IV_Item_RecID = stag.IV_Item_RecID
  24167. AND ivad.Warehouse_Bin_RecID = stag.Warehouse_Bin_RecID
  24168. AND ivad.Warehouse_RecID = stag.Warehouse_RecID
  24169. AND ivad.Updated_By = stag.ExcelRowNumber
  24170.  
  24171. -- Set Updated_By to import batch user in IV_Adjustment_Detail
  24172. UPDATE ivad
  24173. SET ivad.Updated_By = @ImportBatchUser
  24174. FROM IV_Adjustment_Detail ivad
  24175. INNER JOIN #PR_Import_Staging stag
  24176. ON stag.IV_Adjustment_Detail_RecID = ivad.IV_Adjustment_Detail_RecID
  24177.  
  24178. -- Error if any rows with SOH are missing IV_Adjustment_Detail_RecID
  24179. IF EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE intSOH > 0 AND IV_Adjustment_Detail_RecID IS NULL)
  24180. BEGIN
  24181. SELECT @ErrorMsg = 'ERROR: No IV_Adjustment_Detail_RecID record was inserted for product: "' + (SELECT TOP 1 ProductID FROM #PR_Import_Staging WHERE intSOH > 0 AND IV_Adjustment_Detail_RecID IS NULL) + '"'
  24182. RAISERROR(@ErrorMsg, 16, 2)
  24183. END
  24184.  
  24185. -- Create Item Audit record - Use loop because we need the insert trigger to run
  24186. WHILE EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE IntSOH > 0 AND IV_Audit_RecID IS NULL)
  24187. BEGIN
  24188.  
  24189. -- Grab next row to process
  24190. SET @Curr_Audit_Row = (SELECT TOP 1 ExcelRowNumber FROM #PR_Import_Staging stag WHERE IntSOH > 0 AND IV_Audit_RecID IS NULL ORDER BY CONVERT(INT, ExcelRowNumber) ASC)
  24191.  
  24192. SELECT @Prev_Quantity = ISNULL(Qty_On_Hand, 0) FROM dbo.Inventory_By_Warehouse WHERE Inventory_By_Warehouse_RecID = (SELECT Inventory_By_Warehouse_RecID FROM #PR_Import_Staging WHERE ExcelRowNumber =
  24193.  
  24194. @Curr_Audit_Row)
  24195.  
  24196. -- Update Inventory_By_Warehouse to increment count
  24197. UPDATE ibw
  24198. SET ibw.Qty_On_Hand = ISNULL(Qty_On_Hand, 0) + IntSOH
  24199. FROM #PR_Import_Staging stag
  24200. CROSS APPLY(SELECT TOP 1 * FROM dbo.Inventory_By_Warehouse ibw WHERE ibw.Inventory_By_Warehouse_RecID = stag.Inventory_By_Warehouse_RecID)ibw
  24201. WHERE stag.ExcelRowNumber = @Curr_Audit_Row
  24202.  
  24203. -- Perform insert
  24204. INSERT INTO IV_Audit
  24205. (
  24206. IV_Item_RecID,
  24207. Warehouse_RecID,
  24208. Warehouse_Bin_RecID,
  24209. Updated_By,
  24210. Transaction_Date,
  24211. Transaction_Type,
  24212. Quantity_Change,
  24213. Unit_Cost,
  24214. IV_Adjustment_Detail_RecID,
  24215. Quantity_On_Hand,
  24216. Avg_Cost,
  24217. Serial_Numbers
  24218. )
  24219.  
  24220. SELECT
  24221. stag.IV_Item_RecID,
  24222. stag.Warehouse_RecID,
  24223. stag.Warehouse_Bin_RecID,
  24224. @ImportBatchUser,
  24225. DATEADD(Second, ExcelRowNumber, GETDATE()),
  24226. 'Adjustment - Import Utility',
  24227. stag.intSOH,
  24228. stag.UnitCost,
  24229. stag.IV_Adjustment_Detail_RecID,
  24230. ISNULL(@Prev_Quantity, 0) + intSoh,
  24231. NULL,
  24232. SerialNumbers
  24233. FROM #PR_Import_Staging stag
  24234. CROSS APPLY(SELECT TOP 1 * FROM dbo.Inventory_By_Warehouse ibw WHERE ibw.Inventory_By_Warehouse_RecID = stag.Inventory_By_Warehouse_RecID)ibw
  24235. WHERE ExcelRowNumber = @Curr_Audit_Row
  24236.  
  24237. SELECT @IV_Audit_RecID = SCOPE_IDENTITY()
  24238.  
  24239. -- Capture identity
  24240. UPDATE #PR_Import_Staging SET IV_Audit_RecID = @IV_Audit_RecID WHERE ExcelRowNumber = @Curr_Audit_Row
  24241.  
  24242.  
  24243. END
  24244.  
  24245. -- Determine expected total number of serial numbers to insert
  24246. SELECT @ExpRowCount = SUM(intSOH) FROM #PR_Import_Staging WHERE Serialized = 1
  24247.  
  24248. -- Insert records to IV_Serial_Numbers
  24249. INSERT INTO IV_Serial_Number
  24250. (
  24251. Serial_Number,
  24252. IV_Item_RecID,
  24253. Warehouse_Bin_RecID,
  24254. Updated_By,
  24255. Last_Update,
  24256. Date_Received,
  24257. IV_Adjustment_Detail_RecID,
  24258. Unit_Cost
  24259. )
  24260. SELECT
  24261. sn.SerialNum,
  24262. stag.IV_Item_RecID,
  24263. stag.Warehouse_Bin_RecID,
  24264. @ImportBatchUser,
  24265. GETDATE(),
  24266. GETDATE(),
  24267. stag.IV_Adjustment_Detail_RecID,
  24268. stag.UnitCost
  24269. FROM #PR_Import_Staging stag
  24270. INNER JOIN @SerNums sn
  24271. ON stag.ExcelRowNumber = sn.ExcelRowNumber
  24272.  
  24273. -- Determine which records require GL records
  24274. UPDATE stag
  24275. SET GL_Inserted = 0
  24276. FROM #PR_Import_Staging stag
  24277. WHERE stag.IV_Adjustment_Detail_RecID IS NOT NULL
  24278.  
  24279. -- Loop through staging table and insert GL records
  24280. WHILE EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE GL_Inserted = 0)
  24281. BEGIN
  24282.  
  24283. -- Grab current RecID for processing
  24284. SET @Curr_Detail_RecID = (SELECT TOP 1 IV_Adjustment_Detail_RecID FROM #PR_Import_Staging WHERE GL_Inserted = 0 ORDER BY ExcelRowNumber ASC)
  24285.  
  24286. SELECT
  24287. @taxable = iv_item.taxable_flag,
  24288. @typeRecid = a.iv_adjustment_type_recid,
  24289. @billAmount = ISNULL(ROUND(ISNULL(iv_item.current_cost, 0) * ISNULL(ad.adjusted_qty, 0),2), 0),
  24290. @glCost = ISNULL(ROUND(ISNULL(iv_item.current_cost, 0) * ISNULL(ad.adjusted_qty, 0),2), 0),
  24291. @subCatRecid = subcat.iv_subcat_recid,
  24292. @catRecid = subcat.iv_cat_recid,
  24293. @olRecid = ISNULL(b.owner_level_recid, w.owner_level_recid),
  24294. @buRecid = ISNULL(b.billing_unit_recid, w.billing_unit_recid)
  24295. FROM dbo.IV_Adjustment_Detail ad
  24296. LEFT JOIN dbo.IV_Adjustment a on ad.iv_adjustment_recid = a.iv_adjustment_recid
  24297. LEFT JOIN dbo.IV_Item on iv_item.iv_item_recid = ad.iv_item_recid
  24298. LEFT JOIN dbo.IV_SubCategory subcat on subcat.iv_subcat_recid = iv_item.iv_subcat_recid
  24299. LEFT JOIN dbo.Warehouse_Bin b on b.warehouse_bin_recid = ad.warehouse_bin_recid
  24300. LEFT JOIN dbo.Warehouse w on w.warehouse_recid = b.warehouse_recid
  24301. WHERE ad.IV_Adjustment_Detail_RecID = @Curr_Detail_RecID
  24302.  
  24303.  
  24304. -- Clear table variable
  24305. DELETE FROM @GLAccounts
  24306.  
  24307. /*Insert GL Account information into table for the roll-up*/
  24308. INSERT INTO @GLAccounts
  24309. SELECT
  24310. ga.GL_Item,
  24311. ga.GL_SalesCode,
  24312. ga.GL_Cogs,
  24313. ga.GL_Inventory,
  24314. ga.segment1,
  24315. ga.segment2,
  24316. ga.segment3,
  24317. ga.segment4,
  24318. ga.segment5,
  24319. ga.segment6,
  24320. ga.segment7,
  24321. ga.segment8,
  24322. ga.segment9,
  24323. ga.segment10,
  24324. sort = CASE Table_Name
  24325. WHEN 'iv_adjustment_type' THEN 1
  24326. WHEN 'iv_subcategory' THEN 2
  24327. WHEN 'iv_category' THEN 3
  24328. WHEN 'billing_unit' THEN 4
  24329. WHEN 'owner_level' THEN 5
  24330. WHEN 'owner' THEN 6
  24331. END
  24332. FROM GL_Setup gs
  24333. LEFT JOIN GL_Account ga on ga.segment_nbr = 1 and ga.GL_Setup_RecID = gs.GL_Setup_RecID
  24334. WHERE gl_type_id = 'IA'
  24335. AND ((RecID = @typeRecid AND Table_Name = 'iv_adjustment_type')
  24336. OR (RecID = @subCatRecid AND Table_Name = 'iv_subcategory')
  24337. OR (RecID = @catRecid AND Table_Name = 'iv_category')
  24338. OR (RecID = @buRecid AND Table_Name = 'billing_unit')
  24339. OR (RecID = @olRecid AND Table_Name = 'owner_level')
  24340. OR (RecID = 1 AND Table_Name = 'owner'))
  24341.  
  24342. /*Insert into gl entries, the subqueries do the roll-up of the accounts : it starts from the top, looks down each row,
  24343. and pulls from the first non-null value to fill out the row for inserting.*/
  24344.  
  24345. SET @glCogs = (SELECT TOP 1 GL_Cogs FROM @GLAccounts WHERE ISNULL(GL_Cogs, '') != '' ORDER BY sort);
  24346. SET @glInventory = (SELECT TOP 1 GL_Inventory FROM @GLAccounts WHERE ISNULL(GL_Inventory, '') != '' ORDER BY sort);
  24347. SET @glItem = (SELECT TOP 1 GL_Item FROM @GLAccounts WHERE ISNULL(GL_Item, '') != '' ORDER BY sort);
  24348. SET @glSalesCode = (SELECT TOP 1 GL_SalesCode FROM @GLAccounts WHERE ISNULL(GL_SalesCode, '') != '' ORDER BY sort);
  24349. SET @seg1 = (SELECT TOP 1 CASE WHEN @segmentNbr > 0 THEN segment1 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment1, '') != '' ORDER BY sort);
  24350. SET @seg2 = (SELECT TOP 1 CASE WHEN @segmentNbr > 1 THEN segment2 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment2, '') != '' ORDER BY sort);
  24351. SET @seg3 = (SELECT TOP 1 CASE WHEN @segmentNbr > 2 THEN segment3 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment3, '') != '' ORDER BY sort);
  24352. SET @seg4 = (SELECT TOP 1 CASE WHEN @segmentNbr > 3 THEN segment4 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment4, '') != '' ORDER BY sort);
  24353. SET @seg5 = (SELECT TOP 1 CASE WHEN @segmentNbr > 4 THEN segment5 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment5, '') != '' ORDER BY sort);
  24354. SET @seg6 = (SELECT TOP 1 CASE WHEN @segmentNbr > 5 THEN segment6 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment6, '') != '' ORDER BY sort);
  24355. SET @seg7 = (SELECT TOP 1 CASE WHEN @segmentNbr > 6 THEN segment7 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment7, '') != '' ORDER BY sort);
  24356. SET @seg8 = (SELECT TOP 1 CASE WHEN @segmentNbr > 7 THEN segment8 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment8, '') != '' ORDER BY sort);
  24357. SET @seg9 = (SELECT TOP 1 CASE WHEN @segmentNbr > 8 THEN segment9 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment9, '') != '' ORDER BY sort);
  24358. SET @seg10 = (SELECT TOP 1 CASE WHEN @segmentNbr > 9 THEN segment10 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment10, '') != '' ORDER BY sort);
  24359.  
  24360. INSERT INTO gl_entry
  24361. (table_reference, recid, gl_type_id, gl_amount, gl_description, taxable_flag, item_taxable_flag, taxable2_flag,
  24362. taxable3_flag, taxable4_flag, taxable5_flag, iv_product_recid, updated_by, gl_cost, gl_cogs, gl_inventory, gl_item,
  24363. gl_salescode, segment1, segment2, segment3, segment4, segment5, segment6, segment7, segment8, segment9, segment10)
  24364. VALUES ('iv_adjustment_detail', @Curr_Detail_RecID, 'IA', @billAmount, 'Inventory Adjustment', @taxable, @taxable, @taxable,
  24365. @taxable, @taxable, @taxable, NULL, @ImportBatchUser, @glCost, @glCogs, @glInventory, @glItem, @glSalesCode, @seg1, @seg2, @seg3,
  24366. @seg4, @seg5, @seg6, @seg7, @seg8, @seg9, @seg10)
  24367.  
  24368. INSERT INTO gl_entry
  24369. (table_reference, recid, gl_type_id, gl_amount, gl_description, taxable_flag, item_taxable_flag, taxable2_flag,
  24370. taxable3_flag, taxable4_flag, taxable5_flag, iv_product_recid, updated_by, gl_cost, gl_cogs, gl_inventory, gl_item,
  24371. gl_salescode, segment1, segment2, segment3, segment4, segment5, segment6, segment7, segment8, segment9, segment10)
  24372. VALUES ('iv_adjustment_detail', @Curr_Detail_RecID, 'IO', @billAmount, 'Inventory Adjustment', @taxable, @taxable, @taxable,
  24373. @taxable, @taxable, @taxable, NULL, @ImportBatchUser, @glCost, @glCogs, @glInventory, @glItem, @glSalesCode, @seg1, @seg2, @seg3,
  24374. @seg4, @seg5, @seg6, @seg7, @seg8, @seg9, @seg10)
  24375.  
  24376. UPDATE #PR_Import_Staging SET GL_Inserted = 1 WHERE IV_Adjustment_Detail_RecID = @Curr_Detail_RecID
  24377.  
  24378. END
  24379.  
  24380.  
  24381. -- If debug mode and successful, select the rows that were inserted
  24382. -- and rollback transaction
  24383. IF @DebugMode = 1 AND @@ERROR = 0
  24384. BEGIN
  24385. SELECT * FROM dbo.IV_Item WHERE Updated_By = @ImportBatchUser
  24386. SELECT * FROM IV_Adjustment WHERE Updated_By = @ImportBatchUser
  24387. SELECT * FROM IV_Adjustment_Detail WHERE Updated_By = @ImportBatchUser
  24388. SELECT * FROM Inventory_By_Warehouse WHERE Updated_By = @ImportBatchUser
  24389. SELECT * FROM IV_Audit WHERE Updated_By = @ImportBatchUser
  24390. SELECT * FROM IV_Serial_Number WHERE Updated_By = @ImportBatchUser
  24391. SELECT * FROM GL_Entry WHERE Updated_By = @ImportBatchUser
  24392.  
  24393. ROLLBACK TRANSACTION PR_Import
  24394. END
  24395.  
  24396. IF @DebugMode = 2 AND @@ERROR = 0
  24397. BEGIN
  24398. SELECT
  24399. 1 AS Success,
  24400. NULL AS ExcelRowNumber,
  24401. NULL AS ErrorDetails
  24402. ROLLBACK TRANSACTION PR_Import
  24403. END
  24404.  
  24405. IF @DebugMode = 0 AND @@Error = 0
  24406. BEGIN
  24407.  
  24408. -- Import successful - commit and return results
  24409. COMMIT TRANSACTION PR_Import
  24410.  
  24411. SELECT
  24412. 1 AS Success,
  24413. NULL AS ExcelRowNumber,
  24414. NULL AS ErrorDetails
  24415. END
  24416.  
  24417. END TRY
  24418.  
  24419. BEGIN CATCH
  24420.  
  24421. -- An error has occured - return SQL error message encountered
  24422. SELECT
  24423. 0 AS Success,
  24424. 'Unknown' AS ExcelRowNumber,
  24425. ERROR_MESSAGE() + 'Line: ' + CONVERT(VARCHAR(20),ERROR_LINE()) AS ErrorDetails
  24426.  
  24427. -- Rollback transaction
  24428. IF @@TRANCOUNT > 0
  24429. ROLLBACK TRANSACTION PR_Import
  24430.  
  24431. END CATCH
  24432.  
  24433.  
  24434.  
  24435.  
  24436. GO
  24437.  
  24438.  
  24439.  
  24440.  
  24441.  
  24442. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_AGR_ImportValidate')
  24443. BEGIN
  24444. EXEC('CREATE PROCEDURE [dbo].[usp_AGR_ImportValidate] AS SELECT 1')
  24445. END
  24446. GO
  24447.  
  24448.  
  24449. IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_AGR_ImportPush')
  24450. BEGIN
  24451. EXEC('CREATE PROCEDURE [dbo].[usp_AGR_ImportPush] AS SELECT 1')
  24452. END
  24453. GO
  24454. -- =============================================
  24455. -- Author: m.gray
  24456. -- Create date: 10/04/2013
  24457. -- Description: Validates data for Agreements import
  24458. -- Sample call: EXEC usp_AGR_ImportValidate 'TMP_Import_4992de3f325c4a2d8f575608b7dc2801', 1
  24459. -- =============================================
  24460.  
  24461. ALTER PROCEDURE [dbo].[usp_AGR_ImportValidate]
  24462. @TableName VARCHAR(255),
  24463. @ForceMode BIT = 0
  24464. AS
  24465. BEGIN TRY
  24466. BEGIN TRANSACTION AGR_Import
  24467.  
  24468. SET NOCOUNT ON
  24469.  
  24470. -- Variable declaration
  24471. -- To keep validation/push logic consistent, validation/insert procs are identical - Final insert runs only on usp_AGR_ImportPush
  24472. -- Capture proc name to drive validate vs. commit logic
  24473. DECLARE @ProcName NVARCHAR(50)
  24474. SELECT @ProcName = OBJECT_NAME(@@ProcID)
  24475.  
  24476. -- Row counters for summary results
  24477. DECLARE @start INT
  24478. DECLARE @end INT
  24479.  
  24480. -- Dynamic statement to insert to staging table
  24481. DECLARE @DSQL VARCHAR(MAX)
  24482.  
  24483. -- Fully qualified name of source table
  24484. DECLARE @SourceTable VARCHAR(300)
  24485. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  24486.  
  24487. -- Object_ID of source table
  24488. DECLARE @Source_Object_ID INT
  24489. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  24490.  
  24491. DECLARE
  24492. @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
  24493.  
  24494. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  24495. SELECT @ImportBatchUser =
  24496. 'CONV_'
  24497. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  24498. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  24499. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  24500. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  24501.  
  24502. IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
  24503. BEGIN
  24504. DROP TABLE #tblResults
  24505. END
  24506.  
  24507. -- Table to hold results of procedure
  24508. CREATE TABLE #tblResults
  24509. (
  24510. RowNumber INT,
  24511. ValMsg VARCHAR(750),
  24512. InvalidReason VARCHAR(MAX),
  24513. ReferenceType VARCHAR(MAX),
  24514. Warning_Flag BIT DEFAULT 0
  24515. )
  24516.  
  24517. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  24518.  
  24519.  
  24520. -- Table to hold condensed summary results
  24521. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  24522. BEGIN
  24523. DROP TABLE #ResultsCondensed
  24524. END
  24525.  
  24526. CREATE TABLE #ResultsCondensed
  24527. (
  24528. RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  24529. ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  24530. )
  24531.  
  24532. -- Table to hold source data for this batch from temp table
  24533. IF OBJECT_ID('tempdb.dbo.#Import_Staging') IS NOT NULL
  24534. BEGIN
  24535. DROP TABLE #Import_Staging
  24536. END
  24537.  
  24538. CREATE TABLE #Import_Staging
  24539. (
  24540. ExcelRowNumber INT,
  24541.  
  24542. -- Fields appearing on spreadsheet
  24543. Agreement_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24544. Agreement_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24545. Company_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24546. [Start_Date] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24547. Billing_Start_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24548. End_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24549. Site_Name NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  24550. Contact_First_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24551. Contact_Last_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24552. Purchase_Order nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24553. Location nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24554. [Group] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24555. SLA nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24556. Internal_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  24557. Application_Unit nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24558. Application_Limit nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24559. Available_Per nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24560. Agreement_Covers_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24561. Agreement_Covers_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24562. Agreement_Covers_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24563. Agreement_Covers_Sales_Tax nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24564. Carryover_Days nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24565. Overruns_Percent nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24566. Charge_adjustments_to_the_firm nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24567. Billing_Cycle nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24568. Cycle_Based_On nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24569. Billing_Amount nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24570. Taxable nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24571. Prorate_first_bill nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24572. Tax_Code nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24573. Restrict_downpayment nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24574. Terms nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24575. Override_Bill_To_Company_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24576. Override_Billing_Site_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24577. Invoice_Description nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  24578. Default_Work_Role nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24579. Default_Work_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24580. Project_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24581. Invoice_Template nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24582. Bill_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24583. Bill_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24584. Bill_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24585. Invoice_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24586. Invoice_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24587. Invoice_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24588.  
  24589. -- Fields derived from others on spreadsheet
  24590. No_Ending_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24591. [Unlimited] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  24592.  
  24593. -- Fields always defaulted from Agreement Type
  24594. TopComment_Flag NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  24595. BottomComment_Flag NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  24596. Prepay_Flag BIT NULL,
  24597. Comp_Rate_Option NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  24598. Comp_Limit_Option NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  24599. Comp_Rate_Amount NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  24600. Comp_Limit_Amount NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  24601.  
  24602. -- Reference RecID's/Fields used for final inserts
  24603. AGR_Type_RecID INT NULL,
  24604. AGR_Detail_Type_RecID INT NULL,
  24605. Company_RecID INT NULL,
  24606. Company_Address_RecID INT NULL,
  24607. Contact_RecID INT NULL,
  24608. Owner_Level_RecID INT NULL,
  24609. Billing_Unit_RecID INT NULL,
  24610. SR_SLA_RecID INT NULL,
  24611. Tax_Code_RecID INT NULL,
  24612. Billing_Terms_RecID INT NULL,
  24613. Billing_Company_RecID INT NULL,
  24614. Billing_Address_RecID INT NULL,
  24615. Activity_Type_RecID INT NULL, -- Work type
  24616. Activity_Class_RecID INT NULL, -- Work role
  24617. PM_Type_RecID INT,
  24618. AGR_Billing_Cycle_RecID INT NULL,
  24619. bl_invTemplate_Setup_RecID INT NULL, -- Invoice template
  24620. DT_Start_Date DATETIME NULL,
  24621. DT_End_Date DATETIME NULL,
  24622. DT_Billing_Start_Date DATETIME NULL,
  24623. INT_Carryover_Days INT NULL,
  24624. INT_Overruns_Percent INT NULL,
  24625. OL_Restrict_Flag BIT NULL,
  24626. BU_Restrict_Flag BIT NULL,
  24627. PP_Amount DECIMAL(18, 2) NULL,
  24628. PP_Unlimited_Flag BIT NULL,
  24629. AppCycle_ID CHAR(1) COLLATE DATABASE_DEFAULT NULL,
  24630. AGR_OneTime_Flag BIT NULL,
  24631. PP_Time_Flag BIT NULL,
  24632. PP_Products_Flag BIT NULL,
  24633. PP_Carryover_Flag BIT NULL,
  24634. Overrun_Flag BIT NULL,
  24635. Overrun_Limit INT NULL,
  24636. Charge_Firm_Flag BIT NULL,
  24637. PP_One_Time_Flag BIT NULL,
  24638. PP_Tax_Flag BIT NULL,
  24639. CycleBasis_ID CHAR(1) COLLATE DATABASE_DEFAULT NULL,
  24640. PP_Expire_Flag BIT NULL,
  24641. PP_Expenses_Flag BIT NULL,
  24642. Taxable_Flag BIT NULL,
  24643. Restrict_DP_Flag BIT NULL,
  24644. TE_Invoice_Flag BIT NULL,
  24645. TE_Billable_Flag BIT NULL,
  24646. EX_Invoice_Flag BIT NULL,
  24647. EX_Billable_Flag BIT NULL,
  24648. IV_Invoice_Flag BIT NULL,
  24649. IV_Billable_Flag BIT NULL,
  24650. AGR_Date_Start DATETIME,
  24651. AGR_Date_End DATETIME,
  24652. Bill_Start_Date DATETIME,
  24653. AGR_Detail_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT NULL,
  24654. AGR_PONbr NVARCHAR(30) COLLATE DATABASE_DEFAULT NULL,
  24655. AGR_InvDesc NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  24656. AGR_Name NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  24657. AGR_Amount DECIMAL(18,2) NULL,
  24658. AGR_ProRate DECIMAL(18,2) NULL,
  24659. AGR_Notes VARCHAR(5000) COLLATE DATABASE_DEFAULT NULL,
  24660. TE_InvCust_Flag BIT NULL,
  24661. EX_InvCust_Flag BIT NULL,
  24662. IV_InvCust_Flag BIT NULL,
  24663. AGR_NoEnd_Flag BIT NULL,
  24664. AGR_Header_RecID INT NULL,
  24665. ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  24666. Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  24667. Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  24668. Company_Duplicate_Flag BIT NULL,
  24669. Contact_Duplicate_Flag BIT NULL,
  24670. Contact_Name_Fuzzy NVARCHAR(61),
  24671. Company_Match_Val NVARCHAR(3),
  24672. Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  24673. Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  24674. Diff_Exclude_Flag BIT,
  24675. Duplicate_Flag BIT
  24676. )
  24677.  
  24678. -- Create & populate table variable with list of required columns
  24679. DECLARE @RequiredColumns TABLE
  24680. (
  24681. ColumnName VARCHAR(255)
  24682. )
  24683.  
  24684. INSERT INTO @RequiredColumns
  24685. (
  24686. ColumnName
  24687. )
  24688.  
  24689. SELECT 'Agreement Type' UNION ALL
  24690. SELECT 'Agreement Name' UNION ALL
  24691. SELECT 'Company Name' UNION ALL
  24692. SELECT 'Start Date' UNION ALL
  24693. SELECT 'Billing Start Date'
  24694.  
  24695. -- Create & populate table variable with list of optional columns
  24696. DECLARE @OptionalColumns TABLE
  24697. (
  24698. ColumnName VARCHAR(255)
  24699. )
  24700.  
  24701. INSERT INTO @OptionalColumns
  24702. (
  24703. ColumnName
  24704. )
  24705.  
  24706. SELECT 'Contact First Name' UNION ALL
  24707. SELECT 'Contact Last Name' UNION ALL
  24708. SELECT 'Purchase Order' UNION ALL
  24709. SELECT 'Location' UNION ALL
  24710. SELECT 'Group' UNION ALL
  24711. SELECT 'End Date' UNION ALL
  24712. SELECT 'SLA' UNION ALL
  24713. SELECT 'Internal Notes' UNION ALL
  24714. SELECT 'Application Unit' UNION ALL
  24715. SELECT 'Application Limit' UNION ALL
  24716. SELECT 'Available Per' UNION ALL
  24717. SELECT 'Agreement Covers Time' UNION ALL
  24718. SELECT 'Agreement Covers Expenses' UNION ALL
  24719. SELECT 'Agreement Covers Products' UNION ALL
  24720. SELECT 'Agreement Covers Sales Tax' UNION ALL
  24721. SELECT 'Carryover Days' UNION ALL
  24722. SELECT 'Overruns Percent' UNION ALL
  24723. SELECT 'Charge adjustments to the firm' UNION ALL
  24724. SELECT 'Billing Cycle' UNION ALL
  24725. SELECT 'Cycle Based On' UNION ALL
  24726. SELECT 'Billing Amount' UNION ALL
  24727. SELECT 'Taxable' UNION ALL
  24728. SELECT 'Prorate first bill' UNION ALL
  24729. SELECT 'Tax Code' UNION ALL
  24730. SELECT 'Restrict Downpayment' UNION ALL
  24731. SELECT 'Billing Terms' UNION ALL
  24732. SELECT 'Override Bill To Company Name' UNION ALL
  24733. SELECT 'Override Billing Site Name' UNION ALL
  24734. SELECT 'Invoice Description' UNION ALL
  24735. SELECT 'Default Work Role' UNION ALL
  24736. SELECT 'Default Work Type' UNION ALL
  24737. SELECT 'Project Type' UNION ALL
  24738. SELECT 'Invoice Template' UNION ALL
  24739. SELECT 'Bill Time' UNION ALL
  24740. SELECT 'Bill Expenses' UNION ALL
  24741. SELECT 'Bill Products' UNION ALL
  24742. SELECT 'Invoice Time' UNION ALL
  24743. SELECT 'Invoice Expenses' UNION ALL
  24744. SELECT 'Invoice Products' UNION ALL
  24745. SELECT 'Site Name'
  24746.  
  24747.  
  24748. -- Table variable to hold column names from source table
  24749. DECLARE @SourceColumns TABLE
  24750. (
  24751. ColumnName VARCHAR(255)
  24752. )
  24753.  
  24754. -- Populate @SourceColumns
  24755. INSERT INTO @SourceColumns
  24756. (
  24757. ColumnName
  24758. )
  24759.  
  24760. SELECT
  24761. name
  24762. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  24763.  
  24764. -- Check that all required columns exist in @SourceColumns
  24765. INSERT INTO #tblResults
  24766. (
  24767. RowNumber,
  24768. ValMsg
  24769. )
  24770.  
  24771. SELECT
  24772. 0,
  24773. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  24774. FROM @RequiredColumns rq
  24775.  
  24776. EXCEPT
  24777.  
  24778. SELECT
  24779. 0,
  24780. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  24781. FROM @SourceColumns sc
  24782.  
  24783. -- If a required column is missing, stop here and return results
  24784. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  24785. BEGIN
  24786. SELECT
  24787. 0 AS ValPassed,
  24788. RowNumber,
  24789. ValMsg
  24790. FROM #tblResults
  24791. ORDER BY RowNumber, ValMsg
  24792.  
  24793. ROLLBACK TRANSACTION AGR_Import
  24794.  
  24795. RETURN
  24796. END
  24797.  
  24798. -- Pull sys columns information for tempdb into temp table
  24799. -- This is necessary to join to sys columns data without experiencing collation errors in the event that tempdb collation differs from database_default
  24800. IF OBJECT_ID('tempdb..#sysColumns') IS NOT NULL
  24801. BEGIN
  24802. DROP TABLE #sysColumns
  24803. END
  24804.  
  24805. SELECT *
  24806. INTO #sysColumns
  24807. FROM tempdb.sys.columns
  24808.  
  24809. -- Add any optional spreadsheet columns to source table to sidestep table structure errors later on
  24810. -- Use dynamic SQL to only add columns that are missing
  24811. IF EXISTS(SELECT TOP 1 * FROM @OptionalColumns rq LEFT OUTER JOIN #sysColumns cols ON cols.name = rq.ColumnName AND cols.Object_ID = object_id('tempdb..' + @TableName) WHERE cols.name IS NULL)
  24812. BEGIN
  24813. SELECT @DSQL = 'ALTER TABLE ' + @SourceTable + '
  24814. ADD '
  24815. SELECT @DSQL = @DSQL + QUOTENAME(ColumnName) + ' NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  24816. '
  24817. FROM @OptionalColumns rq
  24818. LEFT OUTER JOIN #sysColumns cols
  24819. ON cols.name = rq.ColumnName
  24820. AND cols.Object_ID = object_id('tempdb..' + @TableName)
  24821. WHERE cols.name IS NULL
  24822. END
  24823.  
  24824. -- Remove last comma from @DSQL to correct syntax
  24825. SET @DSQL = LEFT(@DSQL, LEN(@DSQL) - 3)
  24826.  
  24827. -- Add optional columns to source table
  24828. EXEC(@DSQL)
  24829.  
  24830. -- Build statement to populate validation temp table
  24831. SELECT @DSQL = '
  24832. INSERT INTO #Import_Staging
  24833. (
  24834. [ExcelRowNumber],
  24835. [Agreement_Type],
  24836. [Agreement_Name],
  24837. [Company_Name],
  24838. [Site_Name],
  24839. [Contact_First_Name],
  24840. [Contact_Last_Name],
  24841. [Purchase_Order],
  24842. [Location],
  24843. [Group],
  24844. [Start_Date],
  24845. [End_Date],
  24846. [SLA],
  24847. [Internal_Notes],
  24848. [Application_Unit],
  24849. [Application_Limit],
  24850. [Available_Per],
  24851. [Agreement_Covers_Time],
  24852. [Agreement_Covers_Expenses],
  24853. [Agreement_Covers_Products],
  24854. [Agreement_Covers_Sales_Tax],
  24855. [Carryover_Days],
  24856. [Overruns_Percent],
  24857. [Charge_adjustments_to_the_firm],
  24858. [Billing_Cycle],
  24859. [Cycle_Based_On],
  24860. [Billing_Amount],
  24861. [Taxable],
  24862. [Prorate_first_bill],
  24863. [Billing_Start_date],
  24864. [Tax_Code],
  24865. [Restrict_downpayment],
  24866. [Terms],
  24867. [Override_Bill_To_Company_Name],
  24868. [Override_Billing_Site_Name],
  24869. [Invoice_Description],
  24870. [Default_Work_Role],
  24871. [Default_Work_Type],
  24872. [Project_Type],
  24873. [Invoice_Template],
  24874. [Bill_Time],
  24875. [Bill_Expenses],
  24876. [Bill_Products],
  24877. [Invoice_Time],
  24878. [Invoice_Expenses],
  24879. [Invoice_Products],
  24880. Company_Match_Val
  24881. )
  24882.  
  24883. SELECT
  24884. [Excel Row Number],
  24885. [Agreement Type],
  24886. [Agreement Name],
  24887. [Company Name],
  24888. [Site Name],
  24889. [Contact First Name],
  24890. [Contact Last Name],
  24891. [Purchase Order],
  24892. [Location],
  24893. [Group],
  24894. [Start Date],
  24895. [End Date],
  24896. [SLA],
  24897. [Internal Notes ],
  24898. [Application Unit],
  24899. [Application Limit],
  24900. [Available Per],
  24901. [Agreement Covers Time],
  24902. [Agreement Covers Expenses],
  24903. [Agreement Covers Products],
  24904. [Agreement Covers Sales Tax],
  24905. [Carryover Days],
  24906. [Overruns Percent],
  24907. [Charge adjustments to the firm],
  24908. [Billing Cycle],
  24909. [Cycle Based On],
  24910. [Billing Amount],
  24911. [Taxable],
  24912. [Prorate first bill],
  24913. [Billing Start date],
  24914. [Tax Code],
  24915. [Restrict downpayment],
  24916. [Billing Terms],
  24917. [Override Bill To Company Name],
  24918. [Override Billing Site Name],
  24919. [Invoice Description],
  24920. [Default Work Role],
  24921. [Default Work Type],
  24922. [Project Type],
  24923. [Invoice Template],
  24924. [Bill Time],
  24925. [Bill Expenses],
  24926. [Bill Products],
  24927. [Invoice Time],
  24928. [Invoice Expenses],
  24929. [Invoice Products],
  24930. SUBSTRING([Company Name], 1, 3)
  24931. FROM ' + @SourceTable
  24932.  
  24933. -- Pull data into validation temp table
  24934. EXEC(@DSQL)
  24935.  
  24936. -- Convert empty string and single space to null in temp table
  24937. -- So that nulls may be properly handled throughout procedure
  24938. UPDATE #Import_Staging
  24939. SET [Agreement_Type] = CASE WHEN [Agreement_Type] IN('', ' ') THEN NULL ELSE [Agreement_Type] END,
  24940. [Agreement_Name] = CASE WHEN [Agreement_Name] IN('', ' ') THEN NULL ELSE [Agreement_Name] END,
  24941. [Company_Name] = CASE WHEN [Company_Name] IN('', ' ') THEN NULL ELSE [Company_Name] END,
  24942. [Site_Name] = CASE WHEN [Site_Name] IN('', ' ') THEN NULL ELSE [Site_Name] END,
  24943. [Contact_First_Name] = CASE WHEN [Contact_First_Name] IN('', ' ') THEN NULL ELSE [Contact_First_Name] END,
  24944. [Contact_Last_Name] = CASE WHEN [Contact_Last_Name] IN('', ' ') THEN NULL ELSE [Contact_Last_Name] END,
  24945. [Purchase_Order] = CASE WHEN [Purchase_Order] IN('', ' ') THEN NULL ELSE [Purchase_Order] END,
  24946. [Location] = CASE WHEN [Location] IN('', ' ') THEN NULL ELSE [Location] END,
  24947. [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
  24948. [Start_Date] = CASE WHEN [Start_Date] IN('', ' ') THEN NULL ELSE [Start_Date] END,
  24949. [End_Date] = CASE WHEN [End_Date] IN('', ' ') THEN NULL ELSE [End_Date] END,
  24950. [No_Ending_Date] = CASE WHEN [No_Ending_Date] IN('', ' ') THEN NULL ELSE [No_Ending_Date] END,
  24951. [SLA] = CASE WHEN [SLA] IN('', ' ') THEN NULL ELSE [SLA] END,
  24952. [Internal_Notes] = CASE WHEN [Internal_Notes] IN('', ' ') THEN NULL ELSE [Internal_Notes] END,
  24953. [Application_Unit] = CASE WHEN [Application_Unit] IN('', ' ') THEN NULL ELSE [Application_Unit] END,
  24954. [Application_Limit] = CASE WHEN [Application_Limit] IN('', ' ') THEN NULL ELSE [Application_Limit] END,
  24955. [Unlimited] = CASE WHEN [Unlimited] IN('', ' ') THEN NULL ELSE [Unlimited] END,
  24956. [Available_Per] = CASE WHEN [Available_Per] IN('', ' ') THEN NULL ELSE [Available_Per] END,
  24957. [Agreement_Covers_Time] = CASE WHEN [Agreement_Covers_Time] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Time] END,
  24958. [Agreement_Covers_Expenses] = CASE WHEN [Agreement_Covers_Expenses] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Expenses] END,
  24959. [Agreement_Covers_Products] = CASE WHEN [Agreement_Covers_Products] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Products] END,
  24960. [Agreement_Covers_Sales_Tax] = CASE WHEN [Agreement_Covers_Sales_Tax] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Sales_Tax] END,
  24961. [Carryover_Days] = CASE WHEN [Carryover_Days] IN('', ' ') THEN NULL ELSE [Carryover_Days] END,
  24962. [Overruns_Percent] = CASE WHEN [Overruns_Percent] IN('', ' ') THEN NULL ELSE [Overruns_Percent] END,
  24963. [Charge_adjustments_to_the_firm] = CASE WHEN [Charge_adjustments_to_the_firm] IN('', ' ') THEN NULL ELSE [Charge_adjustments_to_the_firm] END,
  24964. [Billing_Cycle] = CASE WHEN [Billing_Cycle] IN('', ' ') THEN NULL ELSE [Billing_Cycle] END,
  24965. [Cycle_Based_On] = CASE WHEN [Cycle_Based_On] IN('', ' ') THEN NULL ELSE [Cycle_Based_On] END,
  24966. [Billing_Amount] = CASE WHEN [Billing_Amount] IN('', ' ') THEN NULL ELSE [Billing_Amount] END,
  24967. [Taxable] = CASE WHEN [Taxable] IN('', ' ') THEN NULL ELSE [Taxable] END,
  24968. [Prorate_first_bill] = CASE WHEN [Prorate_first_bill] IN('', ' ') THEN NULL ELSE [Prorate_first_bill] END,
  24969. [Billing_Start_date] = CASE WHEN [Billing_Start_date] IN('', ' ') THEN NULL ELSE [Billing_Start_date] END,
  24970. [Tax_Code] = CASE WHEN [Tax_Code] IN('', ' ') THEN NULL ELSE [Tax_Code] END,
  24971. [Restrict_downpayment] = CASE WHEN [Restrict_downpayment] IN('', ' ') THEN NULL ELSE [Restrict_downpayment] END,
  24972. [Terms] = CASE WHEN [Terms] IN('', ' ') THEN NULL ELSE [Terms] END,
  24973. [Override_Bill_To_Company_Name] = CASE WHEN [Override_Bill_To_Company_Name] IN('', ' ') THEN NULL ELSE [Override_Bill_To_Company_Name] END,
  24974. [Override_Billing_Site_Name] = CASE WHEN [Override_Billing_Site_Name] IN('', ' ') THEN NULL ELSE [Override_Billing_Site_Name] END,
  24975. [Invoice_Description] = CASE WHEN [Invoice_Description] IN('', ' ') THEN NULL ELSE [Invoice_Description] END,
  24976. [Default_Work_Role] = CASE WHEN [Default_Work_Role] IN('', ' ') THEN NULL ELSE [Default_Work_Role] END,
  24977. [Default_Work_Type] = CASE WHEN [Default_Work_Type] IN('', ' ') THEN NULL ELSE [Default_Work_Type] END,
  24978. [Project_Type] = CASE WHEN [Project_Type] IN('', ' ') THEN NULL ELSE [Project_Type] END,
  24979. [Invoice_Template] = CASE WHEN [Invoice_Template] IN('', ' ') THEN NULL ELSE [Invoice_Template] END,
  24980. [Bill_Time] = CASE WHEN [Bill_Time] IN('', ' ') THEN NULL ELSE [Bill_Time] END,
  24981. [Bill_Expenses] = CASE WHEN [Bill_Expenses] IN('', ' ') THEN NULL ELSE [Bill_Expenses] END,
  24982. [Bill_Products] = CASE WHEN [Bill_Products] IN('', ' ') THEN NULL ELSE [Bill_Products] END,
  24983. [Invoice_Time] = CASE WHEN [Invoice_Time] IN('', ' ') THEN NULL ELSE [Invoice_Time] END,
  24984. [Invoice_Expenses] = CASE WHEN [Invoice_Expenses] IN('', ' ') THEN NULL ELSE [Invoice_Expenses] END,
  24985. [Invoice_Products] = CASE WHEN [Invoice_Products] IN('', ' ') THEN NULL ELSE [Invoice_Products] END
  24986.  
  24987. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
  24988. BEGIN
  24989. SELECT @DSQL = '
  24990. UPDATE tmp
  24991. SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
  24992. FROM #Import_Staging tmp
  24993. INNER JOIN ' + @SourceTable + ' src
  24994. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  24995.  
  24996. EXEC(@DSQL)
  24997. END
  24998.  
  24999. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
  25000. BEGIN
  25001. SELECT @DSQL = '
  25002. UPDATE tmp
  25003. SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
  25004. FROM #Import_Staging tmp
  25005. INNER JOIN ' + @SourceTable + ' src
  25006. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  25007.  
  25008. EXEC(@DSQL)
  25009. END
  25010.  
  25011. -- Condense contact first and last names to ContactName
  25012. UPDATE tmp
  25013. SET ContactName = LTRIM(ISNULL(tmp.Contact_First_Name + ' ', '') + ISNULL(tmp.Contact_Last_Name, ''))
  25014. FROM #Import_Staging tmp
  25015.  
  25016. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  25017. IF Object_ID('tempdb..#Company') IS NOT NULL
  25018. BEGIN
  25019. DROP TABLE #Company
  25020. END
  25021.  
  25022. SELECT
  25023. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  25024. comp.Company_ID,
  25025. comp.Company_Name,
  25026. Delete_Flag,
  25027. LEFT(comp.Company_Name, 3) AS Company_Match_Val,
  25028. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  25029. 0 AS Duplicate_Flag
  25030. INTO #Company
  25031. FROM dbo.Company comp
  25032. WHERE Delete_Flag = 0
  25033.  
  25034.  
  25035. -- Table to hold contact information
  25036. IF Object_ID('tempdb..#Contact') IS NOT NULL
  25037. BEGIN
  25038. DROP TABLE #Contact
  25039. END
  25040.  
  25041. SELECT
  25042. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  25043. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  25044. First_Name,
  25045. Last_Name,
  25046. cont.Company_RecID,
  25047. Default_Flag
  25048. INTO #Contact
  25049. FROM dbo.Contact cont
  25050. INNER JOIN #Company comp
  25051. ON comp.Company_RecID = cont.Company_RecID
  25052.  
  25053. -- Match companies and contacts
  25054. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  25055.  
  25056. -- Table to hold duplicate sites
  25057. IF OBJECT_ID('tempdb..#Duplicate_Sites') IS NOT NULL
  25058. BEGIN
  25059. DROP TABLE #Duplicate_Sites
  25060. END
  25061.  
  25062. SELECT
  25063. cad.Company_RecID,
  25064. dbo.ufn_Import_Trim(comp.Company_Name) AS Company_Name,
  25065. dbo.ufn_Import_Trim(cad.[Description]) AS Site_Name
  25066. INTO #Duplicate_Sites
  25067. FROM #Company comp
  25068. INNER JOIN Company_Address cad
  25069. ON cad.Company_RecID = comp.Company_RecID
  25070. GROUP BY comp.Company_Name, cad.[Description], cad.Company_RecID
  25071. HAVING COUNT(*) > 1
  25072.  
  25073. -- Strip commas and dollar signs from dollar amounts to resolve common partner error
  25074. UPDATE #Import_Staging
  25075. SET Billing_Amount = REPLACE(Billing_Amount, '$', ''),
  25076. Prorate_first_bill = REPLACE(Prorate_first_bill, '$', '')
  25077.  
  25078. UPDATE #Import_Staging
  25079. SET Billing_Amount = REPLACE(Billing_Amount, ',', ''),
  25080. Prorate_first_bill = REPLACE(Prorate_first_bill, '$', '')
  25081.  
  25082. -- Pull valid numeric values into final fields
  25083. UPDATE stag
  25084. SET stag.PP_Amount = stag.Application_Limit
  25085. FROM #Import_Staging stag
  25086. WHERE ISNUMERIC(stag.Application_Limit + 'e0') = 1
  25087.  
  25088. UPDATE stag
  25089. SET stag.INT_Carryover_Days = stag.Carryover_Days
  25090. FROM #Import_Staging stag
  25091. WHERE ISNUMERIC(stag.Carryover_Days + '.e0') = 1
  25092.  
  25093. UPDATE stag
  25094. SET stag.INT_Overruns_Percent = stag.Overruns_Percent
  25095. FROM #Import_Staging stag
  25096. WHERE ISNUMERIC(stag.Overruns_Percent + '.e0') = 1
  25097.  
  25098. UPDATE stag
  25099. SET stag.AGR_Amount = stag.Billing_Amount
  25100. FROM #Import_Staging stag
  25101. WHERE ISNUMERIC(stag.Billing_Amount + 'e0') = 1
  25102.  
  25103. UPDATE stag
  25104. SET stag.AGR_ProRate = stag.Prorate_First_Bill
  25105. FROM #Import_Staging stag
  25106. WHERE ISNUMERIC(stag.Prorate_first_bill + 'e0') = 1
  25107.  
  25108. -- Gather reference recid's needed for agreement import
  25109. -- Get RecID's from reference tables
  25110. UPDATE stag
  25111. SET stag.AGR_Type_RecID = agrt.AGR_Type_RecID,
  25112. stag.Owner_Level_RecID = loc.Owner_Level_RecID,
  25113. stag.Billing_Unit_RecID = bu.Billing_Unit_RecID,
  25114. stag.SR_SLA_RecID = sla.SR_SLA_RecID,
  25115. stag.AGR_Billing_Cycle_RecID = bc.Bill_Cycle_RecID,
  25116. stag.Tax_Code_RecID = tc.Tax_Code_RecID,
  25117. stag.Billing_Terms_RecID = bterms.Billing_Terms_RecID,
  25118. stag.Billing_Company_RecID = billcomp.Company_RecID,
  25119. stag.Activity_Type_RecID = wt.Activity_Type_RecID, -- Work type/dbo.Activity_Type
  25120. stag.Activity_Class_RecID = wr.Activity_Class_RecID, -- Work role/dbo.Activity_Class
  25121. stag.PM_Type_RecID = pt.PM_Type_RecID,
  25122. --stag.bl_invTemplate_Setup_RecID = invt.bl_invTemplate_RecID,
  25123. CycleBasis_ID = CASE WHEN Cycle_Based_On = 'Contract Year' THEN 'C' WHEN Cycle_Based_On = 'Calendar Year' THEN 'Y' ELSE NULL END,
  25124. stag.[PP_Unlimited_Flag] = CASE WHEN stag.PP_Amount = 0 THEN 1 WHEN stag.PP_Amount > 0 THEN 0 ELSE NULL END,
  25125. stag.[PP_One_Time_Flag] = CASE WHEN [Available_Per] = 'Once' THEN 1 WHEN [Available_Per] IS NULL THEN NULL ELSE 0 END,
  25126. stag.[PP_Time_Flag] = CASE WHEN [Agreement_Covers_Time] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Agreement_Covers_Time] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25127. stag.[PP_Expenses_Flag] = CASE WHEN [Agreement_Covers_Expenses] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Agreement_Covers_Expenses] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25128. stag.[PP_Products_Flag] = CASE WHEN [Agreement_Covers_Products] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Agreement_Covers_Products] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25129. stag.[PP_Tax_Flag] = CASE WHEN [Agreement_Covers_Sales_Tax] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Agreement_Covers_Sales_Tax] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25130. stag.[PP_Carryover_Flag] = CASE WHEN INT_Carryover_Days > 0 THEN 1 WHEN INT_Carryover_Days = 0 THEN 0 ELSE NULL END,
  25131. stag.[Overrun_Flag] = CASE WHEN INT_Overruns_Percent >= 0 THEN 1 WHEN INT_Overruns_Percent = 0 THEN 0 ELSE NULL END,
  25132. stag.Charge_Firm_Flag = CASE WHEN [Charge_adjustments_to_the_firm] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Charge_adjustments_to_the_firm] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25133. stag.[AGR_OneTime_Flag] = CASE WHEN Billing_Cycle = 'Once' THEN 1 WHEN Billing_Cycle IS NULL THEN NULL ELSE 0 END,
  25134. stag.[Taxable_Flag] = CASE WHEN [Taxable] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Taxable] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25135. stag.[Restrict_DP_Flag] = CASE WHEN [Restrict_downpayment] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Restrict_downpayment] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25136. stag.AGR_Detail_Type_ID = adt.AGR_Detail_Type_ID,
  25137. stag.AGR_PONbr = CASE WHEN LEN([Purchase_Order]) < 30 THEN [Purchase_Order] ELSE NULL END,
  25138. stag.AGR_InvDesc = [Invoice_Description],
  25139. stag.AGR_Name = CASE WHEN LEN([Agreement_Name]) < 100 THEN [Agreement_Name] ELSE NULL END,
  25140. stag.AppCycle_ID = acy.AppCycle_ID,
  25141. stag.AGR_Notes = CASE WHEN LEN([Internal_Notes]) < 5000 THEN [Internal_Notes] ELSE NULL END,
  25142. stag.TE_Billable_Flag = CASE WHEN stag.Bill_Time IN('B', 'ND') THEN 1 WHEN stag.Bill_Time IN('NB', 'NC') THEN 0 ELSE NULL END,
  25143. stag.TE_Invoice_Flag = CASE WHEN stag.Bill_Time IN('B', 'NC') THEN 1 WHEN stag.Bill_Time IN('NB', 'ND') THEN 0 ELSE NULL END,
  25144. stag.EX_Billable_Flag = CASE WHEN stag.Bill_Expenses IN('B', 'ND') THEN 1 WHEN stag.Bill_Expenses IN('NB', 'NC') THEN 0 ELSE NULL END,
  25145. stag.EX_Invoice_Flag = CASE WHEN stag.Bill_Expenses IN('B', 'NC') THEN 1 WHEN stag.Bill_Expenses IN('NB', 'ND') THEN 0 ELSE NULL END,
  25146. stag.IV_Billable_Flag = CASE WHEN stag.Bill_Products IN('B', 'ND') THEN 1 WHEN stag.Bill_Products IN('NB', 'NC') THEN 0 ELSE NULL END,
  25147. stag.IV_Invoice_Flag = CASE WHEN stag.Bill_Products IN('B', 'NC') THEN 1 WHEN stag.Bill_Products IN('NB', 'ND') THEN 0 ELSE NULL END,
  25148. stag.TE_InvCust_Flag = CASE WHEN stag.Invoice_Time IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN stag.Invoice_Time IN('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25149. stag.EX_InvCust_Flag = CASE WHEN stag.Invoice_Expenses IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN stag.Invoice_Expenses IN('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25150. stag.IV_InvCust_Flag = CASE WHEN stag.Invoice_Products IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN stag.Invoice_Products IN('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  25151. stag.AGR_NoEnd_Flag = CASE WHEN stag.End_Date IS NULL THEN 1 ELSE 0 END
  25152. FROM #Import_Staging stag
  25153. LEFT OUTER JOIN dbo.AGR_Type agrt
  25154. ON agrt.AGR_Type_Desc = stag.Agreement_Type
  25155. LEFT OUTER JOIN #Company comp
  25156. ON comp.Company_RecID = stag.Company_RecID
  25157. LEFT OUTER JOIN dbo.Owner_Level loc
  25158. ON loc.[Description] = stag.Location
  25159. AND loc.Location_Flag = 1
  25160. LEFT OUTER JOIN dbo.Billing_Unit bu
  25161. ON bu.[Description] = stag.[Group]
  25162. OR bu.Billing_Unit_ID = stag.[Group]
  25163. LEFT OUTER JOIN SR_SLA sla
  25164. ON sla.SLA_Name = stag.SLA
  25165. LEFT OUTER JOIN Billing_Cycle bc
  25166. ON bc.[Description] = stag.Billing_Cycle
  25167. LEFT OUTER JOIN Tax_Code tc
  25168. ON tc.Tax_Code_ID = stag.Tax_Code
  25169. OR tc.[Description] = stag.Tax_Code
  25170. LEFT OUTER JOIN Billing_Terms bterms
  25171. ON bterms.[Description] = stag.Terms
  25172. LEFT OUTER JOIN #Company billcomp
  25173. ON billcomp.Company_Name = stag.Override_Bill_To_Company_Name
  25174. LEFT OUTER JOIN Activity_Type wt
  25175. ON wt.[Description] = stag.Default_Work_Type
  25176. LEFT OUTER JOIN Activity_Class wr
  25177. ON wr.[Description] = stag.Default_Work_Role
  25178. LEFT OUTER JOIN PM_Type pt
  25179. ON stag.Project_Type = pt.[Description]
  25180. --LEFT OUTER JOIN bl_invTemplate invt
  25181. --ON invt.Template_Name = stag.Invoice_Template
  25182. LEFT OUTER JOIN AGR_Detail_Type adt
  25183. ON adt.AGR_Detail_Type_Desc = stag.[Application_Unit]
  25184. OR adt.AGR_Detail_Type_ID = stag.[Application_Limit]
  25185. LEFT OUTER JOIN AGR_AppCycle acy
  25186. ON acy.AppCycle_Name = stag.Available_Per
  25187. OR acy.AppCycle_ID = stag.Available_Per
  25188.  
  25189. -- Now that we have Company_RecID, get addresses & contact
  25190. UPDATE stag
  25191. SET stag.Company_Address_RecID = cad.Company_Address_RecID,
  25192. stag.Billing_Address_RecID = billcad.Company_Address_RecID
  25193. FROM #Import_Staging stag
  25194. LEFT OUTER JOIN Company_Address cad
  25195. ON cad.Company_RecID = stag.Company_RecID
  25196. AND cad.[Description] = stag.Site_Name
  25197. LEFT OUTER JOIN Company_Address billcad
  25198. ON billcad.Company_RecID = stag.Billing_Company_RecID
  25199. AND billcad.[Description] = stag.Override_Billing_Site_Name
  25200.  
  25201. -- Default site for override billing if not specified
  25202. UPDATE stag
  25203. SET stag.Billing_Address_RecID = cad.Company_Address_RecID
  25204. FROM #Import_Staging stag
  25205. INNER JOIN Company_Address cad
  25206. ON cad.Company_RecID = stag.Billing_Company_RecID
  25207. AND cad.Default_Flag = 1
  25208. WHERE stag.Override_Billing_Site_Name IS NULL
  25209. AND stag.Billing_Company_RecID IS NOT NULL
  25210.  
  25211. -- Use primary contact if not otherwise specified in spreadsheet
  25212. UPDATE stag
  25213. SET stag.Contact_RecID = cont.Contact_RecID
  25214. FROM #Import_Staging stag
  25215. INNER JOIN #Contact cont
  25216. ON cont.Company_RecID = stag.Company_RecID
  25217. AND cont.Default_Flag = 1
  25218. AND stag.Contact_RecID IS NULL
  25219. AND COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NULL
  25220.  
  25221. -- Blank out application unit if 'None'
  25222. UPDATE stag
  25223. SET stag.AGR_Detail_Type_ID = ''
  25224. FROM #Import_Staging stag
  25225. WHERE stag.Application_Unit = 'None'
  25226.  
  25227. -- Format dates as mm/dd/yyyy and pull into datetime columns
  25228. UPDATE stag
  25229. SET stag.AGR_Date_Start = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[Start_Date]), 101)
  25230. FROM #Import_Staging stag
  25231. WHERE ISDATE([Start_Date]) = 1
  25232. AND ([Start_Date] LIKE('%/%/%') OR [Start_Date] LIKE('%-%-%'))
  25233.  
  25234. UPDATE stag
  25235. SET stag.AGR_Date_End = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[End_Date]), 101)
  25236. FROM #Import_Staging stag
  25237. WHERE ISDATE([End_Date]) = 1
  25238. AND ([End_Date] LIKE('%/%/%') OR [End_Date] LIKE('%-%-%'))
  25239.  
  25240. UPDATE stag
  25241. SET stag.Bill_Start_Date = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[Billing_Start_Date]), 101)
  25242. FROM #Import_Staging stag
  25243. WHERE ISDATE([Billing_Start_Date]) = 1
  25244. AND ([Billing_Start_Date] LIKE('%/%/%') OR [Billing_Start_Date] LIKE('%-%-%'))
  25245.  
  25246. -- AGR_Billing_Cycle_RecID should be 0 if billing cycle = 'Once' (mirror PSA logic)
  25247. UPDATE stag
  25248. SET stag.AGR_Billing_Cycle_RecID = 0
  25249. FROM #Import_Staging stag
  25250. WHERE Billing_Cycle = 'Once'
  25251.  
  25252. -- Validate that all required spreadsheet fields are entered
  25253. INSERT INTO #tblResults
  25254. (
  25255. RowNumber,
  25256. ValMsg
  25257. )
  25258.  
  25259. -- Agreement type
  25260. SELECT
  25261. ExcelRowNumber,
  25262. 'Agreement type cannot be blank'
  25263. FROM #Import_Staging
  25264. WHERE Agreement_Type IS NULL
  25265.  
  25266. UNION ALL
  25267.  
  25268. -- Agreement Name
  25269. SELECT
  25270. ExcelRowNumber,
  25271. 'Agreement Name cannot be blank'
  25272. FROM #Import_Staging
  25273. WHERE Agreement_Name IS NULL
  25274.  
  25275. UNION ALL
  25276.  
  25277. -- Agreement Name Duplicate
  25278. SELECT
  25279. ExcelRowNumber,
  25280. 'An agreement with this name already exists in ConnectWise for this company'
  25281. FROM #Import_Staging stag
  25282. INNER JOIN dbo.AGR_Header ah
  25283. ON ah.AGR_Name = stag.AGR_Name
  25284. AND ah.Company_RecID = stag.Company_RecID
  25285. WHERE stag.AGR_Name IS NOT NULL
  25286. AND stag.Company_RecID IS NOT NULL
  25287.  
  25288. UNION ALL
  25289.  
  25290. -- Agreement Name Duplicate
  25291. SELECT
  25292. MIN(stag.ExcelRowNumber),
  25293. 'Cannot have multiple agreements with the same name for a single company'
  25294. FROM #Import_Staging stag
  25295. WHERE Company_RecID IS NOT NULL
  25296. AND AGR_Name IS NOT NULL
  25297. GROUP BY Company_RecID, AGR_Name
  25298. HAVING COUNT(*) > 1
  25299.  
  25300. UNION ALL
  25301.  
  25302. -- Company Name
  25303. SELECT
  25304. ExcelRowNumber,
  25305. 'Company name cannot be blank'
  25306. FROM #Import_Staging
  25307. WHERE Company_Name IS NULL
  25308.  
  25309. UNION ALL
  25310.  
  25311. -- Start Date
  25312. SELECT
  25313. ExcelRowNumber,
  25314. 'Start Date cannot be blank'
  25315. FROM #Import_Staging
  25316. WHERE [Start_Date] IS NULL
  25317.  
  25318. UNION ALL
  25319.  
  25320. -- Validate that all spreadsheet cells that contain a value are valid
  25321. -- Single field validations
  25322.  
  25323. -- Agreement_Type
  25324. SELECT
  25325. stag.ExcelRowNumber,
  25326. 'Agreement_Type "' + stag.Agreement_Type + '" is invalid'
  25327. FROM #Import_Staging stag
  25328. WHERE stag.Agreement_Type IS NOT NULL
  25329. AND stag.AGR_Type_RecID IS NULL
  25330.  
  25331. UNION ALL
  25332.  
  25333. -- Agreement_Name
  25334. SELECT
  25335. stag.ExcelRowNumber,
  25336. 'Agreement_Name cannot exceed 100 characters'
  25337. FROM #Import_Staging stag
  25338. WHERE stag.Agreement_Name IS NOT NULL
  25339. AND LEN(stag.Agreement_Name) > 100
  25340.  
  25341. UNION ALL
  25342.  
  25343. -- Company_Name must be valid
  25344. SELECT
  25345. stag.ExcelRowNumber,
  25346. 'Company "' + stag.Company_Name + '" is invalid'
  25347. FROM #Import_Staging stag
  25348. WHERE stag.Company_Name IS NOT NULL
  25349. AND stag.Company_RecID IS NULL
  25350.  
  25351. UNION ALL
  25352.  
  25353. -- Company_Name cannot be duplicate
  25354. SELECT
  25355. stag.ExcelRowNumber,
  25356. 'There are more than one companies named "' + stag.Company_Name + '"'
  25357. FROM #Import_Staging stag
  25358. WHERE Company_Duplicate_Flag = 1
  25359.  
  25360. UNION ALL
  25361.  
  25362. -- Site_Name must be valid
  25363. SELECT
  25364. stag.ExcelRowNumber,
  25365. 'Site_Name "' + stag.Site_Name + '" is invalid for company: "' + stag.Company_Name + '"'
  25366. FROM #Import_Staging stag
  25367. WHERE stag.Site_Name IS NOT NULL
  25368. AND stag.Company_Address_RecID IS NULL
  25369. AND stag.Company_RecID IS NOT NULL
  25370.  
  25371. UNION ALL
  25372.  
  25373. -- Site_Name cannot be duplicate
  25374. SELECT
  25375. stag.ExcelRowNumber,
  25376. 'There are more than one sites named "' + stag.Site_Name +'" for Company: "' + stag.Company_Name
  25377. FROM #Import_Staging stag
  25378. INNER JOIN #Duplicate_Sites dups
  25379. ON dups.Company_RecID = stag.Company_RecID
  25380. AND dups.Site_Name = stag.Site_Name
  25381. WHERE stag.Company_Address_RecID IS NOT NULL
  25382.  
  25383. UNION ALL
  25384.  
  25385. -- Contact must be valid
  25386. SELECT
  25387. stag.ExcelRowNumber,
  25388. 'Invalid contact: "' + ISNULL(stag.Contact_First_Name + ' ', '') + ISNULL(stag.Contact_Last_Name, '') + '" for company "' + stag.Company_Name + '"'
  25389. FROM #Import_Staging stag
  25390. WHERE COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NOT NULL
  25391. AND Contact_RecID IS NULL
  25392. AND Company_RecID IS NOT NULL
  25393.  
  25394. UNION ALL
  25395.  
  25396. -- Contact cannot be null in spreadsheet unless a primary exists for company
  25397. SELECT
  25398. stag.ExcelRowNumber,
  25399. 'A contact name must be specified because no primary contact exists for company "' + stag.Company_Name + '"'
  25400. FROM #Import_Staging stag
  25401. WHERE COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NULL
  25402. AND stag.Company_RecID IS NOT NULL
  25403. AND stag.Contact_RecID IS NULL
  25404.  
  25405. UNION ALL
  25406.  
  25407. -- Contact cannot be duplicate
  25408. SELECT
  25409. stag.ExcelRowNumber,
  25410. 'There are more than one contacts named "' + ISNULL(stag.Contact_First_Name + ' ', '') + ISNULL(stag.Contact_Last_Name, '') +'" for Company: "' + stag.Company_Name
  25411. FROM #Import_Staging stag
  25412. WHERE stag.Contact_Duplicate_Flag = 1
  25413.  
  25414. UNION ALL
  25415.  
  25416. -- Purchase_Order
  25417. SELECT
  25418. stag.ExcelRowNumber,
  25419. 'Purchase Order cannot exceed 30 characters'
  25420. FROM #Import_Staging stag
  25421. WHERE stag.Purchase_Order IS NOT NULL
  25422. AND (LEN(stag.Purchase_Order) > 30 OR stag.AGR_PONbr IS NULL)
  25423.  
  25424. UNION ALL
  25425.  
  25426. -- Location
  25427. SELECT
  25428. stag.ExcelRowNumber,
  25429. 'Invalid location: "' + stag.Location + '"'
  25430. FROM #Import_Staging stag
  25431. WHERE stag.Location IS NOT NULL
  25432. AND stag.Owner_Level_RecID IS NULL
  25433.  
  25434. UNION ALL
  25435.  
  25436. -- Group
  25437. SELECT
  25438. stag.ExcelRowNumber,
  25439. 'Invalid Group: "' + stag.[Group]
  25440. FROM #Import_Staging stag
  25441. WHERE stag.[Group] IS NOT NULL
  25442. AND stag.Billing_Unit_RecID IS NULL
  25443.  
  25444. UNION ALL
  25445.  
  25446. -- [Start_Date]
  25447. SELECT
  25448. stag.ExcelRowNumber,
  25449. 'Start Date must be a valid date in MM/DD/YYYY format'
  25450. FROM #Import_Staging stag
  25451. WHERE stag.[Start_Date] IS NOT NULL
  25452. AND stag.AGR_Date_Start IS NULL
  25453.  
  25454. UNION ALL
  25455.  
  25456. -- End_Date
  25457. SELECT
  25458. stag.ExcelRowNumber,
  25459. 'End Date must be a valid date in MM/DD/YYYY format'
  25460. FROM #Import_Staging stag
  25461. WHERE stag.End_Date IS NOT NULL
  25462. AND stag.AGR_Date_End IS NULL
  25463.  
  25464. UNION ALL
  25465.  
  25466. -- SLA
  25467. SELECT
  25468. stag.ExcelRowNumber,
  25469. 'Invalid SLA: "' + stag.SLA + '"'
  25470. FROM #Import_Staging stag
  25471. WHERE stag.SLA IS NOT NULL
  25472. AND stag.SR_SLA_RecID IS NULL
  25473.  
  25474. UNION ALL
  25475.  
  25476. -- Internal_Notes
  25477. SELECT
  25478. stag.ExcelRowNumber,
  25479. 'Internal Notes cannot exceed 5000 characters'
  25480. FROM #Import_Staging stag
  25481. WHERE stag.Internal_Notes IS NOT NULL
  25482. AND (LEN(stag.Internal_Notes) > 5000 OR AGR_Notes IS NULL)
  25483.  
  25484.  
  25485. UNION ALL
  25486.  
  25487. -- Application_Unit
  25488. SELECT
  25489. stag.ExcelRowNumber,
  25490. 'Application Unit must be "Amount", "Hours", "Incidents" or "None"'
  25491. FROM #Import_Staging stag
  25492. WHERE stag.Application_Unit IS NOT NULL
  25493. AND stag.AGR_Detail_Type_ID IS NULL
  25494.  
  25495. UNION ALL
  25496.  
  25497. -- Application_Limit
  25498. SELECT
  25499. stag.ExcelRowNumber,
  25500. 'Invalid Application Limit - field must be numeric.'
  25501. FROM #Import_Staging stag
  25502. WHERE stag.Application_Limit IS NOT NULL
  25503. AND stag.PP_Amount IS NULL
  25504.  
  25505. UNION ALL
  25506.  
  25507. -- Available_Per
  25508. SELECT
  25509. stag.ExcelRowNumber,
  25510. 'Available per must be "Once", "Contract 2 weeks", "Contract 4 weeks", "Contract Year", "Calendar Month", "Calendar Quarter","Calendar Week", "Contract Quarter", or "Calendar Year"'
  25511. FROM #Import_Staging stag
  25512. WHERE stag.Available_Per IS NOT NULL
  25513. AND stag.AppCycle_ID IS NULL
  25514. AND stag.PP_One_Time_Flag <> 1
  25515.  
  25516. UNION ALL
  25517.  
  25518. -- Agreement_Covers_Time
  25519. SELECT
  25520. stag.ExcelRowNumber,
  25521. 'Agreement Covers Time must be Y or N'
  25522. FROM #Import_Staging stag
  25523. WHERE stag.Agreement_Covers_Time IS NOT NULL
  25524. AND stag.PP_Time_Flag IS NULL
  25525.  
  25526. UNION ALL
  25527.  
  25528. -- Agreement_Covers_Expenses
  25529. SELECT
  25530. stag.ExcelRowNumber,
  25531. 'Agreement Covers Expenses must be Y or N'
  25532. FROM #Import_Staging stag
  25533. WHERE stag.Agreement_Covers_Expenses IS NOT NULL
  25534. AND stag.PP_Expenses_Flag IS NULL
  25535.  
  25536. UNION ALL
  25537.  
  25538. -- Agreement_Covers_Products
  25539. SELECT
  25540. stag.ExcelRowNumber,
  25541. 'Agreement Covers Products must be Y or N'
  25542. FROM #Import_Staging stag
  25543. WHERE stag.Agreement_Covers_Products IS NOT NULL
  25544. AND stag.PP_Products_Flag IS NULL
  25545.  
  25546. UNION ALL
  25547.  
  25548. -- Agreement_Covers_Sales_Tax
  25549. SELECT
  25550. stag.ExcelRowNumber,
  25551. 'Agreement Covers Sales Tax must be Y or N'
  25552. FROM #Import_Staging stag
  25553. WHERE stag.Agreement_Covers_Sales_Tax IS NOT NULL
  25554. AND PP_Tax_Flag IS NULL
  25555.  
  25556. UNION ALL
  25557.  
  25558. -- Carryover_Days
  25559. SELECT
  25560. stag.ExcelRowNumber,
  25561. 'Carryover Days must be a whole number, and cannot be negative'
  25562. FROM #Import_Staging stag
  25563. WHERE stag.Carryover_Days IS NOT NULL
  25564. AND (stag.INT_Carryover_Days IS NULL OR stag.INT_Carryover_Days < 0)
  25565.  
  25566. UNION ALL
  25567.  
  25568. -- Carryover_Days
  25569. SELECT
  25570. stag.ExcelRowNumber,
  25571. 'Carryover Days cannot exceed 999999'
  25572. FROM #Import_Staging stag
  25573. WHERE stag.Carryover_Days IS NOT NULL
  25574. AND stag.INT_Carryover_Days > 999999
  25575.  
  25576. UNION ALL
  25577. -- Overruns_Percent
  25578. SELECT
  25579. stag.ExcelRowNumber,
  25580. 'Overruns_Percent must be a whole number between 0 and 999999'
  25581. FROM #Import_Staging stag
  25582. WHERE stag.Overruns_Percent IS NOT NULL
  25583. AND (INT_Overruns_Percent IS NULL OR INT_Overruns_Percent NOT BETWEEN 0 AND 999999)
  25584.  
  25585. UNION ALL
  25586.  
  25587. -- Charge_adjustments_to_the_firm
  25588. SELECT
  25589. stag.ExcelRowNumber,
  25590. 'Charge adjustments to the firm must be Y or N'
  25591. FROM #Import_Staging stag
  25592. WHERE stag.Charge_adjustments_to_the_firm IS NOT NULL
  25593. AND stag.Charge_Firm_Flag IS NULL
  25594.  
  25595. UNION ALL
  25596.  
  25597. -- Billing_Cycle
  25598. SELECT
  25599. stag.ExcelRowNumber,
  25600. 'Invalid Billing Cycle: "' + stag.Billing_Cycle + '"'
  25601. FROM #Import_Staging stag
  25602. WHERE stag.Billing_Cycle IS NOT NULL
  25603. AND stag.AGR_Billing_Cycle_RecID IS NULL
  25604.  
  25605. UNION ALL
  25606.  
  25607. -- Cycle_Based_On
  25608. SELECT
  25609. stag.ExcelRowNumber,
  25610. 'Cycle Based On must be "Calendar" or "Contract"'
  25611. FROM #Import_Staging stag
  25612. WHERE stag.Cycle_Based_On IS NOT NULL
  25613. AND CycleBasis_ID IS NULL
  25614.  
  25615. UNION ALL
  25616.  
  25617. -- Billing_Amount
  25618. SELECT
  25619. stag.ExcelRowNumber,
  25620. 'Billing_Amount must be numeric'
  25621. FROM #Import_Staging stag
  25622. WHERE stag.Billing_Amount IS NOT NULL
  25623. AND AGR_Amount IS NULL
  25624.  
  25625. UNION ALL
  25626.  
  25627. -- Taxable
  25628. SELECT
  25629. stag.ExcelRowNumber,
  25630. 'Taxable must be Y or N'
  25631. FROM #Import_Staging stag
  25632. WHERE stag.Taxable IS NOT NULL
  25633. AND Taxable_Flag IS NULL
  25634.  
  25635. UNION ALL
  25636.  
  25637. -- Prorate_first_bill
  25638. SELECT
  25639. stag.ExcelRowNumber,
  25640. 'Prorate first bill amount must be numeric'
  25641. FROM #Import_Staging stag
  25642. WHERE stag.Prorate_first_bill IS NOT NULL
  25643. AND AGR_ProRate IS NULL
  25644.  
  25645. UNION ALL
  25646.  
  25647. -- Billing_Start_date
  25648. SELECT
  25649. stag.ExcelRowNumber,
  25650. 'Billing Start Date must be a valid date - Please use MM/DD/YYYY format'
  25651. FROM #Import_Staging stag
  25652. WHERE stag.Bill_Start_Date IS NULL
  25653. AND stag.Billing_Start_Date IS NOT NULL
  25654.  
  25655. UNION ALL
  25656.  
  25657. -- Tax_Code
  25658. SELECT
  25659. stag.ExcelRowNumber,
  25660. 'Invalid Tax Code: "' + stag.Tax_Code + '"'
  25661. FROM #Import_Staging stag
  25662. WHERE stag.Tax_Code IS NOT NULL
  25663. AND stag.Tax_Code_RecID IS NULL
  25664.  
  25665. UNION ALL
  25666.  
  25667. -- Restrict_downpayment
  25668. SELECT
  25669. stag.ExcelRowNumber,
  25670. 'Restrict_downpayment must be Y or N'
  25671. FROM #Import_Staging stag
  25672. WHERE stag.Restrict_downpayment IS NOT NULL
  25673. AND stag.Restrict_DP_Flag IS NULL
  25674.  
  25675. UNION ALL
  25676.  
  25677. -- Terms
  25678. SELECT
  25679. stag.ExcelRowNumber,
  25680. 'Invalid billing terms: "' + stag.Terms + '"'
  25681. FROM #Import_Staging stag
  25682. WHERE stag.Terms IS NOT NULL
  25683. AND stag.Billing_Terms_RecID IS NULL
  25684.  
  25685. UNION ALL
  25686.  
  25687. -- Override_Bill_To must be valid
  25688. SELECT
  25689. stag.ExcelRowNumber,
  25690. 'Override Bill To company: "' + stag.Override_Bill_To_Company_Name + '" is invalid'
  25691. FROM #Import_Staging stag
  25692. WHERE stag.Override_Bill_To_Company_Name IS NOT NULL
  25693. AND stag.Billing_Company_RecID IS NULL
  25694.  
  25695.  
  25696. UNION ALL
  25697.  
  25698. -- Override_Billing_Site_Name must be valid
  25699. SELECT
  25700. stag.ExcelRowNumber,
  25701. 'Override_Billing_Site_Name: "' + stag.Override_Billing_Site_Name + '" is invalid'
  25702. FROM #Import_Staging stag
  25703. WHERE stag.Override_Billing_Site_Name IS NOT NULL
  25704. AND Billing_Address_RecID IS NULL
  25705.  
  25706. UNION ALL
  25707.  
  25708. -- Override_Billing_Site_Name cannot be duplicate
  25709. SELECT
  25710. stag.ExcelRowNumber,
  25711. 'There are more than one sites named "' + stag.Site_Name +'" for override billing company: "' + stag.Override_Bill_To_Company_Name
  25712. FROM #Import_Staging stag
  25713. INNER JOIN #Duplicate_Sites dups
  25714. ON dups.Company_RecID = stag.Billing_Company_RecID
  25715. AND dups.Site_Name = stag.Override_Billing_Site_Name
  25716. WHERE stag.Billing_Address_RecID IS NOT NULL
  25717.  
  25718. UNION ALL
  25719.  
  25720. -- Invoice_Description (check that it carried across if not null)
  25721. SELECT
  25722. stag.ExcelRowNumber,
  25723. 'Invoice description invalid'
  25724. FROM #Import_Staging stag
  25725. WHERE stag.Invoice_Description IS NOT NULL
  25726. AND AGR_InvDesc IS NULL
  25727.  
  25728. UNION ALL
  25729.  
  25730. -- Default_Work_Role
  25731. SELECT
  25732. stag.ExcelRowNumber,
  25733. 'Invalid Default_Work_Role: "' + Default_Work_Role + '"'
  25734. FROM #Import_Staging stag
  25735. WHERE stag.Default_Work_Role IS NOT NULL
  25736. AND stag.Activity_Class_RecID IS NULL
  25737.  
  25738. UNION ALL
  25739.  
  25740. -- Default_Work_Type
  25741. SELECT
  25742. stag.ExcelRowNumber,
  25743. 'Invalid Default_Work_Type: "' + Default_Work_Type + '"'
  25744. FROM #Import_Staging stag
  25745. WHERE stag.Default_Work_Type IS NOT NULL
  25746. AND stag.Activity_Type_RecID IS NULL
  25747.  
  25748. UNION ALL
  25749.  
  25750. -- Project_Type must be valid
  25751. SELECT
  25752. stag.ExcelRowNumber,
  25753. 'Invalid Project_Type: "' + stag.Project_Type + '"'
  25754. FROM #Import_Staging stag
  25755. WHERE stag.Project_Type IS NOT NULL
  25756. AND stag.PM_Type_RecID IS NULL
  25757.  
  25758. --UNION ALL
  25759.  
  25760. ---- Invoice_Template must be valid
  25761. --SELECT
  25762. -- stag.ExcelRowNumber,
  25763. -- 'Invalid Invoice_Template: "' + stag.Invoice_Template + '"'
  25764. --FROM #Import_Staging stag
  25765. --WHERE stag.Invoice_Template IS NOT NULL
  25766. -- AND stag.bl_invTemplate_RecID IS NULL
  25767.  
  25768. UNION ALL
  25769.  
  25770. -- Bill_Time must be B, NB, NC
  25771. SELECT
  25772. stag.ExcelRowNumber,
  25773. 'Bill_Time must be "B", "NB" or "NC"'
  25774. FROM #Import_Staging stag
  25775. WHERE stag.Bill_Time IS NOT NULL
  25776. AND (TE_Billable_Flag IS NULL OR TE_Invoice_Flag IS NULL)
  25777.  
  25778. UNION ALL
  25779.  
  25780. -- Bill_Expenses
  25781. SELECT
  25782. stag.ExcelRowNumber,
  25783. 'Bill_Expenses must be "B", "NB" or "NC"'
  25784. FROM #Import_Staging stag
  25785. WHERE stag.Bill_Expenses IS NOT NULL
  25786. AND (EX_Billable_Flag IS NULL OR EX_Invoice_Flag IS NULL)
  25787.  
  25788. UNION ALL
  25789.  
  25790. -- Bill_Products
  25791. SELECT
  25792. stag.ExcelRowNumber,
  25793. 'Bill_Products must be "B", "NB" or "NC"'
  25794. FROM #Import_Staging stag
  25795. WHERE stag.Bill_Products IS NOT NULL
  25796. AND (IV_Billable_Flag IS NULL OR IV_Invoice_Flag IS NULL)
  25797.  
  25798. UNION ALL
  25799.  
  25800. -- Invoice_Time must evaluate to Y/N
  25801. SELECT
  25802. stag.ExcelRowNumber,
  25803. 'Invoice_Time must be Y or N'
  25804. FROM #Import_Staging stag
  25805. WHERE stag.Invoice_Time IS NOT NULL
  25806. AND TE_InvCust_Flag IS NULL
  25807.  
  25808. UNION ALL
  25809.  
  25810. -- Invoice_Expenses must evaluate to Y/N
  25811. SELECT
  25812. stag.ExcelRowNumber,
  25813. 'Invoice Customer Expenses must be Y or N '
  25814. FROM #Import_Staging stag
  25815. WHERE stag.Invoice_Expenses IS NOT NULL
  25816. AND EX_InvCust_Flag IS NULL
  25817.  
  25818. UNION ALL
  25819.  
  25820. -- Invoice_Products must evaluate to Y/N
  25821. SELECT
  25822. stag.ExcelRowNumber,
  25823. 'Invoice Customer Products must be Y or N'
  25824. FROM #Import_Staging stag
  25825. WHERE stag.Invoice_Products IS NOT NULL
  25826. AND IV_InvCust_Flag IS NULL
  25827.  
  25828. UNION ALL
  25829.  
  25830. -- Cross-field validations
  25831. -- End date cannot be before start date
  25832. SELECT
  25833. stag.ExcelRowNumber,
  25834. 'End date cannot be prior to start date'
  25835. FROM #Import_Staging stag
  25836. WHERE AGR_Date_End IS NOT NULL
  25837. AND AGR_Date_Start IS NOT NULL
  25838. AND AGR_Date_End < AGR_Date_Start
  25839.  
  25840. UNION ALL
  25841.  
  25842. -- Group & Location must be associated
  25843. SELECT
  25844. stag.ExcelRowNumber,
  25845. 'Group: "' + stag.[Group] + '" does not belong to location: "' + stag.Location + '"'
  25846. FROM #Import_Staging stag
  25847. LEFT OUTER JOIN dbo.Billing_Unit_Loc bul
  25848. ON bul.Owner_Level_RecID = stag.Owner_Level_RecID
  25849. AND bul.Billing_Unit_RecID = stag.Billing_Unit_RecID
  25850. WHERE stag.Billing_Unit_RecID IS NOT NULL
  25851. AND stag.Owner_Level_RecID IS NOT NULL
  25852. AND bul.Billing_Unit_Loc_RecID IS NULL
  25853.  
  25854.  
  25855. -- UNION ALL
  25856.  
  25857. ---- Application limit required if application unit specified -- Default limit from AGR_Type???
  25858. --SELECT
  25859. -- stag.ExcelRowNumber,
  25860. -- 'Application limit is required if application unit is specified - enter "0" for unlimited"'
  25861. --FROM #Import_Staging stag
  25862. --WHERE Application_Unit IS NOT NULL
  25863. -- AND Application_Limit IS NULL
  25864.  
  25865. -- Set up row count table to summarize results
  25866. SELECT @start = 1
  25867. SELECT @end = MAX(ExcelRowNumber)+1 FROM #Import_Staging
  25868.  
  25869. -- If there are errors in spreadsheet, stop processing now and return results
  25870. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  25871. BEGIN
  25872.  
  25873.  
  25874. exec dbo.usp_Condense_Validation_Results
  25875.  
  25876. IF @ProcName = 'usp_AGR_ImportValidate'
  25877. BEGIN
  25878.  
  25879. SELECT
  25880. 0 AS ValPassed,
  25881. 0 AS RowNumber,
  25882. t.ValMsg
  25883. FROM #ResultsCondensed t
  25884.  
  25885. END
  25886.  
  25887. IF @ProcName = 'usp_AGR_ImportPush'
  25888. BEGIN
  25889.  
  25890. SELECT
  25891. 0 AS Success,
  25892. 0 AS RowNumber,
  25893. t.ValMsg
  25894. FROM #ResultsCondensed t
  25895. END
  25896.  
  25897. ROLLBACK TRANSACTION AGR_Import
  25898.  
  25899. RETURN
  25900. END
  25901.  
  25902. -- Set default values for fields that are only available in spreadsheet, but were not specified
  25903. -- Prorate first bill defaults to 0 if null
  25904. UPDATE stag
  25905. SET stag.AGR_Prorate = 0
  25906. FROM #Import_Staging stag
  25907. WHERE Prorate_first_bill IS NULL
  25908.  
  25909. -- Tax code defaults to company default if not specified in spreadsheet
  25910. UPDATE stag
  25911. SET stag.Tax_Code_RecID = comp.Tax_Code_RecID
  25912. FROM #Import_Staging stag
  25913. INNER JOIN dbo.Company comp
  25914. ON stag.Company_RecID = comp.Company_RecID
  25915. WHERE stag.Tax_Code_RecID IS NULL
  25916.  
  25917. -- Any tax codes that are still null should use overall default from dbo.Tax_Code
  25918. UPDATE stag
  25919. SET stag.Tax_Code_RecID = tc.Tax_Code_RecID
  25920. FROM #Import_Staging stag
  25921. INNER JOIN dbo.Tax_Code tc
  25922. ON tc.Default_Flag = 1
  25923. WHERE stag.Tax_Code_RecID IS NULL
  25924.  
  25925.  
  25926. -- Fold in fields from Agreement Type that are not *-available-* in spreadsheet (pre-pay, employee compensation, invoice comment preferences etc.)
  25927. UPDATE stag
  25928. SET stag.Prepay_Flag = atype.Prepay_Flag,
  25929. stag.Comp_Rate_Option = atype.Comp_Rate_Option,
  25930. stag.Comp_Limit_Option = atype.Comp_Limit_Option,
  25931. stag.Comp_Rate_Amount = atype.Comp_Rate_Amount,
  25932. stag.Comp_Limit_Amount = atype.Comp_Limit_Amount,
  25933. stag.TopComment_Flag = atype.TopComment_Flag,
  25934. stag.BottomComment_Flag = atype.BottomComment_Flag,
  25935. stag.BU_Restrict_Flag = atype.BU_Restrict_Flag,
  25936. stag.OL_Restrict_Flag = atype.OL_Restrict_Flag
  25937. FROM #Import_Staging stag
  25938. INNER JOIN AGR_Type atype
  25939. ON stag.AGR_Type_RecID = atype.AGR_Type_RecID
  25940.  
  25941. -- Pull in fields from Agreement Type that are not *-specified-* in spreadsheet
  25942. UPDATE stag
  25943. SET stag.Owner_Level_RecID = CASE WHEN stag.Location IS NULL THEN atype.Owner_Level_RecID ELSE stag.Owner_Level_RecID END,
  25944. stag.Billing_Unit_RecID = CASE WHEN stag.[Group] IS NULL THEN atype.Billing_Unit_RecID ELSE stag.Billing_Unit_RecID END,
  25945. stag.SR_SLA_RecID = CASE WHEN stag.SLA IS NULL THEN atype.SR_SLA_RecID ELSE stag.SR_SLA_RecID END,
  25946. stag.AGR_Detail_Type_ID = CASE WHEN stag.AGR_Detail_Type_ID IS NULL THEN adtype.AGR_Detail_Type_ID ELSE stag.AGR_Detail_Type_ID END,
  25947. stag.PP_Amount = CASE WHEN stag.Application_Limit IS NULL THEN atype.PP_Amount ELSE stag.PP_Amount END,
  25948. stag.PP_Unlimited_Flag = CASE WHEN stag.Application_Limit IS NULL THEN atype.PP_Unlimited_Flag ELSE stag.PP_Unlimited_Flag END,
  25949. stag.AppCycle_ID = CASE WHEN stag.Available_Per IS NULL THEN atype.AppCycle_ID ELSE stag.AppCycle_ID END,
  25950. stag.AGR_Billing_Cycle_RecID = CASE WHEN stag.Billing_Cycle IS NULL THEN atype.Bill_Cycle_RecID ELSE stag.AGR_Billing_Cycle_RecID END,
  25951. stag.AGR_OneTime_Flag = CASE WHEN stag.AGR_OneTime_Flag IS NULL THEN atype.OneTime_Flag ELSE stag.AGR_OneTime_Flag END,
  25952. stag.PP_Time_Flag = CASE WHEN stag.Agreement_Covers_Time IS NULL THEN atype.PP_Time_Flag ELSE stag.PP_Time_Flag END,
  25953. stag.PP_Products_Flag = CASE WHEN stag.Agreement_Covers_Products IS NULL THEN atype.PP_Products_Flag ELSE stag.PP_Products_Flag END,
  25954. stag.PP_Expenses_Flag = CASE WHEN stag.Agreement_Covers_Expenses IS NULL THEN atype.PP_Expenses_Flag ELSE stag.PP_Expenses_Flag END,
  25955. stag.PP_Tax_Flag = CASE WHEN stag.Agreement_Covers_Sales_Tax IS NULL THEN atype.PP_Tax_Flag ELSE stag.PP_Tax_Flag END,
  25956. stag.PP_Carryover_Flag = CASE WHEN stag.PP_Carryover_Flag IS NULL THEN atype.PP_Carryover_Flag ELSE stag.PP_Carryover_Flag END,
  25957. stag.INT_Carryover_Days = CASE WHEN stag.Carryover_Days IS NULL THEN atype.Carryover_Days ELSE stag.Carryover_Days END,
  25958. stag.Overrun_Flag = CASE WHEN stag.Overruns_Percent IS NULL THEN atype.Overrun_Flag ELSE stag.Overrun_Flag END,
  25959. stag.INT_Overruns_Percent = CASE WHEN stag.Overruns_Percent IS NULL THEN atype.Overrun_Limit ELSE stag.INT_Overruns_Percent END, ------- verify
  25960. stag.Charge_Firm_Flag = CASE WHEN stag.Charge_adjustments_to_the_firm IS NULL THEN atype.Charge_Firm_Flag ELSE stag.Charge_Firm_Flag END,
  25961. stag.PP_One_Time_Flag = CASE WHEN stag.PP_One_Time_Flag IS NULL THEN atype.PP_One_Time_Flag ELSE stag.PP_One_Time_Flag END,
  25962. stag.CycleBasis_ID = CASE WHEN stag.Cycle_Based_On IS NULL THEN atype.CycleBasis_ID ELSE stag.CycleBasis_ID END,
  25963. stag.AGR_Amount = CASE WHEN stag.AGR_Amount IS NULL THEN atype.Bill_Amount ELSE stag.AGR_Amount END,
  25964. stag.Taxable_Flag = CASE WHEN stag.Taxable_Flag IS NULL THEN atype.Taxable_Flag ELSE stag.Taxable_Flag END,
  25965. stag.Restrict_DP_Flag = CASE WHEN stag.Restrict_downpayment IS NULL THEN atype.Restrict_DP_Flag ELSE stag.Restrict_DP_Flag END,
  25966. stag.Billing_Terms_RecID = CASE WHEN stag.Billing_Terms_RecID IS NULL THEN atype.Billing_Terms_RecID ELSE stag.Billing_Terms_RecID END,
  25967. stag.AGR_InvDesc = CASE WHEN stag.AGR_InvDesc IS NULL THEN atype.Invoice_Desc ELSE stag.AGR_InvDesc END,
  25968. stag.Activity_Class_RecID = CASE WHEN stag.Activity_Class_RecID IS NULL THEN atype.Activity_Class_RecID ELSE stag.Activity_Class_RecID END,
  25969. stag.Activity_Type_RecID = CASE WHEN stag.Activity_Type_RecID IS NULL THEN atype.Activity_Type_RecID ELSE stag.Activity_Type_RecID END,
  25970. stag.PM_Type_RecID = CASE WHEN stag.PM_Type_RecID IS NULL THEN atype.PM_Type_RecID ELSE stag.PM_Type_RecID END,
  25971. stag.bl_invTemplate_Setup_RecID = CASE WHEN stag.bl_invTemplate_Setup_RecID IS NULL THEN atype.bl_invTemplate_Setup_RecID ELSE stag.bl_invTemplate_Setup_RecID END,
  25972. stag.TE_Billable_Flag = CASE WHEN stag.TE_Billable_Flag IS NULL THEN atype.TE_Billable_Flag ELSE stag.TE_Billable_Flag END,
  25973. stag.EX_Billable_Flag = CASE WHEN stag.EX_Billable_Flag IS NULL THEN atype.EX_Billable_Flag ELSE stag.EX_Billable_Flag END,
  25974. stag.IV_Billable_Flag = CASE WHEN stag.IV_Billable_Flag IS NULL THEN atype.IV_Billable_Flag ELSE stag.IV_Billable_Flag END,
  25975. stag.TE_Invoice_Flag = CASE WHEN stag.TE_Invoice_Flag IS NULL THEN atype.TE_Invoice_Flag ELSE stag.TE_Invoice_Flag END,
  25976. stag.EX_Invoice_Flag = CASE WHEN stag.EX_Invoice_Flag IS NULL THEN atype.EX_Invoice_Flag ELSE stag.EX_Invoice_Flag END,
  25977. stag.IV_Invoice_Flag = CASE WHEN stag.IV_Invoice_Flag IS NULL THEN atype.IV_Invoice_Flag ELSE stag.IV_Invoice_Flag END,
  25978. stag.TE_InvCust_Flag = CASE WHEN stag.TE_InvCust_Flag IS NULL THEN atype.TE_InvCust_Flag ELSE stag.TE_InvCust_Flag END,
  25979. stag.EX_InvCust_Flag = CASE WHEN stag.EX_InvCust_Flag IS NULL THEN atype.EX_InvCust_Flag ELSE stag.EX_InvCust_Flag END,
  25980. stag.IV_InvCust_Flag = CASE WHEN stag.IV_InvCust_Flag IS NULL THEN atype.IV_InvCust_Flag ELSE stag.IV_InvCust_Flag END
  25981. FROM #Import_Staging stag
  25982. INNER JOIN AGR_Type atype
  25983. ON stag.AGR_Type_RecID = atype.AGR_Type_RecID
  25984. LEFT OUTER JOIN AGR_Detail_Type adtype
  25985. ON adtype.AGR_Detail_Type_RecID = atype.AGR_Detail_Type_RecID
  25986.  
  25987. UPDATE stag
  25988. SET stag.PM_Type_RecID = pmt.PM_Type_RecID
  25989. FROM #Import_Staging stag
  25990. CROSS APPLY(SELECT TOP 1 PM_Type_RecID FROM PM_Type pmt WHERE pmt.Default_Flag = 1)pmt
  25991. WHERE stag.PM_Type_RecID IS NULL
  25992.  
  25993.  
  25994. -- Handle instance where PP_Unlimited_Flag is never set (i.e. no application unit)
  25995. UPDATE #Import_Staging
  25996. SET PP_Unlimited_Flag = 0
  25997. WHERE PP_Unlimited_Flag IS NULL
  25998.  
  25999. -- If application unit is hours, agreement should cover time
  26000. UPDATE #Import_Staging
  26001. SET PP_Time_Flag = 1
  26002. WHERE AGR_Detail_Type_ID = 'H'
  26003.  
  26004. -- Final validations to make sure that combined values from spreadsheet and agreement type create a valid agreement
  26005. INSERT INTO #tblResults
  26006. (
  26007. RowNumber,
  26008. ValMsg
  26009. )
  26010.  
  26011. -- Agreement must have a valid location
  26012. SELECT
  26013. stag.ExcelRowNumber,
  26014. 'A location must be specified in either the spreadsheet or the agreement type'
  26015. FROM #Import_Staging stag
  26016. WHERE stag.Owner_Level_RecID IS NULL
  26017. OR stag.Owner_Level_RecID = 0
  26018.  
  26019. UNION ALL
  26020.  
  26021. -- Agreement must have a valid group/billing unit
  26022. SELECT
  26023. stag.ExcelRowNumber,
  26024. 'A group must be specified in either the spreadsheet or the agreement type'
  26025. FROM #Import_Staging stag
  26026. WHERE stag.Billing_Unit_RecID IS NULL
  26027. OR stag.Billing_Unit_RecID = 0
  26028.  
  26029. UNION ALL
  26030.  
  26031. -- If agreement has an application unit (Amount, Hours, Incidents) - it must have an application limit
  26032. SELECT
  26033. stag.ExcelRowNumber,
  26034. 'Application limit must be specified unless application unit is "None"'
  26035. FROM #Import_Staging stag
  26036. WHERE stag.PP_Amount IS NULL
  26037. AND stag.AGR_Detail_Type_ID <> ''
  26038.  
  26039. UNION ALL
  26040.  
  26041. -- If agreement has an application unit (Amount, Hours, Incidents) - it must have an application cycle
  26042. SELECT
  26043. stag.ExcelRowNumber,
  26044. 'If the agreement has an application unit, "Available Per" must be specified in either the Agreement Type or Spreadsheet'
  26045. FROM #Import_Staging stag
  26046. WHERE (stag.AppCycle_ID IS NULL OR stag.AppCycle_ID = '')
  26047. AND stag.AGR_Detail_Type_ID <> ''
  26048. AND stag.PP_One_Time_Flag <> '1'
  26049.  
  26050. UNION ALL
  26051.  
  26052. SELECT
  26053. stag.ExcelRowNumber,
  26054. 'If agreement covers sales tax, application units must be set to "Amount"'
  26055. FROM #Import_Staging stag
  26056. WHERE PP_Tax_Flag = 1
  26057. AND AGR_Detail_Type_ID <> 'A'
  26058.  
  26059. --UNION ALL
  26060.  
  26061. ---- Default Work role must belong to location
  26062. --SELECT
  26063. -- stag.ExcelRowNumber,
  26064. -- 'Default work role "' + ac.[Description] + '" does not belong to location: "' + loc.[Description] + '"'
  26065. --FROM #Import_Staging stag
  26066. -- INNER JOIN dbo.Activity_Class ac
  26067. -- ON ac.Activity_Class_RecID = stag.Activity_Class_RecID
  26068. -- INNER JOIN dbo.Owner_Level loc
  26069. -- ON loc.Owner_Level_RecID = stag.Owner_Level_RecID
  26070. -- LEFT OUTER JOIN dbo.Activity_Class_Loc acl
  26071. -- ON acl.Activity_Class_RecID = ac.Activity_Class_RecID
  26072. -- AND acl.Owner_Level_RecID = stag.Owner_Level_RecID
  26073. --WHERE acl.Activity_Class_Loc_RecID IS NULL
  26074.  
  26075. --UNION ALL
  26076.  
  26077. ---- Copied work roles must belong to location
  26078. --SELECT
  26079. -- stag.ExcelRowNumber,
  26080. -- 'Unable to copy work role "' + ac.[Description] + '" from agreement type "' + stag.Agreement_Type + '" because the work role is not assigned to location: "' + loc.[Description] + '"'
  26081. --FROM #Import_Staging stag
  26082. -- INNER JOIN AGR_Type aty
  26083. -- ON aty.AGR_Type_RecID = stag.AGR_Type_RecID
  26084. -- INNER JOIN AGR_Type_WRole atw
  26085. -- ON atw.AGR_Type_RecID = aty.AGR_Type_RecID
  26086. -- INNER JOIN dbo.Activity_Class ac
  26087. -- ON ac.Activity_Class_RecID = atw.Activity_Class_RecID
  26088. -- INNER JOIN dbo.Owner_Level loc
  26089. -- ON loc.Owner_Level_RecID = stag.Owner_Level_RecID
  26090. -- LEFT OUTER JOIN dbo.Activity_Class_Loc acl
  26091. -- ON acl.Activity_Class_RecID = ac.Activity_Class_RecID
  26092. -- AND acl.Owner_Level_RecID = stag.Owner_Level_RecID
  26093. --WHERE acl.Activity_Class_Loc_RecID IS NULL
  26094.  
  26095. -- If running push procedure, perform final inserts
  26096. IF @ProcName = 'usp_AGR_ImportPUsh' AND NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  26097. BEGIN
  26098.  
  26099.  
  26100. -- AGR_Header insert
  26101. -- Temporarily repurpose PP_Billing_Cycle_RecID to store excel row number
  26102. INSERT INTO dbo.AGR_Header
  26103. (
  26104. AGR_Type_RecID,
  26105. AGR_Name,
  26106. AGR_Date_Start,
  26107. AGR_Date_End,
  26108. AGR_NoEnd_Flag,
  26109. AGR_Billing_Cycle_RecID,
  26110. AGR_OneTime_Flag,
  26111. AGR_Amount,
  26112. AGR_Calc_Flag,
  26113. AGR_Prorate,
  26114. AGR_InvDesc,
  26115. Company_RecID,
  26116. Contact_RecID,
  26117. AGR_PONbr,
  26118. Owner_Level_RecID,
  26119. Billing_Unit_RecID,
  26120. OL_Restrict_Flag,
  26121. BU_Restrict_Flag,
  26122. SubCompany_RecID,
  26123. SubContact_RecID,
  26124. Sub_WONbr,
  26125. AGR_Cancel_Flag,
  26126. AGR_Date_Cancel,
  26127. AGR_Reason_Cancel,
  26128. AGR_Cancel_By,
  26129. PP_Billing_Cycle_RecID,
  26130. PP_One_Time_Flag,
  26131. AGR_Detail_Type_ID,
  26132. PP_Amount,
  26133. PP_Carryover_Flag,
  26134. PP_Time_Flag,
  26135. PP_Expenses_Flag,
  26136. PP_Products_Flag,
  26137. AGR_Notes,
  26138. AGR_Default_Flag,
  26139. Activity_Class_RecID,
  26140. Activity_Type_RecID,
  26141. SR_Urgency_RecID,
  26142. PM_Type_RecID,
  26143. TE_Billable_Flag,
  26144. TE_Invoice_Flag,
  26145. EX_Billable_Flag,
  26146. EX_Invoice_Flag,
  26147. IV_Billable_Flag,
  26148. IV_Invoice_Flag,
  26149. PP_Adjustment,
  26150. Last_Update,
  26151. Updated_By,
  26152. SR_Type_RecID,
  26153. TopComment_Flag,
  26154. BottomComment_Flag,
  26155. Carryover_ID,
  26156. AppCycle_ID,
  26157. Overrun_Flag,
  26158. BillPeriod_ID,
  26159. CycleBasis_ID,
  26160. Taxable_Flag,
  26161. Tax_Code_RecID,
  26162. TE_Amount,
  26163. TE_UseBill_Flag,
  26164. TE_InvCust_Flag,
  26165. EX_InvCust_Flag,
  26166. IV_InvCust_Flag,
  26167. PP_Unlimited_Flag,
  26168. BR_Option,
  26169. Bill_Start_Date,
  26170. CarryOver_Days,
  26171. Overrun_Limit,
  26172. PP_Expire_Flag,
  26173. Notification_History,
  26174. Charge_Firm_Flag,
  26175. SR_SLA_RecID,
  26176. PP_Tax_Flag,
  26177. NetBalance,
  26178. Overrun,
  26179. Billing_Company_RecID,
  26180. Billing_Address_RecID,
  26181. Restrict_DP_Flag,
  26182. Billing_Terms_RecID,
  26183. TE_AmtOption,
  26184. TE_UseRate_Flag,
  26185. TE_UseAmt_Flag,
  26186. bl_invTemplate_Setup_RecID,
  26187. Avail_Balance,
  26188. parent_recid,
  26189. Comp_Rate_Option,
  26190. Comp_Limit_Option,
  26191. Comp_Rate_Amount,
  26192. Comp_Limit_Amount
  26193. )
  26194.  
  26195. SELECT
  26196. AGR_Type_RecID,
  26197. AGR_Name,
  26198. AGR_Date_Start,
  26199. AGR_Date_End,
  26200. AGR_NoEnd_Flag,
  26201. AGR_Billing_Cycle_RecID,
  26202. AGR_OneTime_Flag,
  26203. AGR_Amount,
  26204. 0 AS AGR_Calc_Flag,
  26205. AGR_Prorate,
  26206. AGR_InvDesc,
  26207. Company_RecID,
  26208. Contact_RecID,
  26209. AGR_PONbr,
  26210. Owner_Level_RecID,
  26211. Billing_Unit_RecID,
  26212. OL_Restrict_Flag,
  26213. BU_Restrict_Flag,
  26214. 0 AS SubCompany_RecID,
  26215. 0 AS SubContact_RecID,
  26216. NULL AS Sub_WONbr,
  26217. 0 AS AGR_Cancel_Flag,
  26218. NULL AS AGR_Date_Cancel,
  26219. NULL AS AGR_Reason_Cancel,
  26220. 0 AS AGR_Cancel_By,
  26221. [ExcelRowNumber] AS PP_Billing_Cycle_RecID,
  26222. PP_One_Time_Flag,
  26223. AGR_Detail_Type_ID,
  26224. PP_Amount,
  26225. PP_Carryover_Flag,
  26226. PP_Time_Flag,
  26227. PP_Expenses_Flag,
  26228. PP_Products_Flag,
  26229. AGR_Notes,
  26230. 0 AS AGR_Default_Flag,
  26231. Activity_Class_RecID,
  26232. Activity_Type_RecID,
  26233. NULL AS SR_Urgency_RecID,
  26234. NULL,
  26235. TE_Billable_Flag,
  26236. TE_Invoice_Flag,
  26237. EX_Billable_Flag,
  26238. EX_Invoice_Flag,
  26239. IV_Billable_Flag,
  26240. IV_Invoice_Flag,
  26241. '0.00' AS PP_Adjustment,
  26242. GETDATE() AS Last_Update,
  26243. @ImportBatchUser AS Updated_By,
  26244. 0 AS SR_Type_RecID,
  26245. TopComment_Flag,
  26246. BottomComment_Flag,
  26247. '' AS Carryover_ID,
  26248. AppCycle_ID,
  26249. Overrun_Flag,
  26250. '' AS BillPeriod_ID,
  26251. CycleBasis_ID,
  26252. Taxable_Flag,
  26253. Tax_Code_RecID,
  26254. NULL AS TE_Amount,
  26255. 0 AS TE_UseBill_Flag,
  26256. TE_InvCust_Flag,
  26257. EX_InvCust_Flag,
  26258. IV_InvCust_Flag,
  26259. PP_Unlimited_Flag,
  26260. 'W' AS BR_Option,
  26261. Bill_Start_Date,
  26262. CarryOver_Days,
  26263. INT_Overruns_Percent,
  26264. ISNULL(PP_Expire_Flag, 0),
  26265. ',' AS Notification_History,
  26266. Charge_Firm_Flag,
  26267. SR_SLA_RecID,
  26268. PP_Tax_Flag,
  26269. '0.00' AS NetBalance,
  26270. '0.00' AS Overrun,
  26271. Billing_Company_RecID,
  26272. Billing_Address_RecID,
  26273. Restrict_DP_Flag,
  26274. Billing_Terms_RecID,
  26275. NULL AS TE_AmtOption,
  26276. '0' AS TE_UseRate_Flag,
  26277. '0' AS TE_UseAmt_Flag,
  26278. bl_invTemplate_Setup_RecID,
  26279. NULL AS Avail_Balance,
  26280. NULL AS parent_recid,
  26281. Comp_Rate_Option,
  26282. Comp_Limit_Option,
  26283. Comp_Rate_Amount,
  26284. Comp_Limit_Amount
  26285. FROM #Import_Staging
  26286.  
  26287. -- Join AGR_Header back to staging table to capture identity for new rows
  26288. UPDATE stag
  26289. SET stag.AGR_Header_RecID = agr.AGR_Header_RecID
  26290. FROM #Import_Staging stag
  26291. INNER JOIN AGR_Header agr
  26292. ON stag.ExcelRowNumber = agr.PP_Billing_Cycle_RecID
  26293. AND agr.Updated_By = @ImportBatchUser
  26294.  
  26295. -- Set PP_Billing_Cycle_RecID to 0
  26296. UPDATE agr
  26297. SET agr.PP_Billing_Cycle_RecID = 0
  26298. FROM AGR_Header agr
  26299. WHERE Updated_By = @ImportBatchUser
  26300.  
  26301. -- Error if any row was not inserted (identity not populated)
  26302. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE AGR_Header_RecID IS NULL)
  26303. BEGIN
  26304. RAISERROR('One or more rows not inserted to AGR_Header - Rolling back transaction. Run insert procedure in SSMS to view the row(s) which were not inserted.', 16, 1)
  26305. SELECT * FROM #Import_Staging
  26306. END
  26307.  
  26308. -- AGR_Site Insert
  26309. INSERT INTO AGR_Site
  26310. (
  26311. AGR_Header_RecID,
  26312. Company_Address_Recid,
  26313. Last_Update,
  26314. Updated_By,
  26315. Company_RecID
  26316. )
  26317.  
  26318. SELECT
  26319. AGR_Header_RecID,
  26320. Company_Address_RecID,
  26321. GETDATE(),
  26322. @ImportBatchUser,
  26323. Company_RecID
  26324. FROM #Import_Staging stag
  26325. WHERE stag.Company_Address_RecID IS NOT NULL
  26326.  
  26327. -- Copy exclusions from AGR_Type_Exclusion to AGR_Exclusion
  26328. INSERT INTO AGR_Exclusion
  26329. (
  26330. AGR_Header_RecID,
  26331. Activity_Type_RecID,
  26332. Activity_Class_RecID,
  26333. Updated_By,
  26334. Last_Update
  26335. )
  26336.  
  26337. SELECT
  26338. stag.AGR_Header_RecID,
  26339. ate.Activity_Type_RecID,
  26340. ate.Activity_Class_RecID,
  26341. @ImportBatchUser,
  26342. GETDATE()
  26343. FROM #Import_Staging stag
  26344. INNER JOIN dbo.AGR_Type_Exclusion ate
  26345. ON ate.AGR_Type_RecID = stag.AGR_Type_RecID
  26346.  
  26347. -- Copy defaults from AGR_Type_Default to AGR_Default
  26348. INSERT INTO AGR_Default
  26349. (
  26350. AGR_Header_RecID,
  26351. Owner_Level_RecID,
  26352. Billing_Unit_RecID,
  26353. SR_Board_RecID,
  26354. SR_Type_RecID,
  26355. Default_Flag,
  26356. Last_Update,
  26357. Updated_By
  26358. )
  26359.  
  26360. SELECT
  26361. stag.AGR_Header_RecID,
  26362. atd.Owner_Level_RecID,
  26363. atd.Billing_Unit_RecID,
  26364. atd.SR_Board_RecID,
  26365. atd.SR_Type_RecID,
  26366. atd.Default_Flag,
  26367. GETDATE(),
  26368. @ImportBatchUser
  26369. FROM #Import_Staging stag
  26370. INNER JOIN AGR_Type_Default atd
  26371. ON atd.AGR_Type_RecID = stag.AGR_Type_RecID
  26372.  
  26373. -- Copy work roles to dbo.Company_Billing_Rate from dbo.AGR_Type_WRole
  26374. -- For agreement types where Copy_Work_Roles_Flag = 1
  26375. INSERT INTO dbo.Company_Billing_Rate
  26376. (
  26377. Owner_ID,
  26378. Company_RecID,
  26379. Date_Effective,
  26380. Last_Update,
  26381. Updated_By,
  26382. Date_Ending,
  26383. Rate_Type,
  26384. Activity_Class_RecID,
  26385. BR_Option,
  26386. Owner_Level_RecID
  26387. )
  26388.  
  26389. SELECT
  26390. 1,
  26391. stag.Company_RecID,
  26392. wrl.Date_Effective,
  26393. GETDATE(),
  26394. @ImportBatchUser,
  26395. wrl.Date_Ending,
  26396. wrl.Rate_Type,
  26397. wrl.Activity_Class_RecID,
  26398. 'W',
  26399. NULL
  26400. FROM #Import_Staging stag
  26401. INNER JOIN AGR_Type aty
  26402. ON stag.AGR_Type_RecID = aty.AGR_Type_RecID
  26403. INNER JOIN AGR_Type_WRole wrl
  26404. ON wrl.AGR_Type_RecID = aty.AGR_Type_RecID
  26405. WHERE aty.Copy_Work_Roles_Flag = 1
  26406.  
  26407. -- Copy work types to dbo.Company_Activity_Type from dbo.AGR_Type_WType
  26408. -- For agreement types where Copy_Work_Types_Flag = 1
  26409. INSERT INTO dbo.Company_Activity_Type
  26410. (
  26411. Owner_ID,
  26412. Company_RecID,
  26413. Hours_Min,
  26414. Rate_Type,
  26415. Rate,
  26416. Inactive_Flag,
  26417. Last_Update,
  26418. Updated_By,
  26419. Hours_Max,
  26420. Billable_Flag,
  26421. Activity_Type_RecID,
  26422. AGR_Header_RecID,
  26423. Owner_Level_RecID,
  26424. Date_Effective,
  26425. Date_Ending,
  26426. Company_Address_RecID,
  26427. Entered_By
  26428. )
  26429.  
  26430. SELECT
  26431. 1,
  26432. stag.Company_RecID,
  26433. atw.Hours_Min,
  26434. atw.Rate_Type,
  26435. atw.Rate,
  26436. 0,
  26437. GETDATE(),
  26438. @ImportBatchUser,
  26439. atw.Hours_Max,
  26440. 1,
  26441. atw.Activity_Type_RecID,
  26442. stag.AGR_Header_RecID,
  26443. NULL,
  26444. atw.Date_Effective,
  26445. atw.Date_Ending,
  26446. NULL,
  26447. 'Import'
  26448. FROM #Import_Staging stag
  26449. INNER JOIN AGR_Type aty
  26450. ON aty.AGR_Type_RecID = stag.AGR_Type_RecID
  26451. INNER JOIN AGR_Type_WType atw
  26452. ON atw.AGR_Type_RecID = aty.AGR_Type_RecID
  26453. WHERE aty.Copy_Work_Types_Flag = 1
  26454.  
  26455. COMMIT TRANSACTION AGR_Import
  26456.  
  26457. SELECT
  26458. 1 AS Success,
  26459. NULL AS RowNumber,
  26460. NULL AS ValMsg
  26461.  
  26462. RETURN
  26463. END
  26464.  
  26465. -- Condense row numbers to return one line per unique validation message
  26466. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  26467. BEGIN
  26468.  
  26469. exec dbo.usp_Condense_Validation_Results
  26470.  
  26471. IF @ProcName = 'usp_AGR_ImportValidate'
  26472. BEGIN
  26473. SELECT
  26474. 0 AS ValPassed,
  26475. 0 AS RowNumber,
  26476. t.ValMsg + ' on row(s): ' + STUFF((SELECT ', ' + CONVERT(NVARCHAR(50), RowNumber) AS ValMsg
  26477. FROM #ResultsCondensed
  26478. WHERE ValMsg = t.ValMsg
  26479. FOR XML PATH(''), TYPE
  26480. ).value('.', 'varchar(max)'), 1, 2, '') AS ValMsg
  26481. FROM #ResultsCondensed t
  26482. GROUP BY t.ValMsg
  26483. END
  26484.  
  26485. IF @ProcName = 'usp_AGR_ImportPush'
  26486. BEGIN
  26487.  
  26488. SELECT
  26489. 0 AS Success,
  26490. 0 AS RowNumber,
  26491. t.ValMsg + ' on row(s): ' + STUFF((SELECT ', ' + CONVERT(NVARCHAR(50), RowNumber) AS ValMsg
  26492. FROM #ResultsCondensed
  26493. WHERE ValMsg = t.ValMsg
  26494. FOR XML PATH(''), TYPE
  26495. ).value('.', 'varchar(max)'), 1, 2, '') AS ValMsg
  26496. FROM #ResultsCondensed t
  26497. GROUP BY t.ValMsg
  26498. END
  26499.  
  26500. END
  26501. ELSE
  26502. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
  26503. BEGIN
  26504. SELECT
  26505. 2 AS ValPassed,
  26506. 0 AS RowNumber,
  26507. 'The following ' + ReferenceType + ' will be created: '+
  26508. STUFF(
  26509. (SELECT ', ' + ValMsg
  26510. FROM #tblResults
  26511. WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
  26512. FOR XML PATH (''))
  26513. , 1, 1, '') AS ValMsg
  26514. FROM #tblResults res
  26515. GROUP BY ReferenceType
  26516.  
  26517. END
  26518. ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  26519. BEGIN
  26520. SELECT
  26521. 1 AS ValPassed,
  26522. NULL AS RowNumber,
  26523. NULL AS ValMsg
  26524. END
  26525.  
  26526. ROLLBACK TRANSACTION AGR_Import
  26527.  
  26528. END TRY
  26529.  
  26530. BEGIN CATCH
  26531.  
  26532.  
  26533.  
  26534.  
  26535. -- Return error information and rollback transaction
  26536. SELECT
  26537. 0 AS Success,
  26538. ERROR_LINE() AS ExcelRowNumber,
  26539. ERROR_MESSAGE() AS ErrorDetails
  26540.  
  26541. ROLLBACK TRANSACTION AGR_Import
  26542.  
  26543.  
  26544.  
  26545. END CATCH
  26546.  
  26547.  
  26548.  
  26549. GO
  26550.  
  26551.  
  26552.  
  26553. -- =============================================
  26554. -- Author: m.gray
  26555. -- Create date: 10/04/2013
  26556. -- Description: Validates data for Agreements import
  26557. -- Sample call: EXEC usp_AGR_ImportPush 'TMP_Import_4992de3f325c4a2d8f575608b7dc2801', 1
  26558. -- =============================================
  26559.  
  26560. ALTER PROCEDURE [dbo].[usp_AGR_ImportPush]
  26561. @TableName VARCHAR(255),
  26562. @ForceMode BIT = 0
  26563. AS
  26564. BEGIN TRY
  26565. BEGIN TRANSACTION AGR_Import
  26566.  
  26567. SET NOCOUNT ON
  26568.  
  26569. -- Variable declaration
  26570. -- To keep validation/push logic consistent, validation/insert procs are identical - Final insert runs only on usp_AGR_ImportPush
  26571. -- Capture proc name to drive validate vs. commit logic
  26572. DECLARE @ProcName NVARCHAR(50)
  26573. SELECT @ProcName = OBJECT_NAME(@@ProcID)
  26574.  
  26575. -- Row counters for summary results
  26576. DECLARE @start INT
  26577. DECLARE @end INT
  26578.  
  26579. -- Dynamic statement to insert to staging table
  26580. DECLARE @DSQL VARCHAR(MAX)
  26581.  
  26582. -- Fully qualified name of source table
  26583. DECLARE @SourceTable VARCHAR(300)
  26584. SELECT @SourceTable = 'tempdb.dbo.' + @TableName
  26585.  
  26586. -- Object_ID of source table
  26587. DECLARE @Source_Object_ID INT
  26588. SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
  26589.  
  26590. DECLARE
  26591. @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
  26592.  
  26593. -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
  26594. SELECT @ImportBatchUser =
  26595. 'CONV_'
  26596. + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
  26597. + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
  26598. + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
  26599. + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
  26600.  
  26601. IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
  26602. BEGIN
  26603. DROP TABLE #tblResults
  26604. END
  26605.  
  26606. -- Table to hold results of procedure
  26607. CREATE TABLE #tblResults
  26608. (
  26609. RowNumber INT,
  26610. ValMsg VARCHAR(750),
  26611. InvalidReason VARCHAR(MAX),
  26612. ReferenceType VARCHAR(MAX),
  26613. Warning_Flag BIT DEFAULT 0
  26614. )
  26615.  
  26616. CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
  26617.  
  26618. -- Table to hold condensed summary results
  26619. IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
  26620. BEGIN
  26621. DROP TABLE #ResultsCondensed
  26622. END
  26623.  
  26624. CREATE TABLE #ResultsCondensed
  26625. (
  26626. RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  26627. ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
  26628. )
  26629.  
  26630. -- Table to hold source data for this batch from temp table
  26631. IF OBJECT_ID('tempdb.dbo.#Import_Staging') IS NOT NULL
  26632. BEGIN
  26633. DROP TABLE #Import_Staging
  26634. END
  26635.  
  26636. CREATE TABLE #Import_Staging
  26637. (
  26638. ExcelRowNumber INT,
  26639.  
  26640. -- Fields appearing on spreadsheet
  26641. Agreement_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26642. Agreement_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26643. Company_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26644. [Start_Date] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26645. Billing_Start_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26646. End_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26647. Site_Name NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  26648. Contact_First_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26649. Contact_Last_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26650. Purchase_Order nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26651. Location nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26652. [Group] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26653. SLA nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26654. Internal_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
  26655. Application_Unit nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26656. Application_Limit nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26657. Available_Per nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26658. Agreement_Covers_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26659. Agreement_Covers_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26660. Agreement_Covers_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26661. Agreement_Covers_Sales_Tax nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26662. Carryover_Days nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26663. Overruns_Percent nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26664. Charge_adjustments_to_the_firm nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26665. Billing_Cycle nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26666. Cycle_Based_On nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26667. Billing_Amount nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26668. Taxable nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26669. Prorate_first_bill nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26670. Tax_Code nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26671. Restrict_downpayment nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26672. Terms nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26673. Override_Bill_To_Company_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26674. Override_Billing_Site_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26675. Invoice_Description nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
  26676. Default_Work_Role nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26677. Default_Work_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26678. Project_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26679. Invoice_Template nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26680. Bill_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26681. Bill_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26682. Bill_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26683. Invoice_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26684. Invoice_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26685. Invoice_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26686.  
  26687. -- Fields derived from others on spreadsheet
  26688. No_Ending_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26689. [Unlimited] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
  26690.  
  26691. -- Fields always defaulted from Agreement Type
  26692. TopComment_Flag NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  26693. BottomComment_Flag NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  26694. Prepay_Flag BIT NULL,
  26695. Comp_Rate_Option NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  26696. Comp_Limit_Option NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  26697. Comp_Rate_Amount NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  26698. Comp_Limit_Amount NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
  26699.  
  26700. -- Reference RecID's/Fields used for final inserts
  26701. AGR_Type_RecID INT NULL,
  26702. AGR_Detail_Type_RecID INT NULL,
  26703. Company_RecID INT NULL,
  26704. Company_Address_RecID INT NULL,
  26705. Contact_RecID INT NULL,
  26706. Owner_Level_RecID INT NULL,
  26707. Billing_Unit_RecID INT NULL,
  26708. SR_SLA_RecID INT NULL,
  26709. Tax_Code_RecID INT NULL,
  26710. Billing_Terms_RecID INT NULL,
  26711. Billing_Company_RecID INT NULL,
  26712. Billing_Address_RecID INT NULL,
  26713. Activity_Type_RecID INT NULL, -- Work type
  26714. Activity_Class_RecID INT NULL, -- Work role
  26715. PM_Type_RecID INT,
  26716. AGR_Billing_Cycle_RecID INT NULL,
  26717. bl_invTemplate_Setup_RecID INT NULL, -- Invoice template
  26718. DT_Start_Date DATETIME NULL,
  26719. DT_End_Date DATETIME NULL,
  26720. DT_Billing_Start_Date DATETIME NULL,
  26721. INT_Carryover_Days INT NULL,
  26722. INT_Overruns_Percent INT NULL,
  26723. OL_Restrict_Flag BIT NULL,
  26724. BU_Restrict_Flag BIT NULL,
  26725. PP_Amount DECIMAL(18, 2) NULL,
  26726. PP_Unlimited_Flag BIT NULL,
  26727. AppCycle_ID CHAR(1) COLLATE DATABASE_DEFAULT NULL,
  26728. AGR_OneTime_Flag BIT NULL,
  26729. PP_Time_Flag BIT NULL,
  26730. PP_Products_Flag BIT NULL,
  26731. PP_Carryover_Flag BIT NULL,
  26732. Overrun_Flag BIT NULL,
  26733. Overrun_Limit INT NULL,
  26734. Charge_Firm_Flag BIT NULL,
  26735. PP_One_Time_Flag BIT NULL,
  26736. PP_Tax_Flag BIT NULL,
  26737. CycleBasis_ID CHAR(1) COLLATE DATABASE_DEFAULT NULL,
  26738. PP_Expire_Flag BIT NULL,
  26739. PP_Expenses_Flag BIT NULL,
  26740. Taxable_Flag BIT NULL,
  26741. Restrict_DP_Flag BIT NULL,
  26742. TE_Invoice_Flag BIT NULL,
  26743. TE_Billable_Flag BIT NULL,
  26744. EX_Invoice_Flag BIT NULL,
  26745. EX_Billable_Flag BIT NULL,
  26746. IV_Invoice_Flag BIT NULL,
  26747. IV_Billable_Flag BIT NULL,
  26748. AGR_Date_Start DATETIME,
  26749. AGR_Date_End DATETIME,
  26750. Bill_Start_Date DATETIME,
  26751. AGR_Detail_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT NULL,
  26752. AGR_PONbr NVARCHAR(30) COLLATE DATABASE_DEFAULT NULL,
  26753. AGR_InvDesc NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  26754. AGR_Name NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
  26755. AGR_Amount DECIMAL(18,2) NULL,
  26756. AGR_ProRate DECIMAL(18,2) NULL,
  26757. AGR_Notes VARCHAR(5000) COLLATE DATABASE_DEFAULT NULL,
  26758. TE_InvCust_Flag BIT NULL,
  26759. EX_InvCust_Flag BIT NULL,
  26760. IV_InvCust_Flag BIT NULL,
  26761. AGR_NoEnd_Flag BIT NULL,
  26762. AGR_Header_RecID INT NULL,
  26763. ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  26764. Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
  26765. Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
  26766. Company_Duplicate_Flag BIT NULL,
  26767. Contact_Duplicate_Flag BIT NULL,
  26768. Contact_Name_Fuzzy NVARCHAR(61),
  26769. Company_Match_Val NVARCHAR(3),
  26770. Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  26771. Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  26772. Diff_Exclude_Flag BIT,
  26773. Duplicate_Flag BIT,
  26774. Currency_RecID INT
  26775. )
  26776.  
  26777. -- Create & populate table variable with list of required columns
  26778. DECLARE @RequiredColumns TABLE
  26779. (
  26780. ColumnName VARCHAR(255)
  26781. )
  26782.  
  26783. INSERT INTO @RequiredColumns
  26784. (
  26785. ColumnName
  26786. )
  26787.  
  26788. SELECT 'Agreement Type' UNION ALL
  26789. SELECT 'Agreement Name' UNION ALL
  26790. SELECT 'Company Name' UNION ALL
  26791. SELECT 'Start Date' UNION ALL
  26792. SELECT 'Billing Start Date'
  26793.  
  26794. -- Create & populate table variable with list of optional columns
  26795. DECLARE @OptionalColumns TABLE
  26796. (
  26797. ColumnName VARCHAR(255)
  26798. )
  26799.  
  26800. INSERT INTO @OptionalColumns
  26801. (
  26802. ColumnName
  26803. )
  26804.  
  26805. SELECT 'Contact First Name' UNION ALL
  26806. SELECT 'Contact Last Name' UNION ALL
  26807. SELECT 'Purchase Order' UNION ALL
  26808. SELECT 'Location' UNION ALL
  26809. SELECT 'Group' UNION ALL
  26810. SELECT 'End Date' UNION ALL
  26811. SELECT 'SLA' UNION ALL
  26812. SELECT 'Internal Notes' UNION ALL
  26813. SELECT 'Application Unit' UNION ALL
  26814. SELECT 'Application Limit' UNION ALL
  26815. SELECT 'Available Per' UNION ALL
  26816. SELECT 'Agreement Covers Time' UNION ALL
  26817. SELECT 'Agreement Covers Expenses' UNION ALL
  26818. SELECT 'Agreement Covers Products' UNION ALL
  26819. SELECT 'Agreement Covers Sales Tax' UNION ALL
  26820. SELECT 'Carryover Days' UNION ALL
  26821. SELECT 'Overruns Percent' UNION ALL
  26822. SELECT 'Charge adjustments to the firm' UNION ALL
  26823. SELECT 'Billing Cycle' UNION ALL
  26824. SELECT 'Cycle Based On' UNION ALL
  26825. SELECT 'Billing Amount' UNION ALL
  26826. SELECT 'Taxable' UNION ALL
  26827. SELECT 'Prorate first bill' UNION ALL
  26828. SELECT 'Tax Code' UNION ALL
  26829. SELECT 'Restrict Downpayment' UNION ALL
  26830. SELECT 'Billing Terms' UNION ALL
  26831. SELECT 'Override Bill To Company Name' UNION ALL
  26832. SELECT 'Override Billing Site Name' UNION ALL
  26833. SELECT 'Invoice Description' UNION ALL
  26834. SELECT 'Default Work Role' UNION ALL
  26835. SELECT 'Default Work Type' UNION ALL
  26836. SELECT 'Project Type' UNION ALL
  26837. SELECT 'Invoice Template' UNION ALL
  26838. SELECT 'Bill Time' UNION ALL
  26839. SELECT 'Bill Expenses' UNION ALL
  26840. SELECT 'Bill Products' UNION ALL
  26841. SELECT 'Invoice Time' UNION ALL
  26842. SELECT 'Invoice Expenses' UNION ALL
  26843. SELECT 'Invoice Products' UNION ALL
  26844. SELECT 'Site Name'
  26845.  
  26846.  
  26847. -- Table variable to hold column names from source table
  26848. DECLARE @SourceColumns TABLE
  26849. (
  26850. ColumnName VARCHAR(255)
  26851. )
  26852.  
  26853. -- Populate @SourceColumns
  26854. INSERT INTO @SourceColumns
  26855. (
  26856. ColumnName
  26857. )
  26858.  
  26859. SELECT
  26860. name
  26861. FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
  26862.  
  26863. -- Check that all required columns exist in @SourceColumns
  26864. INSERT INTO #tblResults
  26865. (
  26866. RowNumber,
  26867. ValMsg
  26868. )
  26869.  
  26870. SELECT
  26871. 0,
  26872. 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
  26873. FROM @RequiredColumns rq
  26874.  
  26875. EXCEPT
  26876.  
  26877. SELECT
  26878. 0,
  26879. 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
  26880. FROM @SourceColumns sc
  26881.  
  26882. -- If a required column is missing, stop here and return results
  26883. IF EXISTS(SELECT TOP 1 * FROM #tblResults)
  26884. BEGIN
  26885. SELECT
  26886. 0 AS ValPassed,
  26887. RowNumber,
  26888. ValMsg
  26889. FROM #tblResults
  26890. ORDER BY RowNumber, ValMsg
  26891.  
  26892. ROLLBACK TRANSACTION AGR_Import
  26893.  
  26894. RETURN
  26895. END
  26896.  
  26897. -- Pull sys columns information for tempdb into temp table
  26898. -- This is necessary to join to sys columns data without experiencing collation errors in the event that tempdb collation differs from database_default
  26899. IF OBJECT_ID('tempdb..#sysColumns') IS NOT NULL
  26900. BEGIN
  26901. DROP TABLE #sysColumns
  26902. END
  26903.  
  26904. SELECT *
  26905. INTO #sysColumns
  26906. FROM tempdb.sys.columns
  26907.  
  26908. -- Add any optional spreadsheet columns to source table to sidestep table structure errors later on
  26909. -- Use dynamic SQL to only add columns that are missing
  26910. IF EXISTS(SELECT TOP 1 * FROM @OptionalColumns rq LEFT OUTER JOIN #sysColumns cols ON cols.name = rq.ColumnName AND cols.Object_ID = object_id('tempdb..' + @TableName) WHERE cols.name IS NULL)
  26911. BEGIN
  26912. SELECT @DSQL = 'ALTER TABLE ' + @SourceTable + '
  26913. ADD '
  26914. SELECT @DSQL = @DSQL + QUOTENAME(ColumnName) + ' NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
  26915. '
  26916. FROM @OptionalColumns rq
  26917. LEFT OUTER JOIN #sysColumns cols
  26918. ON cols.name = rq.ColumnName
  26919. AND cols.Object_ID = object_id('tempdb..' + @TableName)
  26920. WHERE cols.name IS NULL
  26921. END
  26922.  
  26923. -- Remove last comma from @DSQL to correct syntax
  26924. SET @DSQL = LEFT(@DSQL, LEN(@DSQL) - 3)
  26925.  
  26926. -- Add optional columns to source table
  26927. EXEC(@DSQL)
  26928.  
  26929. -- Build statement to populate validation temp table
  26930. SELECT @DSQL = '
  26931. INSERT INTO #Import_Staging
  26932. (
  26933. [ExcelRowNumber],
  26934. [Agreement_Type],
  26935. [Agreement_Name],
  26936. [Company_Name],
  26937. [Site_Name],
  26938. [Contact_First_Name],
  26939. [Contact_Last_Name],
  26940. [Purchase_Order],
  26941. [Location],
  26942. [Group],
  26943. [Start_Date],
  26944. [End_Date],
  26945. [SLA],
  26946. [Internal_Notes],
  26947. [Application_Unit],
  26948. [Application_Limit],
  26949. [Available_Per],
  26950. [Agreement_Covers_Time],
  26951. [Agreement_Covers_Expenses],
  26952. [Agreement_Covers_Products],
  26953. [Agreement_Covers_Sales_Tax],
  26954. [Carryover_Days],
  26955. [Overruns_Percent],
  26956. [Charge_adjustments_to_the_firm],
  26957. [Billing_Cycle],
  26958. [Cycle_Based_On],
  26959. [Billing_Amount],
  26960. [Taxable],
  26961. [Prorate_first_bill],
  26962. [Billing_Start_date],
  26963. [Tax_Code],
  26964. [Restrict_downpayment],
  26965. [Terms],
  26966. [Override_Bill_To_Company_Name],
  26967. [Override_Billing_Site_Name],
  26968. [Invoice_Description],
  26969. [Default_Work_Role],
  26970. [Default_Work_Type],
  26971. [Project_Type],
  26972. [Invoice_Template],
  26973. [Bill_Time],
  26974. [Bill_Expenses],
  26975. [Bill_Products],
  26976. [Invoice_Time],
  26977. [Invoice_Expenses],
  26978. [Invoice_Products],
  26979. Company_Match_Val
  26980. )
  26981.  
  26982. SELECT
  26983. [Excel Row Number],
  26984. [Agreement Type],
  26985. [Agreement Name],
  26986. [Company Name],
  26987. [Site Name],
  26988. [Contact First Name],
  26989. [Contact Last Name],
  26990. [Purchase Order],
  26991. [Location],
  26992. [Group],
  26993. [Start Date],
  26994. [End Date],
  26995. [SLA],
  26996. [Internal Notes ],
  26997. [Application Unit],
  26998. [Application Limit],
  26999. [Available Per],
  27000. [Agreement Covers Time],
  27001. [Agreement Covers Expenses],
  27002. [Agreement Covers Products],
  27003. [Agreement Covers Sales Tax],
  27004. [Carryover Days],
  27005. [Overruns Percent],
  27006. [Charge adjustments to the firm],
  27007. [Billing Cycle],
  27008. [Cycle Based On],
  27009. [Billing Amount],
  27010. [Taxable],
  27011. [Prorate first bill],
  27012. [Billing Start date],
  27013. [Tax Code],
  27014. [Restrict downpayment],
  27015. [Billing Terms],
  27016. [Override Bill To Company Name],
  27017. [Override Billing Site Name],
  27018. [Invoice Description],
  27019. [Default Work Role],
  27020. [Default Work Type],
  27021. [Project Type],
  27022. [Invoice Template],
  27023. [Bill Time],
  27024. [Bill Expenses],
  27025. [Bill Products],
  27026. [Invoice Time],
  27027. [Invoice Expenses],
  27028. [Invoice Products],
  27029. SUBSTRING([Company Name], 1, 3)
  27030. FROM ' + @SourceTable
  27031.  
  27032. -- Pull data into validation temp table
  27033. EXEC(@DSQL)
  27034.  
  27035. -- Convert empty string and single space to null in temp table
  27036. -- So that nulls may be properly handled throughout procedure
  27037. UPDATE #Import_Staging
  27038. SET [Agreement_Type] = CASE WHEN [Agreement_Type] IN('', ' ') THEN NULL ELSE [Agreement_Type] END,
  27039. [Agreement_Name] = CASE WHEN [Agreement_Name] IN('', ' ') THEN NULL ELSE [Agreement_Name] END,
  27040. [Company_Name] = CASE WHEN [Company_Name] IN('', ' ') THEN NULL ELSE [Company_Name] END,
  27041. [Site_Name] = CASE WHEN [Site_Name] IN('', ' ') THEN NULL ELSE [Site_Name] END,
  27042. [Contact_First_Name] = CASE WHEN [Contact_First_Name] IN('', ' ') THEN NULL ELSE [Contact_First_Name] END,
  27043. [Contact_Last_Name] = CASE WHEN [Contact_Last_Name] IN('', ' ') THEN NULL ELSE [Contact_Last_Name] END,
  27044. [Purchase_Order] = CASE WHEN [Purchase_Order] IN('', ' ') THEN NULL ELSE [Purchase_Order] END,
  27045. [Location] = CASE WHEN [Location] IN('', ' ') THEN NULL ELSE [Location] END,
  27046. [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
  27047. [Start_Date] = CASE WHEN [Start_Date] IN('', ' ') THEN NULL ELSE [Start_Date] END,
  27048. [End_Date] = CASE WHEN [End_Date] IN('', ' ') THEN NULL ELSE [End_Date] END,
  27049. [No_Ending_Date] = CASE WHEN [No_Ending_Date] IN('', ' ') THEN NULL ELSE [No_Ending_Date] END,
  27050. [SLA] = CASE WHEN [SLA] IN('', ' ') THEN NULL ELSE [SLA] END,
  27051. [Internal_Notes] = CASE WHEN [Internal_Notes] IN('', ' ') THEN NULL ELSE [Internal_Notes] END,
  27052. [Application_Unit] = CASE WHEN [Application_Unit] IN('', ' ') THEN NULL ELSE [Application_Unit] END,
  27053. [Application_Limit] = CASE WHEN [Application_Limit] IN('', ' ') THEN NULL ELSE [Application_Limit] END,
  27054. [Unlimited] = CASE WHEN [Unlimited] IN('', ' ') THEN NULL ELSE [Unlimited] END,
  27055. [Available_Per] = CASE WHEN [Available_Per] IN('', ' ') THEN NULL ELSE [Available_Per] END,
  27056. [Agreement_Covers_Time] = CASE WHEN [Agreement_Covers_Time] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Time] END,
  27057. [Agreement_Covers_Expenses] = CASE WHEN [Agreement_Covers_Expenses] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Expenses] END,
  27058. [Agreement_Covers_Products] = CASE WHEN [Agreement_Covers_Products] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Products] END,
  27059. [Agreement_Covers_Sales_Tax] = CASE WHEN [Agreement_Covers_Sales_Tax] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Sales_Tax] END,
  27060. [Carryover_Days] = CASE WHEN [Carryover_Days] IN('', ' ') THEN NULL ELSE [Carryover_Days] END,
  27061. [Overruns_Percent] = CASE WHEN [Overruns_Percent] IN('', ' ') THEN NULL ELSE [Overruns_Percent] END,
  27062. [Charge_adjustments_to_the_firm] = CASE WHEN [Charge_adjustments_to_the_firm] IN('', ' ') THEN NULL ELSE [Charge_adjustments_to_the_firm] END,
  27063. [Billing_Cycle] = CASE WHEN [Billing_Cycle] IN('', ' ') THEN NULL ELSE [Billing_Cycle] END,
  27064. [Cycle_Based_On] = CASE WHEN [Cycle_Based_On] IN('', ' ') THEN NULL ELSE [Cycle_Based_On] END,
  27065. [Billing_Amount] = CASE WHEN [Billing_Amount] IN('', ' ') THEN NULL ELSE [Billing_Amount] END,
  27066. [Taxable] = CASE WHEN [Taxable] IN('', ' ') THEN NULL ELSE [Taxable] END,
  27067. [Prorate_first_bill] = CASE WHEN [Prorate_first_bill] IN('', ' ') THEN NULL ELSE [Prorate_first_bill] END,
  27068. [Billing_Start_date] = CASE WHEN [Billing_Start_date] IN('', ' ') THEN NULL ELSE [Billing_Start_date] END,
  27069. [Tax_Code] = CASE WHEN [Tax_Code] IN('', ' ') THEN NULL ELSE [Tax_Code] END,
  27070. [Restrict_downpayment] = CASE WHEN [Restrict_downpayment] IN('', ' ') THEN NULL ELSE [Restrict_downpayment] END,
  27071. [Terms] = CASE WHEN [Terms] IN('', ' ') THEN NULL ELSE [Terms] END,
  27072. [Override_Bill_To_Company_Name] = CASE WHEN [Override_Bill_To_Company_Name] IN('', ' ') THEN NULL ELSE [Override_Bill_To_Company_Name] END,
  27073. [Override_Billing_Site_Name] = CASE WHEN [Override_Billing_Site_Name] IN('', ' ') THEN NULL ELSE [Override_Billing_Site_Name] END,
  27074. [Invoice_Description] = CASE WHEN [Invoice_Description] IN('', ' ') THEN NULL ELSE [Invoice_Description] END,
  27075. [Default_Work_Role] = CASE WHEN [Default_Work_Role] IN('', ' ') THEN NULL ELSE [Default_Work_Role] END,
  27076. [Default_Work_Type] = CASE WHEN [Default_Work_Type] IN('', ' ') THEN NULL ELSE [Default_Work_Type] END,
  27077. [Project_Type] = CASE WHEN [Project_Type] IN('', ' ') THEN NULL ELSE [Project_Type] END,
  27078. [Invoice_Template] = CASE WHEN [Invoice_Template] IN('', ' ') THEN NULL ELSE [Invoice_Template] END,
  27079. [Bill_Time] = CASE WHEN [Bill_Time] IN('', ' ') THEN NULL ELSE [Bill_Time] END,
  27080. [Bill_Expenses] = CASE WHEN [Bill_Expenses] IN('', ' ') THEN NULL ELSE [Bill_Expenses] END,
  27081. [Bill_Products] = CASE WHEN [Bill_Products] IN('', ' ') THEN NULL ELSE [Bill_Products] END,
  27082. [Invoice_Time] = CASE WHEN [Invoice_Time] IN('', ' ') THEN NULL ELSE [Invoice_Time] END,
  27083. [Invoice_Expenses] = CASE WHEN [Invoice_Expenses] IN('', ' ') THEN NULL ELSE [Invoice_Expenses] END,
  27084. [Invoice_Products] = CASE WHEN [Invoice_Products] IN('', ' ') THEN NULL ELSE [Invoice_Products] END
  27085.  
  27086. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
  27087. BEGIN
  27088. SELECT @DSQL = '
  27089. UPDATE tmp
  27090. SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
  27091. FROM #Import_Staging tmp
  27092. INNER JOIN ' + @SourceTable + ' src
  27093. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  27094.  
  27095. EXEC(@DSQL)
  27096. END
  27097.  
  27098. IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
  27099. BEGIN
  27100. SELECT @DSQL = '
  27101. UPDATE tmp
  27102. SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
  27103. FROM #Import_Staging tmp
  27104. INNER JOIN ' + @SourceTable + ' src
  27105. ON src.[Excel Row Number] = tmp.ExcelRowNumber'
  27106.  
  27107. EXEC(@DSQL)
  27108. END
  27109.  
  27110. -- Condense contact first and last names to ContactName
  27111. UPDATE tmp
  27112. SET ContactName = LTRIM(ISNULL(tmp.Contact_First_Name + ' ', '') + ISNULL(tmp.Contact_Last_Name, ''))
  27113. FROM #Import_Staging tmp
  27114.  
  27115. -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
  27116. IF Object_ID('tempdb..#Company') IS NOT NULL
  27117. BEGIN
  27118. DROP TABLE #Company
  27119. END
  27120.  
  27121. SELECT
  27122. CONVERT(INT, comp.Company_RecID) AS Company_RecID,
  27123. comp.Company_ID,
  27124. comp.Company_Name,
  27125. Delete_Flag,
  27126. LEFT(comp.Company_Name, 3) AS Company_Match_Val,
  27127. CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
  27128. 0 AS Duplicate_Flag
  27129. INTO #Company
  27130. FROM dbo.Company comp
  27131. WHERE comp.Delete_Flag = 0
  27132.  
  27133.  
  27134. -- Table to hold contact information
  27135. IF Object_ID('tempdb..#Contact') IS NOT NULL
  27136. BEGIN
  27137. DROP TABLE #Contact
  27138. END
  27139.  
  27140. SELECT
  27141. CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
  27142. RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
  27143. First_Name,
  27144. Last_Name,
  27145. cont.Company_RecID,
  27146. Default_Flag
  27147. INTO #Contact
  27148. FROM dbo.Contact cont
  27149. INNER JOIN #Company comp
  27150. ON comp.Company_RecID = cont.Company_RecID
  27151.  
  27152. -- Match companies and contacts
  27153. EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
  27154.  
  27155. -- Table to hold duplicate sites
  27156. IF OBJECT_ID('tempdb..#Duplicate_Sites') IS NOT NULL
  27157. BEGIN
  27158. DROP TABLE #Duplicate_Sites
  27159. END
  27160.  
  27161. SELECT
  27162. cad.Company_RecID,
  27163. dbo.ufn_Import_Trim(comp.Company_Name) AS Company_Name,
  27164. dbo.ufn_Import_Trim(cad.[Description]) AS Site_Name
  27165. INTO #Duplicate_Sites
  27166. FROM #Company comp
  27167. INNER JOIN Company_Address cad
  27168. ON cad.Company_RecID = comp.Company_RecID
  27169. GROUP BY comp.Company_Name, cad.[Description], cad.Company_RecID
  27170. HAVING COUNT(*) > 1
  27171.  
  27172. -- Strip commas and dollar signs from dollar amounts to resolve common partner error
  27173. UPDATE #Import_Staging
  27174. SET Billing_Amount = REPLACE(Billing_Amount, '$', ''),
  27175. Prorate_first_bill = REPLACE(Prorate_first_bill, '$', '')
  27176.  
  27177. UPDATE #Import_Staging
  27178. SET Billing_Amount = REPLACE(Billing_Amount, ',', ''),
  27179. Prorate_first_bill = REPLACE(Prorate_first_bill, '$', '')
  27180.  
  27181. -- Pull valid numeric values into final fields
  27182. UPDATE stag
  27183. SET stag.PP_Amount = stag.Application_Limit
  27184. FROM #Import_Staging stag
  27185. WHERE ISNUMERIC(stag.Application_Limit + 'e0') = 1
  27186.  
  27187. UPDATE stag
  27188. SET stag.INT_Carryover_Days = stag.Carryover_Days
  27189. FROM #Import_Staging stag
  27190. WHERE ISNUMERIC(stag.Carryover_Days + '.e0') = 1
  27191.  
  27192. UPDATE stag
  27193. SET stag.INT_Overruns_Percent = stag.Overruns_Percent
  27194. FROM #Import_Staging stag
  27195. WHERE ISNUMERIC(stag.Overruns_Percent + '.e0') = 1
  27196.  
  27197. UPDATE stag
  27198. SET stag.AGR_Amount = stag.Billing_Amount
  27199. FROM #Import_Staging stag
  27200. WHERE ISNUMERIC(stag.Billing_Amount + 'e0') = 1
  27201.  
  27202. UPDATE stag
  27203. SET stag.AGR_ProRate = stag.Prorate_First_Bill
  27204. FROM #Import_Staging stag
  27205. WHERE ISNUMERIC(stag.Prorate_first_bill + 'e0') = 1
  27206.  
  27207. -- Gather reference recid's needed for agreement import
  27208. -- Get RecID's from reference tables
  27209. UPDATE stag
  27210. SET stag.AGR_Type_RecID = agrt.AGR_Type_RecID,
  27211. stag.Owner_Level_RecID = loc.Owner_Level_RecID,
  27212. stag.Billing_Unit_RecID = bu.Billing_Unit_RecID,
  27213. stag.SR_SLA_RecID = sla.SR_SLA_RecID,
  27214. stag.AGR_Billing_Cycle_RecID = bc.Bill_Cycle_RecID,
  27215. stag.Tax_Code_RecID = tc.Tax_Code_RecID,
  27216. stag.Billing_Terms_RecID = bterms.Billing_Terms_RecID,
  27217. stag.Billing_Company_RecID = billcomp.Company_RecID,
  27218. stag.Activity_Type_RecID = wt.Activity_Type_RecID, -- Work type/dbo.Activity_Type
  27219. stag.Activity_Class_RecID = wr.Activity_Class_RecID, -- Work role/dbo.Activity_Class
  27220. stag.PM_Type_RecID = pt.PM_Type_RecID,
  27221. --stag.bl_invTemplate_Setup_RecID = invt.bl_invTemplate_Setup_RecID,
  27222. CycleBasis_ID = CASE WHEN Cycle_Based_On = 'Contract Year' THEN 'C' WHEN Cycle_Based_On = 'Calendar Year' THEN 'Y' ELSE NULL END,
  27223. stag.[PP_Unlimited_Flag] = CASE WHEN stag.PP_Amount = 0 THEN 1 WHEN stag.PP_Amount > 0 THEN 0 ELSE NULL END,
  27224. stag.[PP_One_Time_Flag] = CASE WHEN [Available_Per] = 'Once' THEN 1 WHEN [Available_Per] IS NULL THEN NULL ELSE 0 END,
  27225. stag.[PP_Time_Flag] = CASE WHEN [Agreement_Covers_Time] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Agreement_Covers_Time] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27226. stag.[PP_Expenses_Flag] = CASE WHEN [Agreement_Covers_Expenses] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Agreement_Covers_Expenses] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27227. stag.[PP_Products_Flag] = CASE WHEN [Agreement_Covers_Products] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Agreement_Covers_Products] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27228. stag.[PP_Tax_Flag] = CASE WHEN [Agreement_Covers_Sales_Tax] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Agreement_Covers_Sales_Tax] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27229. stag.[PP_Carryover_Flag] = CASE WHEN INT_Carryover_Days > 0 THEN 1 WHEN INT_Carryover_Days = 0 THEN 0 ELSE NULL END,
  27230. stag.[Overrun_Flag] = CASE WHEN INT_Overruns_Percent >= 0 THEN 1 WHEN INT_Overruns_Percent = 0 THEN 0 ELSE NULL END,
  27231. stag.Charge_Firm_Flag = CASE WHEN [Charge_adjustments_to_the_firm] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Charge_adjustments_to_the_firm] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27232. stag.[AGR_OneTime_Flag] = CASE WHEN Billing_Cycle = 'Once' THEN 1 WHEN Billing_Cycle IS NULL THEN NULL ELSE 0 END,
  27233. stag.[Taxable_Flag] = CASE WHEN [Taxable] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Taxable] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27234. stag.[Restrict_DP_Flag] = CASE WHEN [Restrict_downpayment] IN ('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN [Restrict_downpayment] IN ('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27235. stag.AGR_Detail_Type_ID = adt.AGR_Detail_Type_ID,
  27236. stag.AGR_PONbr = CASE WHEN LEN([Purchase_Order]) < 30 THEN [Purchase_Order] ELSE NULL END,
  27237. stag.AGR_InvDesc = [Invoice_Description],
  27238. stag.AGR_Name = CASE WHEN LEN([Agreement_Name]) < 100 THEN [Agreement_Name] ELSE NULL END,
  27239. stag.AppCycle_ID = acy.AppCycle_ID,
  27240. stag.AGR_Notes = CASE WHEN LEN([Internal_Notes]) < 5000 THEN [Internal_Notes] ELSE NULL END,
  27241. stag.TE_Billable_Flag = CASE WHEN stag.Bill_Time IN('B', 'ND') THEN 1 WHEN stag.Bill_Time IN('NB', 'NC') THEN 0 ELSE NULL END,
  27242. stag.TE_Invoice_Flag = CASE WHEN stag.Bill_Time IN('B', 'NC') THEN 1 WHEN stag.Bill_Time IN('NB', 'ND') THEN 0 ELSE NULL END,
  27243. stag.EX_Billable_Flag = CASE WHEN stag.Bill_Expenses IN('B', 'ND') THEN 1 WHEN stag.Bill_Expenses IN('NB', 'NC') THEN 0 ELSE NULL END,
  27244. stag.EX_Invoice_Flag = CASE WHEN stag.Bill_Expenses IN('B', 'NC') THEN 1 WHEN stag.Bill_Expenses IN('NB', 'ND') THEN 0 ELSE NULL END,
  27245. stag.IV_Billable_Flag = CASE WHEN stag.Bill_Products IN('B', 'ND') THEN 1 WHEN stag.Bill_Products IN('NB', 'NC') THEN 0 ELSE NULL END,
  27246. stag.IV_Invoice_Flag = CASE WHEN stag.Bill_Products IN('B', 'NC') THEN 1 WHEN stag.Bill_Products IN('NB', 'ND') THEN 0 ELSE NULL END,
  27247. stag.TE_InvCust_Flag = CASE WHEN stag.Invoice_Time IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN stag.Invoice_Time IN('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27248. stag.EX_InvCust_Flag = CASE WHEN stag.Invoice_Expenses IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN stag.Invoice_Expenses IN('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27249. stag.IV_InvCust_Flag = CASE WHEN stag.Invoice_Products IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' WHEN stag.Invoice_Products IN('0', 'N', 'No', 'False', 'F') THEN '0' ELSE NULL END,
  27250. stag.AGR_NoEnd_Flag = CASE WHEN stag.End_Date IS NULL THEN 1 ELSE 0 END
  27251. FROM #Import_Staging stag
  27252. LEFT OUTER JOIN dbo.AGR_Type agrt
  27253. ON agrt.AGR_Type_Desc = stag.Agreement_Type
  27254. LEFT OUTER JOIN #Company comp
  27255. ON comp.Company_RecID = stag.Company_RecID
  27256. LEFT OUTER JOIN dbo.Owner_Level loc
  27257. ON loc.[Description] = stag.Location
  27258. AND loc.Location_Flag = 1
  27259. LEFT OUTER JOIN dbo.Billing_Unit bu
  27260. ON bu.[Description] = stag.[Group]
  27261. OR bu.Billing_Unit_ID = stag.[Group]
  27262. LEFT OUTER JOIN SR_SLA sla
  27263. ON sla.SLA_Name = stag.SLA
  27264. LEFT OUTER JOIN Billing_Cycle bc
  27265. ON bc.[Description] = stag.Billing_Cycle
  27266. LEFT OUTER JOIN Tax_Code tc
  27267. ON tc.Tax_Code_ID = stag.Tax_Code
  27268. OR tc.[Description] = stag.Tax_Code
  27269. LEFT OUTER JOIN Billing_Terms bterms
  27270. ON bterms.[Description] = stag.Terms
  27271. LEFT OUTER JOIN #Company billcomp
  27272. ON billcomp.Company_Name = stag.Override_Bill_To_Company_Name
  27273. LEFT OUTER JOIN Activity_Type wt
  27274. ON wt.[Description] = stag.Default_Work_Type
  27275. LEFT OUTER JOIN Activity_Class wr
  27276. ON wr.[Description] = stag.Default_Work_Role
  27277. LEFT OUTER JOIN PM_Type pt
  27278. ON stag.Project_Type = pt.[Description]
  27279. --LEFT OUTER JOIN bl_invTemplate invt
  27280. --ON invt.Template_Name = stag.Invoice_Template
  27281. LEFT OUTER JOIN AGR_Detail_Type adt
  27282. ON adt.AGR_Detail_Type_Desc = stag.[Application_Unit]
  27283. OR adt.AGR_Detail_Type_ID = stag.[Application_Limit]
  27284. LEFT OUTER JOIN AGR_AppCycle acy
  27285. ON acy.AppCycle_Name = stag.Available_Per
  27286. OR acy.AppCycle_ID = stag.Available_Per
  27287.  
  27288. -- Now that we have Company_RecID, get addresses & contact
  27289. UPDATE stag
  27290. SET stag.Company_Address_RecID = cad.Company_Address_RecID,
  27291. stag.Billing_Address_RecID = billcad.Company_Address_RecID
  27292. FROM #Import_Staging stag
  27293. LEFT OUTER JOIN Company_Address cad
  27294. ON cad.Company_RecID = stag.Company_RecID
  27295. AND cad.[Description] = stag.Site_Name
  27296. LEFT OUTER JOIN Company_Address billcad
  27297. ON billcad.Company_RecID = stag.Billing_Company_RecID
  27298. AND billcad.[Description] = stag.Override_Billing_Site_Name
  27299.  
  27300. -- Default site for override billing if not specified
  27301. UPDATE stag
  27302. SET stag.Billing_Address_RecID = cad.Company_Address_RecID
  27303. FROM #Import_Staging stag
  27304. INNER JOIN Company_Address cad
  27305. ON cad.Company_RecID = stag.Billing_Company_RecID
  27306. AND cad.Default_Flag = 1
  27307. WHERE stag.Override_Billing_Site_Name IS NULL
  27308. AND stag.Billing_Company_RecID IS NOT NULL
  27309.  
  27310. -- Use primary contact if not otherwise specified in spreadsheet
  27311. UPDATE stag
  27312. SET stag.Contact_RecID = cont.Contact_RecID
  27313. FROM #Import_Staging stag
  27314. INNER JOIN #Contact cont
  27315. ON cont.Company_RecID = stag.Company_RecID
  27316. AND cont.Default_Flag = 1
  27317. AND stag.Contact_RecID IS NULL
  27318. AND COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NULL
  27319.  
  27320. -- Get Currency_RecID
  27321. -- From Company
  27322. UPDATE stag
  27323. SET stag.Currency_RecID = comp.Currency_RecID
  27324. FROM #Import_Staging stag
  27325. CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Company comp WHERE comp.Company_RecID = stag.Company_RecID)comp
  27326.  
  27327. -- If still null, get from Company Country
  27328. UPDATE stag
  27329. SET stag.Currency_RecID = curr.Currency_RecID
  27330. FROM #Import_Staging stag
  27331. CROSS APPLY(SELECT TOP 1 Country_RecID FROM dbo.Company_Address cad WHERE cad.Company_RecID = stag.Company_RecID ORDER BY Default_Flag DESC)comp
  27332. CROSS APPLY(SELECT TOP 1 Currency_ID FROM dbo.Country cn WHERE cn.Country_RecID = comp.Country_RecID)cn
  27333. CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Currency curr WHERE curr.Currency_ID = cn.Currency_ID)curr
  27334. WHERE stag.Currency_RecID IS NULL
  27335.  
  27336. -- If still null, get default
  27337. UPDATE stag
  27338. SET stag.Currency_RecID = curr.Currency_RecID
  27339. FROM #Import_Staging stag
  27340. CROSS APPLY(SELECT TOP 1 Currency_ID FROM dbo.Country ORDER BY Default_Flag DESC)cn
  27341. CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Currency curr WHERE curr.Currency_ID = cn.Currency_ID)curr
  27342. WHERE stag.Currency_RecID IS NULL
  27343.  
  27344. -- Blank out application unit if 'None'
  27345. UPDATE stag
  27346. SET stag.AGR_Detail_Type_ID = ''
  27347. FROM #Import_Staging stag
  27348. WHERE stag.Application_Unit = 'None'
  27349.  
  27350. -- Format dates as mm/dd/yyyy and pull into datetime columns
  27351. UPDATE stag
  27352. SET stag.AGR_Date_Start = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[Start_Date]), 101)
  27353. FROM #Import_Staging stag
  27354. WHERE ISDATE([Start_Date]) = 1
  27355. AND ([Start_Date] LIKE('%/%/%') OR [Start_Date] LIKE('%-%-%'))
  27356.  
  27357. UPDATE stag
  27358. SET stag.AGR_Date_End = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[End_Date]), 101)
  27359. FROM #Import_Staging stag
  27360. WHERE ISDATE([End_Date]) = 1
  27361. AND ([End_Date] LIKE('%/%/%') OR [End_Date] LIKE('%-%-%'))
  27362.  
  27363. UPDATE stag
  27364. SET stag.Bill_Start_Date = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[Billing_Start_Date]), 101)
  27365. FROM #Import_Staging stag
  27366. WHERE ISDATE([Billing_Start_Date]) = 1
  27367. AND ([Billing_Start_Date] LIKE('%/%/%') OR [Billing_Start_Date] LIKE('%-%-%'))
  27368.  
  27369. -- AGR_Billing_Cycle_RecID should be 0 if billing cycle = 'Once' (mirror PSA logic)
  27370. UPDATE stag
  27371. SET stag.AGR_Billing_Cycle_RecID = 0
  27372. FROM #Import_Staging stag
  27373. WHERE Billing_Cycle = 'Once'
  27374.  
  27375. -- Validate that all required spreadsheet fields are entered
  27376. INSERT INTO #tblResults
  27377. (
  27378. RowNumber,
  27379. ValMsg
  27380. )
  27381.  
  27382. -- Agreement type
  27383. SELECT
  27384. ExcelRowNumber,
  27385. 'Agreement type cannot be blank'
  27386. FROM #Import_Staging
  27387. WHERE Agreement_Type IS NULL
  27388.  
  27389. UNION ALL
  27390.  
  27391. -- Agreement Name
  27392. SELECT
  27393. ExcelRowNumber,
  27394. 'Agreement Name cannot be blank'
  27395. FROM #Import_Staging
  27396. WHERE Agreement_Name IS NULL
  27397.  
  27398. UNION ALL
  27399.  
  27400. -- Agreement Name Duplicate
  27401. SELECT
  27402. ExcelRowNumber,
  27403. 'Cannot have multiple agreements with the same name for a single company'
  27404. FROM #Import_Staging stag
  27405. INNER JOIN dbo.AGR_Header ah
  27406. ON ah.AGR_Name = stag.AGR_Name
  27407. AND ah.Company_RecID = stag.Company_RecID
  27408.  
  27409. UNION ALL
  27410.  
  27411. -- Agreement Name Duplicate
  27412. SELECT
  27413. MIN(stag.ExcelRowNumber),
  27414. 'Cannot have multiple agreements with the same name for a single company'
  27415. FROM #Import_Staging stag
  27416. WHERE Company_RecID IS NOT NULL
  27417. GROUP BY Company_RecID, AGR_Name
  27418. HAVING COUNT(*) > 1
  27419.  
  27420. UNION ALL
  27421.  
  27422. -- Company Name
  27423. SELECT
  27424. ExcelRowNumber,
  27425. 'Company name cannot be blank'
  27426. FROM #Import_Staging
  27427. WHERE Company_Name IS NULL
  27428.  
  27429. UNION ALL
  27430.  
  27431. -- Start Date
  27432. SELECT
  27433. ExcelRowNumber,
  27434. 'Start Date cannot be blank'
  27435. FROM #Import_Staging
  27436. WHERE [Start_Date] IS NULL
  27437.  
  27438. UNION ALL
  27439.  
  27440. -- Validate that all spreadsheet cells that contain a value are valid
  27441. -- Single field validations
  27442.  
  27443. -- Agreement_Type
  27444. SELECT
  27445. stag.ExcelRowNumber,
  27446. 'Agreement_Type "' + stag.Agreement_Type + '" is invalid'
  27447. FROM #Import_Staging stag
  27448. WHERE stag.Agreement_Type IS NOT NULL
  27449. AND stag.AGR_Type_RecID IS NULL
  27450.  
  27451. UNION ALL
  27452.  
  27453. -- Agreement_Name
  27454. SELECT
  27455. stag.ExcelRowNumber,
  27456. 'Agreement_Name cannot exceed 100 characters'
  27457. FROM #Import_Staging stag
  27458. WHERE stag.Agreement_Name IS NOT NULL
  27459. AND LEN(stag.Agreement_Name) > 100
  27460.  
  27461. UNION ALL
  27462.  
  27463. -- Company_Name must be valid
  27464. SELECT
  27465. stag.ExcelRowNumber,
  27466. 'Company "' + stag.Company_Name + '" is invalid'
  27467. FROM #Import_Staging stag
  27468. WHERE stag.Company_Name IS NOT NULL
  27469. AND stag.Company_RecID IS NULL
  27470.  
  27471. UNION ALL
  27472.  
  27473. -- Company_Name cannot be duplicate
  27474. SELECT
  27475. stag.ExcelRowNumber,
  27476. 'There are more than one companies named "' + stag.Company_Name + '"'
  27477. FROM #Import_Staging stag
  27478. WHERE Company_Duplicate_Flag = 1
  27479.  
  27480. UNION ALL
  27481.  
  27482. -- Site_Name must be valid
  27483. SELECT
  27484. stag.ExcelRowNumber,
  27485. 'Site_Name "' + stag.Site_Name + '" is invalid for company: "' + stag.Company_Name + '"'
  27486. FROM #Import_Staging stag
  27487. WHERE stag.Site_Name IS NOT NULL
  27488. AND stag.Company_Address_RecID IS NULL
  27489. AND stag.Company_RecID IS NOT NULL
  27490.  
  27491. UNION ALL
  27492.  
  27493. -- Site_Name cannot be duplicate
  27494. SELECT
  27495. stag.ExcelRowNumber,
  27496. 'There are more than one sites named "' + stag.Site_Name +'" for Company: "' + stag.Company_Name
  27497. FROM #Import_Staging stag
  27498. INNER JOIN #Duplicate_Sites dups
  27499. ON dups.Company_RecID = stag.Company_RecID
  27500. AND dups.Site_Name = stag.Site_Name
  27501. WHERE stag.Company_Address_RecID IS NOT NULL
  27502.  
  27503. UNION ALL
  27504.  
  27505. -- Contact must be valid
  27506. SELECT
  27507. stag.ExcelRowNumber,
  27508. 'Invalid contact: "' + ISNULL(stag.Contact_First_Name + ' ', '') + ISNULL(stag.Contact_Last_Name, '') + '" for company "' + stag.Company_Name + '"'
  27509. FROM #Import_Staging stag
  27510. WHERE COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NOT NULL
  27511. AND Contact_RecID IS NULL
  27512. AND Company_RecID IS NOT NULL
  27513.  
  27514. UNION ALL
  27515.  
  27516. -- Contact cannot be null in spreadsheet unless a primary exists for company
  27517. SELECT
  27518. stag.ExcelRowNumber,
  27519. 'A contact name must be specified because no primary contact exists for company "' + stag.Company_Name + '"'
  27520. FROM #Import_Staging stag
  27521. WHERE COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NULL
  27522. AND stag.Company_RecID IS NOT NULL
  27523. AND stag.Contact_RecID IS NULL
  27524.  
  27525. UNION ALL
  27526.  
  27527. -- Contact cannot be duplicate
  27528. SELECT
  27529. stag.ExcelRowNumber,
  27530. 'There are more than one contacts named "' + ISNULL(stag.Contact_First_Name + ' ', '') + ISNULL(stag.Contact_Last_Name, '') +'" for Company: "' + stag.Company_Name
  27531. FROM #Import_Staging stag
  27532. WHERE stag.Contact_Duplicate_Flag = 1
  27533.  
  27534. UNION ALL
  27535.  
  27536. -- Purchase_Order
  27537. SELECT
  27538. stag.ExcelRowNumber,
  27539. 'Purchase Order cannot exceed 30 characters'
  27540. FROM #Import_Staging stag
  27541. WHERE stag.Purchase_Order IS NOT NULL
  27542. AND (LEN(stag.Purchase_Order) > 30 OR stag.AGR_PONbr IS NULL)
  27543.  
  27544. UNION ALL
  27545.  
  27546. -- Location
  27547. SELECT
  27548. stag.ExcelRowNumber,
  27549. 'Invalid location: "' + stag.Location + '"'
  27550. FROM #Import_Staging stag
  27551. WHERE stag.Location IS NOT NULL
  27552. AND stag.Owner_Level_RecID IS NULL
  27553.  
  27554. UNION ALL
  27555.  
  27556. -- Group
  27557. SELECT
  27558. stag.ExcelRowNumber,
  27559. 'Invalid Group: "' + stag.[Group]
  27560. FROM #Import_Staging stag
  27561. WHERE stag.[Group] IS NOT NULL
  27562. AND stag.Billing_Unit_RecID IS NULL
  27563.  
  27564. UNION ALL
  27565.  
  27566. -- [Start_Date]
  27567. SELECT
  27568. stag.ExcelRowNumber,
  27569. 'Start Date must be a valid date in MM/DD/YYYY format'
  27570. FROM #Import_Staging stag
  27571. WHERE stag.[Start_Date] IS NOT NULL
  27572. AND stag.AGR_Date_Start IS NULL
  27573.  
  27574. UNION ALL
  27575.  
  27576. -- End_Date
  27577. SELECT
  27578. stag.ExcelRowNumber,
  27579. 'End Date must be a valid date in MM/DD/YYYY format'
  27580. FROM #Import_Staging stag
  27581. WHERE stag.End_Date IS NOT NULL
  27582. AND stag.AGR_Date_End IS NULL
  27583.  
  27584. UNION ALL
  27585.  
  27586. -- SLA
  27587. SELECT
  27588. stag.ExcelRowNumber,
  27589. 'Invalid SLA: "' + stag.SLA + '"'
  27590. FROM #Import_Staging stag
  27591. WHERE stag.SLA IS NOT NULL
  27592. AND stag.SR_SLA_RecID IS NULL
  27593.  
  27594. UNION ALL
  27595.  
  27596. -- Internal_Notes
  27597. SELECT
  27598. stag.ExcelRowNumber,
  27599. 'Internal Notes cannot exceed 5000 characters'
  27600. FROM #Import_Staging stag
  27601. WHERE stag.Internal_Notes IS NOT NULL
  27602. AND (LEN(stag.Internal_Notes) > 5000 OR AGR_Notes IS NULL)
  27603.  
  27604.  
  27605. UNION ALL
  27606.  
  27607. -- Application_Unit
  27608. SELECT
  27609. stag.ExcelRowNumber,
  27610. 'Application Unit must be "Amount", "Hours", "Incidents" or "None"'
  27611. FROM #Import_Staging stag
  27612. WHERE stag.Application_Unit IS NOT NULL
  27613. AND stag.AGR_Detail_Type_ID IS NULL
  27614.  
  27615. UNION ALL
  27616.  
  27617. -- Application_Limit
  27618. SELECT
  27619. stag.ExcelRowNumber,
  27620. 'Invalid Application Limit - field must be numeric.'
  27621. FROM #Import_Staging stag
  27622. WHERE stag.Application_Limit IS NOT NULL
  27623. AND stag.PP_Amount IS NULL
  27624.  
  27625. UNION ALL
  27626.  
  27627. -- Available_Per
  27628. SELECT
  27629. stag.ExcelRowNumber,
  27630. 'Available per must be "Once", "Contract 2 weeks", "Contract 4 weeks", "Contract Year", "Calendar Month", "Calendar Quarter","Calendar Week", "Contract Quarter", or "Calendar Year"'
  27631. FROM #Import_Staging stag
  27632. WHERE stag.Available_Per IS NOT NULL
  27633. AND stag.AppCycle_ID IS NULL
  27634. AND stag.PP_One_Time_Flag <> 1
  27635.  
  27636. UNION ALL
  27637.  
  27638. -- Agreement_Covers_Time
  27639. SELECT
  27640. stag.ExcelRowNumber,
  27641. 'Agreement Covers Time must be Y or N'
  27642. FROM #Import_Staging stag
  27643. WHERE stag.Agreement_Covers_Time IS NOT NULL
  27644. AND stag.PP_Time_Flag IS NULL
  27645.  
  27646. UNION ALL
  27647.  
  27648. -- Agreement_Covers_Expenses
  27649. SELECT
  27650. stag.ExcelRowNumber,
  27651. 'Agreement Covers Expenses must be Y or N'
  27652. FROM #Import_Staging stag
  27653. WHERE stag.Agreement_Covers_Expenses IS NOT NULL
  27654. AND stag.PP_Expenses_Flag IS NULL
  27655.  
  27656. UNION ALL
  27657.  
  27658. -- Agreement_Covers_Products
  27659. SELECT
  27660. stag.ExcelRowNumber,
  27661. 'Agreement Covers Products must be Y or N'
  27662. FROM #Import_Staging stag
  27663. WHERE stag.Agreement_Covers_Products IS NOT NULL
  27664. AND stag.PP_Products_Flag IS NULL
  27665.  
  27666. UNION ALL
  27667.  
  27668. -- Agreement_Covers_Sales_Tax
  27669. SELECT
  27670. stag.ExcelRowNumber,
  27671. 'Agreement Covers Sales Tax must be Y or N'
  27672. FROM #Import_Staging stag
  27673. WHERE stag.Agreement_Covers_Sales_Tax IS NOT NULL
  27674. AND PP_Tax_Flag IS NULL
  27675.  
  27676. UNION ALL
  27677.  
  27678. -- Carryover_Days
  27679. SELECT
  27680. stag.ExcelRowNumber,
  27681. 'Carryover Days must be a whole number, and cannot be negative'
  27682. FROM #Import_Staging stag
  27683. WHERE stag.Carryover_Days IS NOT NULL
  27684. AND (stag.INT_Carryover_Days IS NULL OR stag.INT_Carryover_Days < 0)
  27685.  
  27686. UNION ALL
  27687.  
  27688. -- Carryover_Days
  27689. SELECT
  27690. stag.ExcelRowNumber,
  27691. 'Carryover Days cannot exceed 999999'
  27692. FROM #Import_Staging stag
  27693. WHERE stag.Carryover_Days IS NOT NULL
  27694. AND stag.INT_Carryover_Days > 999999
  27695.  
  27696. UNION ALL
  27697. -- Overruns_Percent
  27698. SELECT
  27699. stag.ExcelRowNumber,
  27700. 'Overruns_Percent must be a whole number between 0 and 999999'
  27701. FROM #Import_Staging stag
  27702. WHERE stag.Overruns_Percent IS NOT NULL
  27703. AND (INT_Overruns_Percent IS NULL OR INT_Overruns_Percent NOT BETWEEN 0 AND 999999)
  27704.  
  27705. UNION ALL
  27706.  
  27707. -- Charge_adjustments_to_the_firm
  27708. SELECT
  27709. stag.ExcelRowNumber,
  27710. 'Charge adjustments to the firm must be Y or N'
  27711. FROM #Import_Staging stag
  27712. WHERE stag.Charge_adjustments_to_the_firm IS NOT NULL
  27713. AND stag.Charge_Firm_Flag IS NULL
  27714.  
  27715. UNION ALL
  27716.  
  27717. -- Billing_Cycle
  27718. SELECT
  27719. stag.ExcelRowNumber,
  27720. 'Invalid Billing Cycle: "' + stag.Billing_Cycle + '"'
  27721. FROM #Import_Staging stag
  27722. WHERE stag.Billing_Cycle IS NOT NULL
  27723. AND stag.AGR_Billing_Cycle_RecID IS NULL
  27724.  
  27725. UNION ALL
  27726.  
  27727. -- Cycle_Based_On
  27728. SELECT
  27729. stag.ExcelRowNumber,
  27730. 'Cycle Based On must be "Calendar" or "Contract"'
  27731. FROM #Import_Staging stag
  27732. WHERE stag.Cycle_Based_On IS NOT NULL
  27733. AND CycleBasis_ID IS NULL
  27734.  
  27735. UNION ALL
  27736.  
  27737. -- Billing_Amount
  27738. SELECT
  27739. stag.ExcelRowNumber,
  27740. 'Billing_Amount must be numeric'
  27741. FROM #Import_Staging stag
  27742. WHERE stag.Billing_Amount IS NOT NULL
  27743. AND AGR_Amount IS NULL
  27744.  
  27745. UNION ALL
  27746.  
  27747. -- Taxable
  27748. SELECT
  27749. stag.ExcelRowNumber,
  27750. 'Taxable must be Y or N'
  27751. FROM #Import_Staging stag
  27752. WHERE stag.Taxable IS NOT NULL
  27753. AND Taxable_Flag IS NULL
  27754.  
  27755. UNION ALL
  27756.  
  27757. -- Prorate_first_bill
  27758. SELECT
  27759. stag.ExcelRowNumber,
  27760. 'Prorate first bill amount must be numeric'
  27761. FROM #Import_Staging stag
  27762. WHERE stag.Prorate_first_bill IS NOT NULL
  27763. AND AGR_ProRate IS NULL
  27764.  
  27765. UNION ALL
  27766.  
  27767. -- Billing_Start_date
  27768. SELECT
  27769. stag.ExcelRowNumber,
  27770. 'Billing Start Date must be a valid date - Please use MM/DD/YYYY format'
  27771. FROM #Import_Staging stag
  27772. WHERE stag.Bill_Start_Date IS NULL
  27773. AND stag.Billing_Start_Date IS NOT NULL
  27774.  
  27775. UNION ALL
  27776.  
  27777. -- Tax_Code
  27778. SELECT
  27779. stag.ExcelRowNumber,
  27780. 'Invalid Tax Code: "' + stag.Tax_Code + '"'
  27781. FROM #Import_Staging stag
  27782. WHERE stag.Tax_Code IS NOT NULL
  27783. AND stag.Tax_Code_RecID IS NULL
  27784.  
  27785. UNION ALL
  27786.  
  27787. -- Restrict_downpayment
  27788. SELECT
  27789. stag.ExcelRowNumber,
  27790. 'Restrict_downpayment must be Y or N'
  27791. FROM #Import_Staging stag
  27792. WHERE stag.Restrict_downpayment IS NOT NULL
  27793. AND stag.Restrict_DP_Flag IS NULL
  27794.  
  27795. UNION ALL
  27796.  
  27797. -- Terms
  27798. SELECT
  27799. stag.ExcelRowNumber,
  27800. 'Invalid billing terms: "' + stag.Terms + '"'
  27801. FROM #Import_Staging stag
  27802. WHERE stag.Terms IS NOT NULL
  27803. AND stag.Billing_Terms_RecID IS NULL
  27804.  
  27805. UNION ALL
  27806.  
  27807. -- Override_Bill_To must be valid
  27808. SELECT
  27809. stag.ExcelRowNumber,
  27810. 'Override Bill To company: "' + stag.Override_Bill_To_Company_Name + '" is invalid'
  27811. FROM #Import_Staging stag
  27812. WHERE stag.Override_Bill_To_Company_Name IS NOT NULL
  27813. AND stag.Billing_Company_RecID IS NULL
  27814.  
  27815.  
  27816. UNION ALL
  27817.  
  27818. -- Override_Billing_Site_Name must be valid
  27819. SELECT
  27820. stag.ExcelRowNumber,
  27821. 'Override_Billing_Site_Name: "' + stag.Override_Billing_Site_Name + '" is invalid'
  27822. FROM #Import_Staging stag
  27823. WHERE stag.Override_Billing_Site_Name IS NOT NULL
  27824. AND Billing_Address_RecID IS NULL
  27825.  
  27826. UNION ALL
  27827.  
  27828. -- Override_Billing_Site_Name cannot be duplicate
  27829. SELECT
  27830. stag.ExcelRowNumber,
  27831. 'There are more than one sites named "' + stag.Site_Name +'" for override billing company: "' + stag.Override_Bill_To_Company_Name
  27832. FROM #Import_Staging stag
  27833. INNER JOIN #Duplicate_Sites dups
  27834. ON dups.Company_RecID = stag.Billing_Company_RecID
  27835. AND dups.Site_Name = stag.Override_Billing_Site_Name
  27836. WHERE stag.Billing_Address_RecID IS NOT NULL
  27837.  
  27838. UNION ALL
  27839.  
  27840. -- Invoice_Description (check that it carried across if not null)
  27841. SELECT
  27842. stag.ExcelRowNumber,
  27843. 'Invoice description invalid'
  27844. FROM #Import_Staging stag
  27845. WHERE stag.Invoice_Description IS NOT NULL
  27846. AND AGR_InvDesc IS NULL
  27847.  
  27848. UNION ALL
  27849.  
  27850. -- Default_Work_Role
  27851. SELECT
  27852. stag.ExcelRowNumber,
  27853. 'Invalid Default_Work_Role: "' + Default_Work_Role + '"'
  27854. FROM #Import_Staging stag
  27855. WHERE stag.Default_Work_Role IS NOT NULL
  27856. AND stag.Activity_Class_RecID IS NULL
  27857.  
  27858. UNION ALL
  27859.  
  27860. -- Default_Work_Type
  27861. SELECT
  27862. stag.ExcelRowNumber,
  27863. 'Invalid Default_Work_Type: "' + Default_Work_Type + '"'
  27864. FROM #Import_Staging stag
  27865. WHERE stag.Default_Work_Type IS NOT NULL
  27866. AND stag.Activity_Type_RecID IS NULL
  27867.  
  27868. UNION ALL
  27869.  
  27870. -- Project_Type must be valid
  27871. SELECT
  27872. stag.ExcelRowNumber,
  27873. 'Invalid Project_Type: "' + stag.Project_Type + '"'
  27874. FROM #Import_Staging stag
  27875. WHERE stag.Project_Type IS NOT NULL
  27876. AND stag.PM_Type_RecID IS NULL
  27877.  
  27878. --UNION ALL
  27879.  
  27880. ---- Invoice_Template must be valid
  27881. --SELECT
  27882. -- stag.ExcelRowNumber,
  27883. -- 'Invalid Invoice_Template: "' + stag.Invoice_Template + '"'
  27884. --FROM #Import_Staging stag
  27885. --WHERE stag.Invoice_Template IS NOT NULL
  27886. -- AND stag.bl_invTemplate_RecID IS NULL
  27887.  
  27888. UNION ALL
  27889.  
  27890. -- Bill_Time must be B, NB, NC
  27891. SELECT
  27892. stag.ExcelRowNumber,
  27893. 'Bill_Time must be "B", "NB" or "NC"'
  27894. FROM #Import_Staging stag
  27895. WHERE stag.Bill_Time IS NOT NULL
  27896. AND (TE_Billable_Flag IS NULL OR TE_Invoice_Flag IS NULL)
  27897.  
  27898. UNION ALL
  27899.  
  27900. -- Bill_Expenses
  27901. SELECT
  27902. stag.ExcelRowNumber,
  27903. 'Bill_Expenses must be "B", "NB" or "NC"'
  27904. FROM #Import_Staging stag
  27905. WHERE stag.Bill_Expenses IS NOT NULL
  27906. AND (EX_Billable_Flag IS NULL OR EX_Invoice_Flag IS NULL)
  27907.  
  27908. UNION ALL
  27909.  
  27910. -- Bill_Products
  27911. SELECT
  27912. stag.ExcelRowNumber,
  27913. 'Bill_Products must be "B", "NB" or "NC"'
  27914. FROM #Import_Staging stag
  27915. WHERE stag.Bill_Products IS NOT NULL
  27916. AND (IV_Billable_Flag IS NULL OR IV_Invoice_Flag IS NULL)
  27917.  
  27918. UNION ALL
  27919.  
  27920. -- Invoice_Time must evaluate to Y/N
  27921. SELECT
  27922. stag.ExcelRowNumber,
  27923. 'Invoice_Time must be Y or N'
  27924. FROM #Import_Staging stag
  27925. WHERE stag.Invoice_Time IS NOT NULL
  27926. AND TE_InvCust_Flag IS NULL
  27927.  
  27928. UNION ALL
  27929.  
  27930. -- Invoice_Expenses must evaluate to Y/N
  27931. SELECT
  27932. stag.ExcelRowNumber,
  27933. 'Invoice Customer Expenses must be Y or N '
  27934. FROM #Import_Staging stag
  27935. WHERE stag.Invoice_Expenses IS NOT NULL
  27936. AND EX_InvCust_Flag IS NULL
  27937.  
  27938. UNION ALL
  27939.  
  27940. -- Invoice_Products must evaluate to Y/N
  27941. SELECT
  27942. stag.ExcelRowNumber,
  27943. 'Invoice Customer Products must be Y or N'
  27944. FROM #Import_Staging stag
  27945. WHERE stag.Invoice_Products IS NOT NULL
  27946. AND IV_InvCust_Flag IS NULL
  27947.  
  27948. UNION ALL
  27949.  
  27950. -- Cross-field validations
  27951. -- End date cannot be before start date
  27952. SELECT
  27953. stag.ExcelRowNumber,
  27954. 'End date cannot be prior to start date'
  27955. FROM #Import_Staging stag
  27956. WHERE AGR_Date_End IS NOT NULL
  27957. AND AGR_Date_Start IS NOT NULL
  27958. AND AGR_Date_End < AGR_Date_Start
  27959.  
  27960. UNION ALL
  27961.  
  27962. -- Group & Location must be associated
  27963. SELECT
  27964. stag.ExcelRowNumber,
  27965. 'Group: "' + stag.[Group] + '" does not belong to location: "' + stag.Location + '"'
  27966. FROM #Import_Staging stag
  27967. LEFT OUTER JOIN dbo.Billing_Unit_Loc bul
  27968. ON bul.Owner_Level_RecID = stag.Owner_Level_RecID
  27969. AND bul.Billing_Unit_RecID = stag.Billing_Unit_RecID
  27970. WHERE stag.Billing_Unit_RecID IS NOT NULL
  27971. AND stag.Owner_Level_RecID IS NOT NULL
  27972. AND bul.Billing_Unit_Loc_RecID IS NULL
  27973.  
  27974.  
  27975. -- UNION ALL
  27976.  
  27977. ---- Application limit required if application unit specified -- Default limit from AGR_Type???
  27978. --SELECT
  27979. -- stag.ExcelRowNumber,
  27980. -- 'Application limit is required if application unit is specified - enter "0" for unlimited"'
  27981. --FROM #Import_Staging stag
  27982. --WHERE Application_Unit IS NOT NULL
  27983. -- AND Application_Limit IS NULL
  27984.  
  27985. -- Set up row count table to summarize results
  27986. SELECT @start = 1
  27987. SELECT @end = MAX(ExcelRowNumber)+1 FROM #Import_Staging
  27988.  
  27989. -- If there are errors in spreadsheet, stop processing now and return results
  27990. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  27991. BEGIN
  27992.  
  27993.  
  27994. exec dbo.usp_Condense_Validation_Results
  27995.  
  27996. IF @ProcName = 'usp_AGR_ImportValidate'
  27997. BEGIN
  27998.  
  27999. SELECT
  28000. 0 AS ValPassed,
  28001. 0 AS RowNumber,
  28002. t.ValMsg
  28003. FROM #ResultsCondensed t
  28004.  
  28005. END
  28006.  
  28007. IF @ProcName = 'usp_AGR_ImportPush'
  28008. BEGIN
  28009.  
  28010. SELECT
  28011. 0 AS Success,
  28012. 0 AS RowNumber,
  28013. t.ValMsg
  28014. FROM #ResultsCondensed t
  28015. END
  28016.  
  28017. ROLLBACK TRANSACTION AGR_Import
  28018.  
  28019. RETURN
  28020. END
  28021.  
  28022. -- Set default values for fields that are only available in spreadsheet, but were not specified
  28023. -- Prorate first bill defaults to 0 if null
  28024. UPDATE stag
  28025. SET stag.AGR_Prorate = 0
  28026. FROM #Import_Staging stag
  28027. WHERE Prorate_first_bill IS NULL
  28028.  
  28029. -- Tax code defaults to company default if not specified in spreadsheet
  28030. UPDATE stag
  28031. SET stag.Tax_Code_RecID = comp.Tax_Code_RecID
  28032. FROM #Import_Staging stag
  28033. INNER JOIN dbo.Company comp
  28034. ON stag.Company_RecID = comp.Company_RecID
  28035. WHERE stag.Tax_Code_RecID IS NULL
  28036.  
  28037. -- Any tax codes that are still null should use overall default from dbo.Tax_Code
  28038. UPDATE stag
  28039. SET stag.Tax_Code_RecID = tc.Tax_Code_RecID
  28040. FROM #Import_Staging stag
  28041. INNER JOIN dbo.Tax_Code tc
  28042. ON tc.Default_Flag = 1
  28043. WHERE stag.Tax_Code_RecID IS NULL
  28044.  
  28045.  
  28046. -- Fold in fields from Agreement Type that are not *-available-* in spreadsheet (pre-pay, employee compensation, invoice comment preferences etc.)
  28047. UPDATE stag
  28048. SET stag.Prepay_Flag = atype.Prepay_Flag,
  28049. stag.Comp_Rate_Option = atype.Comp_Rate_Option,
  28050. stag.Comp_Limit_Option = atype.Comp_Limit_Option,
  28051. stag.Comp_Rate_Amount = atype.Comp_Rate_Amount,
  28052. stag.Comp_Limit_Amount = atype.Comp_Limit_Amount,
  28053. stag.TopComment_Flag = atype.TopComment_Flag,
  28054. stag.BottomComment_Flag = atype.BottomComment_Flag,
  28055. stag.BU_Restrict_Flag = atype.BU_Restrict_Flag,
  28056. stag.OL_Restrict_Flag = atype.OL_Restrict_Flag
  28057. FROM #Import_Staging stag
  28058. INNER JOIN AGR_Type atype
  28059. ON stag.AGR_Type_RecID = atype.AGR_Type_RecID
  28060.  
  28061. -- Pull in fields from Agreement Type that are not *-specified-* in spreadsheet
  28062. UPDATE stag
  28063. SET stag.Owner_Level_RecID = CASE WHEN stag.Location IS NULL THEN atype.Owner_Level_RecID ELSE stag.Owner_Level_RecID END,
  28064. stag.Billing_Unit_RecID = CASE WHEN stag.[Group] IS NULL THEN atype.Billing_Unit_RecID ELSE stag.Billing_Unit_RecID END,
  28065. stag.SR_SLA_RecID = CASE WHEN stag.SLA IS NULL THEN atype.SR_SLA_RecID ELSE stag.SR_SLA_RecID END,
  28066. stag.AGR_Detail_Type_ID = CASE WHEN stag.AGR_Detail_Type_ID IS NULL THEN adtype.AGR_Detail_Type_ID ELSE stag.AGR_Detail_Type_ID END,
  28067. stag.PP_Amount = CASE WHEN stag.Application_Limit IS NULL THEN atype.PP_Amount ELSE stag.PP_Amount END,
  28068. stag.PP_Unlimited_Flag = CASE WHEN stag.Application_Limit IS NULL THEN atype.PP_Unlimited_Flag ELSE stag.PP_Unlimited_Flag END,
  28069. stag.AppCycle_ID = CASE WHEN stag.Available_Per IS NULL THEN atype.AppCycle_ID ELSE stag.AppCycle_ID END,
  28070. stag.AGR_Billing_Cycle_RecID = CASE WHEN stag.Billing_Cycle IS NULL THEN atype.Bill_Cycle_RecID ELSE stag.AGR_Billing_Cycle_RecID END,
  28071. stag.AGR_OneTime_Flag = CASE WHEN stag.AGR_OneTime_Flag IS NULL THEN atype.OneTime_Flag ELSE stag.AGR_OneTime_Flag END,
  28072. stag.PP_Time_Flag = CASE WHEN stag.Agreement_Covers_Time IS NULL THEN atype.PP_Time_Flag ELSE stag.PP_Time_Flag END,
  28073. stag.PP_Products_Flag = CASE WHEN stag.Agreement_Covers_Products IS NULL THEN atype.PP_Products_Flag ELSE stag.PP_Products_Flag END,
  28074. stag.PP_Expenses_Flag = CASE WHEN stag.Agreement_Covers_Expenses IS NULL THEN atype.PP_Expenses_Flag ELSE stag.PP_Expenses_Flag END,
  28075. stag.PP_Tax_Flag = CASE WHEN stag.Agreement_Covers_Sales_Tax IS NULL THEN atype.PP_Tax_Flag ELSE stag.PP_Tax_Flag END,
  28076. stag.PP_Carryover_Flag = CASE WHEN stag.PP_Carryover_Flag IS NULL THEN atype.PP_Carryover_Flag ELSE stag.PP_Carryover_Flag END,
  28077. stag.INT_Carryover_Days = CASE WHEN stag.Carryover_Days IS NULL THEN atype.Carryover_Days ELSE stag.Carryover_Days END,
  28078. stag.Overrun_Flag = CASE WHEN stag.Overruns_Percent IS NULL THEN atype.Overrun_Flag ELSE stag.Overrun_Flag END,
  28079. stag.INT_Overruns_Percent = CASE WHEN stag.Overruns_Percent IS NULL THEN atype.Overrun_Limit ELSE stag.INT_Overruns_Percent END, ------- verify
  28080. stag.Charge_Firm_Flag = CASE WHEN stag.Charge_adjustments_to_the_firm IS NULL THEN atype.Charge_Firm_Flag ELSE stag.Charge_Firm_Flag END,
  28081. stag.PP_One_Time_Flag = CASE WHEN stag.PP_One_Time_Flag IS NULL THEN atype.PP_One_Time_Flag ELSE stag.PP_One_Time_Flag END,
  28082. stag.CycleBasis_ID = CASE WHEN stag.Cycle_Based_On IS NULL THEN atype.CycleBasis_ID ELSE stag.CycleBasis_ID END,
  28083. stag.AGR_Amount = CASE WHEN stag.AGR_Amount IS NULL THEN atype.Bill_Amount ELSE stag.AGR_Amount END,
  28084. stag.Taxable_Flag = CASE WHEN stag.Taxable_Flag IS NULL THEN atype.Taxable_Flag ELSE stag.Taxable_Flag END,
  28085. stag.Restrict_DP_Flag = CASE WHEN stag.Restrict_downpayment IS NULL THEN atype.Restrict_DP_Flag ELSE stag.Restrict_DP_Flag END,
  28086. stag.Billing_Terms_RecID = CASE WHEN stag.Billing_Terms_RecID IS NULL THEN atype.Billing_Terms_RecID ELSE stag.Billing_Terms_RecID END,
  28087. stag.AGR_InvDesc = CASE WHEN stag.AGR_InvDesc IS NULL THEN atype.Invoice_Desc ELSE stag.AGR_InvDesc END,
  28088. stag.Activity_Class_RecID = CASE WHEN stag.Activity_Class_RecID IS NULL THEN atype.Activity_Class_RecID ELSE stag.Activity_Class_RecID END,
  28089. stag.Activity_Type_RecID = CASE WHEN stag.Activity_Type_RecID IS NULL THEN atype.Activity_Type_RecID ELSE stag.Activity_Type_RecID END,
  28090. stag.PM_Type_RecID = CASE WHEN stag.PM_Type_RecID IS NULL THEN atype.PM_Type_RecID ELSE stag.PM_Type_RecID END,
  28091. stag.bl_invTemplate_Setup_RecID = CASE WHEN stag.bl_invTemplate_Setup_RecID IS NULL THEN atype.bl_invTemplate_Setup_RecID ELSE stag.bl_invTemplate_Setup_RecID END,
  28092. stag.TE_Billable_Flag = CASE WHEN stag.TE_Billable_Flag IS NULL THEN atype.TE_Billable_Flag ELSE stag.TE_Billable_Flag END,
  28093. stag.EX_Billable_Flag = CASE WHEN stag.EX_Billable_Flag IS NULL THEN atype.EX_Billable_Flag ELSE stag.EX_Billable_Flag END,
  28094. stag.IV_Billable_Flag = CASE WHEN stag.IV_Billable_Flag IS NULL THEN atype.IV_Billable_Flag ELSE stag.IV_Billable_Flag END,
  28095. stag.TE_Invoice_Flag = CASE WHEN stag.TE_Invoice_Flag IS NULL THEN atype.TE_Invoice_Flag ELSE stag.TE_Invoice_Flag END,
  28096. stag.EX_Invoice_Flag = CASE WHEN stag.EX_Invoice_Flag IS NULL THEN atype.EX_Invoice_Flag ELSE stag.EX_Invoice_Flag END,
  28097. stag.IV_Invoice_Flag = CASE WHEN stag.IV_Invoice_Flag IS NULL THEN atype.IV_Invoice_Flag ELSE stag.IV_Invoice_Flag END,
  28098. stag.TE_InvCust_Flag = CASE WHEN stag.TE_InvCust_Flag IS NULL THEN atype.TE_InvCust_Flag ELSE stag.TE_InvCust_Flag END,
  28099. stag.EX_InvCust_Flag = CASE WHEN stag.EX_InvCust_Flag IS NULL THEN atype.EX_InvCust_Flag ELSE stag.EX_InvCust_Flag END,
  28100. stag.IV_InvCust_Flag = CASE WHEN stag.IV_InvCust_Flag IS NULL THEN atype.IV_InvCust_Flag ELSE stag.IV_InvCust_Flag END
  28101. FROM #Import_Staging stag
  28102. INNER JOIN AGR_Type atype
  28103. ON stag.AGR_Type_RecID = atype.AGR_Type_RecID
  28104. LEFT OUTER JOIN AGR_Detail_Type adtype
  28105. ON adtype.AGR_Detail_Type_RecID = atype.AGR_Detail_Type_RecID
  28106.  
  28107. -- Set defaults as-necessary
  28108. UPDATE stag
  28109. SET stag.PM_Type_RecID = pmt.PM_Type_RecID
  28110. FROM #Import_Staging stag
  28111. CROSS APPLY(SELECT TOP 1 PM_Type_RecID FROM PM_Type pmt WHERE pmt.Default_Flag = 1)pmt
  28112. WHERE NOT EXISTS(SELECT 1 FROM PM_Type pmt2 WHERE pmt2.PM_Type_RecID = stag.PM_Type_RecID)
  28113.  
  28114. UPDATE stag
  28115. SET stag.Activity_Class_RecID = NULL
  28116. FROM #Import_Staging stag
  28117. WHERE NOT EXISTS(SELECT 1 FROM Activity_Class ac WHERE ac.Activity_Class_RecID = stag.Activity_Class_RecID)
  28118.  
  28119. UPDATE stag
  28120. SET stag.Activity_Type_RecID = def.Activity_Type_RecID
  28121. FROM #Import_Staging stag
  28122. OUTER APPLY(SELECT TOP 1 * FROM Activity_Type at WHERE at.Default_Flag = 1)def
  28123. WHERE NOT EXISTS(SELECT 1 FROM Activity_Type at WHERE at.Activity_Type_RecID = stag.Activity_Type_RecID)
  28124.  
  28125. UPDATE stag
  28126. SET stag.Billing_Terms_RecID = def.Billing_Terms_RecID
  28127. FROM #Import_Staging stag
  28128. OUTER APPLY(SELECT TOP 1 * FROM Billing_Terms def WHERE def.Default_Flag = 1)def
  28129. WHERE NOT EXISTS(SELECT 1 FROM Billing_Terms bt WHERE bt.Billing_Terms_RecID = stag.Billing_Terms_RecID)
  28130.  
  28131.  
  28132. -- Handle instance where PP_Unlimited_Flag is never set (i.e. no application unit)
  28133. UPDATE #Import_Staging
  28134. SET PP_Unlimited_Flag = 0
  28135. WHERE PP_Unlimited_Flag IS NULL
  28136.  
  28137. -- If application unit is hours, agreement should cover time
  28138. UPDATE #Import_Staging
  28139. SET PP_Time_Flag = 1
  28140. WHERE AGR_Detail_Type_ID = 'H'
  28141.  
  28142. -- Final validations to make sure that combined values from spreadsheet and agreement type create a valid agreement
  28143. INSERT INTO #tblResults
  28144. (
  28145. RowNumber,
  28146. ValMsg
  28147. )
  28148.  
  28149. -- Agreement must have a valid location
  28150. SELECT
  28151. stag.ExcelRowNumber,
  28152. 'A location must be specified in either the spreadsheet or the agreement type'
  28153. FROM #Import_Staging stag
  28154. WHERE stag.Owner_Level_RecID IS NULL
  28155. OR stag.Owner_Level_RecID = 0
  28156.  
  28157. UNION ALL
  28158.  
  28159. -- Agreement must have a valid group/billing unit
  28160. SELECT
  28161. stag.ExcelRowNumber,
  28162. 'A group must be specified in either the spreadsheet or the agreement type'
  28163. FROM #Import_Staging stag
  28164. WHERE stag.Billing_Unit_RecID IS NULL
  28165. OR stag.Billing_Unit_RecID = 0
  28166.  
  28167. UNION ALL
  28168.  
  28169. -- If agreement has an application unit (Amount, Hours, Incidents) - it must have an application limit
  28170. SELECT
  28171. stag.ExcelRowNumber,
  28172. 'Application limit must be specified unless application unit is "None"'
  28173. FROM #Import_Staging stag
  28174. WHERE stag.PP_Amount IS NULL
  28175. AND stag.AGR_Detail_Type_ID <> ''
  28176.  
  28177. UNION ALL
  28178.  
  28179. -- If agreement has an application unit (Amount, Hours, Incidents) - it must have an application cycle
  28180. SELECT
  28181. stag.ExcelRowNumber,
  28182. 'If the agreement has an application unit, "Available Per" must be specified in either the Agreement Type or Spreadsheet'
  28183. FROM #Import_Staging stag
  28184. WHERE (stag.AppCycle_ID IS NULL OR stag.AppCycle_ID = '')
  28185. AND stag.AGR_Detail_Type_ID <> ''
  28186. AND stag.PP_One_Time_Flag <> '1'
  28187.  
  28188. UNION ALL
  28189.  
  28190. SELECT
  28191. stag.ExcelRowNumber,
  28192. 'If agreement covers sales tax, application units must be set to "Amount"'
  28193. FROM #Import_Staging stag
  28194. WHERE PP_Tax_Flag = 1
  28195. AND AGR_Detail_Type_ID <> 'A'
  28196.  
  28197. --UNION ALL
  28198.  
  28199. ---- Default Work role must belong to location
  28200. --SELECT
  28201. -- stag.ExcelRowNumber,
  28202. -- 'Default work role "' + ac.[Description] + '" does not belong to location: "' + loc.[Description] + '"'
  28203. --FROM #Import_Staging stag
  28204. -- INNER JOIN dbo.Activity_Class ac
  28205. -- ON ac.Activity_Class_RecID = stag.Activity_Class_RecID
  28206. -- INNER JOIN dbo.Owner_Level loc
  28207. -- ON loc.Owner_Level_RecID = stag.Owner_Level_RecID
  28208. -- LEFT OUTER JOIN dbo.Activity_Class_Loc acl
  28209. -- ON acl.Activity_Class_RecID = ac.Activity_Class_RecID
  28210. -- AND acl.Owner_Level_RecID = stag.Owner_Level_RecID
  28211. --WHERE acl.Activity_Class_Loc_RecID IS NULL
  28212.  
  28213. --UNION ALL
  28214.  
  28215. ---- Copied work roles must belong to location
  28216. --SELECT
  28217. -- stag.ExcelRowNumber,
  28218. -- 'Unable to copy work role "' + ac.[Description] + '" from agreement type "' + stag.Agreement_Type + '" because the work role is not assigned to location: "' + loc.[Description] + '"'
  28219. --FROM #Import_Staging stag
  28220. -- INNER JOIN AGR_Type aty
  28221. -- ON aty.AGR_Type_RecID = stag.AGR_Type_RecID
  28222. -- INNER JOIN AGR_Type_WRole atw
  28223. -- ON atw.AGR_Type_RecID = aty.AGR_Type_RecID
  28224. -- INNER JOIN dbo.Activity_Class ac
  28225. -- ON ac.Activity_Class_RecID = atw.Activity_Class_RecID
  28226. -- INNER JOIN dbo.Owner_Level loc
  28227. -- ON loc.Owner_Level_RecID = stag.Owner_Level_RecID
  28228. -- LEFT OUTER JOIN dbo.Activity_Class_Loc acl
  28229. -- ON acl.Activity_Class_RecID = ac.Activity_Class_RecID
  28230. -- AND acl.Owner_Level_RecID = stag.Owner_Level_RecID
  28231. --WHERE acl.Activity_Class_Loc_RecID IS NULL
  28232.  
  28233.  
  28234. -- Handle issue where PM_Type_RecID may be 0 in AGR_Type and cause error on FK during insert
  28235. UPDATE stag
  28236. SET stag.PM_Type_RecID = NULL
  28237. FROM #Import_Staging stag
  28238. WHERE stag.PM_Type_RecID = 0
  28239.  
  28240. -- table to Force compilation regardless of structure
  28241. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  28242. DROP TABLE #Force_Compile
  28243.  
  28244. CREATE TABLE #Force_Compile
  28245. (
  28246. Column_Name VARCHAR(20)
  28247. )
  28248.  
  28249. -- If running push procedure, perform final inserts
  28250. -- Pre-2017.6 (No Currency_RecID column)
  28251. IF @ProcName = 'usp_AGR_ImportPUsh' AND NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  28252. BEGIN
  28253.  
  28254. -- AGR_Header insert
  28255. -- Pre-2017.6 (No Currency_RecID column)
  28256. IF NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'AGR_Header')
  28257. BEGIN
  28258.  
  28259. -- Temporarily repurpose PP_Billing_Cycle_RecID to store excel row number
  28260. INSERT INTO dbo.AGR_Header
  28261. (
  28262. AGR_Type_RecID,
  28263. AGR_Name,
  28264. AGR_Date_Start,
  28265. AGR_Date_End,
  28266. AGR_NoEnd_Flag,
  28267. AGR_Billing_Cycle_RecID,
  28268. AGR_OneTime_Flag,
  28269. AGR_Amount,
  28270. AGR_Calc_Flag,
  28271. AGR_Prorate,
  28272. AGR_InvDesc,
  28273. Company_RecID,
  28274. Contact_RecID,
  28275. AGR_PONbr,
  28276. Owner_Level_RecID,
  28277. Billing_Unit_RecID,
  28278. OL_Restrict_Flag,
  28279. BU_Restrict_Flag,
  28280. SubCompany_RecID,
  28281. SubContact_RecID,
  28282. Sub_WONbr,
  28283. AGR_Cancel_Flag,
  28284. AGR_Date_Cancel,
  28285. AGR_Reason_Cancel,
  28286. AGR_Cancel_By,
  28287. PP_Billing_Cycle_RecID,
  28288. PP_One_Time_Flag,
  28289. AGR_Detail_Type_ID,
  28290. PP_Amount,
  28291. PP_Carryover_Flag,
  28292. PP_Time_Flag,
  28293. PP_Expenses_Flag,
  28294. PP_Products_Flag,
  28295. AGR_Notes,
  28296. AGR_Default_Flag,
  28297. Activity_Class_RecID,
  28298. Activity_Type_RecID,
  28299. SR_Urgency_RecID,
  28300. PM_Type_RecID,
  28301. TE_Billable_Flag,
  28302. TE_Invoice_Flag,
  28303. EX_Billable_Flag,
  28304. EX_Invoice_Flag,
  28305. IV_Billable_Flag,
  28306. IV_Invoice_Flag,
  28307. PP_Adjustment,
  28308. Last_Update,
  28309. Updated_By,
  28310. SR_Type_RecID,
  28311. TopComment_Flag,
  28312. BottomComment_Flag,
  28313. Carryover_ID,
  28314. AppCycle_ID,
  28315. Overrun_Flag,
  28316. BillPeriod_ID,
  28317. CycleBasis_ID,
  28318. Taxable_Flag,
  28319. Tax_Code_RecID,
  28320. TE_Amount,
  28321. TE_UseBill_Flag,
  28322. TE_InvCust_Flag,
  28323. EX_InvCust_Flag,
  28324. IV_InvCust_Flag,
  28325. PP_Unlimited_Flag,
  28326. BR_Option,
  28327. Bill_Start_Date,
  28328. CarryOver_Days,
  28329. Overrun_Limit,
  28330. PP_Expire_Flag,
  28331. Notification_History,
  28332. Charge_Firm_Flag,
  28333. SR_SLA_RecID,
  28334. PP_Tax_Flag,
  28335. NetBalance,
  28336. Overrun,
  28337. Billing_Company_RecID,
  28338. Billing_Address_RecID,
  28339. Restrict_DP_Flag,
  28340. Billing_Terms_RecID,
  28341. TE_AmtOption,
  28342. TE_UseRate_Flag,
  28343. TE_UseAmt_Flag,
  28344. bl_invTemplate_Setup_RecID,
  28345. Avail_Balance,
  28346. parent_recid,
  28347. Comp_Rate_Option,
  28348. Comp_Limit_Option,
  28349. Comp_Rate_Amount,
  28350. Comp_Limit_Amount,
  28351. Entered_By
  28352. )
  28353.  
  28354. SELECT
  28355. AGR_Type_RecID,
  28356. AGR_Name,
  28357. AGR_Date_Start,
  28358. AGR_Date_End,
  28359. AGR_NoEnd_Flag,
  28360. AGR_Billing_Cycle_RecID,
  28361. AGR_OneTime_Flag,
  28362. AGR_Amount,
  28363. 0 AS AGR_Calc_Flag,
  28364. AGR_Prorate,
  28365. AGR_InvDesc,
  28366. Company_RecID,
  28367. Contact_RecID,
  28368. AGR_PONbr,
  28369. Owner_Level_RecID,
  28370. Billing_Unit_RecID,
  28371. OL_Restrict_Flag,
  28372. BU_Restrict_Flag,
  28373. NULL AS SubCompany_RecID,
  28374. NULL AS SubContact_RecID,
  28375. NULL AS Sub_WONbr,
  28376. 0 AS AGR_Cancel_Flag,
  28377. NULL AS AGR_Date_Cancel,
  28378. NULL AS AGR_Reason_Cancel,
  28379. 0 AS AGR_Cancel_By,
  28380. [ExcelRowNumber] AS PP_Billing_Cycle_RecID,
  28381. PP_One_Time_Flag,
  28382. AGR_Detail_Type_ID,
  28383. PP_Amount,
  28384. PP_Carryover_Flag,
  28385. PP_Time_Flag,
  28386. PP_Expenses_Flag,
  28387. PP_Products_Flag,
  28388. AGR_Notes,
  28389. 0 AS AGR_Default_Flag,
  28390. Activity_Class_RecID,
  28391. Activity_Type_RecID,
  28392. NULL AS SR_Urgency_RecID,
  28393. PM_Type_RecID,
  28394. TE_Billable_Flag,
  28395. TE_Invoice_Flag,
  28396. EX_Billable_Flag,
  28397. EX_Invoice_Flag,
  28398. IV_Billable_Flag,
  28399. IV_Invoice_Flag,
  28400. '0.00' AS PP_Adjustment,
  28401. GETDATE() AS Last_Update,
  28402. @ImportBatchUser AS Updated_By,
  28403. NULL AS SR_Type_RecID,
  28404. TopComment_Flag,
  28405. BottomComment_Flag,
  28406. '' AS Carryover_ID,
  28407. AppCycle_ID,
  28408. Overrun_Flag,
  28409. '' AS BillPeriod_ID,
  28410. CycleBasis_ID,
  28411. Taxable_Flag,
  28412. Tax_Code_RecID,
  28413. NULL AS TE_Amount,
  28414. 0 AS TE_UseBill_Flag,
  28415. TE_InvCust_Flag,
  28416. EX_InvCust_Flag,
  28417. IV_InvCust_Flag,
  28418. PP_Unlimited_Flag,
  28419. 'W' AS BR_Option,
  28420. Bill_Start_Date,
  28421. CarryOver_Days,
  28422. INT_Overruns_Percent,
  28423. ISNULL(PP_Expire_Flag, 0),
  28424. ',' AS Notification_History,
  28425. Charge_Firm_Flag,
  28426. SR_SLA_RecID,
  28427. PP_Tax_Flag,
  28428. '0.00' AS NetBalance,
  28429. '0.00' AS Overrun,
  28430. Billing_Company_RecID,
  28431. Billing_Address_RecID,
  28432. Restrict_DP_Flag,
  28433. Billing_Terms_RecID,
  28434. NULL AS TE_AmtOption,
  28435. '0' AS TE_UseRate_Flag,
  28436. '0' AS TE_UseAmt_Flag,
  28437. bl_invTemplate_Setup_RecID,
  28438. NULL AS Avail_Balance,
  28439. NULL AS parent_recid,
  28440. Comp_Rate_Option,
  28441. Comp_Limit_Option,
  28442. Comp_Rate_Amount,
  28443. Comp_Limit_Amount,
  28444. 'zAdmin'
  28445. FROM #Import_Staging
  28446. END
  28447.  
  28448. -- AGR_Header insert
  28449. -- Post-2017.6 (Currency_RecID column added + NOT NULL)
  28450. IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'AGR_Header')
  28451. BEGIN
  28452.  
  28453. -- Temporarily repurpose PP_Billing_Cycle_RecID to store excel row number
  28454. INSERT INTO dbo.AGR_Header
  28455. (
  28456. AGR_Type_RecID,
  28457. AGR_Name,
  28458. AGR_Date_Start,
  28459. AGR_Date_End,
  28460. AGR_NoEnd_Flag,
  28461. AGR_Billing_Cycle_RecID,
  28462. AGR_OneTime_Flag,
  28463. AGR_Amount,
  28464. AGR_Calc_Flag,
  28465. AGR_Prorate,
  28466. AGR_InvDesc,
  28467. Company_RecID,
  28468. Contact_RecID,
  28469. AGR_PONbr,
  28470. Owner_Level_RecID,
  28471. Billing_Unit_RecID,
  28472. OL_Restrict_Flag,
  28473. BU_Restrict_Flag,
  28474. SubCompany_RecID,
  28475. SubContact_RecID,
  28476. Sub_WONbr,
  28477. AGR_Cancel_Flag,
  28478. AGR_Date_Cancel,
  28479. AGR_Reason_Cancel,
  28480. AGR_Cancel_By,
  28481. PP_Billing_Cycle_RecID,
  28482. PP_One_Time_Flag,
  28483. AGR_Detail_Type_ID,
  28484. PP_Amount,
  28485. PP_Carryover_Flag,
  28486. PP_Time_Flag,
  28487. PP_Expenses_Flag,
  28488. PP_Products_Flag,
  28489. AGR_Notes,
  28490. AGR_Default_Flag,
  28491. Activity_Class_RecID,
  28492. Activity_Type_RecID,
  28493. SR_Urgency_RecID,
  28494. PM_Type_RecID,
  28495. TE_Billable_Flag,
  28496. TE_Invoice_Flag,
  28497. EX_Billable_Flag,
  28498. EX_Invoice_Flag,
  28499. IV_Billable_Flag,
  28500. IV_Invoice_Flag,
  28501. PP_Adjustment,
  28502. Last_Update,
  28503. Updated_By,
  28504. SR_Type_RecID,
  28505. TopComment_Flag,
  28506. BottomComment_Flag,
  28507. Carryover_ID,
  28508. AppCycle_ID,
  28509. Overrun_Flag,
  28510. BillPeriod_ID,
  28511. CycleBasis_ID,
  28512. Taxable_Flag,
  28513. Tax_Code_RecID,
  28514. TE_Amount,
  28515. TE_UseBill_Flag,
  28516. TE_InvCust_Flag,
  28517. EX_InvCust_Flag,
  28518. IV_InvCust_Flag,
  28519. PP_Unlimited_Flag,
  28520. BR_Option,
  28521. Bill_Start_Date,
  28522. CarryOver_Days,
  28523. Overrun_Limit,
  28524. PP_Expire_Flag,
  28525. Notification_History,
  28526. Charge_Firm_Flag,
  28527. SR_SLA_RecID,
  28528. PP_Tax_Flag,
  28529. NetBalance,
  28530. Overrun,
  28531. Billing_Company_RecID,
  28532. Billing_Address_RecID,
  28533. Restrict_DP_Flag,
  28534. Billing_Terms_RecID,
  28535. TE_AmtOption,
  28536. TE_UseRate_Flag,
  28537. TE_UseAmt_Flag,
  28538. bl_invTemplate_Setup_RecID,
  28539. Avail_Balance,
  28540. parent_recid,
  28541. Comp_Rate_Option,
  28542. Comp_Limit_Option,
  28543. Comp_Rate_Amount,
  28544. Comp_Limit_Amount,
  28545. Entered_By,
  28546. Currency_RecID
  28547. )
  28548.  
  28549. SELECT
  28550. AGR_Type_RecID,
  28551. AGR_Name,
  28552. AGR_Date_Start,
  28553. AGR_Date_End,
  28554. AGR_NoEnd_Flag,
  28555. AGR_Billing_Cycle_RecID,
  28556. AGR_OneTime_Flag,
  28557. AGR_Amount,
  28558. 0 AS AGR_Calc_Flag,
  28559. AGR_Prorate,
  28560. AGR_InvDesc,
  28561. Company_RecID,
  28562. Contact_RecID,
  28563. AGR_PONbr,
  28564. Owner_Level_RecID,
  28565. Billing_Unit_RecID,
  28566. OL_Restrict_Flag,
  28567. BU_Restrict_Flag,
  28568. NULL AS SubCompany_RecID,
  28569. NULL AS SubContact_RecID,
  28570. NULL AS Sub_WONbr,
  28571. 0 AS AGR_Cancel_Flag,
  28572. NULL AS AGR_Date_Cancel,
  28573. NULL AS AGR_Reason_Cancel,
  28574. 0 AS AGR_Cancel_By,
  28575. [ExcelRowNumber] AS PP_Billing_Cycle_RecID,
  28576. PP_One_Time_Flag,
  28577. AGR_Detail_Type_ID,
  28578. PP_Amount,
  28579. PP_Carryover_Flag,
  28580. PP_Time_Flag,
  28581. PP_Expenses_Flag,
  28582. PP_Products_Flag,
  28583. AGR_Notes,
  28584. 0 AS AGR_Default_Flag,
  28585. Activity_Class_RecID,
  28586. Activity_Type_RecID,
  28587. NULL AS SR_Urgency_RecID,
  28588. PM_Type_RecID,
  28589. TE_Billable_Flag,
  28590. TE_Invoice_Flag,
  28591. EX_Billable_Flag,
  28592. EX_Invoice_Flag,
  28593. IV_Billable_Flag,
  28594. IV_Invoice_Flag,
  28595. '0.00' AS PP_Adjustment,
  28596. GETDATE() AS Last_Update,
  28597. @ImportBatchUser AS Updated_By,
  28598. NULL AS SR_Type_RecID,
  28599. TopComment_Flag,
  28600. BottomComment_Flag,
  28601. '' AS Carryover_ID,
  28602. AppCycle_ID,
  28603. Overrun_Flag,
  28604. '' AS BillPeriod_ID,
  28605. CycleBasis_ID,
  28606. Taxable_Flag,
  28607. Tax_Code_RecID,
  28608. NULL AS TE_Amount,
  28609. 0 AS TE_UseBill_Flag,
  28610. TE_InvCust_Flag,
  28611. EX_InvCust_Flag,
  28612. IV_InvCust_Flag,
  28613. PP_Unlimited_Flag,
  28614. 'W' AS BR_Option,
  28615. Bill_Start_Date,
  28616. CarryOver_Days,
  28617. INT_Overruns_Percent,
  28618. ISNULL(PP_Expire_Flag, 0),
  28619. ',' AS Notification_History,
  28620. Charge_Firm_Flag,
  28621. SR_SLA_RecID,
  28622. PP_Tax_Flag,
  28623. '0.00' AS NetBalance,
  28624. '0.00' AS Overrun,
  28625. Billing_Company_RecID,
  28626. Billing_Address_RecID,
  28627. Restrict_DP_Flag,
  28628. Billing_Terms_RecID,
  28629. NULL AS TE_AmtOption,
  28630. '0' AS TE_UseRate_Flag,
  28631. '0' AS TE_UseAmt_Flag,
  28632. bl_invTemplate_Setup_RecID,
  28633. NULL AS Avail_Balance,
  28634. NULL AS parent_recid,
  28635. Comp_Rate_Option,
  28636. Comp_Limit_Option,
  28637. Comp_Rate_Amount,
  28638. Comp_Limit_Amount,
  28639. 'zAdmin',
  28640. Currency_RecID
  28641. FROM #Import_Staging
  28642. OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
  28643. END
  28644.  
  28645. -- Clean up #Force_Compile
  28646. IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
  28647. DROP TABLE #Force_Compile
  28648.  
  28649. -- Join AGR_Header back to staging table to capture identity for new rows
  28650. UPDATE stag
  28651. SET stag.AGR_Header_RecID = agr.AGR_Header_RecID
  28652. FROM #Import_Staging stag
  28653. INNER JOIN AGR_Header agr
  28654. ON stag.ExcelRowNumber = agr.PP_Billing_Cycle_RecID
  28655. AND agr.Updated_By = @ImportBatchUser
  28656.  
  28657. -- Set PP_Billing_Cycle_RecID to 0
  28658. UPDATE agr
  28659. SET agr.PP_Billing_Cycle_RecID = 0
  28660. FROM AGR_Header agr
  28661. WHERE Updated_By = @ImportBatchUser
  28662.  
  28663. -- Error if any row was not inserted (identity not populated)
  28664. IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE AGR_Header_RecID IS NULL)
  28665. BEGIN
  28666. RAISERROR('One or more rows not inserted to AGR_Header - Rolling back transaction. Run insert procedure in SSMS to view the row(s) which were not inserted.', 16, 1)
  28667. SELECT * FROM #Import_Staging
  28668. END
  28669.  
  28670. -- AGR_Site Insert
  28671. INSERT INTO AGR_Site
  28672. (
  28673. AGR_Header_RecID,
  28674. Company_Address_Recid,
  28675. Last_Update,
  28676. Updated_By,
  28677. Company_RecID
  28678. )
  28679.  
  28680. SELECT
  28681. AGR_Header_RecID,
  28682. Company_Address_RecID,
  28683. GETDATE(),
  28684. @ImportBatchUser,
  28685. Company_RecID
  28686. FROM #Import_Staging stag
  28687. WHERE stag.Company_Address_RecID IS NOT NULL
  28688.  
  28689. -- Copy exclusions from AGR_Type_Exclusion to AGR_Exclusion
  28690. INSERT INTO AGR_Exclusion
  28691. (
  28692. AGR_Header_RecID,
  28693. Activity_Type_RecID,
  28694. Activity_Class_RecID,
  28695. Updated_By,
  28696. Last_Update
  28697. )
  28698.  
  28699. SELECT
  28700. stag.AGR_Header_RecID,
  28701. ate.Activity_Type_RecID,
  28702. ate.Activity_Class_RecID,
  28703. @ImportBatchUser,
  28704. GETDATE()
  28705. FROM #Import_Staging stag
  28706. INNER JOIN dbo.AGR_Type_Exclusion ate
  28707. ON ate.AGR_Type_RecID = stag.AGR_Type_RecID
  28708.  
  28709. -- Copy defaults from AGR_Type_Default to AGR_Default
  28710. INSERT INTO AGR_Default
  28711. (
  28712. AGR_Header_RecID,
  28713. Owner_Level_RecID,
  28714. Billing_Unit_RecID,
  28715. SR_Board_RecID,
  28716. SR_Type_RecID,
  28717. Default_Flag,
  28718. Last_Update,
  28719. Updated_By
  28720. )
  28721.  
  28722. SELECT
  28723. stag.AGR_Header_RecID,
  28724. atd.Owner_Level_RecID,
  28725. atd.Billing_Unit_RecID,
  28726. atd.SR_Board_RecID,
  28727. atd.SR_Type_RecID,
  28728. atd.Default_Flag,
  28729. GETDATE(),
  28730. @ImportBatchUser
  28731. FROM #Import_Staging stag
  28732. INNER JOIN AGR_Type_Default atd
  28733. ON atd.AGR_Type_RecID = stag.AGR_Type_RecID
  28734.  
  28735. -- Copy work roles to dbo.Company_Billing_Rate from dbo.AGR_Type_WRole
  28736. -- For agreement types where Copy_Work_Roles_Flag = 1
  28737. INSERT INTO dbo.Company_Billing_Rate
  28738. (
  28739. Owner_ID,
  28740. Company_RecID,
  28741. Date_Effective,
  28742. Last_Update,
  28743. Updated_By,
  28744. Date_Ending,
  28745. Rate_Type,
  28746. Activity_Class_RecID,
  28747. BR_Option,
  28748. Owner_Level_RecID
  28749. )
  28750.  
  28751. SELECT
  28752. 1,
  28753. stag.Company_RecID,
  28754. wrl.Date_Effective,
  28755. GETDATE(),
  28756. @ImportBatchUser,
  28757. wrl.Date_Ending,
  28758. wrl.Rate_Type,
  28759. wrl.Activity_Class_RecID,
  28760. 'W',
  28761. NULL
  28762. FROM #Import_Staging stag
  28763. INNER JOIN AGR_Type aty
  28764. ON stag.AGR_Type_RecID = aty.AGR_Type_RecID
  28765. INNER JOIN AGR_Type_WRole wrl
  28766. ON wrl.AGR_Type_RecID = aty.AGR_Type_RecID
  28767. WHERE aty.Copy_Work_Roles_Flag = 1
  28768.  
  28769. -- Copy work types to dbo.Company_Activity_Type from dbo.AGR_Type_WType
  28770. -- For agreement types where Copy_Work_Types_Flag = 1
  28771. INSERT INTO dbo.Company_Activity_Type
  28772. (
  28773. Owner_ID,
  28774. Company_RecID,
  28775. Hours_Min,
  28776. Rate_Type,
  28777. Rate,
  28778. Inactive_Flag,
  28779. Last_Update,
  28780. Updated_By,
  28781. Hours_Max,
  28782. Billable_Flag,
  28783. Activity_Type_RecID,
  28784. AGR_Header_RecID,
  28785. Owner_Level_RecID,
  28786. Date_Effective,
  28787. Date_Ending,
  28788. Company_Address_RecID,
  28789. Entered_By
  28790. )
  28791.  
  28792. SELECT
  28793. 1,
  28794. stag.Company_RecID,
  28795. atw.Hours_Min,
  28796. atw.Rate_Type,
  28797. atw.Rate,
  28798. 0,
  28799. GETDATE(),
  28800. @ImportBatchUser,
  28801. atw.Hours_Max,
  28802. 1,
  28803. atw.Activity_Type_RecID,
  28804. stag.AGR_Header_RecID,
  28805. NULL,
  28806. atw.Date_Effective,
  28807. atw.Date_Ending,
  28808. NULL,
  28809. 'Import'
  28810. FROM #Import_Staging stag
  28811. INNER JOIN AGR_Type aty
  28812. ON aty.AGR_Type_RecID = stag.AGR_Type_RecID
  28813. INNER JOIN AGR_Type_WType atw
  28814. ON atw.AGR_Type_RecID = aty.AGR_Type_RecID
  28815. WHERE aty.Copy_Work_Types_Flag = 1
  28816.  
  28817. COMMIT TRANSACTION AGR_Import
  28818.  
  28819. SELECT
  28820. 1 AS Success,
  28821. NULL AS RowNumber,
  28822. NULL AS ValMsg
  28823.  
  28824. RETURN
  28825. END
  28826.  
  28827. -- Condense row numbers to return one line per unique validation message
  28828. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
  28829. BEGIN
  28830.  
  28831. exec dbo.usp_Condense_Validation_Results
  28832.  
  28833. IF @ProcName = 'usp_AGR_ImportValidate'
  28834. BEGIN
  28835. SELECT
  28836. 0 AS ValPassed,
  28837. 0 AS RowNumber,
  28838. t.ValMsg + ' on row(s): ' + STUFF((SELECT ', ' + CONVERT(NVARCHAR(50), RowNumber) AS ValMsg
  28839. FROM #ResultsCondensed
  28840. WHERE ValMsg = t.ValMsg
  28841. FOR XML PATH(''), TYPE
  28842. ).value('.', 'varchar(max)'), 1, 2, '') AS ValMsg
  28843. FROM #ResultsCondensed t
  28844. GROUP BY t.ValMsg
  28845. END
  28846.  
  28847. IF @ProcName = 'usp_AGR_ImportPush'
  28848. BEGIN
  28849.  
  28850. SELECT
  28851. 0 AS Success,
  28852. 0 AS RowNumber,
  28853. t.ValMsg + ' on row(s): ' + STUFF((SELECT ', ' + CONVERT(NVARCHAR(50), RowNumber) AS ValMsg
  28854. FROM #ResultsCondensed
  28855. WHERE ValMsg = t.ValMsg
  28856. FOR XML PATH(''), TYPE
  28857. ).value('.', 'varchar(max)'), 1, 2, '') AS ValMsg
  28858. FROM #ResultsCondensed t
  28859. GROUP BY t.ValMsg
  28860. END
  28861.  
  28862. END
  28863. ELSE
  28864. IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
  28865. BEGIN
  28866. SELECT
  28867. 2 AS ValPassed,
  28868. 0 AS RowNumber,
  28869. 'The following ' + ReferenceType + ' will be created: '+
  28870. STUFF(
  28871. (SELECT ', ' + ValMsg
  28872. FROM #tblResults
  28873. WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
  28874. FOR XML PATH (''))
  28875. , 1, 1, '') AS ValMsg
  28876. FROM #tblResults res
  28877. GROUP BY ReferenceType
  28878.  
  28879. END
  28880. ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
  28881. BEGIN
  28882. SELECT
  28883. 1 AS ValPassed,
  28884. NULL AS RowNumber,
  28885. NULL AS ValMsg
  28886. END
  28887.  
  28888. ROLLBACK TRANSACTION AGR_Import
  28889.  
  28890. END TRY
  28891.  
  28892. BEGIN CATCH
  28893.  
  28894.  
  28895. -- Return error information and rollback transaction
  28896. SELECT
  28897. 0 AS Success,
  28898. ERROR_LINE() AS ExcelRowNumber,
  28899. ERROR_MESSAGE() AS ErrorDetails
  28900.  
  28901.  
  28902. ROLLBACK TRANSACTION AGR_Import
  28903.  
  28904.  
  28905. END CATCH
  28906.  
  28907.  
  28908.  
  28909. GO
  28910.  
  28911.  
  28912. SELECT 'Import procedures created - Ready to proceed'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement