Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- IF OBJECT_ID('udf_Import_StripNonAlpha') IS NOT NULL
- DROP FUNCTION [dbo].[udf_Import_StripNonAlpha]
- GO
- CREATE FUNCTION [dbo].[udf_Import_StripNonAlpha]
- (
- @Str VARCHAR(8000)
- ,@Pattern VARCHAR(100)
- )
- RETURNS TABLE WITH SCHEMABINDING AS
- RETURN
- WITH Tally (n) AS
- (
- SELECT TOP (LEN(@Str)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
- FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
- CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
- CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
- CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0)) d(n)
- ),
- SplitString AS
- (
- SELECT code=@Str, n, s=SUBSTRING(@Str, n, 1)
- FROM Tally
- WHERE PATINDEX(@Pattern, SUBSTRING(@Str COLLATE Latin1_General_BIN, n, 1)) <> 0
- )
- SELECT ReducedString=
- (
- SELECT s + ''
- FROM SplitString b
- ORDER BY n
- FOR XML PATH('')
- );
- GO
- -- Create table to hold legacy_id's
- IF OBJECT_ID('Import_Legacy_ID_Custom') IS NULL
- BEGIN
- CREATE TABLE dbo.Import_Legacy_ID_Custom
- (
- Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- CW_RecID INT,
- Record_Type NVARCHAR(255) COLLATE DATABASE_DEFAULT
- )
- CREATE INDEX IX_Legacy_ID ON Import_Legacy_ID_Custom(Legacy_ID)
- CREATE INDEX IX_Legacy_Cover ON Import_Legacy_ID_Custom(Legacy_ID, Record_Type)
- END
- GO
- IF NOT EXISTS(SELECT 1 FROM sys.procedures WHERE name = 'usp_Import_UDF')
- BEGIN
- EXEC('CREATE PROCEDURE usp_Import_UDF AS BEGIN SELECT 1 END')
- END
- GO
- ALTER PROCEDURE usp_Import_UDF
- @Source_Table_Name NVARCHAR(100),
- @RunType VARCHAR(20)
- AS
- BEGIN
- DECLARE
- @DSQL NVARCHAR(MAX),
- @curr_CF NVARCHAR(100),
- @curr_udf_name NVARCHAR(150)
- IF OBJECT_ID('tempdb..#Cols_To_Process') IS NOT NULL
- DROP TABLE #Cols_To_Process
- 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
- INTO #Cols_To_Process
- FROM tempdb.sys.columns cols
- CROSS APPLY(SELECT TOP 1 * FROM tempdb.sys.tables tabs WHERE tabs.object_id = cols.object_id)tabs
- WHERE tabs.name = @Source_Table_Name
- AND (cols.Name LIKE('CF:%') OR cols.Name LIKE('DT:%'))
- ORDER BY Column_ID ASC
- IF NOT EXISTS(SELECT 1 FROM #Cols_To_Process)
- BEGIN
- RETURN
- END
- IF OBJECT_ID('tempdb..##UDF_Staging') IS NOT NULL
- DROP TABLE ##UDF_Staging
- CREATE TABLE ##UDF_Staging
- (
- ExcelRowNumber INT,
- User_Defined_Field_RecID INT,
- Caption VARCHAR(100),
- Answer NVARCHAR(1000),
- RecID INT,
- MAXLEN INT,
- FieldType VARCHAR(50),
- SF_Field_Type_ID VARCHAR(10),
- ColumnName VARCHAR(100)
- )
- WHILE EXISTS(SELECT 1 FROM #Cols_To_Process)
- BEGIN
- SELECT TOP 1 @curr_cf = ColumnName FROM #Cols_To_Process ORDER BY RowNum ASC
- SELECT @curr_udf_name = udf_name FROM #Cols_To_Process WHERE ColumnName = @curr_cf
- SELECT @DSQL =
- 'INSERT INTO ##UDF_Staging
- (
- ExcelRowNumber,
- Answer,
- Caption,
- MAXLEN,
- FieldType,
- ColumnName
- )
- SELECT
- [Excel Row Number],
- LEFT(' + @curr_cf + ', 1000),' + '
- ' + CHAR(39) + @curr_udf_name + CHAR(39) + ',
- NULL,
- ' + CHAR(39) + CASE WHEN @curr_cf LIKE('[[]DT:%') THEN 'Date' ELSE 'Text' END + CHAR(39) + ',
- ' + CHAR(39) + @curr_cf + CHAR(39) + '
- FROM tempdb.dbo.' + @Source_Table_Name + '
- WHERE ' + @curr_cf + ' <> ' + CHAR(39) + CHAR(39) + ' AND ' + @curr_cf + ' IS NOT NULL
- --SELECT
- -- [Excel Row Number],
- -- LEFT(' + @curr_cf + ', 1000),' + '
- -- ' + CHAR(39) + @curr_udf_name + CHAR(39) + ',
- -- NULL,
- -- ' + CHAR(39) + CASE WHEN @curr_cf LIKE('[[]DT:%') THEN 'Date' ELSE 'Text' END + CHAR(39) + ',
- -- ' + CHAR(39) + @curr_cf + CHAR(39) + '
- --FROM tempdb.dbo.' + @Source_Table_Name + '
- --WHERE ' + @curr_cf + ' <> ' + CHAR(39) + CHAR(39) + ' AND ' + @curr_cf + ' IS NOT NULL
- '
- EXEC(@DSQL)
- DELETE FROM #Cols_To_Process WHERE ColumnName = @curr_cf
- END
- ;WITH UDFLEN AS
- (
- SELECT
- Caption,
- MAX(LEN(ANSWER)) AS ML
- FROM ##UDF_Staging
- GROUP BY Caption
- )
- UPDATE udf
- SET udf.MAXLEN = udfl.ML
- FROM ##UDF_Staging udf
- CROSS APPLY(SELECT TOP 1 * FROM UDFLEN udfl WHERE udfl.Caption = udf.Caption)udfl
- UPDATE udf
- SET udf.SF_Field_Type_ID = 'T'
- FROM ##UDF_Staging udf
- WHERE FieldType = 'Text'
- AND MAXLEN < 100
- UPDATE udf
- SET udf.SF_Field_Type_ID = 'A'
- FROM ##UDF_Staging udf
- WHERE FieldType = 'Text'
- AND (MAXLEN IS NULL OR MAXLEN > 100)
- UPDATE udf
- SET udf.SF_Field_Type_ID = 'D'
- FROM ##UDF_Staging udf
- WHERE FieldType = 'Date'
- DELETE FROM ##UDF_Staging
- WHERE FieldType = 'Date' AND (Answer IS NULL OR ISDATE(Answer) = 0)
- SELECT * FROM ##UDF_Staging WHERE FieldType = 'Date'
- UPDATE ##UDF_Staging
- 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)
- WHERE FieldType = 'Date'
- UPDATE ##UDF_Staging
- SET Caption = LEFT(Caption, 25)
- WHERE LEN(Caption) > 25
- -- TODO ADD ADDITIONAL VALIDATION
- -- BEGIN Company Records
- IF @RunType = 'Company'
- BEGIN
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'cm120')udf
- 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')))
- -- Update user-defined fields to text area if they are not already defined as such
- --UPDATE udf
- -- SET udf.SF_Field_Type_ID = 'A',
- -- udf.SF_Entry_Type_ID = 'E',
- -- udf.Nbr_Decimals = 0,
- -- udf.Required_Flag = 0,
- -- udf.Inactive_Flag = 0,
- -- udf.Read_Only_Flag = 0
- --FROM User_Defined_Field udf
- --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
- -- Create user-defined fields which do not already exists
- INSERT INTO User_Defined_Field
- (
- SF_Field_Type_ID,
- SF_Entry_Type_ID,
- Field_ID,
- Nbr_Decimals,
- Caption,
- Required_Flag,
- Pod_RecID,
- ScreenID,
- Full_View_Sort_Order,
- Full_View_Visible_Flag,
- Inactive_Flag,
- Read_Only_Flag,
- Multiline_Flag,
- Multiline_Order,
- Created_UTC,
- Created_By,
- Last_Update_UTC,
- Updated_By,
- Tooltip,
- Button_Url
- )
- SELECT DISTINCT
- stag.SF_Field_Type_ID, --SF_Field_Type_ID,
- 'E', --SF_Entry_Type_ID,
- NULL, --Field_ID,
- 0, --Nbr_Decimals,
- stag.Caption, --Caption,
- 0, --Required_Flag,
- pod.Pod_RecID, --Pod_RecID,
- 'cm120', --ScreenID,
- 0,--Full_View_Sort_Order,
- 1, --Full_View_Visible_Flag,
- 0, --Inactive_Flag,
- 0,--Read_Only_Flag,
- 0,--Multiline_Flag,
- NULL, --Multiline_Order,
- GETUTCDATE(),--Created_UTC,
- 'Migration', --Created_By,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration', --Updated_By,
- 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
- NULL--Button_Url
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'cm120' AND PodID = 'Company_Details')pod
- WHERE stag.User_Defined_Field_RecID IS NULL
- -- Get RecID for user-defined fields
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'cm120')udf
- 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')))
- -- Get Company_RecID for imported records
- UPDATE stag
- SET stag.RecID = imp.Company_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
- -- Eliminate duplicates on combination of company + udf (issue when multiple sites imported with separate custom questions)
- DELETE dup
- FROM ##UDF_Staging dup
- 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)
- -- delete invalid rows (TODO: add validation)
- DELETE stag
- FROM ##UDF_Staging stag
- WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
- -- Update existing UDF values
- UPDATE udfv
- SET udfv.User_Defined_Field_Value = stag.Answer
- FROM Company_User_Defined_Field_Value udfv
- 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
- INSERT INTO Company_User_Defined_Field_Value
- (
- Company_RecID,
- User_Defined_Field_RecID,
- User_Defined_Field_Value,
- Last_Update_UTC,
- Updated_By
- )
- SELECT
- RecID, --Company_RecID,
- User_Defined_Field_RecID, --User_Defined_Field_RecID,
- Answer, --User_Defined_Field_Value,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration'--Updated_By
- FROM ##UDF_Staging stag
- 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)
- END
- -- BEGIN Contact Records
- IF @RunType = 'Contact'
- BEGIN
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'ct300')udf
- WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('Contact_Detail', 'Contact_Overview')))
- -- Update user-defined fields to text area if they are not already defined as such
- --UPDATE udf
- -- SET udf.SF_Field_Type_ID = 'A',
- -- udf.SF_Entry_Type_ID = 'E',
- -- udf.Nbr_Decimals = 0,
- -- udf.Required_Flag = 0,
- -- udf.Inactive_Flag = 0,
- -- udf.Read_Only_Flag = 0
- --FROM User_Defined_Field udf
- --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
- -- Create user-defined fields which do not already exists
- INSERT INTO User_Defined_Field
- (
- SF_Field_Type_ID,
- SF_Entry_Type_ID,
- Field_ID,
- Nbr_Decimals,
- Caption,
- Required_Flag,
- Pod_RecID,
- ScreenID,
- Full_View_Sort_Order,
- Full_View_Visible_Flag,
- Inactive_Flag,
- Read_Only_Flag,
- Multiline_Flag,
- Multiline_Order,
- Created_UTC,
- Created_By,
- Last_Update_UTC,
- Updated_By,
- Tooltip,
- Button_Url
- )
- SELECT DISTINCT
- stag.SF_Field_Type_ID, --SF_Field_Type_ID,
- 'E', --SF_Entry_Type_ID,
- NULL, --Field_ID,
- 0, --Nbr_Decimals,
- stag.Caption, --Caption,
- 0, --Required_Flag,
- pod.Pod_RecID, --Pod_RecID,
- 'ct300', --ScreenID,
- 0,--Full_View_Sort_Order,
- 1, --Full_View_Visible_Flag,
- 0, --Inactive_Flag,
- 0,--Read_Only_Flag,
- 0,--Multiline_Flag,
- NULL, --Multiline_Order,
- GETUTCDATE(),--Created_UTC,
- 'Migration', --Created_By,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration', --Updated_By,
- 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
- NULL--Button_Url
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'ct300' AND PodID = 'Contact_Detail')pod
- WHERE stag.User_Defined_Field_RecID IS NULL
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'ct300')udf
- WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('Contact_Detail', 'Contact_Overview')))
- -- Get Contact_RecID for imported records
- UPDATE stag
- SET stag.RecID = imp.New_Identity
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
- -- delete invalid rows (TODO: add validation)
- DELETE stag
- FROM ##UDF_Staging stag
- WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
- -- Update existing UDF values
- UPDATE udfv
- SET udfv.User_Defined_Field_Value = stag.Answer
- FROM Contact_User_Defined_Field_Value udfv
- 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
- INSERT INTO Contact_User_Defined_Field_Value
- (
- Contact_RecID,
- User_Defined_Field_RecID,
- User_Defined_Field_Value,
- Last_Update_UTC,
- Updated_By
- )
- SELECT
- RecID, --Contact_RecID,
- User_Defined_Field_RecID, --User_Defined_Field_RecID,
- Answer, --User_Defined_Field_Value,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration'--Updated_By
- FROM ##UDF_Staging stag
- 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)
- END
- -- BEGIN Activity Records
- IF @RunType = 'Activity'
- BEGIN
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'my_activities')udf
- WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('activity_overview', 'activity_schedule')))
- ---- Update user-defined fields to text area if they are not already defined as such
- --UPDATE udf
- -- SET udf.SF_Field_Type_ID = 'A',
- -- udf.SF_Entry_Type_ID = 'E',
- -- udf.Nbr_Decimals = 0,
- -- udf.Required_Flag = 0,
- -- udf.Inactive_Flag = 0,
- -- udf.Read_Only_Flag = 0
- --FROM User_Defined_Field udf
- --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
- -- Create user-defined fields which do not already exists
- INSERT INTO User_Defined_Field
- (
- SF_Field_Type_ID,
- SF_Entry_Type_ID,
- Field_ID,
- Nbr_Decimals,
- Caption,
- Required_Flag,
- Pod_RecID,
- ScreenID,
- Full_View_Sort_Order,
- Full_View_Visible_Flag,
- Inactive_Flag,
- Read_Only_Flag,
- Multiline_Flag,
- Multiline_Order,
- Created_UTC,
- Created_By,
- Last_Update_UTC,
- Updated_By,
- Tooltip,
- Button_Url
- )
- SELECT DISTINCT
- stag.SF_Field_Type_ID, --SF_Field_Type_ID,
- 'E', --SF_Entry_Type_ID,
- NULL, --Field_ID,
- 0, --Nbr_Decimals,
- stag.Caption, --Caption,
- 0, --Required_Flag,
- pod.Pod_RecID, --Pod_RecID,
- 'my_activities', --ScreenID,
- 0,--Full_View_Sort_Order,
- 1, --Full_View_Visible_Flag,
- 0, --Inactive_Flag,
- 0,--Read_Only_Flag,
- 0,--Multiline_Flag,
- NULL, --Multiline_Order,
- GETUTCDATE(),--Created_UTC,
- 'Migration', --Created_By,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration', --Updated_By,
- 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
- NULL--Button_Url
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'my_activities' AND PodID = 'Activity_Overview')pod
- WHERE stag.User_Defined_Field_RecID IS NULL
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'my_activities')udf
- WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('activity_overview', 'activity_schedule')))
- -- Get SO_Activity_RecID for imported records
- UPDATE stag
- SET stag.RecID = imp.New_Identity
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
- -- delete invalid rows (TODO: add validation)
- DELETE stag
- FROM ##UDF_Staging stag
- WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
- -- Update existing UDF values
- UPDATE udfv
- SET udfv.User_Defined_Field_Value = stag.Answer
- FROM SO_Activity_User_Defined_Field_Value udfv
- 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
- INSERT INTO SO_Activity_User_Defined_Field_Value
- (
- SO_Activity_RecID,
- User_Defined_Field_RecID,
- User_Defined_Field_Value,
- Last_Update_UTC,
- Updated_By
- )
- SELECT
- RecID, --SO_Activity_RecID,
- User_Defined_Field_RecID, --User_Defined_Field_RecID,
- Answer, --User_Defined_Field_Value,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration'--Updated_By
- FROM ##UDF_Staging stag
- 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)
- END
- -- BEGIN Ticket Records
- IF @RunType = 'Ticket'
- BEGIN
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'sr100')udf
- 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')))
- ---- Update user-defined fields to text area if they are not already defined as such
- --UPDATE udf
- -- SET udf.SF_Field_Type_ID = 'A',
- -- udf.SF_Entry_Type_ID = 'E',
- -- udf.Nbr_Decimals = 0,
- -- udf.Required_Flag = 0,
- -- udf.Inactive_Flag = 0,
- -- udf.Read_Only_Flag = 0
- --FROM User_Defined_Field udf
- --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
- -- Create user-defined fields which do not already exists
- INSERT INTO User_Defined_Field
- (
- SF_Field_Type_ID,
- SF_Entry_Type_ID,
- Field_ID,
- Nbr_Decimals,
- Caption,
- Required_Flag,
- Pod_RecID,
- ScreenID,
- Full_View_Sort_Order,
- Full_View_Visible_Flag,
- Inactive_Flag,
- Read_Only_Flag,
- Multiline_Flag,
- Multiline_Order,
- Created_UTC,
- Created_By,
- Last_Update_UTC,
- Updated_By,
- Tooltip,
- Button_Url
- )
- SELECT DISTINCT
- stag.SF_Field_Type_ID, --SF_Field_Type_ID,
- 'E', --SF_Entry_Type_ID,
- NULL, --Field_ID,
- 0, --Nbr_Decimals,
- stag.Caption, --Caption,
- 0, --Required_Flag,
- pod.Pod_RecID, --Pod_RecID,
- 'sr100', --ScreenID,
- 0,--Full_View_Sort_Order,
- 1, --Full_View_Visible_Flag,
- 0, --Inactive_Flag,
- 0,--Read_Only_Flag,
- 0,--Multiline_Flag,
- NULL, --Multiline_Order,
- GETUTCDATE(),--Created_UTC,
- 'Migration', --Created_By,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration', --Updated_By,
- 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
- NULL--Button_Url
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'sr100' AND PodID = 'service_ticket_ticket')pod
- WHERE stag.User_Defined_Field_RecID IS NULL
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'sr100')udf
- 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')))
- -- Get SR_Service for imported records
- UPDATE stag
- SET stag.RecID = imp.New_Identity
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
- -- delete invalid rows (TODO: add validation)
- DELETE stag
- FROM ##UDF_Staging stag
- WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
- -- Update existing UDF values
- UPDATE udfv
- SET udfv.User_Defined_Field_Value = stag.Answer
- FROM SR_Service_User_Defined_Field_Value udfv
- 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
- INSERT INTO SR_Service_User_Defined_Field_Value
- (
- SR_Service_RecID,
- User_Defined_Field_RecID,
- User_Defined_Field_Value,
- Last_Update_UTC,
- Updated_By
- )
- SELECT
- RecID, --SR_Service,
- User_Defined_Field_RecID, --User_Defined_Field_RecID,
- Answer, --User_Defined_Field_Value,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration'--Updated_By
- FROM ##UDF_Staging stag
- 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)
- END
- -- BEGIN Opportunity Records
- IF @RunType = 'Opportunity'
- BEGIN
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'my_opportunities')udf
- WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('opportunities_opportunity')))
- -- Update user-defined fields to text area if they are not already defined as such
- --UPDATE udf
- -- SET udf.SF_Field_Type_ID = 'A',
- -- udf.SF_Entry_Type_ID = 'E',
- -- udf.Nbr_Decimals = 0,
- -- udf.Required_Flag = 0,
- -- udf.Inactive_Flag = 0,
- -- udf.Read_Only_Flag = 0
- --FROM User_Defined_Field udf
- --WHERE EXISTS(SELECT 1 FROM ##UDF_Staging stag WHERE stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID)
- -- Create user-defined fields which do not already exists
- INSERT INTO User_Defined_Field
- (
- SF_Field_Type_ID,
- SF_Entry_Type_ID,
- Field_ID,
- Nbr_Decimals,
- Caption,
- Required_Flag,
- Pod_RecID,
- ScreenID,
- Full_View_Sort_Order,
- Full_View_Visible_Flag,
- Inactive_Flag,
- Read_Only_Flag,
- Multiline_Flag,
- Multiline_Order,
- Created_UTC,
- Created_By,
- Last_Update_UTC,
- Updated_By,
- Tooltip,
- Button_Url
- )
- SELECT DISTINCT
- stag.SF_Field_Type_ID, --SF_Field_Type_ID,
- 'E', --SF_Entry_Type_ID,
- NULL, --Field_ID,
- 0, --Nbr_Decimals,
- stag.Caption, --Caption,
- 0, --Required_Flag,
- pod.Pod_RecID, --Pod_RecID,
- 'my_opportunities', --ScreenID,
- 0,--Full_View_Sort_Order,
- 1, --Full_View_Visible_Flag,
- 0, --Inactive_Flag,
- 0,--Read_Only_Flag,
- 0,--Multiline_Flag,
- NULL, --Multiline_Order,
- GETUTCDATE(),--Created_UTC,
- 'Migration', --Created_By,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration', --Updated_By,
- 'Text field created by migration tool - adjust data type as-necessary', --Tooltip,
- NULL--Button_Url
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 Pod_RecID FROM Pod WHERE screenid = 'my_opportunities' AND PodID = 'opportunities_opportunity')pod
- WHERE stag.User_Defined_Field_RecID IS NULL
- UPDATE stag
- SET stag.User_Defined_Field_RecID = udf.User_Defined_Field_RecID
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.User_Defined_Field udf WHERE udf.Caption = stag.Caption AND udf.ScreenID = 'my_opportunities')udf
- WHERE EXISTS(SELECT TOP 1 * FROM Pod p WHERE p.Pod_RecID = udf.Pod_RecID AND (p.PodID IN('opportunities_opportunity')))
- -- Get SO_Activity_RecID for imported records
- UPDATE stag
- SET stag.RecID = imp.New_Identity
- FROM ##UDF_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging imp WHERE imp.ExcelRowNumber = stag.ExcelRowNumber)imp
- -- delete invalid rows (TODO: add validation)
- DELETE stag
- FROM ##UDF_Staging stag
- WHERE RecID IS NULL OR User_Defined_Field_RecID IS NULL
- -- Update existing UDF values
- UPDATE udfv
- SET udfv.User_Defined_Field_Value = stag.Answer
- FROM SO_Activity_User_Defined_Field_Value udfv
- 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
- INSERT INTO SO_Activity_User_Defined_Field_Value
- (
- SO_Activity_RecID,
- User_Defined_Field_RecID,
- User_Defined_Field_Value,
- Last_Update_UTC,
- Updated_By
- )
- SELECT
- RecID, --SO_Activity_RecID,
- User_Defined_Field_RecID, --User_Defined_Field_RecID,
- Answer, --User_Defined_Field_Value,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration'--Updated_By
- FROM ##UDF_Staging stag
- 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)
- END
- END
- GO
- IF EXISTS(SELECT TOP 1 * FROM sys.tables WHERE name = '#TMP_Time_Staging')
- BEGIN
- DROP TABLE #TMP_Time_Staging
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Import_Record_Validation')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Import_Record_Validation] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 04/14/2015
- -- Description: Matches migrated records based on Legacy_ID
- -- =============================================
- ALTER PROCEDURE [dbo].usp_Import_Record_Validation
- @TableName NVARCHAR(200)
- AS
- BEGIN
- IF OBJECT_ID('tempdb..TMP_Validation') IS NOT NULL
- DROP TABLE tempdb.dbo.TMP_Validation
- SELECT @TableName AS TableName INTO tempdb.dbo.TMP_Validation
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Import_Match_Legacy')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Import_Match_Legacy] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 04/14/2015
- -- Description: Matches migrated records based on Legacy_ID
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_Import_Match_Legacy]
- @TempTableName NVARCHAR(200),
- @Record_Type NVARCHAR(50)
- AS
- BEGIN
- SET NOCOUNT ON
- DECLARE @CurrColumn NVARCHAR(100),
- @Curr_RecID INT,
- @TempTableObjectID INT,
- @StagingTableObjectID INT,
- @DSQL NVARCHAR(MAX)
- SELECT
- @TempTableObjectID = (SELECT Object_ID FROM tempdb.sys.Tables WHERE Name = @TempTableName),
- @StagingTableObjectID = (SELECT OBJECT_ID('tempdb..#Import_Staging'))
- DECLARE @ColumnsToAdd TABLE
- (
- RecID INT IDENTITY,
- ColumnName NVARCHAR(50)
- )
- INSERT INTO @ColumnsToAdd
- (
- ColumnName
- )
- SELECT 'Legacy_Company_ID' UNION ALL
- SELECT 'Legacy_Contact_ID' UNION ALL
- SELECT 'Legacy_Site_ID'
- -- Add Legacy Columns to tempdb table and staging table if needed
- WHILE EXISTS(SELECT TOP 1 * FROM @ColumnsToAdd)
- BEGIN
- SELECT @Curr_RecID = (SELECT TOP 1 RecID FROM @ColumnsToAdd)
- SELECT @CurrColumn = (SELECT ColumnName FROM @ColumnsToAdd WHERE RecID = @Curr_RecID)
- DECLARE @StagingTableName NVARCHAR(100) = 'TestTable'
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE Name = @CurrColumn AND Object_ID = @TempTableObjectID)
- BEGIN
- SELECT @DSQL = 'ALTER TABLE tempdb.dbo.' + @TempTableName + ' ADD ' + @CurrColumn + ' NVARCHAR(MAX) COLLATE DATABASE_DEFAULT'
- EXEC(@DSQL)
- SELECT @DSQL = ''
- END
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE Name = @CurrColumn AND Object_ID = @StagingTableObjectID)
- BEGIN
- SELECT @DSQL = 'ALTER TABLE #Import_Staging ADD ' + @CurrColumn + ' NVARCHAR(MAX) COLLATE DATABASE_DEFAULT'
- EXEC(@DSQL)
- SELECT @DSQL = ''
- END
- DELETE FROM @ColumnsToAdd WHERE RecID = @Curr_RecID
- END
- IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Site_ID' AND OBJECT_ID = @TempTableObjectID)
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Site_ID = src.Legacy_Site_ID
- FROM #Import_Staging tmp
- INNER JOIN tempdb.dbo.' + @TempTableName + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber
- WHERE tmp.Legacy_Site_ID IS NULL
- AND EXISTS(SELECT 1 FROM tempdb.dbo.' + @TempTableName + ' src WHERE src.Legacy_Site_ID IS NOT NULL)'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Company_ID' AND OBJECT_ID = @TempTableObjectID)
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
- FROM #Import_Staging tmp
- INNER JOIN tempdb.dbo.' + @TempTableName + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber
- WHERE tmp.Legacy_Company_ID IS NULL
- AND EXISTS(SELECT 1 FROM tempdb.dbo.' + @TempTableName + ' src WHERE src.Legacy_Company_ID IS NOT NULL)'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Contact_ID' AND OBJECT_ID = @TempTableObjectID)
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
- FROM #Import_Staging tmp
- INNER JOIN tempdb.dbo.' + @TempTableName + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber
- WHERE tmp.Legacy_Contact_ID IS NULL
- AND EXISTS(SELECT 1 FROM tempdb.dbo.' + @TempTableName + ' src WHERE src.Legacy_Contact_ID IS NOT NULL)'
- EXEC(@DSQL)
- END
- -- Exclude records previously imported
- -- Non-Company records
- IF @Record_Type NOT IN('Company', 'Site')
- BEGIN
- UPDATE stag
- SET stag.Diff_Exclude_Flag = 1
- FROM #Import_Staging stag
- WHERE EXISTS(SELECT 1 FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_ID AND leg.Record_Type = @Record_Type)
- END
- IF @Record_Type = 'Company'
- BEGIN
- -- Company records
- UPDATE stag
- SET stag.Diff_Exclude_Flag = 1
- FROM #Import_Staging stag
- WHERE EXISTS(SELECT 1 FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_ID AND leg.Record_Type = @Record_Type)
- AND EXISTS(SELECT 1 FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Site_ID AND leg.Record_Type = 'Site')
- end
- DELETE FROM #Import_Staging WHERE Diff_Exclude_Flag = 1
- UPDATE #Import_Staging SET Legacy_Contact_ID = NULL WHERE Legacy_Contact_ID = ''
- -- Update #Import_Staging to pull company RecID
- -- Non-company records
- IF @Record_Type NOT IN('Company', 'Site')
- BEGIN
- UPDATE stag
- SET stag.Company_RecID = leg.CW_RecID
- FROM #Import_Staging stag
- 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
- WHERE EXISTS(SELECT 1 FROM dbo.Company comp WHERE comp.Company_RecID = leg.CW_RecID)
- END
- -- Company records
- IF @Record_Type = 'Company'
- BEGIN
- UPDATE stag
- SET stag.Company_RecID = leg.CW_RecID
- FROM #Import_Staging stag
- 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
- END
- -- Pull company RecID for merged companies
- UPDATE stag
- SET stag.Company_RecID = mrg.To_RecID
- FROM #Import_Staging stag
- 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
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Contact_Merge_Audit mrg WHERE mrg.From_RecID = leg.CW_RecID AND mrg.Audit_Source = 'M')mrg
- WHERE NOT EXISTS(SELECT 1 FROM dbo.Company comp WHERE comp.Company_RecID = leg.CW_RecID)
- -- Update #Import_Staging to pull Site RecID
- UPDATE stag
- SET stag.Company_Address_RecID = leg.CW_RecID
- FROM #Import_Staging stag
- 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
- -- Update #Import_Staging to pull Contact RecID
- IF @Record_Type NOT IN('Company', 'Site')
- BEGIN
- UPDATE stag
- SET stag.Contact_RecID = leg.CW_RecID
- FROM #Import_Staging stag
- 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
- WHERE EXISTS(SELECT TOP 1 * FROM dbo.Contact cont WHERE cont.Contact_RecID = leg.CW_RecID)
- END
- -- Perform validation on matched records
- IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
- BEGIN
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag
- )
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Legacy Site: ' + Legacy_Site_ID + ' did not match to legacy company ' + Legacy_Company_ID,
- -- 1
- --FROM #Import_Staging stag
- -- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_Address_RecID = stag.Company_Address_RecID) cad
- -- --OUTER APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = cad.Company_RecID AND comp.Company_RecID = stag.Company_RecID)comp
- --WHERE cad.Company_RecID <> stag.Company_RecID
- --UNION ALL
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Legacy contact: ' + Legacy_Contact_ID + ' did not match to legacy company ' + Legacy_Company_ID,
- -- 1
- --FROM #Import_Staging stag
- -- CROSS APPLY(SELECT TOP 1 * FROM dbo.Contact cont WHERE cont.Contact_RecID = stag.Contact_RecID) cont
- -- OUTER APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = cont.Company_RecID AND comp.Company_RecID = stag.Company_RecID)comp
- --WHERE cont.Contact_RecID IS NOT NULL
- -- AND comp.Company_RecID IS NULL
- --UNION ALL
- SELECT
- ExcelRowNumber,
- 'Record will be excluded from import - did not map to a company based on Legacy_Company_ID',
- 1
- FROM #Import_Staging stag
- WHERE Company_RecID IS NULL
- AND Legacy_Company_ID IS NOT NULL
- AND @Record_Type NOT IN('Company', 'Site')
- UNION ALL
- SELECT
- stag.ExcelRowNumber,
- 'Legacy_ID ' + Legacy_ID + ' appears more than once. Cannot be duplicate',
- 0
- FROM #Import_Staging stag
- WHERE @Record_Type NOT IN('Company', 'Site')
- AND EXISTS(SELECT 1 FROM #Import_Staging dup WHERE dup.Legacy_ID = stag.Legacy_ID AND dup.ExcelRowNumber <> stag.ExcelRowNumber)
- UNION ALL
- SELECT
- stag.ExcelRowNumber,
- 'Legacy_ID ' + stag.Legacy_ID + ' appears more than once. Cannot be duplicate',
- 0
- FROM #Import_Staging stag
- 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)
- AND @Record_Type = 'Company'
- END
- -- Auto-differential
- -- Exclude records which were not mapped to a company (Company deleted by partner)
- DELETE stag
- FROM #Import_Staging stag
- WHERE Company_RecID IS NULL
- AND Legacy_Company_ID IS NOT NULL
- AND @Record_Type NOT IN('Company', 'Site')
- -- Exclude sites already imported
- DELETE stag
- FROM #Import_Staging stag
- WHERE Company_Address_RecID IS NOT NULL
- AND @Record_Type = 'Site'
- -- If contact not specified, map to default contact (or oldest contact, if no default exists)
- UPDATE stag
- SET stag.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging stag
- 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
- WHERE stag.Contact_RecID IS NULL
- AND @Record_Type NOT IN('Contact', 'Company', 'Site')
- -- If no contact specified, and none exists, create a contact
- INSERT INTO dbo.Contact
- (
- Owner_ID,
- Company_RecID,
- Seq_Nbr,
- First_Name,
- Last_Name,
- Last_Update,
- Updated_By,
- Default_Flag
- )
- SELECT DISTINCT
- 1,
- stag.Company_RecID,
- 0,
- 'Imported',
- 'Contact',
- GETDATE(),
- 'Import',
- 0
- FROM #Import_Staging stag
- WHERE Company_RecID IS NOT NULL
- AND Contact_RecID IS NULL
- AND @Record_Type NOT IN('Contact', 'Company', 'Site')
- UPDATE stag
- SET stag.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging stag
- 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
- WHERE stag.Legacy_Contact_ID IS NULL
- AND @Record_Type NOT IN('Contact', 'Company', 'Site')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Import_Legacy_IDs')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Import_Legacy_IDs] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 07/30/2014
- -- Description: Insert legacy_id's for imported
- -- records, creates table for this purposes if needed
- -- Sample call: exec usp_Import_Legacy_IDs 'Ticket'
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_Import_Legacy_IDs]
- AS
- BEGIN
- -- Create table to hold legacy_id's
- IF OBJECT_ID('Import_Legacy_ID_Custom') IS NULL
- BEGIN
- CREATE TABLE dbo.Import_Legacy_ID_Custom
- (
- Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- CW_RecID INT,
- Record_Type NVARCHAR(255) COLLATE DATABASE_DEFAULT
- )
- END
- -- Insert Legacy_ID's from #Legacy_IDs
- INSERT INTO dbo.Import_Legacy_ID_Custom
- (
- Legacy_ID,
- CW_RecID,
- Record_Type
- )
- SELECT DISTINCT
- Legacy_ID,
- CW_RecID,
- Record_Type
- FROM #Legacy_IDs
- END
- GO
- IF OBJECT_ID('ufn_Prepare_Company_Name') IS NOT NULL
- BEGIN
- DROP FUNCTION ufn_Prepare_Company_Name
- END
- GO
- -- Function to strip company names of certain strings and symbols
- -- Allows for fuzzy matching to solve common errors with partner data entry (i.e. "ABC Company" vs. "ABC Company, Inc.")
- -- Fuzzy matching displays as a warning message for common sense check, and is only attempted if primary validation fails
- CREATE FUNCTION dbo.ufn_Prepare_Company_Name
- (
- @CompanyName NVARCHAR(100)
- )
- RETURNS NVARCHAR(100)
- AS
- BEGIN
- DECLARE @RetVal NVARCHAR(100)
- SELECT @RetVal = @CompanyName
- SELECT @RetVal = REPLACE(@RetVal, 'Incorporated', '')
- SELECT @RetVal = REPLACE(@RetVal, 'p/l', '')
- SELECT @RetVal = REPLACE(@RetVal, 'Corporation', '')
- SELECT @RetVal = REPLACE(@RetVal, '& Co', '')
- SELECT @RetVal = REPLACE(@RetVal, ', LP', '')
- SELECT @RetVal = REPLACE(@RetVal, 'l.p.', '')
- SELECT @RetVal = REPLACE(@RetVal, ' AND ', '')
- SELECT @RetVal = REPLACE(@RetVal, '&', '')
- SELECT @RetVal = REPLACE(@RetVal, '.', '')
- SELECT @RetVal = REPLACE(@RetVal, ' Inc', '')
- SELECT @RetVal = REPLACE(@RetVal, 'LLC', '')
- SELECT @RetVal = REPLACE(@RetVal, 'Corp', '')
- SELECT @RetVal = REPLACE(@RetVal, '-', '')
- SELECT @RetVal = REPLACE(@RetVal, ',', '')
- SELECT @RetVal = REPLACE(@RetVal, ' ', '')
- RETURN @RetVal
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.objects WHERE name = 'ufn_Import_Trim')
- BEGIN
- EXEC('CREATE FUNCTION dbo.ufn_Import_Trim() RETURNS INT BEGIN RETURN 1 END')
- END
- GO
- -- Function to trim spaces from referenced columns in CW, to correspond with trimmed values from spreadsheet
- ALTER FUNCTION dbo.ufn_Import_Trim(@string VARCHAR(MAX))
- RETURNS VARCHAR(MAX)
- BEGIN
- RETURN LTRIM(RTRIM(@string))
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.objects WHERE name = 'ufn_Import_Decode')
- BEGIN
- EXEC('CREATE FUNCTION dbo.ufn_Import_Decode() RETURNS INT BEGIN RETURN 1 END')
- END
- GO
- -- Function to decode delimiters in question/answer strings for configuration import
- ALTER FUNCTION dbo.ufn_Import_Decode(@string nvarchar(max))
- RETURNS nvarchar(max)
- AS
- BEGIN
- DECLARE @count int, @c char(1), @cenc char(2), @i int, @stringReturn nvarchar(max)
- SET @count = Len(@string)
- SET @i = 1
- SET @stringReturn = ''
- WHILE (@i <= @count)
- BEGIN
- SET @c = substring(@string, @i, 1)
- IF @c LIKE '[!%]' ESCAPE '!'
- BEGIN
- SET @cenc = substring(@string, @i + 1, 2)
- SET @c = CHAR(CASE WHEN SUBSTRING(@cenc, 1, 1) LIKE '[0-9]'
- THEN CAST(SUBSTRING(@cenc, 1, 1) as int)
- ELSE CAST(ASCII(UPPER(SUBSTRING(@cenc, 1, 1)))-55 as int)
- END * 16 +
- CASE WHEN SUBSTRING(@cenc, 2, 1) LIKE '[0-9]'
- THEN CAST(SUBSTRING(@cenc, 2, 1) as int)
- ELSE CAST(ASCII(UPPER(SUBSTRING(@cenc, 2, 1)))-55 as int)
- END)
- SET @stringReturn = @stringReturn + @c
- SET @i = @i + 2
- END
- ELSE
- BEGIN
- SET @stringReturn = @stringReturn + @c
- END
- SET @i = @i +1
- END
- RETURN @stringReturn
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Import_Match_Companies')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Import_Match_Companies] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 01/24/2014
- -- Description: Matches companies and contacts to values provided in import spreadsheet. Inserts contacts as necessary if force mode enabled
- -- Used for all imports to eliminate redundant logic.
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_Import_Match_Companies]
- @ForceMode BIT = 0,
- @ImportBatchUser VARCHAR(15)
- AS
- BEGIN
- SET NOCOUNT ON
- -- PSA does not allow spaces at beginning or end when saving a company or contact name or company id
- -- Trim any that exist (just in case) to make sure it is safe to ignore spaces throughout import
- IF EXISTS(SELECT TOP 1 * FROM dbo.Company WHERE Company_Name LIKE('% ') OR Company_Name LIKE(' %'))
- BEGIN
- UPDATE comp
- SET Company_Name = dbo.ufn_import_trim(Company_Name)
- FROM dbo.Company comp
- WHERE Company_Name LIKE('% ') OR Company_Name LIKE(' %')
- END
- IF EXISTS(SELECT TOP 1 * FROM dbo.Contact WHERE First_Name LIKE('% ') OR First_name LIKE(' %'))
- BEGIN
- UPDATE cont
- SET First_Name = dbo.ufn_import_trim(First_Name)
- FROM dbo.Contact cont
- WHERE First_Name LIKE('% ') OR First_Name LIKE(' %')
- END
- IF EXISTS(SELECT TOP 1 * FROM dbo.Contact WHERE Last_Name LIKE('% ') OR Last_name LIKE(' %'))
- BEGIN
- UPDATE cont
- SET Last_Name = dbo.ufn_import_trim(Last_Name)
- FROM dbo.Contact cont
- WHERE Last_Name LIKE('% ') OR Last_Name LIKE(' %')
- END
- -- Flag duplicate company names in company table
- UPDATE comp
- SET comp.Duplicate_Flag = 1
- FROM #Company comp
- WHERE comp.Company_Name IN
- (
- SELECT Company_Name
- FROM #Company
- GROUP BY Company_Name
- HAVING COUNT(*) > 1
- )
- -- Initialize duplicate flag to 0
- UPDATE #Import_Staging
- SET Company_Duplicate_Flag = 0
- -- Point any rows where Company_Name = '<Internal Company>' to the company specified in dbo.Owner
- UPDATE stag
- SET stag.Company_Name = comp.Company_Name
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Company_RecID FROM dbo.Owner) own
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = own.Company_RecID)comp
- WHERE stag.Company_Name = '<Internal Company>'
- IF OBJECT_ID('Import_Legacy_ID_Custom') IS NOT NULL
- BEGIN
- -- Use Legacy_Company_ID to grab Company_RecID
- UPDATE stag
- SET stag.Company_RecID = leg.CW_RecID,
- stag.Duplicate_Flag = 0
- FROM #Import_Staging stag
- CROSS APPLY(SELECT * FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_Company_ID AND leg.Record_Type = 'Company') leg
- -- Remove any rows where company has been deleted
- DELETE stag
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = stag.Company_RecID AND comp.Delete_Flag = 0)comp
- WHERE stag.Company_RecID IS NOT NULL
- AND stag.Company_RecID <> ''
- AND comp.Company_RecID IS NULL
- END
- -- Use company_name to grab Company_RecID
- UPDATE tmp
- SET tmp.Company_RecID = comp.Company_RecID,
- tmp.Company_Duplicate_Flag = comp.Duplicate_Flag
- FROM #Import_Staging tmp
- INNER JOIN #Company comp
- ON tmp.Company_Name = comp.Company_Name
- WHERE tmp.Company_RecID IS NULL
- -- If unique company not found on name, attempt to find by Company_ID
- UPDATE tmp
- SET tmp.Company_RecID = comp.Company_RecID,
- tmp.Company_Duplicate_Flag = 0
- FROM #Import_Staging tmp
- INNER JOIN #Company comp
- ON tmp.Company_Name = comp.Company_ID
- WHERE tmp.Company_RecID IS NULL
- OR tmp.Company_Duplicate_Flag = 1
- IF OBJECT_ID('tempdb..#DuplicateContacts') IS NOT NULL
- BEGIN
- DROP TABLE #DuplicateContacts
- END
- -- Table to hold duplicate contacts
- SELECT
- ContactName,
- comp.Company_Name
- INTO #DuplicateContacts
- FROM #Contact cont
- INNER JOIN #Company comp
- ON cont.Company_RecID = comp.Company_RecID
- GROUP BY Company_Name, ContactName, cont.Company_RecID
- HAVING COUNT(*) > 1
- -- Update Contact Name to null if single space or empty string
- UPDATE #Import_Staging
- SET ContactName = NULL
- WHERE LTRIM(RTRIM(ContactName)) = ''
- -- For duplicate companies, see if we can uniquely identify the company on combination of Company + Contact names
- UPDATE tmp
- SET tmp.Company_RecID = comp.Company_RecID,
- tmp.Contact_RecID = cont.Contact_RecID,
- tmp.Company_Duplicate_Flag = 0
- FROM #Import_Staging tmp
- INNER JOIN #Company comp
- ON comp.Company_Name = tmp.Company_Name
- INNER JOIN #Contact cont
- ON cont.ContactName = tmp.ContactName
- AND cont.Company_RecID = comp.Company_RecID
- LEFT OUTER JOIN #DuplicateContacts dups
- ON dups.ContactName = tmp.ContactName
- AND dups.Company_Name = tmp.Company_Name
- WHERE tmp.Company_Duplicate_Flag = 1
- AND dups.Company_Name IS NULL
- -- If company still not found, strip company names
- -- From staging table
- UPDATE tmp
- SET tmp.Company_Name_Stripped = dbo.ufn_Prepare_Company_Name(tmp.Company_Name)
- FROM #Import_Staging tmp
- INNER JOIN #Company comp
- ON comp.Company_Match_Val = tmp.Company_Match_Val
- WHERE tmp.Company_RecID IS NULL
- AND tmp.Company_Duplicate_Flag = 0
- -- And company Table
- UPDATE comp
- SET comp.Company_Name_Stripped = dbo.ufn_Prepare_Company_Name(comp.Company_Name)
- FROM #Company comp
- INNER JOIN #Import_Staging tmp
- ON comp.Company_Match_Val = tmp.Company_Match_Val
- AND tmp.Company_RecID IS NULL
- AND tmp.Company_Name_Stripped IS NOT NULL
- -- Attempt fuzzy match to locate any remaining companies
- UPDATE tmp
- SET tmp.Company_RecID = comp.Company_RecID,
- tmp.Company_Name_Fuzzy = comp.Company_Name
- FROM #Import_Staging tmp
- INNER JOIN #Company comp
- ON tmp.Company_Name_Stripped = comp.Company_Name_Stripped
- AND comp.Company_Name <> tmp.Company_Name
- AND comp.Duplicate_Flag = 0
- WHERE tmp.Company_RecID IS NULL
- AND tmp.Company_Duplicate_Flag = 0
- -- Get Contact_RecID if contact specified
- UPDATE tmp
- SET tmp.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging tmp
- INNER JOIN #Contact cont
- ON cont.Company_RecID = tmp.Company_RecID
- AND tmp.ContactName = cont.ContactName
- WHERE tmp.Contact_RecID IS NULL
- -- Get primary Contact_RecID if no contact specified
- UPDATE tmp
- SET tmp.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging tmp
- INNER JOIN #Contact cont
- ON cont.Company_RecID = tmp.Company_RecID
- AND cont.Default_Flag = 1
- WHERE tmp.ContactName IS NULL
- -- Update Contact Duplicate flag as necessary
- UPDATE tmp
- SET tmp.Contact_Duplicate_Flag = 1
- FROM #Import_Staging tmp
- INNER JOIN #Contact cont
- ON cont.Company_RecID = tmp.Company_RecID
- AND cont.ContactName = tmp.ContactName
- AND cont.Contact_RecID <> tmp.Contact_RecID
- WHERE tmp.Contact_RecID IS NOT NULL
- -- If contact is specified, but not found, try to fuzzy match on last name
- UPDATE tmp
- SET tmp.Contact_RecID = cont.Contact_RecID,
- tmp.Contact_Name_Fuzzy = cont.ContactName
- FROM #Import_Staging tmp
- INNER JOIN #Contact cont
- ON tmp.Company_RecID = cont.Company_RecID
- AND tmp.ContactName LIKE('%' + cont.Last_Name + '%')
- WHERE tmp.ContactName IS NOT NULL
- AND cont.Last_Name <> ''
- AND LEN(cont.Last_Name) > 3
- AND tmp.Contact_RecID IS NULL
- -- Company/Contact force mode
- IF @ForceMode = 1
- BEGIN
- -- If company or contact is duplicate, use first instance of company and tick duplicate flag to 0 to bypass validation
- UPDATE tmp
- SET tmp.Company_Duplicate_Flag = 0,
- tmp.Contact_Duplicate_Flag = 0
- FROM #Import_Staging tmp
- -- If no contact specified, and no default exists - attempt to assign to any contact
- UPDATE tmp
- SET tmp.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging tmp
- INNER JOIN #Contact cont
- ON cont.Company_RecID = tmp.Company_RecID
- WHERE tmp.Contact_RecID IS NULL
- AND (tmp.ContactName IS NULL OR tmp.ContactName = '')
- -- If no contact specified, and no contact exists for company, update contact to 'Imported Contact'
- UPDATE tmp
- SET tmp.ContactName = 'Imported Contact'
- FROM #Import_Staging tmp
- WHERE tmp.ContactName IS NULL
- AND tmp.Contact_recID IS NULL
- AND ISNULL(tmp.Company_Duplicate_Flag, 0) = 0
- AND tmp.Company_RecID IS NOT NULL
- -- Create contacts as necessary
- INSERT INTO dbo.Contact
- (
- Owner_ID,
- Company_RecID,
- Seq_Nbr,
- First_Name,
- Last_Name,
- Last_Update,
- Updated_By,
- Default_Flag
- )
- SELECT DISTINCT
- 1,
- comp.Company_RecID,
- 0,
- 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,
- LEFT(LTRIM(RTRIM(CASE WHEN tmp.ContactName LIKE('% %') THEN SUBSTRING(tmp.ContactName, CHARINDEX(' ', tmp.ContactName,1)+1, 30) ELSE '' END)), 30) AS Last_Name,
- GETDATE(),
- @ImportBatchUser,
- 0
- FROM #Import_Staging tmp
- INNER JOIN #Company comp
- ON comp.Company_RecID = tmp.Company_RecID
- WHERE tmp.Contact_RecID IS NULL
- AND tmp.ContactName IS NOT NULL
- AND tmp.ContactName NOT LIKE('_ %')
- INSERT INTO dbo.Contact
- (
- Owner_ID,
- Company_RecID,
- Seq_Nbr,
- First_Name,
- Last_Name,
- Last_Update,
- Updated_By,
- Default_Flag
- )
- SELECT DISTINCT
- 1,
- comp.Company_RecID,
- 0,
- LEFT(ContactName, 1) AS First_Name,
- SUBSTRING(ContactName, 3, 30) AS Last_Name,
- GETDATE(),
- @ImportBatchUser,
- 0
- FROM #Import_Staging tmp
- INNER JOIN #Company comp
- ON comp.Company_RecID = tmp.Company_RecID
- WHERE tmp.Contact_RecID IS NULL
- AND tmp.ContactName IS NOT NULL
- AND tmp.ContactName LIKE('_ %')
- -- Add newly inserted contacts to #Contact
- INSERT INTO #Contact
- (
- Contact_RecID,
- ContactName,
- First_Name,
- Last_Name,
- Company_RecID,
- Default_Flag
- )
- SELECT
- cont.Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- FROM dbo.Contact cont
- WHERE Updated_By = @ImportBatchUser
- -- Update staging table with RecID of newly inserted contacts
- UPDATE tmp
- SET tmp.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging tmp
- INNER JOIN #Contact cont
- ON tmp.ContactName = cont.ContactName
- AND tmp.Company_RecID = cont.Company_RecID
- WHERE tmp.Contact_RecID IS NULL
- END
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Condense_Validation_Results')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Condense_Validation_Results] AS SELECT 1')
- END
- GO
- ALTER PROCEDURE [dbo].[usp_Condense_Validation_Results]
- AS
- BEGIN
- IF OBJECT_ID('tempdb..#Results_Staging') IS NOT NULL
- DROP TABLE #Results_Staging
- SELECT ValMsg, RowNumber, RowNumber+1 AS Next_Row, RowNumber-1 AS Prev_Row, ReferenceType
- INTO #Results_Staging
- FROM #tblResults
- CREATE INDEX IX_Next ON #Results_Staging(ValMsg, Next_Row)
- CREATE INDEX IX_Curr ON #Results_Staging(ValMsg, RowNumber)
- CREATE INDEX IX_Prev ON #Results_Staging(ValMsg, Prev_Row)
- IF OBJECT_ID('tempdb..#StartEnd') IS NOT NULL
- BEGIN
- DROP TABLE #StartEnd
- END
- IF OBJECT_ID('tempdb..#StartEnd') IS NOT NULL
- BEGIN
- DROP TABLE #StartEnd
- END
- SELECT
- RowNumber,
- 1 AS StartRange,
- 1 AS EndRange,
- ValMsg
- INTO #StartEnd
- FROM #Results_Staging curr
- WHERE NOT EXISTS(SELECT TOP 1 * FROM #Results_Staging prev WHERE prev.RowNumber = curr.Prev_Row AND prev.ValMsg = curr.ValMsg)
- AND NOT EXISTS(SELECT TOP 1 * FROM #Results_Staging nxt WHERE nxt.RowNumber = curr.Next_Row AND nxt.ValMsg = curr.ValMsg)
- AND curr.ReferenceType IS NULL
- UNION ALL
- SELECT
- RowNumber,
- 0 AS StartRange,
- 1 AS EndRange,
- ValMsg
- FROM #Results_Staging curr
- WHERE EXISTS(SELECT TOP 1 * FROM #Results_Staging prev WHERE prev.RowNumber = curr.Prev_Row AND prev.ValMsg = curr.ValMsg)
- AND NOT EXISTS(SELECT TOP 1 * FROM #Results_Staging nxt WHERE nxt.RowNumber = curr.Next_Row AND nxt.ValMsg = curr.ValMsg)
- AND curr.ReferenceType IS NULL
- UNION ALL
- SELECT
- RowNumber,
- 1 AS StartRange,
- 0 AS EndRange,
- ValMsg
- FROM #Results_Staging curr
- WHERE NOT EXISTS(SELECT TOP 1 * FROM #Results_Staging prev WHERE prev.RowNumber = curr.Prev_Row AND prev.ValMsg = curr.ValMsg)
- AND EXISTS(SELECT TOP 1 * FROM #Results_Staging nxt WHERE nxt.RowNumber = curr.Next_Row AND nxt.ValMsg = curr.ValMsg)
- AND curr.ReferenceType IS NULL
- UNION ALL
- SELECT
- RowNumber,
- 0 AS StartRange,
- 0 AS EndRange,
- ValMsg
- FROM #Results_Staging curr
- WHERE EXISTS(SELECT TOP 1 * FROM #Results_Staging prev WHERE prev.RowNumber = curr.Prev_Row AND prev.ValMsg = curr.ValMsg)
- AND EXISTS(SELECT TOP 1 * FROM #Results_Staging nxt WHERE nxt.RowNumber = curr.Next_Row AND nxt.ValMsg = curr.ValMsg)
- AND curr.ReferenceType IS NULL
- CREATE INDEX IX_Cover ON #StartEnd(RowNumber, ValMsg, EndRange)
- IF OBJECT_ID('tempdb..#Ranges') IS NOT NULL
- BEGIN
- DROP TABLE #Ranges
- END
- 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
- INTO #Ranges
- FROM #StartEnd r1
- 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
- GROUP BY er.EndNum, r1.ValMsg
- ORDER BY MIN(r1.RowNumber) ASC
- INSERT INTO #ResultsCondensed
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- [ValMsg] + ' on row(s): ' +
- STUFF((
- SELECT ', ' + CAST(RowRange AS NVARCHAR(MAX))
- FROM #Ranges WHERE (ValMsg = Results.ValMsg) ORDER BY StartRow ASC
- FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
- ,1,2,'') AS NameValues
- FROM #Ranges Results
- GROUP BY ValMsg
- END
- GO
- -- Service ticket
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_SR_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_SR_ImportValidate] AS SELECT 1')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_SR_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_SR_ImportPush] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 03/14/2013
- -- Description: Validates data in temp table
- -- tempdb.dbo.TMP_SR_Conversion - for Service
- -- Ticket Import
- -- Sample call: EXEC usp_SR_ImportValidate 'TMP_Import_d87ef5f6d26a43a0aff96bfca8882ad2', 'TMP_Time_d87ef5f6d26a43a0aff96bfca8882ad2', 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_SR_ImportValidate]
- @TableName VARCHAR(255),
- @TETableName VARCHAR(255) = NULL,
- @ForceMode BIT = 0
- AS
- BEGIN TRY
- SET NOCOUNT ON
- -- Handle instance where front end passes string 'Null' for @TETableName
- IF @TETableName = 'NULL'
- BEGIN
- SET @TETableName = NULL
- END
- -- Variable declaration
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source tables
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- DECLARE @TESourceTable VARCHAR(300)
- SELECT @TESourceTable = 'tempdb.dbo.' + @TETableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- DECLARE
- @ImportBatchUser VARCHAR(15), -- Unique value to identify records created by this import
- @Billing_Unit_Loc_RecID INT, -- RecID from Billing_Unit_Loc to associate with Archive service boards created in force mode
- @Migration_Flag BIT -- Indicates a canned data migration (i.e. Autotask/Tigerpaw)
- SELECT @Migration_Flag = 0
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
- BEGIN
- DROP TABLE #tblResults
- END
- -- Table to hold results of procedure
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
- InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Warning_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- -- Table to hold source data for this batch from temp table
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT NOT NULL,
- BoardName nvarchar(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Name nvarchar(50) COLLATE DATABASE_DEFAULT NULL,
- ContactName varchar(100) COLLATE DATABASE_DEFAULT NULL,
- SR_Board_RecID int NULL,
- SrStatus varchar(50) COLLATE DATABASE_DEFAULT NULL,
- SrType varchar(50) COLLATE DATABASE_DEFAULT NULL,
- SrSubType varchar(50) COLLATE DATABASE_DEFAULT NULL,
- SrItem varchar(50) COLLATE DATABASE_DEFAULT NULL,
- SrSource varchar(50) COLLATE DATABASE_DEFAULT NULL,
- SrLocation varchar(50) COLLATE DATABASE_DEFAULT NULL,
- SrPriority varchar(50) COLLATE DATABASE_DEFAULT NULL,
- Summary varchar(100) COLLATE DATABASE_DEFAULT NULL,
- DetailDescription nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- InternalAnalysis nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- Resolution nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- AssignedBy varchar(100) COLLATE DATABASE_DEFAULT NULL,
- DateEntered VARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- DateCompleted VARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- ConfigName varchar(100) COLLATE DATABASE_DEFAULT NULL,
- ResourceMember varchar(100) COLLATE DATABASE_DEFAULT NULL,
- NewSrRecid int NULL,
- ConvertMessage varchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Config_RecID INT NULL,
- Legacy_ID VARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Legacy_Site_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Company_RecID INT NULL,
- Company_Name_Stripped NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_RecID INT NULL,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Company_Match_Val NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- SR_Type_RecID INT,
- SR_SubType_RecID INT,
- SR_SubtypeItem_RecID INT,
- Diff_Exclude_Flag BIT,
- Company_Address_RecID INT,
- Legacy_Ticket_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- SR_Service_RecID INT,
- Legacy_Opp_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- SO_Opportunity_RecID INT,
- Duplicate_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_BoardName ON #Import_Staging(BoardName)
- CREATE INDEX IX_SrStatus ON #Import_Staging(SrStatus)
- CREATE INDEX IX_SrType ON #Import_Staging(SrType)
- CREATE INDEX IX_SrSubType ON #Import_Staging(SrSubtype)
- CREATE INDEX IX_SrItem ON #Import_Staging(SrItem)
- CREATE INDEX IX_SrSource ON #Import_Staging(SrSource)
- CREATE INDEX IX_SrLocation ON #Import_Staging(SrLocation)
- CREATE INDEX IX_SrPriority ON #Import_Staging(SrPriority)
- CREATE INDEX IX_AssignedBy ON #Import_Staging(AssignedBy)
- CREATE INDEX IX_ConfigName ON #Import_Staging(ConfigName)
- CREATE INDEX IX_ResourceMember ON #Import_Staging(ResourceMember)
- CREATE INDEX IX_Comp_Leg ON #Import_Staging(Legacy_Company_ID)
- CREATE INDEX IX_Cont_Leg ON #Import_Staging(Legacy_Contact_ID)
- -- Add Legacy_ID field to staging table to avoid any compilation errors based on structure
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Legacy_Company_ID field to staging table to avoid any compilation errors based on structure
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Company_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Legacy_Contact_ID field to staging table to avoid any compilation errors based on structure
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Contact_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'Service Board'
- UNION ALL
- SELECT 'Company Name'
- UNION ALL
- SELECT 'Contact Name'
- UNION ALL
- SELECT 'Service Status'
- UNION ALL
- SELECT 'Service Type'
- UNION ALL
- SELECT 'Service Subtype'
- UNION ALL
- SELECT 'Service Item'
- UNION ALL
- SELECT 'Service Source'
- UNION ALL
- SELECT 'Service Location'
- UNION ALL
- SELECT 'Service Priority'
- UNION ALL
- SELECT 'Summary'
- UNION ALL
- SELECT 'Detail Description'
- UNION ALL
- SELECT 'Internal Analysis'
- UNION ALL
- SELECT 'Resolution'
- UNION ALL
- SELECT 'Assigned By'
- UNION ALL
- SELECT 'Date Entered'
- UNION ALL
- SELECT 'Date Completed'
- UNION ALL
- SELECT 'Configuration Name'
- UNION ALL
- SELECT 'Resource Member'
- UNION ALL
- SELECT 'Legacy_ID'
- UNION ALL
- SELECT 'Legacy_Company_ID'
- UNION ALL
- SELECT 'Legacy_Contact_ID'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- -- If a column is missing, stop here and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 0 AS ValPassed,
- RowNumber,
- ValMsg
- FROM #tblResults
- ORDER BY RowNumber, ValMsg
- RETURN
- END
- -- Build statement to populate validation temp table
- SELECT @DSQL = '
- INSERT INTO #Import_Staging WITH(TABLOCK)
- (
- ExcelRowNumber,
- BoardName,
- Company_Name,
- ContactName,
- SrStatus,
- SrType,
- SrSubType,
- SrItem,
- SrSource,
- SrLocation,
- SrPriority,
- Summary,
- DetailDescription,
- InternalAnalysis,
- Resolution,
- AssignedBy,
- DateEntered,
- DateCompleted,
- ConfigName,
- ResourceMember,
- Company_Match_Val,
- Legacy_ID,
- Legacy_Company_ID,
- Legacy_Contact_ID
- )
- SELECT
- [Excel Row Number],
- LEFT([Service Board], 50),
- LEFT([Company Name], 50),
- LEFT([Contact Name], 100),
- LEFT([Service Status], 50),
- LEFT([Service Type], 50),
- LEFT([Service Subtype], 50),
- LEFT([Service Item], 50),
- LEFT([Service Source], 50),
- LEFT([Service Location], 50),
- LEFT([Service Priority], 50),
- LEFT([Summary], 100),
- [Detail Description],
- [Internal Analysis],
- [Resolution],
- LEFT([Assigned By], 100),
- LEFT([Date Entered], 100),
- LEFT([Date Completed], 100),
- LEFT([Configuration Name], 100),
- LEFT([Resource Member], 100),
- LEFT([Company Name], 3),
- Legacy_ID,
- Legacy_Company_ID,
- Legacy_Contact_ID
- FROM ' + @SourceTable
- -- Pull data into validation temp table
- EXEC(@DSQL)
- BEGIN TRANSACTION SR_Validate
- -- Table to hold time entries for insert
- IF OBJECT_ID('tempdb..#TMP_Time_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #TMP_Time_Staging
- END
- CREATE TABLE #TMP_Time_Staging
- (
- Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- ExcelRowNumber INT,
- First_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Last_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Num_Hours FLOAT,
- Hours_Bill FLOAT,
- Date_Start NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Date_End NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Billable INT,
- Notes NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Note_Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Member_RecID INT,
- Member_ID VARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Created_By NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- RecID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Time_RecID INT,
- SR_Detail_RecID INT,
- Company_RecID INT,
- SR_Service_RecID INT,
- Member_ID_Calculated VARCHAR(100) COLLATE DATABASE_DEFAULT
- )
- IF @TETableName IS NOT NULL
- BEGIN
- SELECT @DSQL =
- '
- INSERT INTO #TMP_Time_Staging WITH(TABLOCK)
- (
- Legacy_Ticket_ID,
- ExcelRowNumber,
- First_Name,
- Last_Name,
- Date_Start,
- Date_End,
- Billable,
- Notes,
- Num_Hours,
- Hours_Bill,
- Note_Type
- )
- SELECT
- [Legacy_Ticket_ID],
- [Excel Row Number],
- [Resource First Name],
- [Resource Last Name],
- [Date Start],
- [Date End],
- [Billable Flag],
- NULL,
- [Total Hours],
- [Hours Bill],
- [Note Type]
- FROM ' + @TESourceTable + '
- WHERE [Hours Bill] NOT LIKE ''CONNECTWISE%'''
- EXEC (@DSQL)
- END
- -- Convert empty string and single space to null in temp table
- -- So that nulls may be properly handled throughout procedure
- UPDATE #Import_Staging
- SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- BoardName = CASE WHEN BoardName IN('', ' ') THEN NULL ELSE BoardName END,
- Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
- ContactName = CASE WHEN ContactName IN('', ' ') THEN NULL ELSE ContactName END,
- SR_Board_RecID = CASE WHEN SR_Board_RecID IN('', ' ') THEN NULL ELSE SR_Board_RecID END,
- SrStatus = CASE WHEN SrStatus IN('', ' ') THEN NULL ELSE SrStatus END,
- SrType = CASE WHEN SrType IN('', ' ') THEN NULL ELSE SrType END,
- SrSubType = CASE WHEN SrSubType IN('', ' ') THEN NULL ELSE SrSubType END,
- SrItem = CASE WHEN SrItem IN('', ' ') THEN NULL ELSE SrItem END,
- SrSource = CASE WHEN SrSource IN('', ' ') THEN NULL ELSE SrSource END,
- SrLocation = CASE WHEN SrLocation IN('', ' ') THEN NULL ELSE SrLocation END,
- SrPriority = CASE WHEN SrPriority IN('', ' ') THEN NULL ELSE SrPriority END,
- Summary = CASE WHEN Summary IN('', ' ') THEN NULL ELSE Summary END,
- DetailDescription = CASE WHEN DetailDescription IN('', ' ') THEN NULL ELSE DetailDescription END,
- InternalAnalysis = CASE WHEN InternalAnalysis IN('', ' ') THEN NULL ELSE InternalAnalysis END,
- Resolution = CASE WHEN Resolution IN('', ' ') THEN NULL ELSE Resolution END,
- AssignedBy = CASE WHEN AssignedBy IN('', ' ') THEN NULL ELSE AssignedBy END,
- DateEntered = CASE WHEN DateEntered IN('', ' ') THEN NULL ELSE DateEntered END,
- DateCompleted = CASE WHEN DateCompleted IN('', ' ', '01/01/1900', '1900-01-01') THEN NULL ELSE DateCompleted END,
- ConfigName = CASE WHEN ConfigName IN('', ' ') THEN NULL ELSE ConfigName END,
- ResourceMember = CASE WHEN ResourceMember IN('', ' ') THEN NULL ELSE ResourceMember END,
- NewSrRecid = CASE WHEN NewSrRecid IN('', ' ') THEN NULL ELSE NewSrRecid END,
- ConvertMessage = CASE WHEN ConvertMessage IN('', ' ') THEN NULL ELSE ConvertMessage END,
- Config_RecID = CASE WHEN Config_RecID IN('', ' ') THEN NULL ELSE Config_RecID END,
- Company_RecID = CASE WHEN Company_RecID IN('', ' ') THEN NULL ELSE Company_RecID END,
- Legacy_ID = CASE WHEN Legacy_ID IN('', ' ') THEN NULL ELSE Legacy_ID END
- -- Update Source table to AssignedBy = zAdmin for records where it does not exist
- UPDATE #Import_Staging
- SET AssignedBy = 'zAdmin'
- WHERE AssignedBy IS NULL
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Ticket'
- END
- ELSE
- BEGIN
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT DISTINCT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE Delete_Flag = 0
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- INNER JOIN #Company comp
- ON comp.Company_RecID = cont.Company_RecID
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- END
- -- Update each record with SR_Board_RecID
- UPDATE tmp
- SET tmp.SR_Board_RecID = srb.SR_Board_RecID
- FROM SR_Board srb
- INNER JOIN #Import_Staging tmp
- ON tmp.BoardName = srb.Board_Name
- UPDATE stag
- SET stag.Member_ID_Calculated = SUBSTRING(ISNULL(stag.First_Name, ''), 1, 1) + ISNULL(stag.Last_Name, '')
- FROM #TMP_Time_Staging stag
- -- Get Member_RecID, Member_ID for records in #TMP_Time_Staging
- UPDATE ti
- SET ti.Member_RecID = mem.Member_RecID,
- ti.Member_ID = mem.Member_ID
- FROM #TMP_Time_Staging ti
- INNER JOIN dbo.Member mem
- ON (mem.First_Name = ti.First_Name AND mem.Last_Name = ti.Last_Name)
- OR ti.Member_ID_Calculated = mem.Member_ID
- -- If member not found, update time entries to map to zAdmin
- UPDATE ti
- SET ti.Member_RecID = mem.Member_RecID,
- ti.Member_ID = mem.Member_ID
- FROM #TMP_Time_Staging ti
- INNER JOIN dbo.Member mem
- ON mem.Member_ID = 'zAdmin'
- WHERE ti.Member_ID IS NULL
- -- Format dates as mm/dd/yyyy
- UPDATE tmp
- SET DateCompleted = CONVERT(VARCHAR, CAST(DateCompleted AS DATETIME), 101)
- FROM #Import_Staging tmp
- WHERE ISDATE(DateCompleted) = 1
- UPDATE tmp
- SET DateEntered = CONVERT(VARCHAR, CAST(DateEntered AS DATETIME), 101)
- FROM #Import_Staging tmp
- WHERE ISDATE(DateEntered) = 1
- -- Update Date fields to NULL if 1900-01-01
- UPDATE #Import_Staging
- SET DateCompleted = NULL
- WHERE DateCompleted = '1/1/1900'
- UPDATE #Import_Staging
- SET DateEntered = NULL
- WHERE DateEntered IN ('1/1/1900', '1900-01-01')
- -- Grab defaults for optional fields (Location, Source, Priority)
- UPDATE tmp
- SET tmp.SrLocation = srl.DefaultLocation
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 [Description] AS DefaultLocation FROM SR_Location WHERE Default_Flag = 1) srl
- WHERE tmp.SrLocation IS NULL
- UPDATE tmp
- SET tmp.SrSource = src.DefaultSource
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 [Description] AS DefaultSource FROM SR_Source WHERE Default_Flag = 1) src
- WHERE tmp.SrSource IS NULL
- UPDATE tmp
- SET tmp.SrPriority = pri.DefaultPriority
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 [Description] AS DefaultPriority FROM SR_Urgency WHERE Default_Flag = 1) pri
- WHERE tmp.SrPriority IS NULL
- -- Get SR_Type_RecID
- UPDATE tmp
- SET tmp.SR_Type_RecID = srt.SR_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN SR_Type srt
- ON srt.Inactive_Flag = 0
- AND srt.[Description] = tmp.SrType
- AND srt.SR_Board_RecID = tmp.SR_Board_RecID
- -- Get SR_Subtype_RecID
- UPDATE tmp
- SET tmp.SR_Subtype_RecID = srs.SR_Subtype_RecID
- FROM #Import_Staging tmp
- 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
- WHERE tmp.SrSubType IS NOT NULL
- AND tmp.SrSubType <> ''
- -- Get SR_SubtypeItem_RecID
- UPDATE tmp
- SET tmp.SR_SubtypeItem_RecID = sti.SR_SubtypeItem_RecID
- FROM #Import_Staging tmp
- 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
- -- If force enabled, create references that don't match up
- IF @ForceMode = 1
- BEGIN
- -- Eliminate header row
- DELETE FROM #Import_Staging
- WHERE SrSource = 'CONNECTWISE' AND SrPriority = 'CONNECTWISE'
- -- Set data migration mode to 1
- SET @Migration_Flag = 1
- -- Find an appropriate location & billing unit for archive board
- ;WITH BU_LOC_FIND AS
- (
- SELECT bul.Billing_Unit_Loc_RecID, Board_Name, Autoclose_Status_RecID, EC_ReOpen_Status, bu.[Description] AS Billing_Unit, ol.[Description] AS Owner_Level
- FROM Billing_Unit_Loc bul
- LEFT OUTER JOIN SR_Board board
- ON board.Billing_Unit_RecID = bul.Billing_Unit_RecID
- AND board.Owner_Level_RecID = bul.Owner_Level_RecID
- INNER JOIN Owner_Level ol
- ON bul.Owner_Level_RecID = ol.Owner_Level_RecID
- INNER JOIN Billing_Unit bu
- ON bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
- )
- SELECT @Billing_Unit_Loc_RecID =
- CASE
- WHEN EXISTS(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Owner_Level = 'CW_Migration')
- THEN (SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Owner_Level = 'CW_Migration')
- 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'))
- 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'))
- WHEN EXISTS(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE EC_ReOpen_Status IS NOT NULL)
- THEN(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE EC_ReOpen_Status IS NOT NULL)
- ELSE
- (SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Board_Name IS NOT NULL)
- END
- -- Insert service board
- INSERT INTO SR_Board
- (
- Board_Name,
- Owner_Level_Recid,
- Billing_Unit_Recid,
- Board_Icon,
- Billcomplete_Flag,
- Billsr_Flag,
- Billunapp_Flag,
- Override_Flag,
- Dispatch,
- Servicemanager,
- Dutymanager,
- Activity_Class_Recid,
- Activity_Type_Recid,
- Timebillable_Flag,
- Expbillable_Flag,
- Prodbillable_Flag,
- Timeinvoice_Flag,
- Expinvoice_Flag,
- Prodinvoice_Flag,
- Updated_By,
- Last_Update,
- Autoclose_Status_Recid,
- Autoassignnew_Flag,
- Autoassignec_Flag,
- Autoassignportal_Flag,
- Sr_Signoff_Recid,
- Ec_Reopen_Status,
- Project_Flag,
- Emailcontact_Flag,
- Emailresource_Flag,
- Lockdesc_Flag,
- Sr_Problem_Flag,
- Additionslocktime_Flag,
- Oncall,
- Default_Notify_From,
- Sr_Resolution_Flag,
- Sr_Internalanalysis_Flag,
- Te_Problem_Flag,
- Te_Resolution_Flag,
- Te_Internalanalysis_Flag,
- Problem_Sort,
- Resolution_Sort,
- Internalanalysis_Sort,
- Emailcontact_Template_Recid,
- Emailresource_Template_Recid,
- Inactive_Flag,
- Display_Name,
- Ec_Reopen_Resources_Flag,
- Ec_Company_Match_Flag,
- Ec_Reopen_Days_Flag,
- Ec_Reopen_Days,
- Member_Display_Name_Flag
- )
- SELECT DISTINCT
- tmp.BoardName,
- bul.Owner_Level_RecID,
- bul.Billing_Unit_RecID,
- '',
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ISNULL(srb.Activity_Class_RecID, ac.Activity_Class_RecID),
- aty.Activity_Type_RecID,
- 1,
- 0,
- 0,
- 0,
- 0,
- 0,
- @ImportBatchUser,
- GETDATE(),
- 0,
- 0,
- 0,
- 0,
- 0,
- NULL,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 'A',
- 'A',
- 'A',
- 0,
- 0,
- 0,
- '',
- 0,
- 0,
- 0,
- 0,
- 0
- FROM #Import_Staging tmp
- OUTER APPLY(SELECT TOP 1 * FROM Billing_Unit_Loc bul WHERE bul.Billing_Unit_Loc_RecID = @Billing_Unit_Loc_RecID) bul
- OUTER APPLY(SELECT TOP 1 Activity_Class_RecID FROM dbo.SR_Board srb WHERE srb.Activity_Class_RecID > 0)srb
- OUTER APPLY(SELECT TOP 1 Activity_Class_RecID FROM Activity_Class)ac
- OUTER APPLY(SELECT TOP 1 Activity_Type_RecID FROM dbo.Activity_Type aty ORDER BY aty.Default_Flag DESC)aty
- WHERE tmp.SR_Board_RecID IS NULL
- -- Create default service teams for inserted boards boards
- INSERT INTO SR_Team
- (
- Owner_ID,
- [Description],
- Member_RecID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- Default_Flag,
- Updated_By,
- Last_Update,
- SR_Board_RecID,
- DeleteNotify_Flag
- )
- SELECT DISTINCT
- 1,
- LEFT(tmp.BoardName + ' Team', 30),
- mem.Member_RecID,
- bul.Owner_Level_RecID,
- bul.Billing_Unit_RecID,
- 1,
- @ImportBatchUser,
- GETDATE(),
- srb.SR_Board_RecID,
- 0
- FROM #Import_Staging tmp
- INNER JOIN dbo.Billing_Unit_Loc bul
- ON bul.Billing_Unit_Loc_RecID = @Billing_Unit_Loc_RecID
- INNER JOIN dbo.Member mem
- ON mem.Member_ID = 'zAdmin'
- INNER JOIN SR_Board srb
- ON srb.Board_Name = tmp.BoardName
- AND srb.Updated_By = @ImportBatchUser
- -- Update each record with SR_Board_RecID
- UPDATE tmp
- SET tmp.SR_Board_RecID = srb.SR_Board_RecID
- FROM SR_Board srb
- INNER JOIN #Import_Staging tmp
- ON tmp.BoardName = srb.Board_Name
- WHERE dbo.ufn_Import_Trim(srb.Board_Name) = tmp.BoardName
- -- Service Priority
- INSERT INTO dbo.SR_Urgency WITH(TABLOCK)
- (
- Owner_ID,
- Color,
- Image_Link,
- [Description],
- Sort_Order,
- Default_Flag,
- Updated_By,
- Response_Hours
- )
- SELECT DISTINCT
- 1,
- 'White',
- '.../../common/images/infoIcons/urgencyColors/White.gif',
- tmp.SrPriority,
- 0,
- 0,
- @ImportBatchUser,
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN dbo.SR_Urgency sru
- ON sru.[Description] = tmp.SrPriority
- WHERE tmp.SrPriority IS NOT NULL
- AND sru.SR_Urgency_RecID IS NULL
- AND tmp.SrPriority NOT IN('', ' ')
- -- table to Force compilation regardless of structure
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- CREATE TABLE #Force_Compile
- (
- Column_Name VARCHAR(20)
- )
- IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_by' AND OBJECT_NAME(OBJECT_ID) = 'SR_Source')
- BEGIN
- -- Service Source
- INSERT INTO SR_Source
- (
- Owner_ID,
- [Description],
- Updated_By,
- Last_Update,
- Default_Flag,
- Entered_By
- )
- SELECT DISTINCT
- 1,
- tmp.SrSource,
- @ImportBatchUser,
- GETDATE(),
- 0,
- 'zAdmin'
- FROM #Import_Staging tmp
- OUTER APPLY(SELECT TOP 1 * FROM SR_Source srs WHERE srs.[Description] = tmp.SrSource)srs
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- WHERE tmp.SrSource IS NOT NULL
- AND srs.SR_Source_RecID IS NULL
- AND tmp.SrSource NOT IN('', ' ')
- END
- IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_by' AND OBJECT_NAME(OBJECT_ID) = 'SR_Source')
- BEGIN
- -- Service Source
- INSERT INTO SR_Source
- (
- Owner_ID,
- [Description],
- Updated_By,
- Last_Update,
- Default_Flag
- )
- SELECT DISTINCT
- 1,
- tmp.SrSource,
- @ImportBatchUser,
- GETDATE(),
- 0
- FROM #Import_Staging tmp
- OUTER APPLY(SELECT TOP 1 * FROM SR_Source srs WHERE srs.[Description] = tmp.SrSource)srs
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- WHERE tmp.SrSource IS NOT NULL
- AND srs.SR_Source_RecID IS NULL
- AND tmp.SrSource NOT IN('', ' ')
- END
- -- Service Status
- INSERT INTO dbo.SR_Status
- (
- Owner_ID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- [Description],
- Default_Flag,
- Sort_Order,
- Board_Flag,
- Closed_Flag,
- No_Time_Flag,
- Updated_By,
- Resolved_Flag,
- NoEscalation_Flag,
- Escalation_Level,
- SR_Board_RecID,
- Customer_Portal_Flag,
- Inactive_Flag,
- Long_Description
- )
- SELECT DISTINCT
- 1,
- srb.Owner_Level_RecID,
- srb.Billing_Unit_RecID,
- REPLACE(tmp.SrStatus, '<x>', ''),
- 0,
- 0,
- 1,
- CASE WHEN SrStatus LIKE('<x>%') THEN 1 ELSE 0 END,
- 0,
- @ImportBatchUser,
- 0,
- 1,
- 0,
- tmp.SR_Board_RecID,
- 0,
- 0,
- 'Status ' + tmp.SrStatus + ' created by import utility with default values. Adjust as necessary.'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Status srs
- ON srs.[Description] = REPLACE(tmp.SrStatus, '<x>', '')
- AND srs.SR_Board_RecID = tmp.SR_Board_RecID
- INNER JOIN SR_Board srb
- ON srb.SR_Board_RecID = tmp.SR_Board_RecID
- WHERE tmp.SrStatus IS NOT NULL
- AND srs.SR_Status_RecID IS NULL
- -- Exclude records where board not specified
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrStatus NOT IN('', ' ')
- UPDATE tmp
- SET tmp.SrStatus = REPLACE(tmp.SrStatus, '<x>', '')
- FROM #Import_Staging tmp
- -- If generated status is '>Archived' - make it a 'Closed' status (for custom migrations)
- UPDATE SR_Status
- SET Closed_Flag = 1,
- No_Time_Flag = 1
- WHERE [Description] = '>Archived'
- AND Updated_By = @ImportBatchUser
- -- Service Type
- INSERT INTO dbo.SR_Type
- (
- Owner_ID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- [Description],
- Updated_By,
- Default_Flag,
- ActiveType,
- SR_Board_RecID,
- Inactive_Flag,
- RFC_Flag
- )
- SELECT DISTINCT
- 1,
- srb.Owner_Level_RecID,
- srb.Billing_Unit_RecID,
- tmp.SrType,
- @ImportBatchUser,
- 0,
- 'R',
- tmp.SR_Board_RecID,
- 0,
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Type srt
- ON srt.[Description] = tmp.SrType
- AND srt.SR_Board_RecID = tmp.SR_Board_RecID
- INNER JOIN SR_Board srb
- ON srb.SR_Board_RecID = tmp.SR_Board_RecID
- WHERE srt.SR_Type_RecID IS NULL
- AND tmp.SrType IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrType NOT IN('', ' ')
- UPDATE stag
- SET stag.SR_Type_RecID = srt.SR_Type_RecID
- FROM #Import_Staging stag
- 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
- WHERE stag.SR_Type_RecID IS NULL
- -- Service Subtype
- -- Insert new subtype only if not duplicate on Description and SR_Board_RecID
- INSERT INTO dbo.SR_SubType
- (
- [Description],
- SR_Board_RecID,
- Updated_By,
- Last_Update,
- Inactive_Flag
- )
- SELECT DISTINCT
- tmp.SRSubtype,
- tmp.SR_Board_RecID,
- @ImportBatchUser,
- GETDATE(),
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN dbo.SR_Subtype srst
- ON srst.SR_Board_RecID = tmp.SR_Board_RecID
- AND tmp.SRSubtype = srst.[Description]
- WHERE srst.SR_SubType_RecID IS NULL
- AND tmp.SRSubtype NOT IN('', ' ')
- AND tmp.SRSubtype IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrType IS NOT NULL
- UPDATE stag
- SET stag.SR_SubType_RecID = srs.SR_SubType_RecID
- FROM #Import_Staging stag
- 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
- WHERE stag.SR_SubType_RecID IS NULL
- -- Insert new Subtype Item only if not duplicate on Description and SR_Board_RecID
- INSERT INTO dbo.SR_SubtypeItem
- (
- [Description],
- SR_Board_RecID,
- Updated_By,
- Last_Update,
- Inactive_Flag
- )
- SELECT DISTINCT
- tmp.SrItem,
- tmp.SR_Board_RecID,
- @ImportBatchUser,
- GETDATE(),
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_SubtypeItem sti
- ON tmp.SrItem = sti.[Description]
- AND tmp.SR_Board_RecID = sti.SR_Board_RecID
- WHERE sti.SR_SubtypeItem_RecID IS NULL
- AND tmp.SrItem NOT IN('', ' ')
- AND tmp.SRSubtype IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrType IS NOT NULL
- -- Get SR_SubtypeItem_RecID
- UPDATE tmp
- SET tmp.SR_SubtypeItem_RecID = sti.SR_SubtypeItem_RecID
- FROM #Import_Staging tmp
- 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
- -- All types/subtypes/items should now exist
- -- Insert to SR_Type_Subtype_SubTypeItem_Template to create necessary relationships
- INSERT INTO dbo.SR_Type_SubType_SubTypeItem_Template
- (
- SR_Type_RecID,
- SR_SubType_RecID,
- Auto_Apply,
- Updated_By,
- SR_SubTypeItem_RecID,
- Last_Update
- )
- SELECT DISTINCT
- srt.SR_Type_RecID,
- srs.SR_Subtype_RecID,
- 0,
- @ImportBatchUser,
- sri.SR_SubTypeItem_RecID,
- GETDATE()
- FROM #Import_Staging tmp
- INNER JOIN SR_Board srb
- ON tmp.SR_Board_RecID = srb.SR_Board_RecID
- INNER JOIN SR_Type srt
- ON srt.SR_Board_RecID = srb.SR_Board_RecID
- AND srt.[Description] = tmp.SrType
- INNER JOIN SR_Subtype srs
- ON srb.SR_Board_RecID = srs.SR_Board_RecID
- AND srs.[Description] = tmp.SrSubType
- LEFT OUTER JOIN SR_SubTypeItem sri
- ON sri.SR_Board_RecID = srb.SR_Board_RecID
- AND tmp.SrItem = sri.[Description]
- LEFT OUTER JOIN SR_Type_Subtype_SubTypeItem_Template sst
- ON sst.SR_Type_RecID = srt.SR_Type_RecID
- AND sst.SR_Subtype_RecID = srs.SR_Subtype_RecID
- AND ISNULL(sst.SR_SubTypeItem_RecID, 0) = ISNULL(sri.SR_SubTypeItem_RecID, 0)
- WHERE sst.SR_Type_Subtype_SubTypeItem_Template_RecID IS NULL
- AND tmp.SrItem NOT IN('', ' ')
- AND tmp.SRSubtype IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrType IS NOT NULL
- -- Insert Service location
- INSERT INTO SR_Location
- (
- Owner_ID,
- Description,
- Default_Flag,
- Updated_By,
- Last_Update
- )
- SELECT DISTINCT
- 1,
- [SRLocation],
- 0,
- @ImportBatchUser,
- GETDATE()
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 * FROM SR_Location srl WHERE srl.[Description] = stag.[SRLocation]) srl
- WHERE srl.SR_Location_RecID IS NULL
- AND LEN(stag.[SRLocation]) < 30
- END
- -- Begin validations
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- InvalidReason
- )
- -- Check that service board is entered
- SELECT
- tmp.ExcelRowNumber,
- 'Service board is required',
- 'No service board'
- FROM #Import_Staging tmp
- WHERE BoardName IS NULL
- UNION ALL
- -- Check that service board is valid
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid service board: "' + ISNULL(tmp.BoardName, '') + '"',
- 'Invalid service board'
- FROM #Import_Staging tmp
- WHERE tmp.BoardName IS NOT NULL
- AND tmp.SR_Board_RecID IS NULL
- UNION ALL
- -- Check that each service board has a default team
- SELECT
- tmp.ExcelRowNumber,
- 'Service board: "' + ISNULL(tmp.BoardName, '') + '" does not have a default Service Team',
- 'No default service team'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Team srt
- ON tmp.SR_Board_RecID = srt.SR_Board_RecID
- AND srt.Default_Flag = 1
- WHERE srt.SR_Board_RecID IS NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- UNION ALL
- -- Company Name is required
- SELECT
- tmp.ExcelRowNumber,
- 'Company name cannot be blank',
- 'NULL Company'
- FROM #Import_Staging tmp
- WHERE Company_Name IS NULL
- AND @Legacy_Flag = 0
- UNION ALL
- -- Check that company names are valid
- SELECT
- tmp.ExcelRowNumber,
- 'Company not found: "' + ISNULL(tmp.Company_Name, '') + '"',
- 'Invalid company'
- FROM #Import_Staging tmp
- WHERE Company_Name IS NOT NULL
- AND Company_RecID IS NULL
- UNION ALL
- -- Check for more than one company with the same name
- SELECT
- tmp.ExcelRowNumber,
- 'There are more than one companies named "' + ISNULL(Company_Name, '') + '" - company name must be unique in order to associate it to an imported ticket',
- 'Duplicate company'
- FROM #Import_Staging tmp
- WHERE Company_Duplicate_Flag = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Unable to locate contact: "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '') + '"',
- 'Invalid contact name'
- FROM #Import_Staging tmp
- WHERE Contact_RecID IS NULL
- AND tmp.ContactName IS NOT NULL
- AND tmp.Company_Duplicate_Flag = 0
- AND tmp.Company_RecID IS NOT NULL
- UNION ALL
- -- Check for duplicate contacts within company
- SELECT
- tmp.ExcelRowNumber,
- 'There are more than one contacts named "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"',
- 'Duplicate contact name'
- FROM #Import_Staging tmp
- WHERE tmp.Contact_Duplicate_Flag = 1
- AND tmp.Company_Duplicate_Flag = 0
- UNION ALL
- -- Check that a default contact for company exists if contact is null
- SELECT
- tmp.ExcelRowNumber,
- 'Contact must be specified for company: "' + ISNULL(tmp.Company_Name, '') + '" because no default contact exists for this company',
- 'No contact/No default'
- FROM #Import_Staging tmp
- WHERE tmp.Contact_RecID IS NULL
- AND tmp.ContactName IS NULL
- AND tmp.Company_Name IS NOT NULL
- AND tmp.Company_RecID IS NOT NULL
- AND tmp.Company_Duplicate_Flag = 0
- -- Check that configuration is assigned to company
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- InvalidReason
- )
- SELECT DISTINCT
- tmp.ExcelRowNumber,
- 'No configurations named "' + ISNULL(tmp.ConfigName, '') + '" are assigned to company "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"',
- 'Configuration not assigned to company'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN dbo.Config conf
- ON conf.Config_Name = tmp.ConfigName
- AND tmp.Company_RecID = conf.Company_RecID
- WHERE tmp.ConfigName IS NOT NULL
- AND conf.Config_RecID IS NULL
- AND tmp.Company_RecID IS NOT NULL
- UNION ALL
- -- Check for duplicate configuration names assigned to this company
- SELECT
- tmp.ExcelRowNumber,
- 'There are more than one configurations named "' + ISNULL(conf.Config_Name, '') + '" for company "' + ISNULL(tmp.Company_Name, '') + '"',
- 'Duplicate configuration'
- FROM Config conf
- INNER JOIN #Import_Staging tmp
- ON conf.Config_Name = tmp.ConfigName
- AND conf.Company_RecID = tmp.Company_RecID
- WHERE tmp.ConfigName IS NOT NULL
- AND tmp.Company_Name IS NOT NULL
- AND tmp.Company_RecID IS NOT NULL
- GROUP BY tmp.ExcelRowNumber, conf.Config_Name, tmp.Company_Name
- HAVING COUNT(*) > 1
- -- Check that configuration is assigned to company
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- InvalidReason
- )
- -- Check that service statuses are entered
- SELECT
- tmp.ExcelRowNumber,
- 'Service status is required',
- 'No service status'
- FROM #Import_Staging tmp
- WHERE tmp.SrStatus IS NULL
- UNION ALL
- -- Check that entered service statuses are valid
- SELECT
- tmp.ExcelRowNumber,
- 'Service status: "' + ISNULL(tmp.SrStatus, '') + '" does not exist for service board "' + ISNULL(tmp.BoardName, '') + '"',
- 'Invalid service status'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Status srs
- ON srs.[Description] = tmp.SrStatus
- AND srs.SR_Board_RecID = tmp.SR_Board_RecID
- WHERE tmp.SrStatus IS NOT NULL
- AND srs.SR_Status_RecID IS NULL
- -- Exclude records where board not specified
- AND tmp.SR_Board_RecID IS NOT NULL
- UNION ALL
- -- Check that entered service types are valid
- SELECT
- tmp.ExcelRowNumber,
- 'No Active service type named "' + ISNULL(tmp.SrType, '[Not entered]') + '" exists for service board "' + ISNULL(tmp.BoardName, '') + '"',
- 'Invalid Service Type'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Type srt
- ON srt.[Description] = tmp.SrType
- AND srt.SR_Board_RecID = tmp.SR_Board_RecID
- WHERE srt.SR_Type_RecID IS NULL
- AND tmp.SrType IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- InvalidReason
- )
- SELECT DISTINCT
- tmp.ExcelRowNumber,
- 'No active service subtype named "' + ISNULL(tmp.SrSubType, '[No subtype entered]') + '" Exists for service type: "' + ISNULL(tmp.SrType, '') + '" for service board "' + ISNULL(tmp.BoardName, '') + '"',
- 'Invalid Subtype'
- FROM #Import_Staging tmp
- WHERE tmp.SR_Type_RecID IS NOT NULL
- AND tmp.SR_SubType_RecID IS NULL
- AND tmp.SrSubType IS NOT NULL
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- InvalidReason
- )
- -- Check that Item is a valid reference for Subtype, Type, and Board
- -- Get all records where item is entered
- SELECT DISTINCT
- tmp.ExcelRowNumber,
- '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, '') + '"',
- 'Invalid Subtype'
- FROM #Import_Staging tmp
- WHERE tmp.SrItem IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SR_Type_RecID IS NOT NULL
- AND tmp.SR_SubType_RecID IS NOT NULL
- AND tmp.SrType IS NOT NULL
- AND tmp.SrSubType IS NOT NULL
- -- Except records where item is a valid reference
- EXCEPT
- SELECT DISTINCT
- tmp.ExcelRowNumber,
- '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, '') + '"',
- 'Invalid Subtype'
- FROM #Import_Staging tmp
- INNER JOIN SR_SubTypeItem sti
- ON sti.[Description] = tmp.SrItem
- AND sti.SR_Board_RecID = tmp.SR_Board_RecID
- INNER JOIN SR_Type_SubType_SubTypeItem_Template tmpl
- ON tmpl.SR_SubTypeItem_RecID = sti.SR_SubTypeItem_RecID
- -- Join on temp table subtype & type to prevent duplicate message if subtype didn't line up in previous check
- 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)
- 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)
- WHERE tmp.SrItem IS NOT NULL
- AND tmp.SR_SubType_RecID IS NOT NULL
- AND tmp.SR_Type_RecID IS NOT NULL
- AND tmp.SrType IS NOT NULL
- AND tmp.SrSubType IS NOT NULL
- UNION ALL
- -- Check that type is entered if Subtype/item is entered
- SELECT
- tmp.ExcelRowNumber,
- 'Service Type is required if a subtype or item is entered',
- 'Null type with subtype/item'
- FROM #Import_Staging tmp
- WHERE SrType IS NULL
- AND (SrSubType IS NOT NULL OR SrItem IS NOT NULL)
- UNION ALL
- -- Check that subtype is entered if item is entered
- SELECT
- tmp.ExcelRowNumber,
- 'Service SubType is required if a item is entered',
- 'Null Subtype with item'
- FROM #Import_Staging tmp
- WHERE SrItem IS NOT NULL
- AND SrType IS NULL
- UNION ALL
- -- Check that source is entered
- SELECT
- tmp.ExcelRowNumber,
- 'Source must be entered',
- 'No Source'
- FROM #Import_Staging tmp
- WHERE tmp.SrSource IS NULL
- UNION ALL
- -- Check that source is valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Source: ' + ISNULL(tmp.SrSource, '') + ' is not a valid source',
- 'Invalid source'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Source srs
- ON srs.[Description] = tmp.SrSource
- WHERE tmp.SrSource IS NOT NULL
- AND srs.SR_Source_RecID IS NULL
- UNION ALL
- -- Check that service location is entered
- SELECT
- tmp.ExcelRowNumber,
- 'Service Location must be entered',
- 'No location'
- FROM #Import_Staging tmp
- WHERE tmp.SrLocation IS NULL
- UNION ALL
- -- Check that date entered is a valid date
- SELECT
- tmp.ExcelRowNumber,
- 'Date entered is invalid - please use MM/DD/YYYY format',
- 'Invalid Date Entered'
- FROM #Import_Staging tmp
- WHERE DateEntered IS NOT NULL
- AND ISDATE(DateEntered) = 0
- UNION ALL
- -- Check that date completed is a valid date
- SELECT
- tmp.ExcelRowNumber,
- 'Date completed is invalid - please use MM/DD/YYYY format',
- 'Invalid Date Completed'
- FROM #Import_Staging tmp
- WHERE DateCompleted IS NOT NULL
- AND ISDATE(DateCompleted) = 0
- UNION ALL
- -- Check that service location is valid
- SELECT
- tmp.ExcelRowNumber,
- 'Service location: "' + ISNULL(tmp.SrLocation, '') + '" is not valid',
- 'Invalid location'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Location srl
- ON srl.[Description] = tmp.SrLocation
- WHERE tmp.SrLocation IS NOT NULL
- AND srl.SR_Location_RecID IS NULL
- UNION ALL
- -- Check that summary is entered
- SELECT
- tmp.ExcelRowNumber,
- 'Summary is required',
- 'No summary'
- FROM #Import_Staging tmp
- WHERE tmp.Summary IS NULL
- UNION ALL
- -- Check that summary <= 100 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Summary cannot exceed 100 characters',
- 'Summary cannot exceed 100 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Summary) > 100
- AND tmp.Summary IS NOT NULL
- UNION ALL
- -- Check that service priority entered
- SELECT
- tmp.ExcelRowNumber,
- 'Service priority is required',
- 'No priority'
- FROM #Import_Staging tmp
- WHERE tmp.SrPriority IS NULL
- UNION ALL
- -- Check that service priority is a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Service priority: ' + ISNULL(SrPriority, '') + ' is invalid',
- 'Invalid priority'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN dbo.SR_Urgency sru
- ON sru.[Description] = tmp.SrPriority
- WHERE tmp.SrPriority IS NOT NULL
- AND sru.SR_Urgency_RecID IS NULL
- UNION ALL
- -- Check that Assigned by is entered
- SELECT
- tmp.ExcelRowNumber,
- 'Assigned by is required',
- 'Assigned By missing'
- FROM #Import_Staging tmp
- WHERE tmp.AssignedBy IS NULL
- AND @ForceMode <> 1
- UNION ALL
- -- Check that Assigned by members are valid
- SELECT
- tmp.ExcelRowNumber,
- 'Unable to locate assigned by member: ' + ISNULL(AssignedBy, ''),
- 'Invalid assigned by resource'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON tmp.AssignedBy = LTRIM(ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, ''))
- OR tmp.AssignedBy = mem.Member_ID
- WHERE mem.Member_RecID IS NULL
- AND tmp.AssignedBy IS NOT NULL
- AND tmp.AssignedBy <> 'zAdmin'
- AND @Migration_Flag = 0
- UNION ALL
- -- Check that Resource members are valid
- SELECT
- tmp.ExcelRowNumber,
- 'Unable to locate resource member: ' + ISNULL(ResourceMember, ''),
- 'Invalid resource member'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON tmp.ResourceMember = ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + dbo.ufn_Import_Trim(mem.Last_Name)
- OR tmp.ResourceMember = mem.Member_ID
- WHERE mem.Member_RecID IS NULL
- AND tmp.ResourceMember IS NOT NULL
- AND @ForceMode = 0
- UNION ALL
- -- Check that all time entries have a valid dates
- SELECT
- ti.ExcelRowNumber,
- 'Invalid time entry start date: ' + ISNULL(Date_Start, '[NULL]'),
- 'Invalid start date'
- FROM #TMP_Time_Staging ti
- WHERE ISDATE(Date_Start) = 0
- OR ti.Date_Start IS NULL
- UNION ALL
- SELECT
- ti.ExcelRowNumber,
- 'Invalid time entry end date: ' + ISNULL(Date_End, '[NULL]'),
- 'Invalid end date'
- FROM #TMP_Time_Staging ti
- WHERE ISDATE(Date_End) = 0
- OR ti.Date_End IS NULL
- UNION ALL
- -- Check that Note Type is 'Internal', 'Detail', 'Resolution', or blank
- SELECT
- ti.ExcelRowNumber,
- 'Invalid note type: ' + ISNULL(Note_Type, '[NULL]'),
- 'Invalid Time entry note type'
- FROM #TMP_Time_Staging ti
- WHERE ti.Note_Type NOT IN('Internal', 'Detail', 'Resolution', '', 'ResolutionNote', 'InternalNote', 'DetailNote', 'ExtNote')
- UNION ALL
- -- Check that all time entries link back to a ticket
- SELECT
- ti.Legacy_Ticket_ID,
- 'Time entry did not link back to a ticket for legacy id: ' + ti.Legacy_Ticket_ID,
- ''
- FROM #TMP_Time_Staging ti
- WHERE ti.ExcelRowNumber IS NULL
- -- If date completed is entered - must be >= date entered
- IF NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging tmp WHERE ISDATE(tmp.DateEntered) = 0 OR ISDATE(tmp.DateCompleted) = 0)
- BEGIN
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- InvalidReason
- )
- SELECT
- tmp.ExcelRowNumber,
- 'Date completed cannot be earlier than date entered',
- NULL
- FROM #Import_Staging tmp
- WHERE CONVERT(DATETIME, tmp.DateCompleted) < CONVERT(DATETIME, tmp.DateEntered)
- AND tmp.DateCompleted IS NOT NULL
- END
- -- Insert notification messages for any created references
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag,
- ReferenceType
- )
- SELECT
- 0,
- '"' + Board_Name + '" for Billing Unit: "' + bu.[Description] + '" at Location: "' + ol.[Description] + '"',
- 1,
- 'Service Board(s)'
- FROM dbo.SR_Board srb
- INNER JOIN Owner_Level ol
- ON ol.Owner_Level_RecID = srb.Owner_Level_RecID
- INNER JOIN Billing_Unit bu
- ON bu.Billing_Unit_RecID = srb.Billing_Unit_RecID
- WHERE srb.Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- 0,
- [Description],
- 1,
- 'Service Team(s)'
- FROM dbo.SR_Team
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- 0,
- [Description],
- 1,
- 'Service Prioritie(s)'
- FROM dbo.SR_Urgency
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- 0,
- [Description],
- 1,
- 'Service Source(s)'
- FROM dbo.SR_Source
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- 0,
- [Description],
- 1,
- 'Service Status(es)'
- FROM dbo.SR_Status
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- 0,
- [Description],
- 1,
- 'Service type(s)'
- FROM dbo.SR_Type
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- 0,
- [Description],
- 1,
- 'Service Subtype(s)'
- FROM dbo.SR_SubType
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- 0,
- [Description],
- 1,
- 'Subtype Item(s)'
- FROM dbo.SR_SubTypeItem
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- 0,
- ty.[Description] + ISNULL(' -> ' + sty.[Description], '') + ISNULL(' -> ' + sitem.[Description], ''),
- 1,
- 'Service Type -> Subtype -> Item Relationship(s)'
- FROM dbo.SR_Type_Subtype_SubtypeItem_Template tmpl
- INNER JOIN SR_Type ty
- ON ty.SR_Type_RecID = tmpl.SR_Type_RecID
- INNER JOIN SR_Subtype sty
- ON sty.SR_Subtype_RecID = tmpl.SR_Subtype_RecID
- LEFT OUTER JOIN SR_SubtypeItem sitem
- ON sitem.SR_SubTypeItem_RecID = tmpl.SR_SubTypeItem_RecID
- WHERE tmpl.Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- 0,
- ISNULL(cont.First_Name, '') + ' ' + ISNULL(cont.Last_Name, ''),
- 1,
- 'Contact(s)'
- FROM dbo.Contact cont
- WHERE cont.Updated_By = @ImportBatchUser
- UNION ALL
- SELECT DISTINCT
- ExcelRowNumber,
- 'Company: "' + tmp.Company_Name + '" fuzzy matched to Company: ' + tmp.Company_Name_Fuzzy,
- 1,
- NULL
- FROM #Import_Staging tmp
- WHERE Company_Name_Fuzzy IS NOT NULL
- UNION ALL
- SELECT DISTINCT
- ExcelRowNumber,
- 'Contact "' + tmp.ContactName + '" fuzzy matched to Contact: ' + tmp.Contact_Name_Fuzzy,
- 1,
- NULL
- FROM #Import_Staging tmp
- WHERE Contact_Name_Fuzzy IS NOT NULL
- UNION ALL
- SELECT
- 0,
- [Description],
- 1,
- 'Service Location(s)'
- FROM dbo.SR_Location
- WHERE Updated_By = @ImportBatchUser
- -- Return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed
- IF XACT_STATE() IN(1, -1)
- BEGIN
- ROLLBACK TRANSACTION
- END
- RETURN 0
- END
- ELSE
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed res
- UNION ALL
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- 'The following ' + ReferenceType + ' will be created: '+
- STUFF(
- (SELECT ', ' + ValMsg
- FROM #tblResults
- WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
- FOR XML PATH (''))
- , 1, 1, '') AS ValMsg
- FROM #tblResults res
- WHERE ReferenceType IS NOT NULL
- GROUP BY ReferenceType
- IF XACT_STATE() IN(1, -1)
- BEGIN
- ROLLBACK TRANSACTION
- END
- EXEC usp_Import_Record_Validation @TableName
- RETURN 1
- END
- ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS ValMsg
- IF XACT_STATE() IN(1, -1)
- BEGIN
- ROLLBACK TRANSACTION
- END
- EXEC usp_Import_Record_Validation @TableName
- RETURN 1
- END
- END TRY
- BEGIN CATCH
- -- Return error information and rollback transaction
- SELECT
- 0 AS ValPassed,
- ERROR_LINE() AS ExcelRowNumber,
- ERROR_MESSAGE() AS ErrorDetails
- IF XACT_STATE() IN(1, -1)
- BEGIN
- ROLLBACK TRANSACTION
- END
- RETURN 0
- END CATCH
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 03/15/2013
- -- Description: Performs final validation
- -- and inserts for Service Ticket import
- -- Sample call: exec usp_SR_ImportPush 'TMP_Import_4306c256637a4540a14d5db36e8aa1f9', 'TMP_Time_4306c256637a4540a14d5db36e8aa1f9', 0, 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_SR_ImportPush]
- @TableName VARCHAR(255),
- @TETableName VARCHAR(255),
- @DebugMode INT = 0,
- @ForceMode BIT = 0
- AS
- BEGIN TRY
- SET NOCOUNT ON
- -- Handle instance where front end passes string 'Null' for @TETableName
- IF @TETableName = 'NULL'
- BEGIN
- SET @TETableName = NULL
- END
- -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber int NULL,
- BoardName VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Name VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- ContactName VARCHAR(60) COLLATE DATABASE_DEFAULT NULL,
- SR_Board_RecID int NULL,
- SrStatus VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- SrType VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- SrSubType VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- SrItem VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- SrSource VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- SrLocation VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- SrPriority VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Summary VARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- DetailDescription nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- InternalAnalysis nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- Resolution nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- AssignedBy VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- DateEntered datetime NULL,
- DateCompleted datetime NULL,
- ConfigName VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- ResourceMember VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- NewSrRecid int NULL,
- ConvertMessage varchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- BatchID UNIQUEIDENTIFIER NULL,
- Phone VARCHAR(50) COLLATE DATABASE_DEFAULT,
- Ext VARCHAR(50) COLLATE DATABASE_DEFAULT,
- Email VARCHAR(255) COLLATE DATABASE_DEFAULT,
- Company_Address_RecID INT,
- SiteName VARCHAR(80) COLLATE DATABASE_DEFAULT,
- Address_Line1 VARCHAR(150) COLLATE DATABASE_DEFAULT,
- Address_Line2 VARCHAR(150) COLLATE DATABASE_DEFAULT,
- City VARCHAR(150) COLLATE DATABASE_DEFAULT,
- State_ID VARCHAR(50) COLLATE DATABASE_DEFAULT,
- Zip VARCHAR(20) COLLATE DATABASE_DEFAULT,
- SR_Type_RecID INT,
- SR_SubType_RecID INT,
- SR_SubTypeItem_RecID INT,
- SR_Location_RecID INT,
- SR_Status_RecID INT,
- SR_Source_RecID INT,
- SR_Urgency_RecID INT,
- Sr_Team_RecID INT,
- Config_RecID INT,
- FinalRecID INT,
- New_Identity INT,
- Schedule_Desc VARCHAR(200) COLLATE DATABASE_DEFAULT,
- Resource_Member_RecID INT,
- EnteredOffset INT,
- EnteredUTC DATETIME,
- CompletedOffset INT,
- CompletedUTC DATETIME,
- Legacy_Ticket_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Company_RecID INT NULL,
- Company_Name_Stripped VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_RecID INT NULL,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Match_Val VARCHAR(3) COLLATE DATABASE_DEFAULT NULL,
- Template_RecID INT,
- Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Legacy_Site_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- SR_Service_RecID INT,
- SO_Opportunity_RecID INT,
- Diff_Exclude_Flag BIT,
- Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Duplicate_Flag BIT,
- Legacy_Opp_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Country_RecID INT,
- Tax_Code_RecID INT
- )
- CREATE INDEX IX_SR_Import_CompName ON #Import_Staging(Company_Name)
- CREATE CLUSTERED INDEX IX_SR_Import_Excel ON #Import_Staging(ExcelRowNumber)
- CREATE INDEX IX_SR_Import_Board ON #Import_Staging(BoardName)
- CREATE INDEX IX_SR_Import_Status ON #Import_Staging(SrStatus)
- CREATE INDEX IX_SR_Import_Type ON #Import_Staging(SrType)
- CREATE INDEX IX_SR_Import_SubType ON #Import_Staging(SrSubtype)
- CREATE INDEX IX_SR_Import_Item ON #Import_Staging(SrItem)
- CREATE INDEX IX_SR_Import_Loc ON #Import_Staging(SrLocation)
- CREATE INDEX IX_SR_Import_Pri ON #Import_Staging(SrPriority)
- CREATE INDEX IX_SR_Import_Legacy ON #Import_Staging(Legacy_ID)
- CREATE INDEX IX_SR_Import_Tix ON #Import_Staging(Legacy_Ticket_ID)
- CREATE INDEX IX_SR_Import_Mat ON #Import_Staging(Company_Match_Val)
- CREATE INDEX IX_SR_Import_legcomp ON #Import_Staging(Legacy_Company_ID)
- CREATE INDEX IX_SR_Import_legcont ON #Import_Staging(Legacy_Contact_ID)
- CREATE INDEX IX_SR_Import_opp ON #Import_Staging(Legacy_Opp_ID)
- CREATE INDEX IX_SR_Import_Site ON #Import_Staging(Legacy_Site_ID)
- -- Variable declaration
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source tables
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- DECLARE @TESourceTable VARCHAR(300)
- SELECT @TESourceTable = 'tempdb.dbo.' + @TETableName
- -- Get first zAdmin Time_Sheet_RecID to link to time entries
- 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)
- -- Get TE_Status_ID for 'Written off' to apply to time entries/sheet
- DECLARE @TE_Status_ID INT = (SELECT TOP 1 TE_Status_ID FROM dbo.TE_Status stat WHERE stat.[Description] = 'Written off')
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- DECLARE
- @ExpRowCount INT, -- Expected rowcount inserts - Used for validation
- @ErrorMsg VARCHAR(1000), -- Variable to hold custom error message
- @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
- @ImportBatchUser VARCHAR(15), -- Unique value to identify records created by this import
- @Time_Zone_RecID INT, -- Default time zone from setup tables
- @Migration_Flag BIT, -- Indicates that this is a canned data migration (Autotask/Tigerpaw)
- @Time_Zone_Name_RecID INT,
- @MAX_SR_Service_RecID INT, -- Max recid from SR_Service prior to import (Performance - helps with slow join on this table)
- @MAX_Time_Entry_RecID INT -- Max recid from SR_Service prior to import (Performance - helps with slow join on this table)
- SET @Time_Zone_Name_RecID = (SELECT TOP 1 Time_Zone_Name_RecID FROM Time_Zone WHERE Default_Flag = 1)
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Determine default time zone
- SET @Time_Zone_RecID = (SELECT TOP 1 Time_Zone_RecID FROM dbo.Time_Zone WHERE Default_Flag = 1)
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Build statement to populate staging table
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- BoardName,
- Company_Name,
- ContactName,
- SrStatus,
- SrType,
- SrSubType,
- SrItem,
- SrSource,
- SrLocation,
- SrPriority,
- Summary,
- DetailDescription,
- InternalAnalysis,
- Resolution,
- AssignedBy,
- DateEntered,
- DateCompleted,
- ConfigName,
- ResourceMember,
- Company_Match_Val,
- Legacy_ID,
- Legacy_Company_ID,
- Legacy_Contact_ID
- )
- SELECT
- [Excel Row Number],
- LEFT([Service Board], 50),
- LEFT([Company Name], 50),
- LEFT([Contact Name], 60),
- LEFT([Service Status], 50),
- LEFT([Service Type], 50),
- LEFT([Service Subtype], 50),
- LEFT([Service Item], 50),
- LEFT([Service Source], 50),
- LEFT([Service Location], 50),
- LEFT([Service Priority], 50),
- LEFT([Summary], 100),
- [Detail Description],
- [Internal Analysis],
- [Resolution],
- LEFT([Assigned By], 50),
- LEFT([Date Entered], 50),
- LEFT([Date Completed], 50),
- LEFT([Configuration Name], 50),
- LEFT([Resource Member], 50),
- LEFT([Company Name], 3),
- Legacy_ID,
- Legacy_Company_ID,
- Legacy_Contact_ID
- FROM ' + @SourceTable
- -- Pull data into staging table
- EXEC(@DSQL)
- IF OBJECT_ID('tempdb..#TMP_Time_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #TMP_Time_Staging
- END
- -- Table to hold time entries for insert
- CREATE TABLE #TMP_Time_Staging
- (
- RecID INT IDENTITY,
- Legacy_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Legacy_Ticket_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- ExcelRowNumber INT,
- First_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Last_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Num_Hours FLOAT,
- Hours_Bill FLOAT,
- Date_Start NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Date_End NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Billable INT,
- Notes NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Note_Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Member_RecID INT,
- Member_ID VARCHAR(15) COLLATE DATABASE_DEFAULT NULL,
- Time_RecID INT,
- SR_Detail_RecID INT,
- Created_By NVARCHAR(150) COLLATE DATABASE_DEFAULT NULL,
- TicketRowNumber INT,
- Company_RecID INT,
- SR_Service_RecID INT,
- Owner_Level_RecID INT,
- Billing_Unit_RecID INT,
- Activity_Type_RecID INT,
- Activity_Class_RecID INT,
- Member_ID_Calculated VARCHAR(100) COLLATE DATABASE_DEFAULT
- )
- CREATE INDEX IX_Tix ON #TMP_Time_Staging(Legacy_Ticket_ID)
- CREATE INDEX IX_TE_Excel ON #TMP_Time_Staging(RecID)
- CREATE INDEX IX_TE_SRS ON #TMP_Time_Staging(SR_Service_RecID)
- IF @TETableName IS NOT NULL
- BEGIN
- SELECT @DSQL =
- '
- INSERT INTO #TMP_Time_Staging
- (
- Legacy_Ticket_ID,
- First_Name,
- Last_Name,
- Date_Start,
- Date_End,
- Billable,
- Notes,
- Num_Hours,
- Hours_Bill,
- Note_Type,
- ExcelRowNumber
- )
- SELECT
- [Legacy_Ticket_ID],
- [Resource First Name],
- [Resource Last Name],
- [Date Start],
- [Date End],
- [Billable Flag],
- Notes,
- [Total Hours],
- [Hours Bill],
- [Note Type],
- [Excel Row Number]
- FROM ' + @TESourceTable + '
- WHERE [Hours Bill] NOT LIKE ''CONNECTWISE%'''
- EXEC (@DSQL)
- UPDATE te
- SET TicketRowNumber = stag.ExcelRowNumber
- FROM #TMP_Time_Staging te
- CROSS APPLY(SELECT TOP 1 ExcelRowNumber FROM #Import_Staging stag WHERE stag.Legacy_ID = te.Legacy_Ticket_ID)stag
- UPDATE te
- SET Created_By = LTRIM(RTRIM(LEFT(ISNULL(First_Name + ' ', '') + ISNULL(Last_Name, ''), 150)))
- FROM #TMP_Time_Staging te
- UPDATE #TMP_Time_Staging
- SET Created_By = 'zAdmin'
- WHERE Created_By = ''
- END
- BEGIN TRANSACTION SR_Import
- -- If no zAdmin timesheet, solve by creating one
- IF @Time_Sheet_RecID IS NULL AND @TETableName IS NOT NULL
- BEGIN
- -- Create table to force compile regardless of data structure
- CREATE TABLE #TS_Hack(ColumnName NVARCHAR(50))
- IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_id) = 'Time_Sheet')
- BEGIN
- INSERT INTO dbo.Time_Sheet
- (
- Owner_ID,
- TE_Period_RecID,
- Member_RecID,
- TE_Status_ID,
- Entered_By
- )
- SELECT TOP 1
- 1,
- per.TE_Period_RecID,
- mem.Member_RecID,
- tes.TE_Status_ID,
- 'zAdmin'
- FROM dbo.Member mem
- CROSS APPLY(SELECT TOP 1 * FROM TE_Status tes WHERE tes.[Description] = 'Written off')tes
- CROSS APPLY(SELECT TOP 1 * FROM TE_Period per) per
- CROSS APPLY(SELECT 1 AS hack FROM #TS_Hack)hack
- WHERE mem.Member_ID = 'zAdmin'
- SELECT @Time_Sheet_RecID = SCOPE_IDENTITY()
- END
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_id) = 'Time_Sheet')
- BEGIN
- INSERT INTO dbo.Time_Sheet
- (
- Owner_ID,
- TE_Period_RecID,
- Member_RecID,
- TE_Status_ID
- )
- SELECT TOP 1
- 1,
- per.TE_Period_RecID,
- mem.Member_RecID,
- tes.TE_Status_ID
- FROM dbo.Member mem
- CROSS APPLY(SELECT TOP 1 * FROM TE_Status tes WHERE tes.[Description] = 'Written off')tes
- CROSS APPLY(SELECT TOP 1 * FROM TE_Period per) per
- WHERE mem.Member_ID = 'zAdmin'
- SELECT @Time_Sheet_RecID = SCOPE_IDENTITY()
- END
- DROP TABLE #TS_Hack
- END
- -- Update AssignedBy and Resource member in staging table to use Member_ID
- UPDATE stag
- SET AssignedBy = mem.Member_ID
- FROM Member mem
- INNER JOIN #Import_Staging stag
- ON stag.AssignedBy = ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, '')
- OR stag.AssignedBy = mem.Member_ID
- UPDATE stag
- SET ResourceMember = mem.Member_ID
- FROM Member mem
- INNER JOIN #Import_Staging stag
- ON stag.ResourceMember = ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, '')
- OR stag.ResourceMember = mem.Member_ID
- -- Update Source table to AssignedBy = zAdmin where null
- UPDATE #Import_Staging
- SET AssignedBy = 'zAdmin'
- WHERE AssignedBy IS NULL
- -- For optional fields, update blank string & single space to NULL
- -- so that NULL/NOT NULL can be properly handled throughout procedure
- UPDATE #Import_Staging
- SET
- ContactName = CASE WHEN ContactName IN('', ' ') THEN NULL ELSE ContactName END,
- SrType = CASE WHEN SrType IN('', ' ') THEN NULL ELSE SrType END,
- SrSubType = CASE WHEN SrSubType IN('', ' ') THEN NULL ELSE SrSubType END,
- SrItem = CASE WHEN SrItem IN('', ' ') THEN NULL ELSE SrItem END,
- Summary = CASE WHEN Summary IN('', ' ') THEN NULL ELSE Summary END,
- DetailDescription = CASE WHEN DetailDescription IN('', ' ') THEN NULL ELSE DetailDescription END,
- InternalAnalysis = CASE WHEN InternalAnalysis IN('', ' ') THEN NULL ELSE InternalAnalysis END,
- Resolution = CASE WHEN Resolution IN('', ' ') THEN NULL ELSE Resolution END,
- DateEntered = CASE WHEN DateEntered IN('', ' ') THEN NULL ELSE DateEntered END,
- DateCompleted = CASE WHEN DateCompleted IN('', ' ', '01/01/1900', '1900-01-01') THEN NULL ELSE DateCompleted END,
- ConfigName = CASE WHEN ConfigName IN('', ' ') THEN NULL ELSE ConfigName END,
- ResourceMember = CASE WHEN ResourceMember IN('', ' ') THEN NULL ELSE ResourceMember END,
- SrSource = CASE WHEN SrSource IN('', ' ') THEN NULL ELSE SrSource END,
- SrLocation = CASE WHEN SrLocation IN('', ' ') THEN NULL ELSE SrLocation END,
- SrPriority = CASE WHEN SrPriority IN('', ' ') THEN NULL ELSE SrPriority END
- -- Update each record with SR_Board_RecID
- UPDATE stag
- SET stag.SR_Board_RecID = srb.SR_Board_RecID
- FROM SR_Board srb
- INNER JOIN #Import_Staging stag
- ON stag.BoardName = srb.Board_Name
- -- Format dates as mm/dd/yyyy
- UPDATE stag
- SET DateCompleted = CONVERT(VARCHAR, CAST(DateCompleted AS DATETIME), 101)
- FROM #Import_Staging stag
- WHERE ISDATE(DateCompleted) = 1
- UPDATE stag
- SET DateEntered = CONVERT(VARCHAR, CAST(DateEntered AS DATETIME), 101)
- FROM #Import_Staging stag
- WHERE ISDATE(DateEntered) = 1
- -- Update Date fields to NULL if 1900-01-01
- UPDATE #Import_Staging
- SET DateCompleted = NULL
- WHERE DateCompleted = '1900-01-01'
- UPDATE #Import_Staging
- SET DateEntered = NULL
- WHERE DateEntered = '1900-01-01'
- -- If running in force mode, truncate Summary to 100 characters
- UPDATE stag
- SET stag.Summary = SUBSTRING(stag.Summary, 1, 100)
- FROM #Import_Staging stag
- WHERE @ForceMode = 1
- AND LEN(stag.Summary) > 100
- -- Exclude tickets previously imported
- UPDATE stag
- SET stag.Diff_Exclude_Flag = 1
- FROM #Import_Staging stag
- WHERE EXISTS(SELECT 1 FROM dbo.Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_ID AND leg.Record_Type = 'Ticket')
- DELETE FROM #Import_Staging WHERE Diff_Exclude_Flag = 1
- UPDATE #Import_Staging SET Legacy_Contact_ID = NULL WHERE Legacy_Contact_ID = ''
- -- Get Company_RecID
- UPDATE stag
- SET stag.Company_RecID = leg.CW_RecID
- FROM #Import_Staging stag
- 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
- WHERE EXISTS(SELECT 1 FROM dbo.Company comp WHERE comp.Company_RecID = leg.CW_RecID)
- -- Pull company RecID for merged companies
- UPDATE stag
- SET stag.Company_RecID = mrg.To_RecID
- FROM #Import_Staging stag
- 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
- 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
- WHERE stag.Company_RecID IS NULL
- -- Pull Contact RecID
- UPDATE stag
- SET stag.Contact_RecID = leg.CW_RecID
- FROM #Import_Staging stag
- 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
- WHERE EXISTS(SELECT 1 FROM dbo.Contact cont WHERE cont.Contact_RecID = leg.CW_RecID)
- DELETE stag
- FROM #Import_Staging stag
- WHERE Company_RecID IS NULL
- AND Legacy_Company_ID IS NOT NULL
- IF NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging stag WHERE stag.Legacy_Company_ID IS NOT NULL)
- BEGIN
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT DISTINCT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE Delete_Flag = 0
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- INNER JOIN #Company comp
- ON comp.Company_RecID = cont.Company_RecID
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- END
- -- If contact not specified, map to default contact (or oldest contact, if no default exists)
- UPDATE stag
- SET stag.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging stag
- 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
- WHERE stag.Contact_RecID IS NULL
- -- If no contact specified, and none exists, create a contact
- INSERT INTO dbo.Contact
- (
- Owner_ID,
- Company_RecID,
- Seq_Nbr,
- First_Name,
- Last_Name,
- Last_Update,
- Updated_By,
- Default_Flag
- )
- SELECT DISTINCT
- 1,
- stag.Company_RecID,
- 0,
- 'Imported',
- 'Contact',
- GETDATE(),
- 'Import',
- 0
- FROM #Import_Staging stag
- WHERE Company_RecID IS NOT NULL
- AND Contact_RecID IS NULL
- UPDATE stag
- SET stag.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging stag
- 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
- WHERE stag.Contact_RecID IS NULL
- -- Grab defaults for optional fields (Location, Source, Priority)
- UPDATE tmp
- SET tmp.SrLocation = srl.DefaultLocation
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 [Description] AS DefaultLocation FROM SR_Location WHERE Default_Flag = 1) srl
- WHERE tmp.SrLocation IS NULL
- UPDATE tmp
- SET tmp.SrSource = src.DefaultSource
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 [Description] AS DefaultSource FROM SR_Source WHERE Default_Flag = 1) src
- WHERE tmp.SrSource IS NULL
- UPDATE tmp
- SET tmp.SrPriority = pri.DefaultPriority
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 [Description] AS DefaultPriority FROM SR_Urgency WHERE Default_Flag = 1) pri
- WHERE tmp.SrPriority IS NULL
- IF @ForceMode = 1
- BEGIN
- -- If this is a custom migration, create Archive service board (if needed)
- IF @ForceMode = 1
- BEGIN
- -- Eliminate header row
- DELETE FROM #Import_Staging
- WHERE SrSource = 'CONNECTWISE' AND SrPriority = 'CONNECTWISE'
- SET @Migration_Flag = 1
- -- Determine the best location and billing unit to place the board under
- DECLARE @Billing_Unit_Loc_RecID INT
- ;WITH BU_LOC_FIND AS
- (
- SELECT bul.Billing_Unit_Loc_RecID, Board_Name, Autoclose_Status_RecID, EC_ReOpen_Status, bu.[Description] AS Billing_Unit, ol.[Description] AS Owner_Level
- FROM Billing_Unit_Loc bul
- LEFT OUTER JOIN SR_Board board
- ON board.Billing_Unit_RecID = bul.Billing_Unit_RecID
- AND board.Owner_Level_RecID = bul.Owner_Level_RecID
- INNER JOIN Owner_Level ol
- ON bul.Owner_Level_RecID = ol.Owner_Level_RecID
- INNER JOIN Billing_Unit bu
- ON bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
- )
- SELECT @Billing_Unit_Loc_RecID =
- CASE
- 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'))
- 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'))
- WHEN EXISTS(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE EC_ReOpen_Status IS NOT NULL)
- THEN(SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE EC_ReOpen_Status IS NOT NULL)
- ELSE
- (SELECT TOP 1 Billing_Unit_Loc_RecID FROM BU_LOC_FIND WHERE Board_Name IS NOT NULL)
- END
- END
- -- Insert service board
- INSERT INTO SR_Board
- (
- Board_Name,
- Owner_Level_Recid,
- Billing_Unit_Recid,
- Board_Icon,
- Billcomplete_Flag,
- Billsr_Flag,
- Billunapp_Flag,
- Override_Flag,
- Dispatch,
- Servicemanager,
- Dutymanager,
- Activity_Class_Recid,
- Activity_Type_Recid,
- Timebillable_Flag,
- Expbillable_Flag,
- Prodbillable_Flag,
- Timeinvoice_Flag,
- Expinvoice_Flag,
- Prodinvoice_Flag,
- Updated_By,
- Last_Update,
- Autoclose_Status_Recid,
- Autoassignnew_Flag,
- Autoassignec_Flag,
- Autoassignportal_Flag,
- Sr_Signoff_Recid,
- Ec_Reopen_Status,
- Project_Flag,
- Emailcontact_Flag,
- Emailresource_Flag,
- Lockdesc_Flag,
- Sr_Problem_Flag,
- Additionslocktime_Flag,
- Oncall,
- Default_Notify_From,
- Sr_Resolution_Flag,
- Sr_Internalanalysis_Flag,
- Te_Problem_Flag,
- Te_Resolution_Flag,
- Te_Internalanalysis_Flag,
- Problem_Sort,
- Resolution_Sort,
- Internalanalysis_Sort,
- Emailcontact_Template_Recid,
- Emailresource_Template_Recid,
- Inactive_Flag,
- Display_Name,
- Ec_Reopen_Resources_Flag,
- Ec_Company_Match_Flag,
- Ec_Reopen_Days_Flag,
- Ec_Reopen_Days,
- Member_Display_Name_Flag
- )
- SELECT DISTINCT
- tmp.BoardName,
- bul.Owner_Level_RecID,
- bul.Billing_Unit_RecID,
- '',
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- ISNULL(srb.Activity_Class_RecID, ac.Activity_Class_RecID),
- at.Activity_Type_RecID,
- 1,
- 1,
- 0,
- 0,
- 0,
- 0,
- @ImportBatchUser,
- GETDATE(),
- 0,
- 0,
- 0,
- 0,
- 0,
- NULL,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 'A',
- 'A',
- 'A',
- 0,
- 0,
- 0,
- '',
- 0,
- 0,
- 0,
- 0,
- 0
- FROM #Import_Staging tmp
- OUTER APPLY(SELECT TOP 1 * FROM Billing_Unit_Loc bul WHERE bul.Billing_Unit_Loc_RecID = @Billing_Unit_Loc_RecID) bul
- OUTER APPLY(SELECT TOP 1 Activity_Class_RecID FROM SR_Board srb WHERE srb.Activity_Class_RecID > 0)srb
- OUTER APPLY(SELECT TOP 1 Activity_Class_RecID FROM Activity_Class)ac
- OUTER APPLY(SELECT TOP 1 * FROM Activity_Type ORDER BY Default_Flag DESC)at
- WHERE tmp.SR_Board_RecID IS NULL
- -- Create default service teams for Tigerpaw/AutoTask Archive boards
- INSERT INTO SR_Team
- (
- Owner_ID,
- [Description],
- Member_RecID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- Default_Flag,
- Updated_By,
- Last_Update,
- SR_Board_RecID,
- DeleteNotify_Flag
- )
- SELECT DISTINCT
- 1,
- LEFT(tmp.BoardName + ' Team', 30),
- mem.Member_RecID,
- bul.Owner_Level_RecID,
- bul.Billing_Unit_RecID,
- 1,
- @ImportBatchUser,
- GETDATE(),
- srb.SR_Board_RecID,
- 0
- FROM #Import_Staging tmp
- INNER JOIN dbo.Billing_Unit_Loc bul
- ON bul.Billing_Unit_Loc_RecID = @Billing_Unit_Loc_RecID
- INNER JOIN Member mem
- ON mem.Member_ID = 'zAdmin'
- INNER JOIN SR_Board srb
- ON srb.Board_Name = tmp.BoardName
- AND srb.Updated_By = @ImportBatchUser
- -- Update each record with SR_Board_RecID
- UPDATE tmp
- SET tmp.SR_Board_RecID = srb.SR_Board_RecID
- FROM SR_Board srb
- INNER JOIN #Import_Staging tmp
- ON tmp.BoardName = srb.Board_Name
- -- Service Priority
- INSERT INTO dbo.SR_Urgency WITH(TABLOCK)
- (
- Owner_ID,
- Color,
- Image_Link,
- [Description],
- Sort_Order,
- Default_Flag,
- Updated_By,
- Response_Hours
- )
- SELECT DISTINCT
- 1,
- 'White',
- '.../../common/images/infoIcons/urgencyColors/White.gif',
- tmp.SrPriority,
- 0,
- 0,
- @ImportBatchUser,
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Urgency sru
- ON sru.[Description] = tmp.SrPriority
- WHERE tmp.SrPriority IS NOT NULL
- AND sru.SR_Urgency_RecID IS NULL
- AND tmp.SrPriority NOT IN('', ' ')
- -- table to Force compilation regardless of structure
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- CREATE TABLE #Force_Compile
- (
- Column_Name VARCHAR(20)
- )
- IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_by' AND OBJECT_NAME(OBJECT_ID) = 'SR_Source')
- BEGIN
- -- Service Source
- INSERT INTO SR_Source
- (
- Owner_ID,
- [Description],
- Updated_By,
- Last_Update,
- Default_Flag,
- Entered_By
- )
- SELECT DISTINCT
- 1,
- tmp.SrSource,
- @ImportBatchUser,
- GETDATE(),
- 0,
- 'zAdmin'
- FROM #Import_Staging tmp
- OUTER APPLY(SELECT TOP 1 * FROM SR_Source srs WHERE srs.[Description] = tmp.SrSource)srs
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- WHERE tmp.SrSource IS NOT NULL
- AND srs.SR_Source_RecID IS NULL
- AND tmp.SrSource NOT IN('', ' ')
- END
- IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_by' AND OBJECT_NAME(OBJECT_ID) = 'SR_Source')
- BEGIN
- -- Service Source
- INSERT INTO SR_Source
- (
- Owner_ID,
- [Description],
- Updated_By,
- Last_Update,
- Default_Flag
- )
- SELECT DISTINCT
- 1,
- tmp.SrSource,
- @ImportBatchUser,
- GETDATE(),
- 0
- FROM #Import_Staging tmp
- OUTER APPLY(SELECT TOP 1 * FROM SR_Source srs WHERE srs.[Description] = tmp.SrSource)srs
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- WHERE tmp.SrSource IS NOT NULL
- AND srs.SR_Source_RecID IS NULL
- AND tmp.SrSource NOT IN('', ' ')
- END
- -- Service Status
- INSERT INTO dbo.SR_Status
- (
- Owner_ID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- [Description],
- Default_Flag,
- Sort_Order,
- Board_Flag,
- Closed_Flag,
- No_Time_Flag,
- Updated_By,
- Resolved_Flag,
- NoEscalation_Flag,
- Escalation_Level,
- SR_Board_RecID,
- Customer_Portal_Flag,
- Inactive_Flag,
- Long_Description
- )
- SELECT DISTINCT
- 1,
- srb.Owner_Level_RecID,
- srb.Billing_Unit_RecID,
- REPLACE(tmp.SrStatus, '<x>', ''),
- 0,
- 0,
- 1,
- CASE WHEN tmp.SrStatus LIKE('<x>%') THEN 1 ELSE 0 END,
- 0,
- @ImportBatchUser,
- 0,
- 1,
- 0,
- tmp.SR_Board_RecID,
- 0,
- 0,
- 'Status ' + tmp.SrStatus + ' created by import utility with default values. Adjust as necessary.'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Status srs
- ON srs.[Description] = REPLACE(tmp.SrStatus, '<x>', '')
- AND srs.SR_Board_RecID = tmp.SR_Board_RecID
- INNER JOIN SR_Board srb
- ON srb.SR_Board_RecID = tmp.SR_Board_RecID
- WHERE tmp.SrStatus IS NOT NULL
- AND srs.SR_Status_RecID IS NULL
- -- Exclude records where board not specified
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrStatus NOT IN('', ' ')
- UPDATE tmp
- SET tmp.SrStatus = REPLACE(tmp.SrStatus, '<x>', '')
- FROM #Import_Staging tmp
- -- If generated status is '>Archived' - make it a 'Closed' status (for custom migrations)
- UPDATE SR_Status
- SET Closed_Flag = 1,
- No_Time_Flag = 1
- WHERE [Description] = '>Archived'
- AND Updated_By = @ImportBatchUser
- -- Service Type
- INSERT INTO dbo.SR_Type
- (
- Owner_ID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- [Description],
- Updated_By,
- Default_Flag,
- ActiveType,
- SR_Board_RecID,
- Inactive_Flag,
- RFC_Flag
- )
- SELECT DISTINCT
- 1,
- srb.Owner_Level_RecID,
- srb.Billing_Unit_RecID,
- tmp.SrType,
- @ImportBatchUser,
- 0,
- 'R',
- tmp.SR_Board_RecID,
- 0,
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_Type srt
- ON srt.[Description] = tmp.SrType
- AND srt.SR_Board_RecID = tmp.SR_Board_RecID
- INNER JOIN SR_Board srb
- ON srb.SR_Board_RecID = tmp.SR_Board_RecID
- WHERE srt.SR_Type_RecID IS NULL
- AND tmp.SrType IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrType NOT IN('', ' ')
- -- Service Subtype
- -- Insert new subtype only if not duplicate on Description and SR_Board_RecID
- INSERT INTO dbo.SR_SubType
- (
- [Description],
- SR_Board_RecID,
- Updated_By,
- Last_Update,
- Inactive_Flag
- )
- SELECT DISTINCT
- tmp.SRSubtype,
- tmp.SR_Board_RecID,
- @ImportBatchUser,
- GETDATE(),
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN dbo.SR_Subtype srst
- ON srst.SR_Board_RecID = tmp.SR_Board_RecID
- AND tmp.SRSubtype = srst.[Description]
- WHERE srst.SR_SubType_RecID IS NULL
- AND tmp.SRSubtype NOT IN('', ' ')
- AND tmp.SRSubtype IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrType IS NOT NULL
- UPDATE tmp
- SET tmp.SR_Subtype_RecID = sti.SR_Subtype_RecID
- FROM #Import_Staging tmp
- 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
- -- Insert new Subtype Item only if not duplicate on Description and SR_Board_RecID
- INSERT INTO dbo.SR_SubtypeItem
- (
- [Description],
- SR_Board_RecID,
- Updated_By,
- Last_Update,
- Inactive_Flag
- )
- SELECT DISTINCT
- tmp.SrItem,
- tmp.SR_Board_RecID,
- @ImportBatchUser,
- GETDATE(),
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SR_SubtypeItem sti
- ON tmp.SrItem = sti.[Description]
- AND tmp.SR_Board_RecID = sti.SR_Board_RecID
- WHERE sti.SR_SubtypeItem_RecID IS NULL
- AND tmp.SrItem NOT IN('', ' ')
- AND tmp.SRSubtype IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrType IS NOT NULL
- UPDATE tmp
- SET tmp.SR_SubtypeItem_RecID = sti.SR_SubtypeItem_RecID
- FROM #Import_Staging tmp
- 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
- -- All types/subtypes/items should now exist
- -- Insert to SR_Type_Subtype_SubTypeItem_Template to create necessary relationships
- INSERT INTO dbo.SR_Type_SubType_SubTypeItem_Template
- (
- SR_Type_RecID,
- SR_SubType_RecID,
- Auto_Apply,
- Updated_By,
- SR_SubTypeItem_RecID,
- Last_Update
- )
- SELECT DISTINCT
- srt.SR_Type_RecID,
- srs.SR_Subtype_RecID,
- 0,
- @ImportBatchUser,
- sri.SR_SubTypeItem_RecID,
- GETDATE()
- FROM #Import_Staging tmp
- INNER JOIN SR_Board srb
- ON tmp.SR_Board_RecID = srb.SR_Board_RecID
- INNER JOIN SR_Type srt
- ON srt.SR_Board_RecID = srb.SR_Board_RecID
- AND srt.[Description] = tmp.SrType
- INNER JOIN SR_Subtype srs
- ON srb.SR_Board_RecID = srs.SR_Board_RecID
- AND srs.[Description] = tmp.SrSubType
- LEFT OUTER JOIN SR_SubTypeItem sri
- ON sri.SR_Board_RecID = srb.SR_Board_RecID
- AND tmp.SrItem = sri.[Description]
- LEFT OUTER JOIN SR_Type_Subtype_SubTypeItem_Template sst
- ON sst.SR_Type_RecID = srt.SR_Type_RecID
- AND sst.SR_Subtype_RecID = srs.SR_Subtype_RecID
- AND ISNULL(sst.SR_SubTypeItem_RecID, 0) = ISNULL(sri.SR_SubTypeItem_RecID, 0)
- WHERE sst.SR_Type_Subtype_SubTypeItem_Template_RecID IS NULL
- AND tmp.SRSubtype IS NOT NULL
- AND tmp.SR_Board_RecID IS NOT NULL
- AND tmp.SrType IS NOT NULL
- -- Insert Service location
- INSERT INTO SR_Location
- (
- Owner_ID,
- [Description],
- Default_Flag,
- Updated_By,
- Last_Update
- )
- SELECT DISTINCT
- 1,
- [SRLocation],
- 0,
- @ImportBatchUser,
- GETDATE()
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 * FROM SR_Location srl WHERE srl.[Description] = stag.[SRLocation])srl
- WHERE srl.SR_Location_RecID IS NULL
- AND LEN(stag.[SRLocation]) < 30
- END -- End force mode
- -- Grab RecIDs & fields needed to start import
- -- Get contact details
- -- Phone
- UPDATE stag
- SET stag.Phone = SUBSTRING(cntc.[Description], 1, 20),
- stag.Ext = cntc.Extension
- FROM Contact_Communication cntc
- INNER JOIN #Import_Staging stag
- ON stag.Contact_RecID = cntc.Contact_RecID
- INNER JOIN Communication_Type cct
- ON cct.Communication_Type_RecID = cntc.Communication_Type_RecID
- WHERE cct.Phone_Flag = 1
- AND cntc.Default_Flag = 1
- -- If phone still null, grab default for company
- UPDATE stag
- SET stag.Phone = SUBSTRING(comp.PhoneNbr, 1, 20)
- FROM dbo.Company comp
- INNER JOIN #Import_Staging stag
- ON stag.Company_RecID = comp.Company_RecID
- WHERE stag.Phone IS NULL
- -- Get email
- UPDATE stag
- SET stag.Email = cntc.[Description]
- FROM Contact_Communication cntc
- INNER JOIN #Import_Staging stag
- ON stag.Contact_RecID = cntc.Contact_RecID
- INNER JOIN Communication_Type cct
- ON cct.Communication_Type_RecID = cntc.Communication_Type_RecID
- WHERE cct.Email_Flag = 1
- AND cntc.default_flag = 1
- -- Get default company address
- UPDATE stag
- SET stag.Company_Address_RecID = cad.Company_Address_RecID,
- stag.Address_Line1 = cad.Address_Line1,
- stag.Address_Line2 = cad.Address_Line2,
- stag.City = cad.City,
- stag.State_ID = cad.State_ID,
- stag.Zip = cad.Zip,
- stag.SiteName = cad.[Description],
- stag.Country_RecID = cad.Country_RecID
- FROM Company_Address cad
- INNER JOIN #Import_Staging stag
- ON stag.Company_RecID = cad.Company_RecID
- AND cad.Default_Flag = 1
- -- Get Tax_Code_RecID
- UPDATE stag
- SET stag.Tax_Code_RecID = ISNULL(comp.Tax_Code_RecID, def.Tax_Code_RecID)
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 Tax_Code_RecID FROM dbo.Company comp WHERE comp.Company_RecID = stag.Company_RecID)comp
- OUTER APPLY(SELECT TOP 1 * FROM dbo.Tax_Code def ORDER BY def.Default_Flag DESC)def
- -- Populate Country_RecID in instances where it was NULL on site
- -- Prefer default but can't be NULL due to FK on SR_Service
- UPDATE stag
- SET stag.Country_RecID = cn.Country_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Country_RecID FROM dbo.Country cn ORDER BY Default_Flag DESC)cn
- WHERE stag.Country_RecID IS NULL
- -- Get RecIDs for Service Type/Subtype/Item/Location etc
- -- Grab valid types/subtypes/items
- IF OBJECT_ID('tempdb..#Type_SubType_Item') IS NOT NULL
- BEGIN
- DROP TABLE #Type_SubType_Item
- END
- SELECT
- SR_Type_SubType_SubTypeItem_Template_RecID AS Template_RecID,
- srt.[Description] AS [Type],
- ISNULL(sst.[Description], '') AS [SubType],
- ISNULL(sti.[Description], '') AS [Item],
- srt.SR_Board_RecID,
- srt.SR_Type_RecID,
- tmpl.SR_SubType_RecID,
- tmpl.SR_SubTypeItem_RecID
- INTO #Type_Subtype_Item
- FROM SR_Type srt
- LEFT OUTER JOIN SR_Type_SubType_SubTypeItem_Template tmpl
- ON tmpl.SR_Type_RecID = srt.SR_Type_RecID
- AND srt.Inactive_Flag = 0
- LEFT OUTER JOIN SR_SubType sst
- ON sst.SR_SubType_RecID = tmpl.SR_SubType_RecID
- AND sst.Inactive_Flag = 0
- LEFT OUTER JOIN SR_SubTypeItem sti
- ON sti.SR_SubTypeItem_RecID = tmpl.SR_SubTypeItem_RecID
- AND sti.Inactive_Flag = 0
- -- Service Type
- UPDATE stag
- SET stag.SR_Type_RecID = sti.SR_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN #Type_Subtype_Item sti
- ON stag.SRType = sti.[Type]
- AND stag.SR_Board_RecID = sti.SR_Board_RecID
- -- Service Subtype
- UPDATE stag
- SET stag.SR_Subtype_RecID = sti.SR_Subtype_RecID
- FROM #Import_Staging stag
- INNER JOIN #Type_Subtype_Item sti
- ON sti.SR_Type_RecID = stag.SR_Type_RecID
- AND stag.SrSubType = sti.SubType
- -- Service item
- UPDATE stag
- SET stag.SR_SubTypeItem_RecID = sti.SR_SubTypeItem_RecID
- FROM #Import_Staging stag
- 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
- -- Service location
- UPDATE stag
- SET stag.SR_Location_RecID = srl.SR_Location_RecID
- FROM #Import_Staging stag
- INNER JOIN SR_Location srl
- ON srl.[Description] = stag.SrLocation
- -- Service Status
- UPDATE stag
- SET stag.SR_Status_RecID = srs.SR_Status_RecID
- FROM SR_Status srs
- INNER JOIN #Import_Staging stag
- ON stag.SrStatus = srs.[Description]
- AND stag.SR_Board_RecID = srs.SR_Board_RecID
- -- Source
- UPDATE stag
- SET stag.SR_Source_RecID = srso.SR_Source_RecID
- FROM #Import_Staging stag
- INNER JOIN SR_Source srso
- ON stag.SRSource = srso.[Description]
- -- Urgency
- UPDATE stag
- SET stag.SR_Urgency_RecID = sru.SR_Urgency_RecID
- FROM #Import_Staging stag
- INNER JOIN SR_Urgency sru
- ON stag.SrPriority = sru.[Description]
- -- Team
- UPDATE stag
- SET stag.Sr_Team_RecID = srt.SR_Team_RecID
- FROM #Import_Staging stag
- INNER JOIN SR_Team srt
- ON stag.SR_Board_RecID = srt.SR_Board_RecID
- WHERE srt.Default_Flag = 1
- -- Get RecID for Resource Member - if specified
- UPDATE stag
- SET stag.Resource_Member_RecID = mem.Member_RecID
- FROM #Import_Staging stag
- INNER JOIN Member mem
- ON stag.ResourceMember = mem.Member_ID
- WHERE stag.ResourceMember IS NOT NULL
- -- Get zAdmin RecID
- SELECT @zAdmin_Member_RecID = Member_RecID
- FROM Member
- WHERE Member_ID = 'zadmin'
- -- Error if no zAdmin user
- IF @zAdmin_Member_RecID IS NULL
- BEGIN
- RAISERROR('zAdmin user not found for this implementation - required for import', 16, 2)
- END
- UPDATE stag
- SET stag.Member_ID_Calculated = SUBSTRING(ISNULL(stag.First_Name, ''), 1, 1) + ISNULL(stag.Last_Name, '')
- FROM #TMP_Time_Staging stag
- -- Get Member_RecID, Member_ID for records in #TMP_Time_Staging
- UPDATE ti
- SET ti.Member_RecID = mem.Member_RecID,
- ti.Member_ID = mem.Member_ID
- FROM #TMP_Time_Staging ti
- INNER JOIN dbo.Member mem
- ON (mem.First_Name = ti.First_Name AND mem.Last_Name = ti.Last_Name)
- OR ti.Member_ID_Calculated = mem.Member_ID
- -- Set Member_ID and Member_RecID to correspond to zAdmin if time entry did not map back to a member
- UPDATE te
- SET te.Member_ID = mem.Member_ID,
- te.Member_RecID = mem.Member_RecID,
- te.Notes = 'Resource: ' + ISNULL(te.First_Name, '') + ' ' + ISNULL(te.Last_Name, '') + '
- ' + te.Notes
- FROM #TMP_Time_Staging te
- INNER JOIN dbo.Member mem
- ON mem.Member_ID = 'zAdmin'
- WHERE te.Member_ID IS NULL
- AND te.Note_Type <> 'ExtNote'
- -- If this is a data migration (Autotask/Tigerpaw) strip invalid Assigned By and Resource members
- UPDATE stag
- SET stag.AssignedBy = 'zAdmin'
- FROM #Import_Staging stag
- WHERE @Migration_Flag = 1
- OR @ForceMode = 1
- AND AssignedBy = ''
- OR AssignedBy IS NULL
- UPDATE stag
- SET stag.ResourceMember = NULL
- FROM #Import_Staging stag
- WHERE stag.ResourceMember IS NOT NULL
- AND stag.Resource_Member_RecID IS NULL
- AND @Migration_Flag = 1
- -- Check required fields
- UPDATE #Import_Staging
- SET ConvertMessage =
- CASE
- WHEN SR_Board_RecID IS NULL THEN 'Invalid Service board: ' + BoardName
- WHEN SR_Type_RecID IS NULL AND SrType IS NOT NULL THEN 'Invalid service type: ' + SrType
- WHEN SR_SubType_RecID IS NULL AND SrSubtype IS NOT NULL THEN 'Invalid SubType: ' + SrSubType
- WHEN SR_SubTypeItem_RecID IS NULL AND SrItem IS NOT NULL THEN 'Invalid Service Item: ' + SrItem
- WHEN SR_Source_RecID IS NULL THEN 'Invalid Source: ' + SrSource
- WHEN SR_Location_RecID IS NULL THEN 'Invalid Location: ' + SrLocation
- WHEN SR_Urgency_RecID IS NULL THEN 'Invalid Priority: ' + SrPriority
- WHEN SR_Status_RecID IS NULL THEN 'Invalid Status: ' + SrStatus
- WHEN Company_RecID IS NULL THEN 'Invalid Company: ' + Company_Name
- WHEN Contact_RecID IS NULL THEN 'Contact not found and no default contact exists for Company: ' + Company_Name
- WHEN Config_RecID IS NULL AND ConfigName IS NOT NULL THEN 'Configuration not found: ' + ConfigName + ' for company ' + CAST(Company_RecID AS VARCHAR(10))
- WHEN Resource_Member_RecID IS NULL AND ResourceMember IS NOT NULL THEN 'Resource Member not found: ' + ResourceMember
- END
- -- If a required field is null, return failure message
- IF EXISTS(SELECT * FROM #Import_Staging WHERE ConvertMessage IS NOT NULL)
- BEGIN
- -- Raise error w/ 16 severity to jump to catch
- RAISERROR('Validation Error', 16, 2)
- END
- ELSE
- -- Validation suceeded - begin push
- -- Get expected rowcount for insert to SR_Service
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging
- -- Grab maximum identity from SR_Service prior to insert
- SELECT @MAX_SR_Service_RecID = ISNULL(MAX(SR_Service_RecID), 0) FROM dbo.SR_Service
- -- Retrieve UTC offset for Entered & Completed dates
- UPDATE stag
- SET EnteredOffset = tzo.OffsetFromUTC
- FROM #Import_Staging stag
- INNER JOIN Time_Zone_Offsets tzo
- ON tzo.Time_Zone_Name_RecID = @Time_Zone_Name_RecID
- AND DateEntered BETWEEN tzo.StartDate and tzo.EndDate
- UPDATE stag
- SET CompletedOffset = tzo.OffsetFromUTC
- FROM #Import_Staging stag
- INNER JOIN Time_Zone_Offsets tzo
- ON tzo.Time_Zone_Name_RecID = @Time_Zone_Name_RecID
- AND DateCompleted BETWEEN tzo.StartDate and tzo.EndDate
- -- Convert Entered/Completed dates to UTC
- UPDATE stag
- SET CompletedUTC = DATEADD(HOUR, CompletedOffset * -1, DateCompleted),
- EnteredUTC = DATEADD(HOUR, EnteredOffset * -1, DateEntered)
- FROM #Import_Staging stag
- -- Perform insert to dbo.SR_Service, catching new identity values in temp table
- -- Temporarily repurpose Owner_ID to catch RecID from source table in order to join back
- -- repurpose Reference to catch Legacy_ID
- -- Pre-2017.5 insert
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'SR_Service')
- BEGIN
- INSERT INTO dbo.SR_Service WITH(TABLOCK)
- (
- Owner_ID,
- SR_Type_RecID,
- SR_Location_RecID,
- SR_Status_RecID,
- SR_Source_RecID,
- SR_Urgency_RecID,
- SR_Team_RecID,
- SR_Board_RecID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- SR_Severity_RecID,
- SR_Impact_RecID,
- SR_Billing_Method_ID,
- Company_RecID,
- Contact_RecID,
- Contact_Name,
- PhoneNbr,
- Extension,
- Email_Address,
- Company_Address_RecID,
- Site_Name,
- Address_Line1,
- Address_Line2,
- City,
- State_ID,
- Zip,
- Summary,
- SR_SubType_RecID,
- SR_SubTypeItem_RecID,
- EmailContact_Flag,
- EmailResource_Flag,
- Entered_By,
- Date_Entered,
- Assigned_By_RecID,
- Closed_By,
- Date_Closed,
- Updated_By,
- Last_Update,
- BillSR_Flag,
- BillComplete_Flag,
- BillUnapp_Flag,
- Activity_Class_RecID,
- Activity_Type_RecID,
- Date_Entered_UTC,
- Date_Closed_UTC,
- Reference,
- Country_RecID,
- Tax_Code_RecID
- )
- OUTPUT INSERTED.Reference, INSERTED.SR_Service_RecID, 'Ticket' INTO Import_Legacy_ID_Custom
- SELECT
- stag.ExcelRowNumber,
- stag.SR_Type_RecID,
- stag.SR_Location_RecID,
- stag.SR_Status_RecID,
- stag.SR_Source_RecID,
- stag.SR_Urgency_RecID,
- stag.SR_Team_RecID,
- stag.SR_Board_RecID,
- srb.Owner_Level_RecID,
- srb.Billing_Unit_RecID,
- (SELECT TOP 1 SR_Severity_RecID FROM SR_Severity WHERE Default_Flag = 1) AS SR_Severity_RecID,
- (SELECT TOP 1 SR_Impact_RecID FROM SR_Impact WHERE Default_Flag = 1) AS SR_Impact_RecID,
- 'A' AS SR_Billing_Method_ID,
- stag.Company_RecID,
- stag.Contact_RecID,
- stag.ContactName AS Contact_Name,
- stag.Phone AS PhoneNbr,
- stag.Ext AS Extension,
- stag.Email AS Email_Address,
- stag.Company_Address_RecID,
- stag.SiteName AS Site_Name,
- stag.Address_Line1,
- stag.Address_Line2,
- stag.City,
- stag.State_ID,
- stag.Zip,
- stag.Summary,
- stag.SR_SubType_RecID,
- stag.SR_SubTypeItem_RecID,
- ISNULL(srb.EmailContact_Flag, 0) AS EmailContact_Flag,
- ISNULL(srb.EmailResource_Flag, 0) AS EmailResource_Flag,
- @ImportBatchUser AS Entered_By,
- ISNULL(stag.DateEntered, GETDATE()) AS Date_Entered,
- ISNULL(mem.Member_RecID, @zAdmin_Member_RecID) AS Assigned_By_RecID,
- CASE WHEN stag.DateCompleted IS NULL THEN NULL ELSE 'zadmin' END AS Closed_By,
- ISNULL(stag.DateCompleted, GETDATE()) AS Date_Closed,
- @ImportBatchUser AS Updated_By,
- GETDATE() AS Last_Update,
- ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillSR_Flag ELSE NULL END, bsu.BillSR_Flag) AS BillSR_Flag,
- ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillComplete_Flag ELSE NULL END, bsu.BillComplete_Flag) AS BillComplete_Flag,
- ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillUnapp_Flag ELSE NULL END, bsu.BillUnapp_Flag) AS BillUnapp_Flag,
- 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,
- 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,
- stag.DateEntered,
- stag.DateCompleted,
- Legacy_ID,
- stag.Country_RecID,
- stag.Tax_Code_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM SR_Board srb WHERE srb.SR_Board_RecID = stag.SR_Board_RecID)srb
- OUTER APPLY(SELECT TOP 1 * FROM dbo.Member mem WHERE mem.Member_ID = stag.AssignedBy)mem
- OUTER APPLY(SELECT TOP 1 * FROM Billing_Setup bsu WHERE bsu.Owner_Level_RecID = srb.Owner_Level_RecID)bsu
- OUTER APPLY(SELECT TOP 1 * FROM dbo.Country ORDER BY Default_Flag DESC)cnt
- OUTER APPLY(SELECT TOP 1 * FROM dbo.Currency curr WHERE curr.Currency_ID = cnt.Currency_ID)curr
- OUTER APPLY(SELECT TOP 1 * FROM Activity_Class ac)ac
- OUTER APPLY(SELECT TOP 1 * FROM Activity_Type aty ORDER BY aty.Default_Flag DESC)aty
- ORDER BY stag.ExcelRowNumber ASC
- END
- -- Post-2017.5 insert
- IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'SR_Service')
- BEGIN
- INSERT INTO dbo.SR_Service WITH(TABLOCK)
- (
- Owner_ID,
- SR_Type_RecID,
- SR_Location_RecID,
- SR_Status_RecID,
- SR_Source_RecID,
- SR_Urgency_RecID,
- SR_Team_RecID,
- SR_Board_RecID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- SR_Severity_RecID,
- SR_Impact_RecID,
- SR_Billing_Method_ID,
- Company_RecID,
- Contact_RecID,
- Contact_Name,
- PhoneNbr,
- Extension,
- Email_Address,
- Company_Address_RecID,
- Site_Name,
- Address_Line1,
- Address_Line2,
- City,
- State_ID,
- Zip,
- Summary,
- SR_SubType_RecID,
- SR_SubTypeItem_RecID,
- EmailContact_Flag,
- EmailResource_Flag,
- Entered_By,
- Date_Entered,
- Assigned_By_RecID,
- Closed_By,
- Date_Closed,
- Updated_By,
- Last_Update,
- BillSR_Flag,
- BillComplete_Flag,
- BillUnapp_Flag,
- Activity_Class_RecID,
- Activity_Type_RecID,
- Date_Entered_UTC,
- Date_Closed_UTC,
- Reference,
- Country_RecID,
- Currency_RecID,
- Tax_Code_RecID
- )
- OUTPUT INSERTED.Reference, INSERTED.SR_Service_RecID, 'Ticket' INTO Import_Legacy_ID_Custom
- SELECT
- stag.ExcelRowNumber,
- stag.SR_Type_RecID,
- stag.SR_Location_RecID,
- stag.SR_Status_RecID,
- stag.SR_Source_RecID,
- stag.SR_Urgency_RecID,
- stag.SR_Team_RecID,
- stag.SR_Board_RecID,
- srb.Owner_Level_RecID,
- srb.Billing_Unit_RecID,
- (SELECT TOP 1 SR_Severity_RecID FROM SR_Severity WHERE Default_Flag = 1) AS SR_Severity_RecID,
- (SELECT TOP 1 SR_Impact_RecID FROM SR_Impact WHERE Default_Flag = 1) AS SR_Impact_RecID,
- 'A' AS SR_Billing_Method_ID,
- stag.Company_RecID,
- stag.Contact_RecID,
- stag.ContactName AS Contact_Name,
- stag.Phone AS PhoneNbr,
- stag.Ext AS Extension,
- stag.Email AS Email_Address,
- stag.Company_Address_RecID,
- stag.SiteName AS Site_Name,
- stag.Address_Line1,
- stag.Address_Line2,
- stag.City,
- stag.State_ID,
- stag.Zip,
- stag.Summary,
- stag.SR_SubType_RecID,
- stag.SR_SubTypeItem_RecID,
- ISNULL(srb.EmailContact_Flag, 0) AS EmailContact_Flag,
- ISNULL(srb.EmailResource_Flag, 0) AS EmailResource_Flag,
- @ImportBatchUser AS Entered_By,
- ISNULL(stag.DateEntered, GETDATE()) AS Date_Entered,
- ISNULL(mem.Member_RecID, @zAdmin_Member_RecID) AS Assigned_By_RecID,
- CASE WHEN stag.DateCompleted IS NULL THEN NULL ELSE 'zadmin' END AS Closed_By,
- ISNULL(stag.DateCompleted, GETDATE()) AS Date_Closed,
- @ImportBatchUser AS Updated_By,
- GETDATE() AS Last_Update,
- ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillSR_Flag ELSE NULL END, bsu.BillSR_Flag) AS BillSR_Flag,
- ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillComplete_Flag ELSE NULL END, bsu.BillComplete_Flag) AS BillComplete_Flag,
- ISNULL(CASE WHEN srb.Override_Flag = 1 THEN srb.BillUnapp_Flag ELSE NULL END, bsu.BillUnapp_Flag) AS BillUnapp_Flag,
- 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,
- 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,
- stag.DateEntered,
- stag.DateCompleted,
- Legacy_ID,
- stag.Country_RecID,
- curr.Currency_RecID,
- stag.Tax_Code_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM SR_Board srb WHERE srb.SR_Board_RecID = stag.SR_Board_RecID)srb
- OUTER APPLY(SELECT TOP 1 * FROM dbo.Member mem WHERE mem.Member_ID = stag.AssignedBy)mem
- OUTER APPLY(SELECT TOP 1 * FROM Billing_Setup bsu WHERE bsu.Owner_Level_RecID = srb.Owner_Level_RecID)bsu
- OUTER APPLY(SELECT TOP 1 * FROM dbo.Country ORDER BY Default_Flag DESC)cnt
- OUTER APPLY(SELECT TOP 1 * FROM dbo.Currency curr WHERE curr.Currency_ID = cnt.Currency_ID)curr
- OUTER APPLY(SELECT TOP 1 * FROM Activity_Class ac)ac
- OUTER APPLY(SELECT TOP 1 * FROM Activity_Type aty ORDER BY aty.Default_Flag DESC)aty
- ORDER BY stag.ExcelRowNumber ASC
- END
- -- Join final table back to staging to capture new identity
- UPDATE stag
- SET stag.New_Identity = srs.SR_Service_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.SR_Service srs
- ON srs.Owner_ID = stag.ExcelRowNumber
- AND Entered_By = @ImportBatchUser
- AND srs.SR_Service_RecID > @MAX_SR_Service_RecID
- -- Update Owner_ID in final table to appropriate value
- UPDATE srs
- SET srs.Owner_ID = 1,
- srs.Reference = NULL
- FROM dbo.SR_Service srs
- WHERE Entered_By = @ImportBatchUser
- AND SR_Service_RecID > @MAX_SR_Service_RecID
- -- Insert Problem detail to SR_Detail
- INSERT INTO SR_Detail WITH(TABLOCK)
- (
- SR_Service_RecID,
- SR_Detail_Notes,
- Problem_Flag,
- Resolution_Flag,
- InternalAnalysis_Flag,
- Document_Flag,
- Internal_Member_Flag,
- External_Source_Flag,
- Date_Format,
- Date_Created,
- Created_By,
- Last_Update,
- Updated_By,
- Member_RecID,
- Date_Created_UTC
- )
- SELECT
- stag.New_Identity,
- stag.DetailDescription,
- 1,
- 0,
- 0,
- 0,
- 1,
- 0,
- 111,
- ISNULL(stag.DateEntered, GETDATE()),
- @ImportBatchUser,
- GETDATE(),
- @ImportBatchUser,
- mem.Member_RecID,
- stag.EnteredUTC
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Member_RecID FROM dbo.Member mem WHERE mem.Member_ID = 'zAdmin')mem
- WHERE stag.DetailDescription IS NOT NULL
- -- Insert Internal Analysis to SR_Detail
- INSERT INTO SR_Detail WITH(TABLOCK)
- (
- SR_Service_RecID,
- SR_Detail_Notes,
- Problem_Flag,
- Resolution_Flag,
- InternalAnalysis_Flag,
- Document_Flag,
- Internal_Member_Flag,
- External_Source_Flag,
- Date_Format,
- Date_Created,
- Created_By,
- Last_Update,
- Updated_By,
- Date_Created_UTC
- )
- SELECT
- stag.New_Identity,
- stag.InternalAnalysis,
- 0,
- 0,
- 1,
- 0,
- 1,
- 0,
- 111,
- ISNULL(stag.DateEntered, GETDATE()),
- @ImportBatchUser,
- GETDATE(),
- @ImportBatchUser,
- stag.EnteredUTC
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Member_RecID FROM dbo.Member mem WHERE mem.Member_ID = 'zAdmin')mem
- WHERE stag.InternalAnalysis IS NOT NULL
- -- Insert Resolution detail to SR_Detail
- INSERT INTO SR_Detail WITH(TABLOCK)
- (
- SR_Service_RecID,
- SR_Detail_Notes,
- Problem_Flag,
- Resolution_Flag,
- InternalAnalysis_Flag,
- Document_Flag,
- Internal_Member_Flag,
- External_Source_Flag,
- Date_Format,
- Date_Created,
- Created_By,
- Last_Update,
- Updated_By,
- Date_Created_UTC
- )
- SELECT
- stag.New_Identity,
- stag.Resolution,
- 0,
- 1,
- 0,
- 0,
- 1,
- 0,
- 111,
- ISNULL(stag.DateEntered, GETDATE()),
- @ImportBatchUser,
- GETDATE(),
- @ImportBatchUser,
- stag.EnteredUTC
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Member_RecID FROM dbo.Member mem WHERE mem.Member_ID = 'zAdmin')mem
- WHERE stag.Resolution IS NOT NULL
- -- Add audit trail
- -- Pre-2017.1 - insert to SR_Audit
- IF OBJECT_ID('SR_Service_Audit') IS NULL
- BEGIN
- INSERT INTO dbo.SR_Audit
- (
- SR_Service_RecID,
- Audit_Text,
- Updated_By,
- Last_Update
- )
- SELECT
- stag.New_Identity,
- 'Service ticket has been created by import utility.',
- @ImportBatchUser,
- GETDATE()
- FROM #Import_Staging stag
- END
- -- 2017.1 and later - Insert to SR_Service_Audit
- IF OBJECT_ID('SR_Service_Audit') IS NOT NULL
- BEGIN
- INSERT INTO SR_Service_Audit
- (
- SR_Service_RecID,
- Locale_Key_RecID,
- Audit_Source_RecID,
- Audit_Type_RecID,
- Audit_SubType_RecID,
- Audit_Data_Type_Format_RecID,
- OldValue_Text,
- NewValue_Text,
- Affected_Record,
- DM_Document_RecID,
- Created_By,
- Date_Entered_UTC
- )
- SELECT
- stag.New_Identity, --SR_Service_RecID,
- lk.Locale_Key_RecID, --Locale_Key_RecID,
- src.Audit_Source_RecId, --Audit_Source_RecID,
- aty.Audit_Type_RecId, --Audit_Type_RecID,
- ast.Audit_SubType_RecID, --Audit_SubType_RecID,
- dtf.Audit_Data_Type_Format_RecID, --Audit_Data_Type_Format_RecID,
- NULL, --OldValue_Text,
- stag.New_Identity,--NewValue_Text,
- NULL, --Affected_Record,
- NULL, --DM_Document_RecID,
- 'Import',--Created_By
- GETUTCDATE()--Date_Entered_UTC
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Locale_Key_RecID FROM dbo.Locale_Key lk WHERE lk.Locale_Text_key = 'ticket_created')lk
- CROSS APPLY(SELECT TOP 1 Audit_Source_RecID FROM dbo.Audit_Source src WHERE src.Audit_Source_ID = 'Application')src
- CROSS APPLY(SELECT TOP 1 Audit_Type_RecID FROM dbo.Audit_Type aty WHERE aty.Audit_Type_ID = 'Record')aty
- CROSS APPLY(SELECT TOP 1 Audit_SubType_RecID FROM dbo.Audit_SubType ast WHERE ast.Audit_SubType_ID = 'RecordCreated')ast
- CROSS APPLY(SELECT TOP 1 Audit_Data_Type_Format_RecID FROM Audit_Data_Type_Format dtf WHERE dtf.Data_Type = 'TEXT')dtf
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- END
- -- Add configuration if specified
- INSERT INTO SR_Config
- (
- Config_RecID,
- SR_Service_RecID,
- Last_Update,
- Updated_By
- )
- SELECT
- stag.Config_RecID,
- stag.New_Identity,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging stag
- WHERE stag.Config_RecID IS NOT NULL
- -- Calculate Schedule_Desc field for Schedule insert
- UPDATE stag
- SET Schedule_Desc = SUBSTRING(ISNULL(Company_Name, '') + ' / ' + CONVERT(VARCHAR(50), New_Identity) + ' - ' + ISNULL(Summary, '(No summary description)'), 1, 200)
- FROM #Import_Staging stag
- WHERE stag.ResourceMember IS NOT NULL
- -- Insert to dbo.Schedule
- INSERT INTO dbo.Schedule WITH(TABLOCK)
- (
- RecID,
- Schedule_Type_RecID,
- close_flag,
- Hours_Estimated,
- Schedule_Desc,
- Last_Update,
- Updated_By,
- Syncable,
- Reminder_Flag,
- Reminder_Minutes,
- All_Day_Flag,
- Duration,
- Entered_By_RecID,
- Xref_Mbr_RecID,
- Hours_Sched,
- Schedule_Status_RecID,
- Hours_per_Day,
- Ack_Flag,
- Date_Entered,
- SR_Location_RecID
- )
- SELECT
- stag.New_Identity,
- 4,
- 0,
- 0,
- stag.Schedule_Desc,
- GETDATE(),
- @ImportBatchUser,
- 0,
- 0,
- 0,
- 0,
- 0,
- @zAdmin_Member_RecID,
- stag.Resource_Member_RecID,
- 0,
- 2,
- 0,
- 0,
- GETDATE(),
- stag.SR_Location_RecID
- FROM #Import_Staging stag
- WHERE stag.ResourceMember IS NOT NULL
- -- Insert to SR_Service_SLA_Workflow
- INSERT INTO dbo.SR_Service_SLA_Workflow
- (
- SR_Service_RecID,
- Date_Resolved_UTC,
- Escalation_Start_Date_UTC,
- Notification_History,
- Overall_Start_Date_UTC
- )
- SELECT
- stag.New_Identity,
- CompletedUTC,
- EnteredUTC,
- ',',
- EnteredUTC
- FROM #Import_Staging stag
- IF @TESourceTable IS NOT NULL AND EXISTS(SELECT TOP 1 * FROM #TMP_Time_Staging)
- BEGIN
- -- Capture maximum identity from dbo.Time_Entry prior to insert (optimization)
- SELECT @MAX_Time_Entry_RecID = ISNULL(MAX(Time_RecID), 0) FROM dbo.Time_Entry
- -- Table to capture identities of inserted detail entries
- IF OBJECT_ID('tempdb..#ID_Map') IS NOT NULL
- DROP TABLE #ID_Map
- CREATE TABLE #ID_Map
- (
- Source_RecID INT,
- Destination_RecID INT
- )
- IF OBJECT_ID('tempdb..#TE_Map') IS NOT NULL
- DROP TABLE #TE_Map
- CREATE TABLE #TE_Map
- (
- RecID INT,
- Time_RecID INT
- )
- CREATE INDEX IX_RecID ON #TE_Map(RecID)
- CREATE INDEX IX_Time_RecID ON #TE_Map(Time_RecID)
- -- Pull necessary data from #Import_Staging to TMP_Time_Staging
- UPDATE ti
- SET ti.Company_RecID = stag.Company_RecID,
- ti.SR_Service_RecID = stag.New_Identity
- FROM #TMP_Time_Staging ti
- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging stag WHERE stag.Legacy_ID = ti.Legacy_Ticket_ID)stag
- UPDATE ti
- SET ti.Owner_Level_RecID = srs.Owner_Level_RecID,
- ti.Billing_Unit_RecID = srs.Billing_Unit_RecID,
- ti.Activity_Type_RecID = srs.Activity_Type_RecID,
- ti.Activity_Class_RecID = srs.Activity_Class_RecID
- FROM #TMP_Time_Staging ti
- 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
- -- Eliminate time entries for any ticket which was excluded from import
- DELETE FROM #TMP_Time_Staging WHERE SR_Service_RecID IS NULL
- -- Insert time entries
- INSERT INTO Time_Entry WITH(TABLOCK)
- (
- Owner_ID,
- Company_RecID,
- Entered_By,
- Notes,
- Member_ID,
- Date_Start,
- Time_Start,
- Time_End,
- Hours_Actual,
- Hours_Bill,
- Billable_Flag,
- SR_Service_RecID,
- Member_RecID,
- TE_Problem_Flag,
- TE_Resolution_Flag,
- TE_InternalAnalysis_Flag,
- Invoice_Flag,
- TE_Status_ID,
- Updated_By,
- Time_Sheet_RecID,
- Time_Start_UTC,
- Time_End_UTC,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- Activity_Type_RecID,
- Activity_Class_RecID
- )
- OUTPUT INSERTED.Owner_ID, INSERTED.Time_RecID INTO #TE_Map
- SELECT
- ti.RecID,
- ti.Company_RecID,
- @ImportBatchUser,
- ti.Notes,
- LEFT(ti.Created_By, 15),
- ti.Date_Start,
- '1/1/1900 ' + CONVERT(VARCHAR(8), CAST(ti.Date_Start as time)),
- '1/1/1900 ' + CONVERT(VARCHAR(8), CAST(ti.Date_End AS time)),
- ti.Num_Hours,
- ti.Hours_Bill,
- ti.Billable,
- ti.SR_Service_RecID,
- ti.Member_RecID,
- CASE WHEN ti.Note_Type = 'Detail' THEN 1 ELSE 0 END,
- CASE WHEN ti.Note_Type = 'Resolution' THEN 1 ELSE 0 END,
- CASE WHEN ti.Note_Type = 'Internal' THEN 1 ELSE 0 END,
- ti.Billable,
- @TE_Status_ID,
- @ImportBatchUser,
- @Time_Sheet_RecID,
- Date_Start,
- Date_End,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- Activity_Type_RecID,
- Activity_Class_RecID
- FROM #TMP_Time_Staging ti
- WHERE ti.Note_Type IN('Detail', 'Internal', 'Resolution')
- -- Insert internal (non-time entry) into SR_Detail
- MERGE SR_Detail AS dest
- USING (SELECT * FROM #TMP_Time_Staging WHERE Note_Type IN('InternalNote', 'DetailNote', 'ResolutionNote', 'ExtNote')) AS src
- ON 1=0
- WHEN NOT MATCHED THEN
- INSERT
- (
- SR_Service_RecID,
- SR_Detail_Notes,
- Problem_Flag,
- Resolution_Flag,
- InternalAnalysis_Flag,
- Document_Flag,
- Internal_Member_Flag,
- External_Source_Flag,
- Date_Format,
- Date_Created,
- Created_By,
- Last_Update,
- Updated_By
- )
- VALUES
- (
- src.SR_Service_RecID,
- src.Notes,
- CASE WHEN src.Note_Type IN('DetailNote', 'ExtNote') THEN 1 ELSE 0 END,
- CASE WHEN src.Note_Type = 'ResolutionNote' THEN 1 ELSE 0 END,
- CASE WHEN src.Note_Type = 'InternalNote' THEN 1 ELSE 0 END,
- 0,
- CASE WHEN src.Note_Type = 'ExtNote' THEN 0 ELSE 1 END,
- CASE WHEN src.Note_Type = 'ExtNote' THEN 1 ELSE 0 END,
- 111,
- ISNULL(src.Date_Start, GETDATE()),
- src.Created_By,
- GETDATE(),
- @ImportBatchUser
- )
- OUTPUT src.RecID, inserted.SR_Detail_RecID INTO #ID_Map;
- -- Join back to TMP_Time_Staging to capture identities from dbo.Time_Entry
- UPDATE ti
- SET ti.Time_RecID = map.Time_RecID
- FROM #TMP_Time_Staging ti
- CROSS APPLY(SELECT TOP 1 Time_RecID FROM #TE_Map map WHERE map.RecID = ti.RecID)map
- UPDATE te
- SET Owner_ID = 1
- FROM Time_Entry te
- WHERE EXISTS(SELECT 1 FROM #TMP_Time_Staging stag WHERE stag.Time_RecID = te.Time_RecID)
- -- Join back to #ID_Map to capture identities from SR_Detail
- UPDATE ti
- SET ti.SR_Detail_RecID = map.Destination_RecID
- FROM #TMP_Time_Staging ti
- CROSS APPLY(SELECT TOP 1 Destination_RecID FROM #ID_Map map WHERE map.Source_RecID = ti.RecID)map
- -- Update zAdmin time sheet to 'Written off'
- UPDATE ts
- SET TE_Status_ID = @TE_Status_ID
- FROM dbo.Time_Sheet ts
- WHERE Time_Sheet_RecID = @Time_Sheet_RecID
- -- Insert to dbo.Time_Audit
- INSERT INTO Time_Audit
- (
- Time_RecID,
- Member_RecID,
- Date_Audit,
- TE_Status_ID
- )
- SELECT
- ti.Time_RecID,
- ti.Member_RecID,
- GETDATE(),
- 10
- FROM #TMP_Time_Staging ti
- WHERE ti.Time_RecID IS NOT NULL
- END
- -- Insert to SR_Service_Calculated
- INSERT INTO SR_Service_Calculated
- (
- SR_Service_RecID,
- --ResourceGIF,
- SR_SLA_RecID,
- ResourceList
- )
- SELECT
- stag.New_Identity,
- --CASE WHEN stag.Resource_Member_RecID IS NULL THEN 'common/images/infoIcons/SR0-noperson.gif' ELSE 'common/images/infoIcons/SR9-checkmark.gif' END,
- NULL,
- mem.Member_ID
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 * FROM dbo.Member mem WHERE mem.Member_RecID = stag.Resource_Member_RecID) mem
- WHERE New_Identity NOT IN(SELECT SR_Service_RecID FROM dbo.SR_Service_Calculated)
- -- If debug mode and successful, select the rows that were inserted
- -- and rollback transaction
- IF @DebugMode = 1 AND @@ERROR = 0
- BEGIN
- SELECT * FROM dbo.SR_Service WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
- SELECT * FROM dbo.SR_Detail WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
- SELECT * FROM dbo.SR_Audit WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
- SELECT * FROM dbo.SR_Config WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
- SELECT * FROM dbo.Schedule WHERE RecID IN(SELECT New_Identity FROM #Import_Staging) AND Schedule_Type_RecID = 4
- SELECT * FROM dbo.SR_Service_SLA_Workflow WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
- SELECT * FROM dbo.Time_Entry WHERE SR_Service_RecID IN(SELECT New_Identity FROM #Import_Staging)
- ROLLBACK TRANSACTION SR_Import
- RETURN 0
- END
- IF @DebugMode = 2 AND @@ERROR = 0
- BEGIN
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- ROLLBACK TRANSACTION SR_Import
- RETURN 1
- END
- EXEC usp_Import_UDF @TableName, 'Ticket'
- IF @DebugMode = 0 AND @@Error = 0
- BEGIN
- -- Import successful - Save legacy_id's if necessary, commit and return results
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- IF OBJECT_ID('tempdb..#TMP_Time_Staging') IS NOT NULL
- BEGIN
- IF OBJECT_ID('tempdb..#Legacy_IDs') IS NOT NULL
- DROP TABLE #Legacy_IDs
- SELECT
- Legacy_ID AS Legacy_ID,
- Time_RecID AS CW_RecID,
- CASE WHEN Note_Type IN('InternalNote', 'DetailNote', 'ResolutionNote', 'ExtNote') THEN 'SR_Detail' ELSE 'Time_Entry' END AS Record_Type
- INTO #Legacy_IDs
- FROM #TMP_Time_Staging
- DROP TABLE #TMP_Time_Staging
- END
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- EXEC dbo.usp_Import_Legacy_IDs
- END
- COMMIT TRANSACTION SR_Import
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- RETURN 1
- END
- END TRY
- BEGIN CATCH
- -- An error has occured - determine if validation error
- IF ERROR_MESSAGE() = 'Validation Error'
- BEGIN
- -- Return details of error from staging table
- SELECT
- 0 AS Success,
- stag.ExcelRowNumber,
- stag.ConvertMessage AS ErrorDetails
- FROM #Import_Staging stag
- WHERE ConvertMessage IS NOT NULL
- -- Rollback transaction
- IF @@TRANCOUNT > 0
- ROLLBACK TRANSACTION SR_Import
- RETURN 0
- END
- ELSE
- -- Not a validation error - return SQL error message encountered
- SELECT
- 0 AS Success,
- 'Unknown' AS ExcelRowNumber,
- ERROR_MESSAGE() + ' Line: ' + CONVERT(VARCHAR(20), Error_Line()) AS ErrorDetails
- -- Rollback transaction
- IF @@TRANCOUNT > 0
- ROLLBACK TRANSACTION SR_Import
- RETURN 0
- END CATCH
- GO
- -- Tax codes
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_TC_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_TC_ImportValidate] AS SELECT 1')
- END
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_TC_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_TC_ImportPush] AS SELECT 1')
- END
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 03/22/2013
- -- Description: Validates data in temp table
- -- tempdb.dbo.TMP_TaxCode_Import - for Tax Code
- -- Import
- -- Sample call: exec usp_TC_ImportValidate 'TMP_Import_261224d61b564661b74188391fe9345a'
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_TC_ImportValidate]
- @TableName VARCHAR(255),
- @ForceMode BIT = 0
- AS
- BEGIN
- SET NOCOUNT ON
- -- Set date format to MDY to validate dates from excel
- SET DATEFORMAT MDY
- -- Variable declaration
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Pre-validation
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'TaxCodeID'UNION ALL
- SELECT 'Description'UNION ALL
- SELECT 'Caption On Invoice' UNION ALL
- SELECT 'Country' UNION ALL
- SELECT 'Effective Date'UNION ALL
- SELECT 'Cancel Date'UNION ALL
- SELECT 'Display Each Level On Invoice'UNION ALL
- SELECT 'Level 1 Rate'UNION ALL
- SELECT 'Level 1 Rate Type'UNION ALL
- SELECT 'Level 1 Max'UNION ALL
- SELECT 'Level 1 Caption'UNION ALL
- SELECT 'Level 1 Tax Code'UNION ALL
- SELECT 'Level 1 Agency'UNION ALL
- SELECT 'Level 1 Services'UNION ALL
- SELECT 'Level 1 Expenses'UNION ALL
- SELECT 'Level 1 Products'UNION ALL
- SELECT 'Level 2 Rate'UNION ALL
- SELECT 'Level 2 Rate Type'UNION ALL
- SELECT 'Level 2 Max'UNION ALL
- SELECT 'Level 2 Caption'UNION ALL
- SELECT 'Level 2 Tax Code'UNION ALL
- SELECT 'Level 2 Agency'UNION ALL
- SELECT 'Level 2 Services'UNION ALL
- SELECT 'Level 2 Expenses'UNION ALL
- SELECT 'Level 2 Products'UNION ALL
- SELECT 'Level 3 Rate'UNION ALL
- SELECT 'Level 3 Rate Type'UNION ALL
- SELECT 'Level 3 Max'UNION ALL
- SELECT 'Level 3 Caption'UNION ALL
- SELECT 'Level 3 Tax Code'UNION ALL
- SELECT 'Level 3 Agency'UNION ALL
- SELECT 'Level 3 Services'UNION ALL
- SELECT 'Level 3 Expenses'UNION ALL
- SELECT 'Level 3 Products'UNION ALL
- SELECT 'Level 4 Rate'UNION ALL
- SELECT 'Level 4 Rate Type'UNION ALL
- SELECT 'Level 4 Max'UNION ALL
- SELECT 'Level 4 Caption'UNION ALL
- SELECT 'Level 4 Tax Code'UNION ALL
- SELECT 'Level 4 Agency'UNION ALL
- SELECT 'Level 4 Services'UNION ALL
- SELECT 'Level 4 Expenses'UNION ALL
- SELECT 'Level 4 Products'UNION ALL
- SELECT 'Level 5 Rate'UNION ALL
- SELECT 'Level 5 Rate Type'UNION ALL
- SELECT 'Level 5 Max'UNION ALL
- SELECT 'Level 5 Caption'UNION ALL
- SELECT 'Level 5 Tax Code'UNION ALL
- SELECT 'Level 5 Agency'UNION ALL
- SELECT 'Level 5 Services'UNION ALL
- SELECT 'Level 5 Expenses'UNION ALL
- SELECT 'Level 5 Products'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
- BEGIN
- DROP TABLE #tblResults
- END
- -- Table to hold results of procedure
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750),
- InvalidReason VARCHAR(MAX),
- ReferenceType VARCHAR(MAX),
- Warning_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX),
- ValMsg NVARCHAR(MAX)
- )
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- -- If a column is missing, stop here and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 0 AS ValPassed,
- RowNumber,
- ValMsg
- FROM #tblResults
- ORDER BY RowNumber, ValMsg
- RETURN
- END
- -- Pre-validation complete - proceed with normal validation
- -- Table to hold source data for this batch from temp table
- IF EXISTS(SELECT * FROM tempdb.sys.tables WHERE Name LIKE('%TC_Import_Val_Temp%'))
- BEGIN
- DROP TABLE #TC_Import_Val_Temp
- END
- CREATE TABLE #TC_Import_Val_Temp
- (
- ExcelRowNum INT,
- TaxCodeID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Description] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Country NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- EffectiveDt NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- CancelDt NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- DispEachLvl NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- BatchID UNIQUEIDENTIFIER,
- Lvl1RateDec DECIMAL,
- Lvl2RateDec DECIMAL,
- Lvl3RateDec DECIMAL,
- Lvl4RateDec DECIMAL,
- Lvl5RateDec DECIMAL,
- Lvl1MaxDec DECIMAL,
- Lvl2MaxDec DECIMAL,
- Lvl3MaxDec DECIMAL,
- Lvl4MaxDec DECIMAL,
- Lvl5MaxDec DECIMAL
- )
- -- Build statement to populate validation temp table
- SELECT @DSQL = '
- INSERT INTO #TC_Import_Val_Temp
- (
- ExcelRowNum,
- TaxCodeID,
- [Description],
- Caption,
- Country,
- EffectiveDt,
- CancelDt,
- DispEachLvl,
- Lvl1Rate,
- Lvl1RateType,
- Lvl1Max,
- Lvl1Caption,
- Lvl1TaxCode,
- Lvl1Agency,
- Lvl1Services,
- Lvl1Expenses,
- Lvl1Products,
- Lvl2Rate,
- Lvl2RateType,
- Lvl2Max,
- Lvl2Caption,
- Lvl2TaxCode,
- Lvl2Agency,
- Lvl2Services,
- Lvl2Expenses,
- Lvl2Products,
- Lvl3Rate,
- Lvl3RateType,
- Lvl3Max,
- Lvl3Caption,
- Lvl3TaxCode,
- Lvl3Agency,
- Lvl3Services,
- Lvl3Expenses,
- Lvl3Products,
- Lvl4Rate,
- Lvl4RateType,
- Lvl4Max,
- Lvl4Caption,
- Lvl4TaxCode,
- Lvl4Agency,
- Lvl4Services,
- Lvl4Expenses,
- Lvl4Products,
- Lvl5Rate,
- Lvl5RateType,
- Lvl5Max,
- Lvl5Caption,
- Lvl5TaxCode,
- Lvl5Agency,
- Lvl5Services,
- Lvl5Expenses,
- Lvl5Products
- )
- SELECT
- [Excel Row Number],
- [TaxCodeID],
- [Description],
- [Caption On Invoice],
- [Country],
- [Effective Date],
- [Cancel Date],
- [Display Each Level On Invoice],
- [Level 1 Rate],
- [Level 1 Rate Type],
- [Level 1 Max],
- [Level 1 Caption],
- [Level 1 Tax Code],
- [Level 1 Agency],
- [Level 1 Services],
- [Level 1 Expenses],
- [Level 1 Products],
- [Level 2 Rate],
- [Level 2 Rate Type],
- [Level 2 Max],
- [Level 2 Caption],
- [Level 2 Tax Code],
- [Level 2 Agency],
- [Level 2 Services],
- [Level 2 Expenses],
- [Level 2 Products],
- [Level 3 Rate],
- [Level 3 Rate Type],
- [Level 3 Max],
- [Level 3 Caption],
- [Level 3 Tax Code],
- [Level 3 Agency],
- [Level 3 Services],
- [Level 3 Expenses],
- [Level 3 Products],
- [Level 4 Rate],
- [Level 4 Rate Type],
- [Level 4 Max],
- [Level 4 Caption],
- [Level 4 Tax Code],
- [Level 4 Agency],
- [Level 4 Services],
- [Level 4 Expenses],
- [Level 4 Products],
- [Level 5 Rate],
- [Level 5 Rate Type],
- [Level 5 Max],
- [Level 5 Caption],
- [Level 5 Tax Code],
- [Level 5 Agency],
- [Level 5 Services],
- [Level 5 Expenses],
- [Level 5 Products]
- FROM ' + @SourceTable
- -- Pull data into validation temp table
- EXEC(@DSQL)
- -- For all fields, update empty string or single space to null
- UPDATE #TC_Import_Val_Temp
- SET
- TaxCodeID = CASE WHEN TaxCodeID IN ('', ' ') THEN NULL ELSE TaxCodeID END,
- [Description] = CASE WHEN [Description] IN ('', ' ') THEN NULL ELSE [Description] END,
- Caption = CASE WHEN Caption IN ('', ' ') THEN NULL ELSE Caption END,
- Country = CASE WHEN Country IN ('', ' ') THEN NULL ELSE Country END,
- EffectiveDt = CASE WHEN EffectiveDt IN ('', ' ') THEN NULL ELSE EffectiveDt END,
- CancelDt = CASE WHEN CancelDt IN ('', ' ') THEN NULL ELSE CancelDt END,
- DispEachLvl = CASE WHEN DispEachLvl IN ('', ' ') THEN NULL ELSE DispEachLvl END,
- Lvl1Rate = CASE WHEN Lvl1Rate IN ('', ' ') THEN NULL ELSE Lvl1Rate END,
- Lvl1RateType = CASE WHEN Lvl1RateType IN ('', ' ') THEN NULL ELSE Lvl1RateType END,
- Lvl1Max = CASE WHEN Lvl1Max IN ('', ' ') THEN NULL ELSE Lvl1Max END,
- Lvl1Caption = CASE WHEN Lvl1Caption IN ('', ' ') THEN NULL ELSE Lvl1Caption END,
- Lvl1TaxCode = CASE WHEN Lvl1TaxCode IN ('', ' ') THEN NULL ELSE Lvl1TaxCode END,
- Lvl1Agency = CASE WHEN Lvl1Agency IN ('', ' ') THEN NULL ELSE Lvl1Agency END,
- Lvl1Services = CASE WHEN Lvl1Services IN ('', ' ') THEN NULL ELSE Lvl1Services END,
- Lvl1Expenses = CASE WHEN Lvl1Expenses IN ('', ' ') THEN NULL ELSE Lvl1Expenses END,
- Lvl1Products = CASE WHEN Lvl1Products IN ('', ' ') THEN NULL ELSE Lvl1Products END,
- Lvl2Rate = CASE WHEN Lvl2Rate IN ('', ' ') THEN NULL ELSE Lvl2Rate END,
- Lvl2RateType = CASE WHEN Lvl2RateType IN ('', ' ') THEN NULL ELSE Lvl2RateType END,
- Lvl2Max = CASE WHEN Lvl2Max IN ('', ' ') THEN NULL ELSE Lvl2Max END,
- Lvl2Caption = CASE WHEN Lvl2Caption IN ('', ' ') THEN NULL ELSE Lvl2Caption END,
- Lvl2TaxCode = CASE WHEN Lvl2TaxCode IN ('', ' ') THEN NULL ELSE Lvl2TaxCode END,
- Lvl2Agency = CASE WHEN Lvl2Agency IN ('', ' ') THEN NULL ELSE Lvl2Agency END,
- Lvl2Services = CASE WHEN Lvl2Services IN ('', ' ') THEN NULL ELSE Lvl2Services END,
- Lvl2Expenses = CASE WHEN Lvl2Expenses IN ('', ' ') THEN NULL ELSE Lvl2Expenses END,
- Lvl2Products = CASE WHEN Lvl2Products IN ('', ' ') THEN NULL ELSE Lvl2Products END,
- Lvl3Rate = CASE WHEN Lvl3Rate IN ('', ' ') THEN NULL ELSE Lvl3Rate END,
- Lvl3RateType = CASE WHEN Lvl3RateType IN ('', ' ') THEN NULL ELSE Lvl3RateType END,
- Lvl3Max = CASE WHEN Lvl3Max IN ('', ' ') THEN NULL ELSE Lvl3Max END,
- Lvl3Caption = CASE WHEN Lvl3Caption IN ('', ' ') THEN NULL ELSE Lvl3Caption END,
- Lvl3TaxCode = CASE WHEN Lvl3TaxCode IN ('', ' ') THEN NULL ELSE Lvl3TaxCode END,
- Lvl3Agency = CASE WHEN Lvl3Agency IN ('', ' ') THEN NULL ELSE Lvl3Agency END,
- Lvl3Services = CASE WHEN Lvl3Services IN ('', ' ') THEN NULL ELSE Lvl3Services END,
- Lvl3Expenses = CASE WHEN Lvl3Expenses IN ('', ' ') THEN NULL ELSE Lvl3Expenses END,
- Lvl3Products = CASE WHEN Lvl3Products IN ('', ' ') THEN NULL ELSE Lvl3Products END,
- Lvl4Rate = CASE WHEN Lvl4Rate IN ('', ' ') THEN NULL ELSE Lvl4Rate END,
- Lvl4RateType = CASE WHEN Lvl4RateType IN ('', ' ') THEN NULL ELSE Lvl4RateType END,
- Lvl4Max = CASE WHEN Lvl4Max IN ('', ' ') THEN NULL ELSE Lvl4Max END,
- Lvl4Caption = CASE WHEN Lvl4Caption IN ('', ' ') THEN NULL ELSE Lvl4Caption END,
- Lvl4TaxCode = CASE WHEN Lvl4TaxCode IN ('', ' ') THEN NULL ELSE Lvl4TaxCode END,
- Lvl4Agency = CASE WHEN Lvl4Agency IN ('', ' ') THEN NULL ELSE Lvl4Agency END,
- Lvl4Services = CASE WHEN Lvl4Services IN ('', ' ') THEN NULL ELSE Lvl4Services END,
- Lvl4Expenses = CASE WHEN Lvl4Expenses IN ('', ' ') THEN NULL ELSE Lvl4Expenses END,
- Lvl4Products = CASE WHEN Lvl4Products IN ('', ' ') THEN NULL ELSE Lvl4Products END,
- Lvl5Rate = CASE WHEN Lvl5Rate IN ('', ' ') THEN NULL ELSE Lvl5Rate END,
- Lvl5RateType = CASE WHEN Lvl5RateType IN ('', ' ') THEN NULL ELSE Lvl5RateType END,
- Lvl5Max = CASE WHEN Lvl5Max IN ('', ' ') THEN NULL ELSE Lvl5Max END,
- Lvl5Caption = CASE WHEN Lvl5Caption IN ('', ' ') THEN NULL ELSE Lvl5Caption END,
- Lvl5TaxCode = CASE WHEN Lvl5TaxCode IN ('', ' ') THEN NULL ELSE Lvl5TaxCode END,
- Lvl5Agency = CASE WHEN Lvl5Agency IN ('', ' ') THEN NULL ELSE Lvl5Agency END,
- Lvl5Services = CASE WHEN Lvl5Services IN ('', ' ') THEN NULL ELSE Lvl5Services END,
- Lvl5Expenses = CASE WHEN Lvl5Expenses IN ('', ' ') THEN NULL ELSE Lvl5Expenses END,
- Lvl5Products = CASE WHEN Lvl5Products IN ('', ' ') THEN NULL ELSE Lvl5Products END
- -- Interpret all Y/N fields (Y = 1, N = 0, NULL = 0)
- UPDATE #TC_Import_Val_Temp
- SET
- DispEachLvl = CASE DispEachLvl WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE DispEachLvl END,
- Lvl1Services = CASE Lvl1Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl1Services END,
- Lvl1Expenses = CASE Lvl1Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl1Expenses END,
- Lvl1Products = CASE Lvl1Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl1Products END,
- Lvl2Services = CASE Lvl2Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl2Services END,
- Lvl2Expenses = CASE Lvl2Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl2Expenses END,
- Lvl2Products = CASE Lvl2Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl2Products END,
- Lvl3Services = CASE Lvl3Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl3Services END,
- Lvl3Expenses = CASE Lvl3Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl3Expenses END,
- Lvl3Products = CASE Lvl3Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl3Products END,
- Lvl4Services = CASE Lvl4Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl4Services END,
- Lvl4Expenses = CASE Lvl4Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl4Expenses END,
- Lvl4Products = CASE Lvl4Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl4Products END,
- Lvl5Services = CASE Lvl5Services WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl5Services END,
- Lvl5Expenses = CASE Lvl5Expenses WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl5Expenses END,
- Lvl5Products = CASE Lvl5Products WHEN NULL THEN '0' WHEN 'N' THEN '0' WHEN 'Y' THEN '1' ELSE Lvl5Products END
- -- Update null tax rates/max to 0
- UPDATE #TC_Import_Val_Temp
- SET
- Lvl1Rate = CASE WHEN Lvl1Rate IS NULL THEN '0' ELSE Lvl1Rate END,
- Lvl2Rate = CASE WHEN Lvl2Rate IS NULL THEN '0' ELSE Lvl2Rate END,
- Lvl3Rate = CASE WHEN Lvl3Rate IS NULL THEN '0' ELSE Lvl3Rate END,
- Lvl4Rate = CASE WHEN Lvl4Rate IS NULL THEN '0' ELSE Lvl4Rate END,
- Lvl5Rate = CASE WHEN Lvl5Rate IS NULL THEN '0' ELSE Lvl5Rate END,
- Lvl1Max = CASE WHEN Lvl1Max IS NULL THEN '0' ELSE Lvl1Max END,
- Lvl2Max = CASE WHEN Lvl2Max IS NULL THEN '0' ELSE Lvl2Max END,
- Lvl3Max = CASE WHEN Lvl3Max IS NULL THEN '0' ELSE Lvl3Max END,
- Lvl4Max = CASE WHEN Lvl4Max IS NULL THEN '0' ELSE Lvl4Max END,
- Lvl5Max = CASE WHEN Lvl5Max IS NULL THEN '0' ELSE Lvl5Max END
- -- Populate Decimal column for rate and max - to be used for validations which require number comparison
- UPDATE #TC_Import_Val_Temp
- SET Lvl1RateDec = Lvl1Rate
- WHERE ISNUMERIC(Lvl1Rate) = 1
- UPDATE #TC_Import_Val_Temp
- SET Lvl2RateDec = CONVERT(DECIMAL, Lvl2Rate)
- WHERE ISNUMERIC(Lvl2Rate) = 1
- AND Lvl2Rate IS NOT NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl3RateDec = CONVERT(DECIMAL, Lvl3Rate)
- WHERE ISNUMERIC(Lvl3Rate) = 1
- AND Lvl3Rate IS NOT NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl4RateDec = CONVERT(DECIMAL, Lvl4Rate)
- WHERE ISNUMERIC(Lvl4Rate) = 1
- AND Lvl4Rate IS NOT NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl5RateDec = CONVERT(DECIMAL, Lvl5Rate)
- WHERE ISNUMERIC(Lvl5Rate) = 1
- AND Lvl5Rate IS NOT NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl1MaxDec = CONVERT(DECIMAL, Lvl1Max)
- WHERE ISNUMERIC(Lvl1Max) = 1
- AND Lvl1Max IS NOT NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl2MaxDec = CONVERT(DECIMAL, Lvl2Max)
- WHERE ISNUMERIC(Lvl2Max) = 1
- AND Lvl2Max IS NOT NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl3MaxDec = CONVERT(DECIMAL, Lvl3Max)
- WHERE ISNUMERIC(Lvl3Max) = 1
- AND Lvl3Max IS NOT NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl4MaxDec = CONVERT(DECIMAL, Lvl4Max)
- WHERE ISNUMERIC(Lvl4Max) = 1
- AND Lvl4Max IS NOT NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl5MaxDec = CONVERT(DECIMAL, Lvl5Max)
- WHERE ISNUMERIC(Lvl5Max) = 1
- AND Lvl5Max IS NOT NULL
- -- Update Rate Type to 'P' Where it is not specified
- UPDATE #TC_Import_Val_Temp
- SET Lvl1RateType = 'P'
- WHERE Lvl1RateType IS NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl2RateType = 'P'
- WHERE Lvl2RateType IS NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl3RateType = 'P'
- WHERE Lvl3RateType IS NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl4RateType = 'P'
- WHERE Lvl4RateType IS NULL
- UPDATE #TC_Import_Val_Temp
- SET Lvl5RateType = 'P'
- WHERE Lvl5RateType IS NULL
- -- Begin validations
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- TaxCodeID is required
- SELECT
- ExcelRowNum,
- 'TaxCodeID field is required'
- FROM #TC_Import_Val_Temp
- WHERE TaxCodeID IS NULL
- UNION ALL
- -- TaxCodeID no more than 8 characters
- SELECT
- ExcelRowNum,
- 'TaxCodeID cannot exceed 8 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(TaxCodeID) > 8
- UNION ALL
- -- Description is required
- SELECT
- ExcelRowNum,
- 'Description field is required'
- FROM #TC_Import_Val_Temp
- WHERE [Description] IS NULL
- UNION ALL
- -- Description no more than 50 characters
- SELECT
- ExcelRowNum,
- 'Description cannot exceed 50 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN([Description]) > 50
- UNION ALL
- -- Caption on invoice is required
- SELECT
- ExcelRowNum,
- 'Caption on invoice field is required'
- FROM #TC_Import_Val_Temp
- WHERE Caption IS NULL
- UNION ALL
- -- Caption on invoice no more than 25 characters
- SELECT
- ExcelRowNum,
- 'Caption on invoice cannot exceed 25 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Caption) > 25
- UNION ALL
- -- Country is required
- SELECT
- ExcelRowNum,
- 'Country field is required'
- FROM #TC_Import_Val_Temp
- WHERE Country IS NULL
- UNION ALL
- -- Country must be a valid reference
- SELECT
- ExcelRowNum,
- 'Country "' + tmp.Country + '" is invalid.'
- FROM #TC_Import_Val_Temp tmp
- LEFT OUTER JOIN Country co
- ON dbo.ufn_Import_Trim(co.Country) = tmp.Country
- WHERE co.Country_RecID IS NULL
- AND tmp.Country IS NOT NULL
- UNION ALL
- -- Country may not exceed 50 characters
- SELECT
- ExcelRowNum,
- 'Country cannot exceed 50 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Country) > 50
- UNION ALL
- -- Check for duplicate country
- SELECT
- ExcelRowNum,
- 'There are more than 1 countries named "' + co.Country + '" in the database'
- FROM #TC_Import_Val_Temp tmp
- INNER JOIN dbo.Country co
- ON dbo.ufn_Import_Trim(co.Country) = tmp.Country
- GROUP BY co.Country, tmp.ExcelRowNum
- HAVING COUNT(*) > 1
- UNION ALL
- -- Effective date must be a valid date if entered
- SELECT
- ExcelRowNum,
- 'Effective date must be a valid date - Please use MM/DD/YYYY format'
- FROM #TC_Import_Val_Temp
- WHERE (ISDATE(EffectiveDt) = 0 OR EffectiveDt NOT LIKE '%/%/%')
- AND EffectiveDt IS NOT NULL
- UNION ALL
- -- Cancel date must be a valid date if entered
- SELECT
- ExcelRowNum,
- 'Cancel date must be a valid date - Please use MM/DD/YYYY format'
- FROM #TC_Import_Val_Temp
- WHERE (ISDATE(CancelDt) = 0 OR CancelDt NOT LIKE '%/%/%')
- AND CancelDt IS NOT NULL
- UNION ALL
- -- Display Each Level must be 0 or 1
- SELECT
- ExcelRowNum,
- '"' + DispEachLvl + '" is not a valid value for Display Each Level on Invoice'
- FROM #TC_Import_Val_Temp
- WHERE DispEachLvl NOT IN('0', '1')
- UNION ALL
- -- Check that rate type is 'A' or 'P'
- SELECT
- ExcelRowNum,
- '"' + Lvl1RateType + '" is not a valid rate type for level 1 - must be "A" or "P"'
- FROM #TC_Import_Val_Temp
- WHERE Lvl1RateType NOT IN('A', 'P')
- UNION ALL
- SELECT
- ExcelRowNum,
- '"' + Lvl2RateType + '" is not a valid rate type for level 2 - must be "A" or "P"'
- FROM #TC_Import_Val_Temp
- WHERE Lvl2RateType NOT IN('A', 'P')
- UNION ALL
- SELECT
- ExcelRowNum,
- '"' + Lvl3RateType + '" is not a valid rate type for level 3 - must be "A" or "P"'
- FROM #TC_Import_Val_Temp
- WHERE Lvl3RateType NOT IN('A', 'P')
- UNION ALL
- SELECT
- ExcelRowNum,
- '"' + Lvl4RateType + '" is not a valid rate type for level 4 - must be "A" or "P"'
- FROM #TC_Import_Val_Temp
- WHERE Lvl4RateType NOT IN('A', 'P')
- UNION ALL
- SELECT
- ExcelRowNum,
- '"' + Lvl5RateType + '" is not a valid rate type for level 5 - must be "A" or "P"'
- FROM #TC_Import_Val_Temp
- WHERE Lvl5RateType NOT IN('A', 'P')
- UNION ALL
- -- All rates and max rates must be numeric and max may not exceed 214748.3647
- -- Level 1
- SELECT
- ExcelRowNum,
- 'Level 1 rate must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl1Rate) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 1 maximum tax must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl1Max) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 1 maximum tax cannot exceed 214741.3647'
- FROM #TC_Import_Val_Temp
- WHERE Lvl1MaxDec > 214748.3647
- UNION ALL
- -- Level 2
- SELECT
- ExcelRowNum,
- 'Level 2 rate must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl2Rate) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 2 maximum tax must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl2Max) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 2 maximum tax cannot exceed 214748.3647'
- FROM #TC_Import_Val_Temp
- WHERE Lvl2MaxDec > 214748.3647
- UNION ALL
- -- Level 3
- SELECT
- ExcelRowNum,
- 'Level 3 rate must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl3Rate) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 3 maximum tax must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl3Max) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 3 maximum tax cannot exceed 214748.3647'
- FROM #TC_Import_Val_Temp
- WHERE Lvl3MaxDec > 214748.3647
- UNION ALL
- -- Level 4
- SELECT
- ExcelRowNum,
- 'Level 4 rate must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl4Rate) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 4 maximum tax must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl4Max) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 4 maximum tax cannot exceed 214748.3647'
- FROM #TC_Import_Val_Temp
- WHERE Lvl4MaxDec > 214748.3647
- UNION ALL
- -- Level 5
- SELECT
- ExcelRowNum,
- 'Level 5 rate must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl5Rate) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 5 maximum tax must be a numeric value'
- FROM #TC_Import_Val_Temp
- WHERE ISNUMERIC(Lvl5Max) = 0
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 5 maximum tax cannot exceed 214748.3647'
- FROM #TC_Import_Val_Temp
- WHERE Lvl5MaxDec > 214748.3647
- UNION ALL
- -- Rate must be a percentage (decimal) where rate type is percent
- -- Level 1
- SELECT
- ExcelRowNum,
- Lvl1Rate + ' is not a valid percentage for Level 1 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
- FROM #TC_Import_Val_Temp
- WHERE Lvl1RateDec NOT BETWEEN 0 AND 1
- AND Lvl1RateType = 'P'
- UNION ALL
- -- Level 2
- SELECT
- ExcelRowNum,
- Lvl2Rate + ' is not a valid percentage for Level 2 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
- FROM #TC_Import_Val_Temp
- WHERE Lvl2RateDec NOT BETWEEN 0 AND 1
- AND Lvl2RateType = 'P'
- UNION ALL
- -- Level 3
- SELECT
- ExcelRowNum,
- Lvl3Rate + ' is not a valid percentage for Level 3 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
- FROM #TC_Import_Val_Temp
- WHERE Lvl3RateDec NOT BETWEEN 0 AND 1
- AND Lvl3RateType = 'P'
- UNION ALL
- -- Level 4
- SELECT
- ExcelRowNum,
- Lvl4Rate + ' is not a valid percentage for Level 4 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
- FROM #TC_Import_Val_Temp
- WHERE Lvl4RateDec NOT BETWEEN 0 AND 1
- AND Lvl4RateType = 'P'
- UNION ALL
- -- Level 5
- SELECT
- ExcelRowNum,
- Lvl5Rate + ' is not a valid percentage for Level 5 Rate. Percentage should be expressed as a decimal i.e. 6.5 percent = .065'
- FROM #TC_Import_Val_Temp
- WHERE Lvl5RateDec NOT BETWEEN 0 AND 1
- AND Lvl5RateType = 'P'
- UNION ALL
- -- Rate must be a whole number if rate type = 'A'
- -- Level 1
- SELECT
- ExcelRowNum,
- 'If rate type is set to amount for level 1 - rate must be a whole number'
- FROM #TC_Import_Val_Temp
- WHERE Lvl1RateDec <> FLOOR(Lvl1RateDec)
- AND Lvl1RateType = 'A'
- UNION ALL
- -- Level 2
- SELECT
- ExcelRowNum,
- 'If rate type is set to amount for level 2 - rate must be a whole number'
- FROM #TC_Import_Val_Temp
- WHERE Lvl2RateDec <> FLOOR(Lvl2RateDec)
- AND Lvl2RateType = 'A'
- UNION ALL
- -- Level 3
- SELECT
- ExcelRowNum,
- 'If rate type is set to amount for level 3 - rate must be a whole number'
- FROM #TC_Import_Val_Temp
- WHERE Lvl3RateDec <> FLOOR(Lvl3RateDec)
- AND Lvl3RateType = 'A'
- UNION ALL
- -- Level 4
- SELECT
- ExcelRowNum,
- 'If rate type is set to amount for level 4 - rate must be a whole number'
- FROM #TC_Import_Val_Temp
- WHERE Lvl4RateDec <> FLOOR(Lvl4RateDec)
- AND Lvl4RateType = 'A'
- UNION ALL
- -- Level 5
- SELECT
- ExcelRowNum,
- 'If rate type is set to amount for level 5 - rate must be a whole number'
- FROM #TC_Import_Val_Temp
- WHERE Lvl5RateDec <> FLOOR(Lvl5RateDec)
- AND Lvl5RateType = 'A'
- UNION ALL
- -- Caption for each level cannot exceed 16 characters
- -- Level 1
- SELECT
- ExcelRowNum,
- 'Level 1 caption cannot exceed 16 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl1Caption) > 16
- UNION ALL
- -- Level 2
- SELECT
- ExcelRowNum,
- 'Level 2 caption cannot exceed 16 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl2Caption) > 16
- UNION ALL
- -- Level 3
- SELECT
- ExcelRowNum,
- 'Level 3 caption cannot exceed 16 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl3Caption) > 16
- UNION ALL
- -- Level 4
- SELECT
- ExcelRowNum,
- 'Level 4 caption cannot exceed 16 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl4Caption) > 16
- UNION ALL
- -- Level 5
- SELECT
- ExcelRowNum,
- 'Level 5 caption cannot exceed 16 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl5Caption) > 16
- UNION ALL
- -- If specified, tax code cannot be more than 50 characters
- SELECT
- ExcelRowNum,
- 'Level 1 tax code cannot exceed 50 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl1TaxCode) > 50
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 2 tax code cannot exceed 50 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl2TaxCode) > 50
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 3 tax code cannot exceed 50 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl3TaxCode) > 50
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 4 tax code cannot exceed 50 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl4TaxCode) > 50
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 5 tax code cannot exceed 50 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl5TaxCode) > 50
- UNION ALL
- -- If specified, tax agency cannot be more than 255 characters
- SELECT
- ExcelRowNum,
- 'Level 1 tax agency cannot exceed 255 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl1Agency) > 255
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 2 tax agency cannot exceed 255 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl2Agency) > 255
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 3 tax agency cannot exceed 255 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl3Agency) > 255
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 4 tax agency cannot exceed 255 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl4Agency) > 255
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 5 tax agency cannot exceed 255 characters'
- FROM #TC_Import_Val_Temp
- WHERE LEN(Lvl5Agency) > 255
- UNION ALL
- -- Services must be 0 or 1
- SELECT
- ExcelRowNum,
- 'Level 1 services must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl1Services NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 2 services must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl2Services NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 3 services must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl3Services NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 4 services must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl4Services NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 5 services must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl5Services NOT IN('0', '1')
- UNION ALL
- -- Expenses must be 0 or 1
- SELECT
- ExcelRowNum,
- 'Level 1 Expenses must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl1Expenses NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 2 Expenses must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl2Expenses NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 3 Expenses must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl3Expenses NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 4 Expenses must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl4Expenses NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 5 Expenses must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl5Expenses NOT IN('0', '1')
- UNION ALL
- -- Products must be 0 or 1
- SELECT
- ExcelRowNum,
- 'Level 1 Products must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl1Products NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 2 Products must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl2Products NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 3 Products must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl3Products NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 4 Products must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl4Products NOT IN('0', '1')
- UNION ALL
- SELECT
- ExcelRowNum,
- 'Level 5 Products must be either 0 or 1'
- FROM #TC_Import_Val_Temp
- WHERE Lvl5Products NOT IN('0', '1')
- UNION ALL
- -- Make sure TaxCodeID does not already exist in DB
- SELECT
- ExcelRowNum,
- 'Tax code: "' + tmp.TaxCodeID + '" already exists.'
- FROM #TC_Import_Val_Temp tmp
- INNER JOIN Tax_Code tc
- ON dbo.ufn_Import_Trim(tc.Tax_Code_ID) = tmp.TaxCodeID
- AND ISNULL(tc.Date_Cancel, '1/1/2999') > GETDATE()
- UNION ALL
- -- Make sure TaxCodeID is not duplicate within spreadsheet
- SELECT
- MAX(ExcelRowNum),
- 'Tax code: "' + tmp.TaxCodeID + '" cannot be specified more than once'
- FROM #TC_Import_Val_Temp tmp
- WHERE tmp.TaxCodeID IS NOT NULL
- GROUP BY tmp.TaxCodeID
- HAVING COUNT(*) > 1
- -- Return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed
- ROLLBACK TRANSACTION
- END
- ELSE
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS ValMsg
- ROLLBACK TRANSACTION
- END
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 03/25/2013
- -- Description: Performs final validation
- -- and inserts for Tax code import
- -- Sample call: exec usp_TC_ImportPush 'TMP_Import123', 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_TC_ImportPush]
- @TableName VARCHAR(255),
- @DebugMode INT = 0,
- @ForceMode BIT = 0
- AS
- BEGIN TRY
- -- Variable declaration
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
- IF OBJECT_ID('tempdb..#TC_Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #TC_Import_Staging
- END
- CREATE TABLE #TC_Import_Staging
- (
- TC_Import_Staging_RecID INT IDENTITY,
- ExcelRowNum INT,
- TaxCodeID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Description] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Country NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- EffectiveDt NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- CancelDt NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- DispEachLvl NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl2Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl3Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl4Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Rate NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5RateType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Max NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Caption NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5TaxCode NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Agency NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Services NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Expenses NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl5Products NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Lvl1RateDec DECIMAL,
- Lvl2RateDec DECIMAL,
- Lvl3RateDec DECIMAL,
- Lvl4RateDec DECIMAL,
- Lvl5RateDec DECIMAL,
- Lvl1MaxDec DECIMAL,
- Lvl2MaxDec DECIMAL,
- Lvl3MaxDec DECIMAL,
- Lvl4MaxDec DECIMAL,
- Lvl5MaxDec DECIMAL,
- Default_Flag BIT,
- Country_RecID INT,
- Tax_Code_RecID INT,
- Legacy_ID NVARCHAR(250) COLLATE DATABASE_DEFAULT NULL
- )
- SET NOCOUNT ON
- -- Variable declaration
- DECLARE
- @ExpRowCount INT, -- Expected rowcount for inserts - Used for validation
- @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Populate Staging table variable with initial values
- SELECT @DSQL = '
- INSERT INTO #TC_Import_Staging
- (
- ExcelRowNum,
- TaxCodeID,
- [Description],
- Caption,
- Country,
- EffectiveDt,
- CancelDt,
- DispEachLvl,
- Lvl1Rate,
- Lvl1RateType,
- Lvl1Max,
- Lvl1Caption,
- Lvl1TaxCode,
- Lvl1Agency,
- Lvl1Services,
- Lvl1Expenses,
- Lvl1Products,
- Lvl2Rate,
- Lvl2RateType,
- Lvl2Max,
- Lvl2Caption,
- Lvl2TaxCode,
- Lvl2Agency,
- Lvl2Services,
- Lvl2Expenses,
- Lvl2Products,
- Lvl3Rate,
- Lvl3RateType,
- Lvl3Max,
- Lvl3Caption,
- Lvl3TaxCode,
- Lvl3Agency,
- Lvl3Services,
- Lvl3Expenses,
- Lvl3Products,
- Lvl4Rate,
- Lvl4RateType,
- Lvl4Max,
- Lvl4Caption,
- Lvl4TaxCode,
- Lvl4Agency,
- Lvl4Services,
- Lvl4Expenses,
- Lvl4Products,
- Lvl5Rate,
- Lvl5RateType,
- Lvl5Max,
- Lvl5Caption,
- Lvl5TaxCode,
- Lvl5Agency,
- Lvl5Services,
- Lvl5Expenses,
- Lvl5Products,
- Default_Flag
- )
- SELECT
- [Excel Row Number],
- [TaxCodeID],
- [Description],
- [Caption On Invoice],
- [Country],
- [Effective Date],
- [Cancel Date],
- [Display Each Level On Invoice],
- [Level 1 Rate],
- [Level 1 Rate Type],
- [Level 1 Max],
- [Level 1 Caption],
- [Level 1 Tax Code],
- [Level 1 Agency],
- [Level 1 Services],
- [Level 1 Expenses],
- [Level 1 Products],
- [Level 2 Rate],
- [Level 2 Rate Type],
- [Level 2 Max],
- [Level 2 Caption],
- [Level 2 Tax Code],
- [Level 2 Agency],
- [Level 2 Services],
- [Level 2 Expenses],
- [Level 2 Products],
- [Level 3 Rate],
- [Level 3 Rate Type],
- [Level 3 Max],
- [Level 3 Caption],
- [Level 3 Tax Code],
- [Level 3 Agency],
- [Level 3 Services],
- [Level 3 Expenses],
- [Level 3 Products],
- [Level 4 Rate],
- [Level 4 Rate Type],
- [Level 4 Max],
- [Level 4 Caption],
- [Level 4 Tax Code],
- [Level 4 Agency],
- [Level 4 Services],
- [Level 4 Expenses],
- [Level 4 Products],
- [Level 5 Rate],
- [Level 5 Rate Type],
- [Level 5 Max],
- [Level 5 Caption],
- [Level 5 Tax Code],
- [Level 5 Agency],
- [Level 5 Services],
- [Level 5 Expenses],
- [Level 5 Products],
- 0
- FROM ' + @SourceTable
- -- Pull data into validation temp table
- EXEC(@DSQL)
- BEGIN TRANSACTION TC_Import
- -- For all fields, update empty string or single space to null
- UPDATE #TC_Import_Staging
- SET
- TaxCodeID = CASE WHEN TaxCodeID IN ('', ' ') THEN NULL ELSE TaxCodeID END,
- [Description] = CASE WHEN [Description] IN ('', ' ') THEN NULL ELSE [Description] END,
- Caption = CASE WHEN Caption IN ('', ' ') THEN NULL ELSE Caption END,
- Country = CASE WHEN Country IN ('', ' ') THEN NULL ELSE Country END,
- EffectiveDt = CASE WHEN EffectiveDt IN ('', ' ') THEN NULL ELSE EffectiveDt END,
- CancelDt = CASE WHEN CancelDt IN ('', ' ') THEN NULL ELSE CancelDt END,
- DispEachLvl = CASE WHEN DispEachLvl IN ('', ' ') THEN NULL ELSE DispEachLvl END,
- Lvl1Rate = CASE WHEN Lvl1Rate IN ('', ' ') THEN NULL ELSE Lvl1Rate END,
- Lvl1RateType = CASE WHEN Lvl1RateType IN ('', ' ') THEN NULL ELSE Lvl1RateType END,
- Lvl1Max = CASE WHEN Lvl1Max IN ('', ' ') THEN NULL ELSE Lvl1Max END,
- Lvl1Caption = CASE WHEN Lvl1Caption IN ('', ' ') THEN NULL ELSE Lvl1Caption END,
- Lvl1TaxCode = CASE WHEN Lvl1TaxCode IN ('', ' ') THEN NULL ELSE Lvl1TaxCode END,
- Lvl1Agency = CASE WHEN Lvl1Agency IN ('', ' ') THEN NULL ELSE Lvl1Agency END,
- Lvl1Services = CASE WHEN Lvl1Services IN ('', ' ') THEN NULL ELSE Lvl1Services END,
- Lvl1Expenses = CASE WHEN Lvl1Expenses IN ('', ' ') THEN NULL ELSE Lvl1Expenses END,
- Lvl1Products = CASE WHEN Lvl1Products IN ('', ' ') THEN NULL ELSE Lvl1Products END,
- Lvl2Rate = CASE WHEN Lvl2Rate IN ('', ' ') THEN NULL ELSE Lvl2Rate END,
- Lvl2RateType = CASE WHEN Lvl2RateType IN ('', ' ') THEN NULL ELSE Lvl2RateType END,
- Lvl2Max = CASE WHEN Lvl2Max IN ('', ' ') THEN NULL ELSE Lvl2Max END,
- Lvl2Caption = CASE WHEN Lvl2Caption IN ('', ' ') THEN NULL ELSE Lvl2Caption END,
- Lvl2TaxCode = CASE WHEN Lvl2TaxCode IN ('', ' ') THEN NULL ELSE Lvl2TaxCode END,
- Lvl2Agency = CASE WHEN Lvl2Agency IN ('', ' ') THEN NULL ELSE Lvl2Agency END,
- Lvl2Services = CASE WHEN Lvl2Services IN ('', ' ') THEN NULL ELSE Lvl2Services END,
- Lvl2Expenses = CASE WHEN Lvl2Expenses IN ('', ' ') THEN NULL ELSE Lvl2Expenses END,
- Lvl2Products = CASE WHEN Lvl2Products IN ('', ' ') THEN NULL ELSE Lvl2Products END,
- Lvl3Rate = CASE WHEN Lvl3Rate IN ('', ' ') THEN NULL ELSE Lvl3Rate END,
- Lvl3RateType = CASE WHEN Lvl3RateType IN ('', ' ') THEN NULL ELSE Lvl3RateType END,
- Lvl3Max = CASE WHEN Lvl3Max IN ('', ' ') THEN NULL ELSE Lvl3Max END,
- Lvl3Caption = CASE WHEN Lvl3Caption IN ('', ' ') THEN NULL ELSE Lvl3Caption END,
- Lvl3TaxCode = CASE WHEN Lvl3TaxCode IN ('', ' ') THEN NULL ELSE Lvl3TaxCode END,
- Lvl3Agency = CASE WHEN Lvl3Agency IN ('', ' ') THEN NULL ELSE Lvl3Agency END,
- Lvl3Services = CASE WHEN Lvl3Services IN ('', ' ') THEN NULL ELSE Lvl3Services END,
- Lvl3Expenses = CASE WHEN Lvl3Expenses IN ('', ' ') THEN NULL ELSE Lvl3Expenses END,
- Lvl3Products = CASE WHEN Lvl3Products IN ('', ' ') THEN NULL ELSE Lvl3Products END,
- Lvl4Rate = CASE WHEN Lvl4Rate IN ('', ' ') THEN NULL ELSE Lvl4Rate END,
- Lvl4RateType = CASE WHEN Lvl4RateType IN ('', ' ') THEN NULL ELSE Lvl4RateType END,
- Lvl4Max = CASE WHEN Lvl4Max IN ('', ' ') THEN NULL ELSE Lvl4Max END,
- Lvl4Caption = CASE WHEN Lvl4Caption IN ('', ' ') THEN NULL ELSE Lvl4Caption END,
- Lvl4TaxCode = CASE WHEN Lvl4TaxCode IN ('', ' ') THEN NULL ELSE Lvl4TaxCode END,
- Lvl4Agency = CASE WHEN Lvl4Agency IN ('', ' ') THEN NULL ELSE Lvl4Agency END,
- Lvl4Services = CASE WHEN Lvl4Services IN ('', ' ') THEN NULL ELSE Lvl4Services END,
- Lvl4Expenses = CASE WHEN Lvl4Expenses IN ('', ' ') THEN NULL ELSE Lvl4Expenses END,
- Lvl4Products = CASE WHEN Lvl4Products IN ('', ' ') THEN NULL ELSE Lvl4Products END,
- Lvl5Rate = CASE WHEN Lvl5Rate IN ('', ' ') THEN NULL ELSE Lvl5Rate END,
- Lvl5RateType = CASE WHEN Lvl5RateType IN ('', ' ') THEN NULL ELSE Lvl5RateType END,
- Lvl5Max = CASE WHEN Lvl5Max IN ('', ' ') THEN NULL ELSE Lvl5Max END,
- Lvl5Caption = CASE WHEN Lvl5Caption IN ('', ' ') THEN NULL ELSE Lvl5Caption END,
- Lvl5TaxCode = CASE WHEN Lvl5TaxCode IN ('', ' ') THEN NULL ELSE Lvl5TaxCode END,
- Lvl5Agency = CASE WHEN Lvl5Agency IN ('', ' ') THEN NULL ELSE Lvl5Agency END,
- Lvl5Services = CASE WHEN Lvl5Services IN ('', ' ') THEN NULL ELSE Lvl5Services END,
- Lvl5Expenses = CASE WHEN Lvl5Expenses IN ('', ' ') THEN NULL ELSE Lvl5Expenses END,
- Lvl5Products = CASE WHEN Lvl5Products IN ('', ' ') THEN NULL ELSE Lvl5Products END
- -- Interpret all Y/N fields (Y = 1, N = 0, NULL = 0)
- UPDATE #TC_Import_Staging
- SET
- DispEachLvl = CASE DispEachLvl WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE DispEachLvl END,
- Lvl1Services = CASE Lvl1Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl1Services END,
- Lvl1Expenses = CASE Lvl1Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl1Expenses END,
- Lvl1Products = CASE Lvl1Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl1Products END,
- Lvl2Services = CASE Lvl2Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl2Services END,
- Lvl2Expenses = CASE Lvl2Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl2Expenses END,
- Lvl2Products = CASE Lvl2Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl2Products END,
- Lvl3Services = CASE Lvl3Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl3Services END,
- Lvl3Expenses = CASE Lvl3Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl3Expenses END,
- Lvl3Products = CASE Lvl3Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl3Products END,
- Lvl4Services = CASE Lvl4Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl4Services END,
- Lvl4Expenses = CASE Lvl4Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl4Expenses END,
- Lvl4Products = CASE Lvl4Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl4Products END,
- Lvl5Services = CASE Lvl5Services WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl5Services END,
- Lvl5Expenses = CASE Lvl5Expenses WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl5Expenses END,
- Lvl5Products = CASE Lvl5Products WHEN NULL THEN 0 WHEN 'N' THEN 0 WHEN 'Y' THEN 1 ELSE Lvl5Products END
- -- Set first record in staging table as default if no default exists
- IF NOT EXISTS(SELECT * FROM Tax_Code WHERE Default_Flag = 1)
- BEGIN
- UPDATE #TC_Import_Staging
- SET Default_Flag = 1
- WHERE TC_Import_Staging_RecID = 1
- END
- -- Get Country_RecID that maps back to Country
- UPDATE stag
- SET stag.Country_RecID = co.Country_RecID
- FROM #TC_Import_Staging stag
- INNER JOIN Country co
- ON dbo.ufn_Import_Trim(co.Country) = stag.Country
- -- Get Expected row count for dbo.Tax_Code insert
- SELECT @ExpRowCount = COUNT(*) FROM #TC_Import_Staging
- -- Perform insert
- INSERT INTO dbo.Tax_Code
- (
- Owner_ID,
- Tax_Code_ID,
- [Description],
- CodeCaption,
- Country_RecID,
- Date_Effective,
- Date_Cancel,
- DisplayDetail_Flag,
- State_Rate,
- TaxRateType,
- State_Max,
- LevelCaption,
- State_Xref,
- Agency_Xref,
- TaxServices_Flag,
- TaxExpenses_Flag,
- TaxProducts_Flag,
- County_Rate,
- TaxRateType2,
- County_Max,
- LevelCaption2,
- County_Xref,
- Agency2_Xref,
- TaxServices2_Flag,
- TaxExpenses2_Flag,
- TaxProducts2_Flag,
- City_Rate,
- TaxRateType3,
- City_Max,
- LevelCaption3,
- City_Xref,
- Agency3_Xref,
- TaxServices3_Flag,
- TaxExpenses3_Flag,
- TaxProducts3_Flag,
- Tax4_Rate,
- TaxRateType4,
- Tax4_Max,
- LevelCaption4,
- Tax4_Xref,
- Agency4_Xref,
- TaxServices4_Flag,
- TaxExpenses4_Flag,
- TaxProducts4_Flag,
- Tax5_Rate,
- TaxRateType5,
- Tax5_Max,
- LevelCaption5,
- Tax5_Xref,
- Agency5_Xref,
- TaxServices5_Flag,
- TaxExpenses5_Flag,
- TaxProducts5_Flag,
- Updated_By
- )
- SELECT
- ExcelRowNum,
- TaxCodeID,
- [Description],
- Caption,
- Country_RecID,
- ISNULL(EffectiveDt, GETDATE()),
- CancelDt,
- DispeachLvl,
- Lvl1Rate,
- ISNULL(Lvl1RateType,'P'),
- Lvl1Max,
- Lvl1Caption,
- Lvl1TaxCode,
- Lvl1Agency,
- Lvl1Services,
- Lvl1Expenses,
- Lvl1Products,
- Lvl2Rate,
- ISNULL(Lvl2RateType,'P'),
- Lvl2Max,
- Lvl2Caption,
- Lvl2TaxCode,
- Lvl2Agency,
- Lvl2Services,
- Lvl2Expenses,
- Lvl2Products,
- Lvl3Rate,
- ISNULL(Lvl3RateType,'P'),
- Lvl3Max,
- Lvl3Caption,
- Lvl3TaxCode,
- Lvl3Agency,
- Lvl3Services,
- Lvl3Expenses,
- Lvl3Products,
- Lvl4Rate,
- ISNULL(Lvl4RateType,'P'),
- Lvl4Max,
- Lvl4Caption,
- Lvl4TaxCode,
- Lvl4Agency,
- Lvl4Services,
- Lvl4Expenses,
- Lvl4Products,
- Lvl5Rate,
- ISNULL(Lvl5RateType,'P'),
- Lvl5Max,
- Lvl5Caption,
- Lvl5TaxCode,
- Lvl5Agency,
- Lvl5Services,
- Lvl5Expenses,
- Lvl5Products,
- @ImportBatchUser
- FROM #TC_Import_Staging
- UPDATE stag
- SET stag.Tax_Code_RecID = tc.Tax_Code_RecID
- FROM #TC_Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Tax_Code tc WHERE tc.Owner_ID = stag.ExcelRowNum)tc
- UPDATE Tax_Code SET Owner_ID = 1
- IF @@ROWCOUNT <> @ExpRowCount
- BEGIN
- RAISERROR('Incorrect number of rows inserted - import fails', 16, 1)
- END
- -- If debug mode and successful, select the rows that were inserted
- -- and rollback transaction
- IF @DebugMode = 1 AND @@ERROR = 0
- BEGIN
- SELECT * FROM Tax_Code WHERE Tax_Code_ID IN(SELECT TaxCodeID FROM #TC_Import_Staging)
- ROLLBACK TRANSACTION TC_Import
- END
- IF @DebugMode = 2 AND @@ERROR = 0
- BEGIN
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- ROLLBACK TRANSACTION TC_Import
- END
- IF @DebugMode = 0 AND @@Error = 0
- BEGIN
- -- Import successful - commit and return results
- COMMIT TRANSACTION TC_Import
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- END
- END TRY
- BEGIN CATCH
- -- An error has occured
- -- Return SQL error message encountered
- SELECT
- 0 AS Success,
- 'Unknown' AS ExcelRowNumber,
- ERROR_MESSAGE() AS ErrorDetails
- -- Rollback transaction
- WHILE @@TRANCOUNT > 0
- ROLLBACK TRANSACTION TC_Import
- END CATCH
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Opp_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Opp_ImportValidate] AS SELECT 1')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Opp_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Opp_ImportPush] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 03/26/2013
- -- Description: Validates from spreadsheet for Opportunity
- -- Import
- -- Sample call: exec usp_Opp_ImportValidate 'TMP_Import_7207a9bf0215403cbedc1d7f74bd575d', 0
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_Opp_ImportValidate]
- @TableName VARCHAR(255),
- @Forcemode BIT = 0
- AS
- SET NOCOUNT ON
- -- Set date format to MDY to validate dates from excel
- SET DATEFORMAT MDY
- -- Variable declaration
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Table to hold results of procedure
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
- InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Warning_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- DECLARE @ImportBatchUser VARCHAR(15)
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Pre-validation
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'Company Name' UNION ALL
- SELECT 'Contact Name' UNION ALL
- SELECT 'Opportunity Name' UNION ALL
- SELECT 'Description' UNION ALL
- SELECT 'Type' UNION ALL
- SELECT 'Status' UNION ALL
- SELECT 'Est Close Date' UNION ALL
- SELECT 'Rating' UNION ALL
- SELECT 'Stage' UNION ALL
- SELECT 'Source' UNION ALL
- SELECT 'Primary Sales Person' UNION ALL
- SELECT 'Primary Sales Percent Split' UNION ALL
- SELECT 'Secondary Sales Person' UNION ALL
- SELECT 'Secondary Sales Percent Split' UNION ALL
- SELECT 'Marketing Campaign' UNION ALL
- SELECT 'Location' UNION ALL
- SELECT 'Group' UNION ALL
- SELECT 'Forecast Product Description' UNION ALL
- SELECT 'Forecast Product Revenue' UNION ALL
- SELECT 'Forecast Product Cost' UNION ALL
- SELECT 'Forecast Service Description' UNION ALL
- SELECT 'Forecast Service Revenue' UNION ALL
- SELECT 'Forecast Service Cost' UNION ALL
- SELECT 'Forecast Other-1 Description' UNION ALL
- SELECT 'Forecast Other-1 Revenue' UNION ALL
- SELECT 'Forecast Other-1 Cost' UNION ALL
- SELECT 'Forecast Other-2 Description' UNION ALL
- SELECT 'Forecast Other-2 Revenue' UNION ALL
- SELECT 'Forecast Other-2 Cost'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- -- If a column is missing, stop here and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 0 AS ValPassed,
- RowNumber,
- ValMsg
- FROM #tblResults
- ORDER BY RowNumber, ValMsg
- ROLLBACK TRANSACTION
- RETURN
- END
- -- Pre-validation complete - proceed with normal validation
- -- Table to hold source data for this batch from temp table
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT,
- Company_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- OpportunityName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Status NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- EstCloseDate VARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Rating NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Stage NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Source NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- PrimarySalesPerson NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- PrimarySalesPercentSplit INT NULL,
- SecondarySalesPerson NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- SecondarySalesPercentSplit INT NULL,
- MarketingCampaign NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Location NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- BillingUnit NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastProductDescription NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastProductRev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastProductCost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastServiceDescription NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastServiceRev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastServiceCost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther1Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther1Rev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther1Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther2Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther2Rev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther2Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- New_Identity INT NULL,
- ConvertMessage NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_RecID INT NULL,
- Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_RecID INT NULL,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
- Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
- Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Site_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Company_Address_RecID INT,
- SR_Service_RecID INT,
- SO_Opportunity_RecID INT,
- Diff_Exclude_Flag BIT,
- Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Owner_Level_RecID INT,
- Billing_Unit_RecID INT
- )
- -- Build statement to populate validation temp table
- -- Convert blank string or single space to null
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- Company_Name,
- ContactName,
- OpportunityName,
- [Description],
- [Type],
- [Status],
- EstCloseDate,
- Rating,
- Stage,
- Source,
- PrimarySalesPerson,
- PrimarySalesPercentSplit,
- SecondarySalesPerson,
- SecondarySalesPercentSplit,
- MarketingCampaign,
- Location,
- BillingUnit,
- ForecastProductDescription,
- ForecastProductRev,
- ForecastProductCost,
- ForecastServiceDescription,
- ForecastServiceRev,
- ForecastServiceCost,
- ForecastOther1Description,
- ForecastOther1Rev,
- ForecastOther1Cost,
- ForecastOther2Description,
- ForecastOther2Rev,
- ForecastOther2Cost,
- Company_Match_Val
- )
- SELECT
- [Excel Row Number],
- [Company Name],
- [Contact Name],
- [Opportunity Name],
- LEFT([Description], 1000),
- [Type],
- [Status],
- [Est Close Date],
- [Rating],
- [Stage],
- [Source],
- [Primary Sales Person],
- [Primary Sales Percent Split],
- [Secondary Sales Person],
- [Secondary Sales Percent Split],
- [Marketing Campaign],
- [Location],
- [Group],
- [Forecast Product Description],
- [Forecast Product Revenue],
- [Forecast Product Cost],
- [Forecast Service Description],
- [Forecast Service Revenue],
- [Forecast Service Cost],
- [Forecast Other-1 Description],
- [Forecast Other-1 Revenue],
- [Forecast Other-1 Cost],
- [Forecast Other-2 Description],
- [Forecast Other-2 Revenue],
- [Forecast Other-2 Cost],
- LEFT([Company Name], 3)
- FROM ' + @SourceTable
- -- Pull data into validation temp table
- EXEC(@DSQL)
- BEGIN TRANSACTION
- -- Update single space or blank string to null
- UPDATE #Import_Staging SET
- [ExcelRowNumber] = CASE WHEN [ExcelRowNumber] IN('', ' ') THEN NULL ELSE [ExcelRowNumber] END,
- [Company_Name] = CASE WHEN [Company_Name] IN('', ' ') THEN NULL ELSE [Company_Name] END,
- [ContactName] = CASE WHEN [ContactName] IN('', ' ') THEN NULL ELSE [ContactName] END,
- [OpportunityName] = CASE WHEN [OpportunityName] IN('', ' ') THEN NULL ELSE [OpportunityName] END,
- [Description] = CASE WHEN [Description] IN('', ' ') THEN NULL ELSE [Description] END,
- [Type] = CASE WHEN [Type] IN('', ' ') THEN NULL ELSE [Type] END,
- [Status] = CASE WHEN [Status] IN('', ' ') THEN NULL ELSE [Status] END,
- [EstCloseDate] = CASE WHEN [EstCloseDate] IN('', ' ') THEN NULL ELSE [EstCloseDate] END,
- [Rating] = CASE WHEN [Rating] IN('', ' ') THEN NULL ELSE [Rating] END,
- [Stage] = CASE WHEN [Stage] IN('', ' ') THEN NULL ELSE [Stage] END,
- [Source] = CASE WHEN [Source] IN('', ' ') THEN NULL ELSE [Source] END,
- [PrimarySalesPerson] = CASE WHEN [PrimarySalesPerson] IN('', ' ') THEN NULL ELSE [PrimarySalesPerson] END,
- [PrimarySalesPercentSplit] = CASE WHEN [PrimarySalesPercentSplit] IN('', ' ') THEN NULL ELSE [PrimarySalesPercentSplit] END,
- [SecondarySalesPerson] = CASE WHEN [SecondarySalesPerson] IN('', ' ') THEN NULL ELSE [SecondarySalesPerson] END,
- [SecondarySalesPercentSplit] = CASE WHEN [SecondarySalesPercentSplit] IN('', ' ') THEN NULL ELSE [SecondarySalesPercentSplit] END,
- [MarketingCampaign] = CASE WHEN [MarketingCampaign] IN('', ' ') THEN NULL ELSE [MarketingCampaign] END,
- [Location] = CASE WHEN [Location] IN('', ' ') THEN NULL ELSE [Location] END,
- [BillingUnit] = CASE WHEN [BillingUnit] IN('', ' ') THEN NULL ELSE [BillingUnit] END,
- [ForecastProductDescription] = CASE WHEN [ForecastProductDescription] IN('', ' ') THEN NULL ELSE [ForecastProductDescription] END,
- [ForecastProductRev] = CASE WHEN [ForecastProductRev] IN('', ' ', '??') THEN NULL ELSE [ForecastProductRev] END,
- [ForecastProductCost] = CASE WHEN [ForecastProductCost] IN('', ' ', '??') THEN NULL ELSE [ForecastProductCost] END,
- [ForecastServiceDescription] = CASE WHEN [ForecastServiceDescription] IN('', ' ') THEN NULL ELSE [ForecastServiceDescription] END,
- [ForecastServiceRev] = CASE WHEN [ForecastServiceRev] IN('', ' ', '??') THEN NULL ELSE [ForecastServiceRev] END,
- [ForecastServiceCost] = CASE WHEN [ForecastServiceCost] IN('', ' ', '??') THEN NULL ELSE [ForecastServiceCost] END,
- [ForecastOther1Description] = CASE WHEN [ForecastOther1Description] IN('', ' ') THEN NULL ELSE [ForecastOther1Description] END,
- [ForecastOther1Rev] = CASE WHEN [ForecastOther1Rev] IN('', ' ', '??') THEN NULL ELSE [ForecastOther1Rev] END,
- [ForecastOther1Cost] = CASE WHEN [ForecastOther1Cost] IN('', ' ', '??') THEN NULL ELSE [ForecastOther1Cost] END,
- [ForecastOther2Description] = CASE WHEN [ForecastOther2Description] IN('', ' ') THEN NULL ELSE [ForecastOther2Description] END,
- [ForecastOther2Rev] = CASE WHEN [ForecastOther2Rev] IN('', ' ', '??') THEN NULL ELSE [ForecastOther2Rev] END,
- [ForecastOther2Cost] = CASE WHEN [ForecastOther2Cost] IN('', ' ', '??') THEN NULL ELSE [ForecastOther2Cost] END
- -- Remove import config row created by custom conversion process
- DELETE FROM #Import_Staging
- WHERE Company_Name = 'CW_Import_Config_Row'
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_ID = src.Legacy_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Remove commas and dollar signs from revenue/cost fields (common validation error)
- UPDATE #Import_Staging
- SET ForecastProductCost = REPLACE(ForecastProductCost, ',', ''),
- ForecastProductRev = REPLACE(ForecastProductRev, ',', ''),
- ForecastServiceCost = REPLACE(ForecastServiceCost, ',', ''),
- ForecastServiceRev = REPLACE(ForecastServiceRev, ',', ''),
- ForecastOther1Cost = REPLACE(ForecastOther1Cost, ',', ''),
- ForecastOther1Rev = REPLACE(ForecastOther1Rev, ',', ''),
- ForecastOther2Cost = REPLACE(ForecastOther2Cost, ',', ''),
- ForecastOther2Rev = REPLACE(ForecastOther2Rev, ',', '')
- UPDATE #Import_Staging
- SET ForecastProductCost = REPLACE(ForecastProductCost, '$', ''),
- ForecastProductRev = REPLACE(ForecastProductRev, '$', ''),
- ForecastServiceCost = REPLACE(ForecastServiceCost, '$', ''),
- ForecastServiceRev = REPLACE(ForecastServiceRev, '$', ''),
- ForecastOther1Cost = REPLACE(ForecastOther1Cost, '$', ''),
- ForecastOther1Rev = REPLACE(ForecastOther1Rev, '$', ''),
- ForecastOther2Cost = REPLACE(ForecastOther2Cost, '$', ''),
- ForecastOther2Rev = REPLACE(ForecastOther2Rev, '$', '')
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT DISTINCT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE Delete_Flag = 0
- AND
- (
- LEFT(Company_Name, 3) IN(SELECT Company_Match_Val FROM #Import_Staging)
- OR Company_ID IN(SELECT Company_Name FROM #Import_Staging)
- OR Company_RecID = (SELECT TOP 1 Company_RecID FROM dbo.Owner)
- )
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- INNER JOIN #Company comp
- ON comp.Company_RecID = cont.Company_RecID
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Opportunity'
- END
- IF @Legacy_Flag = 0
- BEGIN
- -- Match companies and contacts
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- END
- -- Assume primary sales percent split is 100 if no secondary rep specified
- UPDATE #Import_Staging
- SET PrimarySalesPercentSplit = 100
- WHERE SecondarySalesPerson IS NULL
- -- Strip commas from numeric fields
- UPDATE #Import_Staging
- SET ForecastProductCost = REPLACE(ForecastProductCost, ',', ''),
- ForecastProductRev = REPLACE(ForecastProductRev, ',', ''),
- ForecastServiceCost = REPLACE(ForecastServiceCost, ',', ''),
- ForecastServiceRev = REPLACE(ForecastServiceRev, ',', ''),
- ForecastOther1Cost = REPLACE(ForecastOther1Cost, ',', ''),
- ForecastOther1Rev = REPLACE(ForecastOther1Rev, ',', ''),
- ForecastOther2Cost = REPLACE(ForecastOther2Cost, ',', ''),
- ForecastOther2Rev = REPLACE(ForecastOther2Rev, ',', '')
- -- Get RecID for Owner_Level / Billing Unit
- UPDATE stag
- SET stag.Owner_Level_RecID = ol.Owner_Level_RecID
- FROM #Import_Staging stag
- 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
- UPDATE stag
- SET stag.Billing_Unit_RecID = bu.Billing_Unit_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Billing_Unit bu WHERE bu.Billing_Unit_ID = stag.BillingUnit OR bu.[Description] = stag.BillingUnit)bu
- -- If running in 'Force Mode', create necessary references
- IF @ForceMode = 1
- BEGIN
- -- Insert Opportunity Types
- INSERT INTO SO_Type
- (
- [Description],
- Update_By
- )
- SELECT DISTINCT
- [Type],
- @ImportBatchUser
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Type sot
- ON dbo.ufn_Import_Trim(sot.[Description]) = tmp.[Type]
- WHERE sot.SO_Type_RecID IS NULL
- AND tmp.[Type] IS NOT NULL
- -- Insert Opportunity Statuses
- INSERT INTO SO_Opp_Status
- (
- Owner_ID,
- [Description],
- Updated_By,
- Entered_By
- )
- SELECT DISTINCT
- 1,
- tmp.[Status],
- @ImportBatchUser,
- @ImportBatchUser
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Opp_Status sos
- ON sos.[Description] = tmp.[Status]
- WHERE sos.SO_Opp_Status_RecID IS NULL
- AND tmp.[Status] IS NOT NULL
- -- Insert opportunity stage
- INSERT INTO SO_Pipeline
- (
- Owner_ID,
- [Description],
- Funnel_Color,
- SO_Probability_RecID,
- Updated_By
- )
- SELECT DISTINCT
- 1,
- tmp.Stage,
- 'window',
- (SELECT TOP 1 SO_Probability_RecID FROM SO_Probability),
- @ImportBatchUser
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Pipeline sop
- ON sop.[Description] = tmp.Stage
- WHERE tmp.Stage IS NOT NULL
- AND sop.SO_Pipeline_RecID IS NULL
- -- Set primary salesperson to 'zAdmin' if no match found
- UPDATE tmp
- SET tmp.PrimarySalesPerson = 'zAdmin'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.PrimarySalesPerson
- OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = tmp.PrimarySalesPerson
- WHERE mem.Member_RecID IS NULL
- -- Attempt to match location/group by Member_ID of primary sales rep
- UPDATE tmp
- SET tmp.Location = ol.Owner_Level_Name,
- tmp.BillingUnit = bu.Billing_Unit_ID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Member mem
- ON mem.Member_ID = tmp.PrimarySalesPerson
- INNER JOIN dbo.Owner_Level ol
- ON ol.Owner_Level_RecID = COALESCE(mem.Default_Loc_RecID, mem.Owner_Level_RecID)
- LEFT OUTER JOIN Billing_Unit bu
- ON bu.Billing_Unit_RecID = mem.Billing_Unit_RecID
- WHERE NOT EXISTS(SELECT TOP 1 * FROM Owner_Level WHERE Owner_Level_Name = tmp.Location AND Location_Flag = 1)
- END
- -- Begin validations
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Company name is required
- SELECT
- tmp.ExcelRowNumber,
- 'Company name is required'
- FROM #Import_Staging tmp
- WHERE Company_Name IS NULL
- AND @Legacy_Flag <> 1
- UNION ALL
- -- Company name must be 50 characters or less
- SELECT
- tmp.ExcelRowNumber,
- 'Company name must be less than 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(Company_Name) > 50
- UNION ALL
- -- If Contact specified, must be <= 61 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Contact name cannot be more than 61 characters'
- FROM #Import_Staging tmp
- WHERE LEN(ContactName) > 61
- UNION ALL
- -- Company Name is Required
- SELECT
- tmp.ExcelRowNumber,
- 'Company Name is required'
- FROM #Import_Staging tmp
- WHERE tmp.Company_Name IS NULL
- AND @Legacy_Flag <> 1
- UNION ALL
- -- Check that company names are valid
- SELECT
- tmp.ExcelRowNumber,
- 'Company not found: "' + ISNULL(tmp.Company_Name, '') + '"'
- FROM #Import_Staging tmp
- WHERE Company_Name IS NOT NULL
- AND Company_RecID IS NULL
- UNION ALL
- -- Check for more than one company with the same name
- SELECT
- tmp.ExcelRowNumber,
- 'There are more than one companies named "' + ISNULL(Company_Name, '') + '" - company name must be unique'
- FROM #Import_Staging tmp
- WHERE Company_Duplicate_Flag = 1
- UNION ALL
- -- Check that contact is valid
- SELECT
- tmp.ExcelRowNumber,
- 'Unable to locate contact: "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '') + '"'
- FROM #Import_Staging tmp
- WHERE Contact_RecID IS NULL
- AND tmp.ContactName IS NOT NULL
- AND tmp.Company_Duplicate_Flag = 0
- AND tmp.Company_RecID IS NOT NULL
- UNION ALL
- -- Check for duplicate contacts within company
- SELECT
- tmp.ExcelRowNumber,
- 'There are more than one contacts named "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Contact_Duplicate_Flag = 1
- AND tmp.Company_Duplicate_Flag = 0
- UNION ALL
- -- Check that a default contact for company exists if contact is null
- SELECT
- tmp.ExcelRowNumber,
- 'Contact must be specified for company: "' + ISNULL(tmp.Company_Name, '') + '" because no default contact exists for this company'
- FROM #Import_Staging tmp
- WHERE tmp.Contact_RecID IS NULL
- AND tmp.ContactName IS NULL
- AND tmp.Company_Name IS NOT NULL
- AND tmp.Company_RecID IS NOT NULL
- AND tmp.Company_Duplicate_Flag = 0
- UNION ALL
- -- Opportunity Name is required
- SELECT
- tmp.ExcelRowNumber,
- 'Opportunity name cannot be blank'
- FROM #Import_Staging tmp
- WHERE OpportunityName IS NULL
- UNION ALL
- -- Opportunity Name must be <= 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Opportunity name cannot be more than 50 characters.'
- FROM #Import_Staging tmp
- WHERE LEN(OpportunityName) > 50
- UNION ALL
- -- Opportunity description cannot exceed 1000 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Opportunity description cannot exceed 1000 characters'
- FROM #Import_Staging tmp
- WHERE LEN([Description]) > 1000
- AND [Description] IS NOT NULL
- UNION ALL
- -- Opportunity type must be <= 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Opportunity type cannot be more than 50 characters.'
- FROM #Import_Staging tmp
- WHERE LEN([Type]) > 50
- UNION ALL
- -- Opportunity Type must be valid
- SELECT
- tmp.ExcelRowNumber,
- '"' + tmp.[Type] + '" is not a valid opportunity type.'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Type sot
- ON dbo.ufn_Import_Trim(sot.[Description]) = tmp.[Type]
- WHERE sot.SO_Type_RecID IS NULL
- AND tmp.[Type] IS NOT NULL
- UNION ALL
- -- Opportunity Status must be valid
- SELECT
- tmp.ExcelRowNumber,
- '"' + tmp.[Status] + '" is not a valid opportunity status.'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Opp_Status sos
- ON sos.[Description] = tmp.[Status]
- WHERE sos.SO_Opp_Status_RecID IS NULL
- AND tmp.[Status] IS NOT NULL
- UNION ALL
- -- Status may not exceed 30 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Opportunity status cannot exceed 30 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.[Status]) > 30
- -- If Status is not specified, a default status must exist
- IF NOT EXISTS(SELECT TOP 1 * FROM SO_Opp_Status WHERE Default_Flag = 1)
- BEGIN
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- tmp.ExcelRowNumber,
- 'If opportunity status is not specified, a default status must exist.'
- FROM #Import_Staging tmp
- WHERE tmp.[Status] IS NULL
- END
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Estimated close date must be a valid date if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Estimated close date must be a valid date - Please use MM/DD/YYYY format'
- FROM #Import_Staging tmp
- WHERE (ISDATE(tmp.EstCloseDate) = 0)
- AND tmp.EstCloseDate IS NOT NULL
- UNION ALL
- -- Rating must be <= 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Rating cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(Rating) > 50
- UNION ALL
- -- Rating must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Opportunity Rating "' + tmp.Rating + '" is not valid'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Interest soi
- ON tmp.Rating = dbo.ufn_Import_Trim(soi.[Description])
- WHERE soi.SO_Interest_RecID IS NULL
- AND tmp.Rating IS NOT NULL
- UNION ALL
- -- Stage cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Opportunity stage cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Stage) > 50
- UNION ALL
- -- Stage must be valid reference if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Opportunity stage "' + tmp.Stage + '" is not valid.'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Pipeline sop
- ON dbo.ufn_Import_Trim(sop.[Description]) = tmp.Stage
- WHERE sop.SO_Pipeline_RecID IS NULL
- AND tmp.Stage IS NOT NULL
- UNION ALL
- -- Source cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Source cannot exceed 50 characters.'
- FROM #Import_Staging tmp
- WHERE LEN([Source]) > 50
- UNION ALL
- -- Primary sales person is required
- SELECT
- tmp.ExcelRowNumber,
- 'Primary sales person is required'
- FROM #Import_Staging tmp
- WHERE PrimarySalesPerson IS NULL
- UNION ALL
- ---- Primary sales person cannot exceed 15 characters
- --SELECT
- -- tmp.ExcelRowNumber,
- -- 'Primary sales person cannot exceed 15 characters'
- --FROM #Import_Staging tmp
- --WHERE LEN(PrimarySalesPerson) > 15
- -- AND PrimarySalesPerson IS NOT NULL
- --UNION ALL
- -- Primary sales person must be a valid Member_ID or name
- SELECT
- tmp.ExcelRowNumber,
- '"' + tmp.PrimarySalesPerson + '" is not a valid Member_ID or name for primary sales person'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.PrimarySalesPerson
- OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = tmp.PrimarySalesPerson
- WHERE mem.Member_RecID IS NULL
- AND tmp.PrimarySalesPerson IS NOT NULL
- UNION ALL
- -- Sales percentages must total 100%
- SELECT
- tmp.ExcelRowNumber,
- 'Primary and secondary sales percentages must total 100 percent'
- FROM #Import_Staging tmp
- WHERE (CAST(ISNULL(PrimarySalesPercentSplit, 0) AS DECIMAL) + CAST(ISNULL(SecondarySalesPercentSplit, 0) AS DECIMAL)) <> 100
- UNION ALL
- -- Primary sales percentage cannot be negative
- SELECT
- tmp.ExcelRowNumber,
- 'Primary sales percentage cannot be negative'
- FROM #Import_Staging tmp
- WHERE PrimarySalesPercentSplit < 0
- UNION ALL
- -- Secondary sales percentage cannot be negative
- SELECT
- tmp.ExcelRowNumber,
- 'Secondary sales percentage cannot be negative'
- FROM #Import_Staging tmp
- WHERE SecondarySalesPercentSplit < 0
- UNION ALL
- -- Secondary sales person must be a valid Member_ID or name
- SELECT
- tmp.ExcelRowNumber,
- '"' + SecondarySalesPerson + '" is not a valid Member_ID for secondary sales person'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.SecondarySalesPerson
- OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = tmp.SecondarySalesPerson
- WHERE mem.Member_RecID IS NULL
- AND tmp.SecondarySalesPerson IS NOT NULL
- UNION ALL
- -- Marketing Campaign cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Marketing campaign cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.MarketingCampaign) > 50
- UNION ALL
- -- If specified, Marketing campaign must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid marketing campaign: "' + MarketingCampaign + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Marketing_Campaign mc
- ON dbo.ufn_Import_Trim(mc.Marketing_ID) = tmp.MarketingCampaign
- WHERE mc.Marketing_Campaign_RecID IS NULL
- AND tmp.MarketingCampaign IS NOT NULL
- UNION ALL
- -- Location is required
- SELECT
- tmp.ExcelRowNumber,
- 'Location is required'
- FROM #Import_Staging tmp
- WHERE tmp.Location IS NULL
- UNION ALL
- -- Location cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Location cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Location) > 50
- UNION ALL
- -- Group must be specified
- SELECT
- tmp.ExcelRowNumber,
- 'Group is required'
- FROM #Import_Staging tmp
- WHERE tmp.BillingUnit IS NULL
- UNION ALL
- -- Group cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Group cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.BillingUnit) > 50
- UNION ALL
- -- Group and location must match up
- -- Location must be valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid location: "' + tmp.Location + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Location IS NOT NULL
- AND tmp.Owner_Level_RecID IS NULL
- UNION ALL
- -- Group Must be valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Group: "' + tmp.BillingUnit + '"'
- FROM #Import_Staging tmp
- WHERE tmp.BillingUnit IS NOT NULL
- AND tmp.Billing_Unit_RecID IS NULL
- UNION ALL
- ---- Group must be assigned to location
- --SELECT
- -- tmp.ExcelRowNumber,
- -- 'The group "' + tmp.BillingUnit + '" is not assigned to the location: "' + tmp.Location'"'
- --FROM #Import_Staging tmp
- -- INNER JOIN Billing_Unit bu
- -- ON tmp.BillingUnit = dbo.ufn_Import_Trim(bu.Billing_Unit_ID)
- -- INNER JOIN Owner_Level ol
- -- ON tmp.Location = dbo.ufn_Import_Trim(ol.Owner_Level_Name)
- -- AND ol.Location_Flag = 1
- -- LEFT OUTER JOIN Billing_Unit_Loc bul
- -- ON bul.Owner_Level_RecID = ol.Owner_Level_RecID
- -- AND bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
- --WHERE bul.Billing_Unit_Loc_RecID IS NULL
- -- AND bu.Billing_Unit_ID IS NOT NULL
- -- AND ol.Owner_Level_RecID IS NOT NULL
- --UNION ALL
- -- Forecast Product Description cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast product description cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.ForecastProductDescription) > 50
- UNION ALL
- -- Forecast Product Revenue must be numeric with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast product revenue must be a number with no formatting'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.ForecastProductRev + 'e0') = 0
- AND tmp.ForecastProductRev IS NOT NULL
- UNION ALL
- -- Forecast Product cost must be numeric with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast product cost must be a number with no formatting'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.ForecastProductCost + 'e0') = 0
- AND tmp.ForecastProductCost IS NOT NULL
- UNION ALL
- -- Forecast Service description must be <= 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast service description cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.ForecastServiceDescription) > 50
- UNION ALL
- -- Forecast service revenue must me a number with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast service revenue must be a number with no formatting'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.ForecastServiceRev + 'e0') = 0
- AND tmp.ForecastServiceRev IS NOT NULL
- UNION ALL
- -- Forecast service cost must be a number with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast service cost must be a number with no formatting'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.ForecastServiceCost + 'e0') = 0
- AND tmp.ForecastServiceCost IS NOT NULL
- UNION ALL
- -- Forecast Other-1 description must be <= 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast Other-1 description cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.ForecastOther1Description) > 50
- UNION ALL
- -- Forecast Other-1 Revenue must be a number with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast Other-1 revenue must be a number with no formatting'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.ForecastOther1Rev + 'e0') = 0
- AND tmp.ForecastOther1Rev IS NOT NULL
- UNION ALL
- -- Forecast Other-1 Cost must be a number with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast Other-1 cost must be a number with no formatting'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.ForecastOther1Cost + 'e0') = 0
- AND tmp.ForecastOther1Cost IS NOT NULL
- UNION ALL
- -- Forecast Other-2 description must be <= 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast Other-2 description cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.ForecastOther2Description) > 50
- UNION ALL
- -- Forecast Other-2 Revenue must be a number with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast Other-2 revenue must be a number with no formatting'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.ForecastOther2Rev+ 'e0') = 0
- AND tmp.ForecastOther2Rev IS NOT NULL
- UNION ALL
- -- Forecast Other-2 Cost must be a number with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast Other-2 cost must be a number with no formatting'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.ForecastOther2Cost + 'e0')= 0
- AND tmp.ForecastOther2Cost IS NOT NULL
- UNION ALL
- -- If Forecast product cost or revenue are specified, a description must be entered.
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast product description is required if a cost or revenue is specified.'
- FROM #Import_Staging tmp
- WHERE ForecastProductDescription IS NULL
- AND COALESCE(ForecastProductCost, ForecastProductRev) IS NOT NULL
- UNION ALL
- -- If Forecast service cost or revenue are specified, a description must be entered.
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast service description is required if a cost or revenue is specified.'
- FROM #Import_Staging tmp
- WHERE ForecastServiceDescription IS NULL
- AND COALESCE(ForecastServiceCost, ForecastServiceRev) IS NOT NULL
- UNION ALL
- -- If Forecast Other 1 cost or revenue are specified, a description must be entered.
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast Other 1 description is required if a cost or revenue is specified.'
- FROM #Import_Staging tmp
- WHERE ForecastOther1Description IS NULL
- AND COALESCE(ForecastOther1Cost, ForecastOther1Rev) IS NOT NULL
- UNION ALL
- -- If Forecast Other 2 cost or revenue are specified, a description must be entered.
- SELECT
- tmp.ExcelRowNumber,
- 'Forecast Other 2 description is required if a cost or revenue is specified.'
- FROM #Import_Staging tmp
- WHERE ForecastOther2Description IS NULL
- AND COALESCE(ForecastOther2Cost, ForecastOther2Rev) IS NOT NULL
- -- Insert notification messages for any created references
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag,
- ReferenceType
- )
- SELECT
- 0,
- ISNULL(cont.First_Name, '') + ' ' + ISNULL(cont.Last_Name, ''),
- 1,
- 'Contact(s)'
- FROM dbo.Contact cont
- WHERE cont.Updated_By = @ImportBatchUser
- UNION ALL
- SELECT DISTINCT
- ExcelRowNumber,
- 'Company: "' + tmp.Company_Name + '" fuzzy matched to Company: ' + tmp.Company_Name_Fuzzy,
- 1,
- NULL
- FROM #Import_Staging tmp
- WHERE Company_Name_Fuzzy IS NOT NULL
- UNION ALL
- SELECT DISTINCT
- ExcelRowNumber,
- 'Contact "' + tmp.ContactName + '" fuzzy matched to Contact: ' + tmp.Contact_Name_Fuzzy,
- 1,
- NULL
- FROM #Import_Staging tmp
- WHERE Contact_Name_Fuzzy IS NOT NULL
- -- Return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed
- ROLLBACK TRANSACTION
- RETURN
- END
- ELSE
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed res
- UNION ALL
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- 'The following ' + ReferenceType + ' will be created: '+
- STUFF(
- (SELECT ', ' + ValMsg
- FROM #tblResults
- WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
- FOR XML PATH (''))
- , 1, 1, '') AS ValMsg
- FROM #tblResults res
- WHERE ReferenceType IS NOT NULL
- GROUP BY ReferenceType
- ROLLBACK TRANSACTION
- END
- ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS ValMsg
- ROLLBACK TRANSACTION
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 03/27/2013
- -- Description: Performs final validation
- -- and inserts for Opportunities import
- -- Sample call: exec usp_Opp_ImportPush 'TMP_Import_bc81116e707446c1a2e52e951d36f58b', 0, 1, 0
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_Opp_ImportPush]
- @TableName VARCHAR(MAX),
- @DebugMode INT = 0,
- @OwnerID INT = 1,
- @Forcemode BIT = 0,
- @ForecastTableName NVARCHAR(MAX) = NULL
- AS
- BEGIN TRY
- BEGIN TRANSACTION Opp_Import
- SET NOCOUNT ON
- -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT NULL,
- Company_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- OpportunityName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Status NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- EstCloseDate VARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Rating NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Stage NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Source NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- PrimarySalesPerson NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- PrimarySalesPercentSplit INT NULL,
- SecondarySalesPerson NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- SecondarySalesPercentSplit INT NULL,
- MarketingCampaign NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Location NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- BillingUnit NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastProductDescription NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastProductRev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastProductCost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastServiceDescription NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastServiceRev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastServiceCost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther1Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther1Rev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther1Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther2Description NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther2Rev NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- ForecastOther2Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- New_Identity INT NULL,
- ConvertMessage NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- BatchID UNIQUEIDENTIFIER NULL,
- Company_Address_RecID INT NULL,
- SO_Opp_Status_RecID INT NULL,
- SO_Interest_RecID INT NULL,
- SO_Pipeline_RecID INT NULL,
- PrimarySales_MemberID INT NULL,
- PrimarySales_FirstName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- PrimarySales_LastName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- PrimarySales_RecID INT NULL,
- SecondarySales_MemberID INT NULL,
- SecondarySales_FirstName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- SecondarySales_LastName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- SecondarySales_RecID INT NULL,
- Location_RecID INT NULL,
- Group_RecID INT NULL,
- Billing_Unit_Loc_RecID INT NULL,
- SO_Probability_RecID INT NULL,
- Probability SMALLINT NULL,
- SO_Type_RecID INT NULL,
- Marketing_Campaign_RecID INT NULL,
- SO_Urgency_RecID INT NULL,
- ImportRowNum INT NULL,
- Billing_Unit_RecID INT NULL,
- Company_RecID INT NULL,
- Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_RecID INT NULL,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
- Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
- Legacy_Opp_ID NVARCHAR(50) COLLATE DATABASE_DEFAULT,
- Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Site_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- SR_Service_RecID INT,
- SO_Opportunity_RecID INT,
- Diff_Exclude_Flag BIT,
- Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Duplicate_Flag BIT,
- Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Currency_RecID INT
- )
- CREATE TABLE #Opportunity_Lines
- (
- RecID INT IDENTITY,
- Legacy_Opp_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- SO_Forecast_Type_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- [Description] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Revenue NVARCHAR(10) COLLATE DATABASE_DEFAULT,
- Cost NVARCHAR(10) COLLATE DATABASE_DEFAULT,
- SO_Opportunity_RecID INT
- )
- -- Variable declaration
- DECLARE
- @ExpRowCount INT, -- Expected rowcount for inserts - Used for validation
- @ErrorMsg VARCHAR(350), -- Variable to hold custom error message
- @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
- @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- DECLARE @ForecastSourceTable VARCHAR(300)
- SELECT @ForecastSourceTable = 'tempdb.dbo.' + @ForecastTableName
- -- Get current time in UTC
- DECLARE @CurrTimeUTC DATETIME
- SELECT @CurrTimeUTC = DATEADD(HOUR, -OffsetFromUTC, GETDATE()) FROM Time_Zone_Offsets tzo
- INNER JOIN Time_Zone_Name tzn
- ON tzn.Time_Zone_Name_RecID = tzo.Time_Zone_Name_RecID
- INNER JOIN Time_Zone tz
- ON tz.Time_Zone_Name_RecID = tzn.Time_Zone_Name_RecID
- AND tz.Default_Flag = 1
- WHERE GETDATE() BETWEEN tzo.StartDate and tzo.EndDate
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- DECLARE @Forecast_Source_Object_ID INT
- SELECT @Forecast_Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @ForecastTableName
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Populate Staging table variable with initial values
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- Company_Name,
- ContactName,
- OpportunityName,
- [Description],
- [Type],
- [Status],
- EstCloseDate,
- Rating,
- Stage,
- Source,
- PrimarySalesPerson,
- PrimarySalesPercentSplit,
- SecondarySalesPerson,
- SecondarySalesPercentSplit,
- MarketingCampaign,
- Location,
- BillingUnit,
- ForecastProductDescription,
- ForecastProductRev,
- ForecastProductCost,
- ForecastServiceDescription,
- ForecastServiceRev,
- ForecastServiceCost,
- ForecastOther1Description,
- ForecastOther1Rev,
- ForecastOther1Cost,
- ForecastOther2Description,
- ForecastOther2Rev,
- ForecastOther2Cost,
- Company_Match_Val
- )
- SELECT
- [Excel Row Number],
- [Company Name],
- [Contact Name],
- [Opportunity Name],
- LEFT([Description], 1000),
- [Type],
- [Status],
- [Est Close Date],
- [Rating],
- [Stage],
- [Source],
- [Primary Sales Person],
- [Primary Sales Percent Split],
- [Secondary Sales Person],
- [Secondary Sales Percent Split],
- [Marketing Campaign],
- [Location],
- [Group],
- [Forecast Product Description],
- [Forecast Product Revenue],
- [Forecast Product Cost],
- [Forecast Service Description],
- [Forecast Service Revenue],
- [Forecast Service Cost],
- [Forecast Other-1 Description],
- [Forecast Other-1 Revenue],
- [Forecast Other-1 Cost],
- [Forecast Other-2 Description],
- [Forecast Other-2 Revenue],
- [Forecast Other-2 Cost],
- LEFT([Company Name], 3)
- FROM ' + @SourceTable
- -- Pull data into validation temp table
- EXEC(@DSQL)
- -- Update single space or blank string to null
- UPDATE #Import_Staging SET
- [ExcelRowNumber] = CASE WHEN [ExcelRowNumber] IN('', ' ') THEN NULL ELSE [ExcelRowNumber] END,
- [Company_Name] = CASE WHEN [Company_Name] IN('', ' ') THEN NULL ELSE [Company_Name] END,
- [ContactName] = CASE WHEN [ContactName] IN('', ' ') THEN NULL ELSE [ContactName] END,
- [OpportunityName] = CASE WHEN [OpportunityName] IN('', ' ') THEN NULL ELSE [OpportunityName] END,
- [Description] = CASE WHEN [Description] IN('', ' ') THEN NULL ELSE [Description] END,
- [Type] = CASE WHEN [Type] IN('', ' ') THEN NULL ELSE [Type] END,
- [Status] = CASE WHEN [Status] IN('', ' ') THEN NULL ELSE [Status] END,
- [EstCloseDate] = CASE WHEN [EstCloseDate] IN('', ' ') THEN NULL ELSE [EstCloseDate] END,
- [Rating] = CASE WHEN [Rating] IN('', ' ') THEN NULL ELSE [Rating] END,
- [Stage] = CASE WHEN [Stage] IN('', ' ') THEN NULL ELSE [Stage] END,
- [Source] = CASE WHEN [Source] IN('', ' ') THEN NULL ELSE [Source] END,
- [PrimarySalesPerson] = CASE WHEN [PrimarySalesPerson] IN('', ' ') THEN NULL ELSE [PrimarySalesPerson] END,
- [PrimarySalesPercentSplit] = CASE WHEN [PrimarySalesPercentSplit] IN('', ' ') THEN NULL ELSE [PrimarySalesPercentSplit] END,
- [SecondarySalesPerson] = CASE WHEN [SecondarySalesPerson] IN('', ' ') THEN NULL ELSE [SecondarySalesPerson] END,
- [SecondarySalesPercentSplit] = CASE WHEN [SecondarySalesPercentSplit] IN('', ' ') THEN NULL ELSE [SecondarySalesPercentSplit] END,
- [MarketingCampaign] = CASE WHEN [MarketingCampaign] IN('', ' ') THEN NULL ELSE [MarketingCampaign] END,
- [Location] = CASE WHEN [Location] IN('', ' ') THEN NULL ELSE [Location] END,
- [BillingUnit] = CASE WHEN [BillingUnit] IN('', ' ') THEN NULL ELSE [BillingUnit] END,
- [ForecastProductDescription] = CASE WHEN [ForecastProductDescription] IN('', ' ') THEN NULL ELSE [ForecastProductDescription] END,
- [ForecastProductRev] = CASE WHEN [ForecastProductRev] IN('', ' ', '??') THEN NULL ELSE [ForecastProductRev] END,
- [ForecastProductCost] = CASE WHEN [ForecastProductCost] IN('', ' ', '??') THEN NULL ELSE [ForecastProductCost] END,
- [ForecastServiceDescription] = CASE WHEN [ForecastServiceDescription] IN('', ' ') THEN NULL ELSE [ForecastServiceDescription] END,
- [ForecastServiceRev] = CASE WHEN [ForecastServiceRev] IN('', ' ', '??') THEN NULL ELSE [ForecastServiceRev] END,
- [ForecastServiceCost] = CASE WHEN [ForecastServiceCost] IN('', ' ', '??') THEN NULL ELSE [ForecastServiceCost] END,
- [ForecastOther1Description] = CASE WHEN [ForecastOther1Description] IN('', ' ') THEN NULL ELSE [ForecastOther1Description] END,
- [ForecastOther1Rev] = CASE WHEN [ForecastOther1Rev] IN('', ' ', '??') THEN NULL ELSE [ForecastOther1Rev] END,
- [ForecastOther1Cost] = CASE WHEN [ForecastOther1Cost] IN('', ' ', '??') THEN NULL ELSE [ForecastOther1Cost] END,
- [ForecastOther2Description] = CASE WHEN [ForecastOther2Description] IN('', ' ') THEN NULL ELSE [ForecastOther2Description] END,
- [ForecastOther2Rev] = CASE WHEN [ForecastOther2Rev] IN('', ' ', '??') THEN NULL ELSE [ForecastOther2Rev] END,
- [ForecastOther2Cost] = CASE WHEN [ForecastOther2Cost] IN('', ' ', '??') THEN NULL ELSE [ForecastOther2Cost] END
- -- Remove commas and dollar signs from revenue/cost fields (common validation error)
- UPDATE #Import_Staging
- SET ForecastProductCost = REPLACE(ForecastProductCost, ',', ''),
- ForecastProductRev = REPLACE(ForecastProductRev, ',', ''),
- ForecastServiceCost = REPLACE(ForecastServiceCost, ',', ''),
- ForecastServiceRev = REPLACE(ForecastServiceRev, ',', ''),
- ForecastOther1Cost = REPLACE(ForecastOther1Cost, ',', ''),
- ForecastOther1Rev = REPLACE(ForecastOther1Rev, ',', ''),
- ForecastOther2Cost = REPLACE(ForecastOther2Cost, ',', ''),
- ForecastOther2Rev = REPLACE(ForecastOther2Rev, ',', '')
- UPDATE #Import_Staging
- SET ForecastProductCost = REPLACE(ForecastProductCost, '$', ''),
- ForecastProductRev = REPLACE(ForecastProductRev, '$', ''),
- ForecastServiceCost = REPLACE(ForecastServiceCost, '$', ''),
- ForecastServiceRev = REPLACE(ForecastServiceRev, '$', ''),
- ForecastOther1Cost = REPLACE(ForecastOther1Cost, '$', ''),
- ForecastOther1Rev = REPLACE(ForecastOther1Rev, '$', ''),
- ForecastOther2Cost = REPLACE(ForecastOther2Cost, '$', ''),
- ForecastOther2Rev = REPLACE(ForecastOther2Rev, '$', '')
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Update temp table with optional field values if they exist
- IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Company_ID' AND Object_ID = @Source_Object_ID)
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Update temp table with optional field values if they exist
- IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_Contact_ID' AND Object_ID = @Source_Object_ID)
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Update temp table with optional field values if they exist
- IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Legacy_ID' AND Object_ID = @Source_Object_ID)
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_ID = src.Legacy_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Remove import config row created by custom conversion process
- DELETE FROM #Import_Staging
- WHERE Company_Name = 'CW_Import_Config_Row'
- -- If forecast sheet being used, populate forecast table
- IF @ForecastTableName IS NOT NULL
- BEGIN
- SELECT @DSQL = '
- INSERT INTO #Opportunity_Lines
- (
- Legacy_Opp_ID,
- SO_Forecast_Type_ID,
- [Description],
- Revenue,
- Cost
- )
- SELECT
- Legacy_Opp_ID,
- SO_Forecast_Type_ID,
- [Description],
- Revenue,
- Cost
- FROM ' + @ForecastSourceTable
- EXEC(@DSQL)
- END
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT DISTINCT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE Delete_Flag = 0
- AND
- (
- LEFT(Company_Name, 3) IN(SELECT Company_Match_Val FROM #Import_Staging)
- OR Company_ID IN(SELECT Company_Name FROM #Import_Staging)
- OR Company_RecID = (SELECT TOP 1 Company_RecID FROM dbo.Owner)
- )
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- INNER JOIN #Company comp
- ON comp.Company_RecID = cont.Company_RecID
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Opportunity'
- END
- IF @Legacy_Flag = 0
- BEGIN
- -- Match companies and contacts
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- END
- -- Strip commas from numeric fields
- UPDATE #Import_Staging
- SET ForecastProductCost = REPLACE(ForecastProductCost, ',', ''),
- ForecastProductRev = REPLACE(ForecastProductRev, ',', ''),
- ForecastServiceCost = REPLACE(ForecastServiceCost, ',', ''),
- ForecastServiceRev = REPLACE(ForecastServiceRev, ',', ''),
- ForecastOther1Cost = REPLACE(ForecastOther1Cost, ',', ''),
- ForecastOther1Rev = REPLACE(ForecastOther1Rev, ',', ''),
- ForecastOther2Cost = REPLACE(ForecastOther2Cost, ',', ''),
- ForecastOther2Rev = REPLACE(ForecastOther2Rev, ',', '')
- -- Get Company_Address_RecID for contact
- UPDATE stag
- SET stag.Company_Address_RecID = cont.Company_Address_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Contact cont
- ON cont.Contact_RecID = stag.Contact_RecID
- -- If Company_Address_RecID still null, get default for company
- UPDATE stag
- SET stag.Company_Address_RecID = cad.Company_Address_RecID
- FROM #Import_Staging stag
- INNER JOIN Company_Address cad
- ON stag.Company_RecID = cad.Company_RecID
- AND cad.Inactive_Flag = 0
- AND cad.Default_Flag = 1
- WHERE stag.Company_Address_RecID IS NULL
- -- Get SO_Status_RecID
- UPDATE stag
- SET stag.SO_Opp_Status_RecID = sos.SO_Opp_Status_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Opp_Status sos
- ON sos.[Description] = stag.[Status]
- WHERE stag.[Status] IS NOT NULL
- -- Get default SO_Status_RecID if not otherwise specified
- UPDATE stag
- SET stag.SO_Opp_Status_RecID = (SELECT TOP 1 SO_Opp_Status_RecID FROM SO_Opp_Status WHERE Default_Flag = 1)
- FROM #Import_Staging stag
- WHERE stag.[Status] IS NULL
- -- Get SO_Interest_RecID for rating
- UPDATE stag
- SET stag.SO_Interest_RecID = soi.SO_Interest_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Interest soi
- ON dbo.ufn_Import_Trim(soi.[Description]) = stag.Rating
- WHERE stag.Rating IS NOT NULL
- -- If interest (rating) not specified or not found - get record with min sort order from SO_Interest
- UPDATE stag
- SET stag.SO_Interest_RecID = (SELECT TOP 1 SO_Interest_RecID FROM SO_Interest ORDER BY Sort_Order ASC)
- FROM #Import_Staging stag
- WHERE SO_Interest_RecID IS NULL
- -- Get SO_Pipeline_RecID for stage
- UPDATE stag
- SET stag.SO_Pipeline_RecID = sop.SO_Pipeline_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Pipeline sop
- ON stag.Stage = sop.[Description]
- WHERE stag.Stage IS NOT NULL
- -- If stage not specified or not found, get stage w/ lowest sequence number
- UPDATE stag
- SET stag.SO_Pipeline_RecID = (SELECT TOP 1 SO_Pipeline_RecID FROM SO_Pipeline ORDER BY Seq_Nbr ASC)
- FROM #Import_Staging stag
- WHERE stag.SO_Pipeline_RecID IS NULL
- -- Update primary sales percent to 100, secondary to 0 if no secondary rep
- UPDATE #Import_Staging
- SET PrimarySalesPercentSplit = 100,
- SecondarySalesPercentSplit = 0
- FROM #Import_Staging
- WHERE SecondarySalesPerson IS NULL
- -- Get primary sales rep info
- UPDATE stag
- SET stag.PrimarySales_MemberID = mem.Member_RecID,
- stag.PrimarySales_FirstName = mem.First_Name,
- stag.PrimarySales_LastName = mem.Last_Name,
- stag.PrimarySales_RecID = mem.Member_RecID
- FROM #Import_Staging stag
- INNER JOIN Member mem
- ON stag.PrimarySalesPerson = dbo.ufn_Import_Trim(mem.Member_ID)
- OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = stag.PrimarySalesPerson
- -- Get secondary sales rep info
- UPDATE stag
- SET stag.SecondarySales_MemberID = mem.Member_RecID,
- stag.SecondarySales_FirstName = mem.First_Name,
- stag.SecondarySales_LastName = mem.Last_Name,
- stag.SecondarySales_RecID = mem.Member_RecID
- FROM #Import_Staging stag
- INNER JOIN Member mem
- ON stag.SecondarySalesPerson = dbo.ufn_Import_Trim(mem.Member_ID)
- OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = stag.SecondarySalesPerson
- WHERE stag.SecondarySalesPerson IS NOT NULL
- -- Get info for location/group
- UPDATE stag
- SET stag.Group_RecID = bu.Billing_Unit_RecID,
- stag.Location_RecID = ol.Owner_Level_RecID,
- stag.Billing_Unit_Loc_RecID = bul.Billing_Unit_Loc_RecID
- FROM #Import_Staging stag
- INNER JOIN Billing_Unit bu
- ON bu.[Description] = stag.BillingUnit
- OR bu.Billing_Unit_ID = stag.BillingUnit
- INNER JOIN Owner_Level ol
- ON ol.Owner_Level_Name = stag.Location
- OR ol.[Description] = stag.Location
- INNER JOIN Billing_Unit_Loc bul
- ON bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
- AND bul.Owner_Level_RecID = ol.Owner_Level_RecID
- -- Get probability RecID
- UPDATE stag
- SET stag.SO_Probability_RecID = sop.SO_Probability_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Pipeline sop
- ON sop.[Description] = stag.Stage
- -- If probability recid still null, get top by sequence number
- UPDATE stag
- SET SO_Probability_RecID = (SELECT TOP 1 SO_Probability_RecID FROM SO_Pipeline ORDER BY Seq_Nbr ASC)
- FROM #Import_Staging stag
- WHERE SO_Probability_RecID IS NULL
- -- Determine probability from SO_Probability
- UPDATE stag
- SET stag.Probability = sop.Probability
- FROM #Import_Staging stag
- INNER JOIN dbo.SO_Probability sop
- ON stag.SO_Probability_RecID = sop.SO_Probability_RecID
- -- Get SO_Type_RecID
- UPDATE stag
- SET stag.SO_Type_RecID = sot.SO_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Type sot
- ON stag.[Type] = dbo.ufn_Import_Trim(sot.[Description])
- -- Get Marketing_Campaign_RecID
- UPDATE stag
- SET stag.Marketing_Campaign_RecID = mc.Marketing_Campaign_RecID
- FROM #Import_Staging stag
- INNER JOIN Marketing_Campaign mc
- ON mc.Marketing_ID = stag.MarketingCampaign
- -- Get SO_Urgency_RecID for default urgency or first sort order
- UPDATE stag
- SET stag.SO_Urgency_RecID = (SELECT TOP 1 SO_Urgency_RecID FROM SO_Urgency ORDER BY Default_Flag DESC, Sort_Order ASC)
- FROM #Import_Staging stag
- -- If running in 'Force Mode', create necessary references
- IF @ForceMode = 1
- BEGIN
- -- Insert Opportunity Types
- INSERT INTO SO_Type
- (
- Owner_ID,
- [Description],
- Update_By
- )
- SELECT DISTINCT
- 1,
- [Type],
- @ImportBatchUser
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Type sot
- ON dbo.ufn_Import_Trim(sot.[Description]) = tmp.[Type]
- WHERE sot.SO_Type_RecID IS NULL
- AND tmp.[Type] IS NOT NULL
- -- Grab RecIDs for newly inserted opportunity types
- UPDATE stag
- SET stag.SO_Type_RecID = sot.SO_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Type sot
- ON stag.[Type] = dbo.ufn_Import_Trim(sot.[Description])
- AND sot.Update_By = @ImportBatchUser
- -- Insert Opportunity Statuses
- INSERT INTO SO_Opp_Status
- (
- Owner_ID,
- [Description],
- Updated_By,
- Entered_By
- )
- SELECT DISTINCT
- 1,
- tmp.[Status],
- @ImportBatchUser,
- 'zAdmin'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Opp_Status sos
- ON sos.[Description] = tmp.[Status]
- WHERE sos.SO_Opp_Status_RecID IS NULL
- AND tmp.[Status] IS NOT NULL
- -- Grab RecIDs for newly inserted opportunity Statuses
- UPDATE stag
- SET stag.SO_Opp_Status_RecID = sos.SO_Opp_Status_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Opp_Status sos
- ON stag.[Status] = sos.[Description]
- AND sos.Updated_By = @ImportBatchUser
- -- Insert opportunity stage
- INSERT INTO SO_Pipeline
- (
- Owner_ID,
- [Description],
- Funnel_Color,
- SO_Probability_RecID,
- Updated_By
- )
- SELECT DISTINCT
- 1,
- tmp.Stage,
- 'window',
- (SELECT TOP 1 SO_Probability_RecID FROM SO_Probability),
- @ImportBatchUser
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Pipeline sop
- ON tmp.Stage = sop.[Description]
- WHERE sop.SO_Pipeline_RecID IS NULL
- AND tmp.Stage IS NOT NULL
- -- Get SO_Pipeline_RecID for newly inserted stages
- UPDATE stag
- SET stag.SO_Pipeline_RecID = sop.SO_Pipeline_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Pipeline sop
- ON stag.Stage = dbo.ufn_Import_Trim(sop.[Description])
- WHERE stag.Stage IS NOT NULL
- AND sop.Updated_By = @ImportBatchUser
- -- Set primary salesperson to 'zAdmin' if no match found
- UPDATE tmp
- SET tmp.PrimarySales_MemberID = za.Member_RecID,
- tmp.PrimarySales_FirstName = za.First_Name,
- tmp.PrimarySales_LastName = za.Last_Name,
- tmp.PrimarySales_RecID = za.Member_RecID
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.PrimarySalesPerson
- OR ISNULL(dbo.ufn_Import_Trim(mem.First_Name) + ' ', '') + ISNULL(dbo.ufn_Import_Trim(mem.Last_Name), '') = tmp.PrimarySalesPerson
- LEFT OUTER JOIN dbo.Member za ON za.Member_ID = 'zAdmin'
- WHERE mem.Member_RecID IS NULL
- AND tmp.PrimarySales_RecID IS NULL
- -- Attempt to match location/group by Member_ID of primary sales rep
- UPDATE tmp
- SET tmp.Location = ol.Owner_Level_Name,
- tmp.BillingUnit = bu.Billing_Unit_ID,
- tmp.Location_RecID = ol.Owner_Level_RecID,
- tmp.Group_RecID = bu.Billing_Unit_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Member mem
- ON mem.Member_ID = tmp.PrimarySalesPerson
- INNER JOIN dbo.Owner_Level ol
- ON ol.Owner_Level_RecID = COALESCE(mem.Default_Loc_RecID, mem.Owner_Level_RecID)
- LEFT OUTER JOIN Billing_Unit bu
- ON bu.Billing_Unit_RecID = mem.Billing_Unit_RecID
- WHERE tmp.Billing_Unit_Loc_RecID IS NULL
- END
- -- Check required fields and update convert message
- UPDATE #Import_Staging
- SET ConvertMessage =
- CASE
- WHEN stag.Company_RecID IS NULL THEN 'Unable to locate company: "' + stag.Company_Name + '"'
- WHEN stag.SO_Opp_Status_RecID IS NULL THEN 'Invalid status: "' + stag.Status + '"'
- WHEN stag.SO_Interest_RecID IS NULL THEN 'Invalid rating: "' + stag.Rating + '"'
- WHEN stag.SO_Pipeline_RecID IS NULL THEN 'Invalid stage: "' + stag.Stage + '"'
- WHEN stag.PrimarySales_MemberID IS NULL THEN 'Invalid Primary Salesperson: "' + stag.PrimarySalesPerson + '"'
- WHEN stag.SecondarySales_MemberID IS NULL AND stag.SecondarySalesPerson IS NOT NULL THEN 'Invalid secondary salesperson: "' + stag.SecondarySalesPerson + '"'
- WHEN stag.Location_RecID IS NULL THEN 'Invalid location: "' + stag.Location + '"'
- WHEN stag.Group_RecID IS NULL THEN 'Invalid group: "' + stag.BillingUnit + '"'
- 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'
- --WHEN stag.Contact_RecID IS NULL THEN 'Invalid contact'
- ELSE NULL
- END
- FROM #Import_Staging stag
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE ConvertMessage IS NOT NULL)
- BEGIN
- SELECT DISTINCT
- 0 AS Success,
- ExcelRowNumber,
- ConvertMessage AS ErrorDetails
- FROM #Import_Staging
- WHERE ConvertMessage IS NOT NULL
- ROLLBACK TRANSACTION
- RETURN
- END
- -- If probability specified in spreadsheet (optional field), override default probability
- IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE name = 'Probability' AND object_id = @Source_Object_ID)
- BEGIN
- SELECT @DSQL = '
- UPDATE stag
- SET stag.Probability = src.Probability
- FROM #Import_Staging stag
- INNER JOIN ' + @SourceTable + ' src
- ON stag.[ExcelRowNumber] = src.ExcelRowNumber
- AND ISNUMERIC(src.Probability) = 1
- '
- EXEC(@DSQL)
- END
- -- Get Currency_RecID
- -- From Company
- UPDATE stag
- SET stag.Currency_RecID = comp.Currency_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Company comp WHERE comp.Company_RecID = stag.Company_RecID)comp
- -- If still null, get from Company Country
- UPDATE stag
- SET stag.Currency_RecID = curr.Currency_RecID
- FROM #Import_Staging stag
- 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
- CROSS APPLY(SELECT TOP 1 Currency_ID FROM dbo.Country cn WHERE cn.Country_RecID = comp.Country_RecID)cn
- CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Currency curr WHERE curr.Currency_ID = cn.Currency_ID)curr
- WHERE stag.Currency_RecID IS NULL
- -- If still null, get default
- UPDATE stag
- SET stag.Currency_RecID = curr.Currency_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Currency_ID FROM dbo.Country ORDER BY Default_Flag DESC)cn
- CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Currency curr WHERE curr.Currency_ID = cn.Currency_ID)curr
- WHERE stag.Currency_RecID IS NULL
- -- Begin push
- -- Get expected rowcount for insert to SO_Opportunity
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE ConvertMessage IS NULL
- -- Perform insert to dbo.SO_Opportunity, catching new identity values in temp table
- -- Repurpose Owner_ID temporarily to hold RecID from source table (used to join back and grab new identity)
- IF EXISTS(SELECT * FROM sys.columns WHERE object_name(object_id) = 'SO_Opportunity' AND name = 'Last_Update_UTC')
- AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_NAME(OBJECT_ID) = 'SO_Opportunity' AND name = 'Currency_RecID')
- BEGIN
- INSERT INTO dbo.SO_Opportunity
- (
- Owner_ID,
- Opportunity_Name,
- Company_RecID,
- Contact_RecID,
- SO_Pipeline_RecID,
- In_Projection_Flag,
- SO_Interest_RecID,
- Probability_to_Close,
- Source,
- Date_Close_Expected,
- Billing_Unit_RecID,
- Entered_By,
- Updated_By,
- --Last_Update,
- Notes,
- Company_Address_RecID,
- Red_Flag,
- SO_Opp_Status_RecID,
- SO_Type_RecID,
- Owner_Level_RecID,
- Marketing_Campaign_RecID,
- SO_Urgency_RecID,
- Notification_History,
- Mobile_Guid,
- Date_Became_Lead_UTC,
- Last_Update_UTC
- )
- SELECT
- stag.ExcelRowNumber,
- stag.OpportunityName,
- stag.Company_RecID,
- stag.Contact_RecID,
- stag.SO_Pipeline_RecID,
- 0 AS In_Projection_Flag,
- stag.SO_Interest_RecID,
- stag.Probability,
- stag.Source,
- stag.EstCloseDate,
- stag.Group_RecID AS Billing_Unit_RecID,
- @ImportBatchUser,
- @ImportBatchUser,
- --GETDATE() AS Last_Update,
- stag.[Description] AS Notes,
- stag.Company_Address_RecID,
- 0 AS Red_Flag,
- stag.SO_Opp_Status_RecID,
- stag.SO_Type_RecID,
- stag.Location_RecID AS Owner_Level_RecID,
- stag.Marketing_Campaign_RecID,
- stag.SO_Urgency_RecID,
- ',' AS Notification_History,
- NEWID() AS Mobile_Guid,
- @CurrTimeUTC,
- @CurrTimeUTC
- FROM #Import_Staging stag
- END
- -- Perform insert to dbo.SO_Opportunity, catching new identity values in temp table
- -- Repurpose Owner_ID temporarily to hold RecID from source table (used to join back and grab new identity)
- IF EXISTS(SELECT * FROM sys.columns WHERE object_name(object_id) = 'SO_Opportunity' AND name = 'Last_Update_UTC')
- AND EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_NAME(OBJECT_ID) = 'SO_Opportunity' AND name = 'Currency_RecID')
- BEGIN
- INSERT INTO dbo.SO_Opportunity
- (
- Owner_ID,
- Opportunity_Name,
- Company_RecID,
- Contact_RecID,
- SO_Pipeline_RecID,
- In_Projection_Flag,
- SO_Interest_RecID,
- Probability_to_Close,
- Source,
- Date_Close_Expected,
- Billing_Unit_RecID,
- Entered_By,
- Updated_By,
- --Last_Update,
- Notes,
- Company_Address_RecID,
- Red_Flag,
- SO_Opp_Status_RecID,
- SO_Type_RecID,
- Owner_Level_RecID,
- Marketing_Campaign_RecID,
- SO_Urgency_RecID,
- Notification_History,
- Mobile_Guid,
- Date_Became_Lead_UTC,
- Last_Update_UTC,
- Currency_RecID
- )
- SELECT
- stag.ExcelRowNumber,
- stag.OpportunityName,
- stag.Company_RecID,
- stag.Contact_RecID,
- stag.SO_Pipeline_RecID,
- 0 AS In_Projection_Flag,
- stag.SO_Interest_RecID,
- stag.Probability,
- stag.Source,
- stag.EstCloseDate,
- stag.Group_RecID AS Billing_Unit_RecID,
- @ImportBatchUser,
- @ImportBatchUser,
- --GETDATE() AS Last_Update,
- stag.[Description] AS Notes,
- stag.Company_Address_RecID,
- 0 AS Red_Flag,
- stag.SO_Opp_Status_RecID,
- stag.SO_Type_RecID,
- stag.Location_RecID AS Owner_Level_RecID,
- stag.Marketing_Campaign_RecID,
- stag.SO_Urgency_RecID,
- ',' AS Notification_History,
- NEWID() AS Mobile_Guid,
- @CurrTimeUTC,
- @CurrTimeUTC,
- Currency_RecID
- FROM #Import_Staging stag
- END
- -- Insert for CW releases where UTC fields do not appear in SO_Opportunity
- IF NOT EXISTS(SELECT * FROM sys.columns WHERE object_name(object_id) = 'SO_Opportunity' AND name = 'Last_Update_UTC')
- BEGIN
- INSERT INTO dbo.SO_Opportunity
- (
- Owner_ID,
- Opportunity_Name,
- Company_RecID,
- Contact_RecID,
- SO_Pipeline_RecID,
- In_Projection_Flag,
- SO_Interest_RecID,
- Probability_to_Close,
- Source,
- Date_Close_Expected,
- Billing_Unit_RecID,
- Entered_By,
- Updated_By,
- --Last_Update,
- Notes,
- Company_Address_RecID,
- Red_Flag,
- SO_Opp_Status_RecID,
- SO_Type_RecID,
- Owner_Level_RecID,
- Marketing_Campaign_RecID,
- SO_Urgency_RecID,
- Notification_History,
- Mobile_Guid
- )
- SELECT
- stag.ExcelRowNumber,
- stag.OpportunityName,
- stag.Company_RecID,
- stag.Contact_RecID,
- stag.SO_Pipeline_RecID,
- 0 AS In_Projection_Flag,
- stag.SO_Interest_RecID,
- stag.Probability,
- stag.Source,
- stag.EstCloseDate,
- stag.Group_RecID AS Billing_Unit_RecID,
- @ImportBatchUser,
- @ImportBatchUser,
- --GETDATE() AS Last_Update,
- stag.[Description] AS Notes,
- stag.Company_Address_RecID,
- 0 AS Red_Flag,
- stag.SO_Opp_Status_RecID,
- stag.SO_Type_RecID,
- stag.Location_RecID AS Owner_Level_RecID,
- stag.Marketing_Campaign_RecID,
- stag.SO_Urgency_RecID,
- ',' AS Notification_History,
- NEWID() AS Mobile_Guid
- FROM #Import_Staging stag
- END
- -- Join back to staging table to capture new identity
- UPDATE stag
- SET stag.New_Identity = op.Opportunity_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Opportunity op
- ON op.Owner_ID = stag.ExcelRowNumber
- AND Entered_By = @ImportBatchUser
- -- Update Owner_ID to appropriate value
- UPDATE op
- SET op.Owner_ID = 1
- FROM #Import_Staging stag
- INNER JOIN SO_Opportunity op
- ON op.Owner_ID = stag.ExcelRowNumber
- AND Entered_By = @ImportBatchUser
- -- Update forecast lines table with RecID from newly created opps
- UPDATE fl
- SET fl.SO_Opportunity_RecID = stag.New_Identity
- FROM #Opportunity_Lines fl
- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging stag WHERE stag.Legacy_Opp_ID = fl.Legacy_Opp_ID) stag
- -- Raise error if New_Identity is null in either staging table
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE New_Identity IS NULL)
- OR EXISTS(SELECT TOP 1 * FROM #Opportunity_Lines WHERE SO_Opportunity_RecID IS NULL)
- BEGIN
- SELECT @ErrorMsg = 'Error capturing new identity values after insert to SO_Opportunity'
- RAISERROR(@ErrorMsg, 16, 1)
- END
- -- Insert to SO_Team for primary rep
- INSERT INTO SO_Team
- (
- Owner_ID,
- Opportunity_RecID,
- RecID,
- [Description],
- Owner_Flag,
- Last_Update,
- Updated_By,
- member_id,
- referral_flag,
- Secondary_Flag,
- Percent_Split,
- Team_Flag
- )
- SELECT
- 1 AS Owner_ID,
- stag.New_Identity,
- stag.PrimarySales_RecID,
- stag.PrimarySales_FirstName + ' ' + stag.PrimarySales_LastName,
- 1 AS Owner_Flag,
- GETDATE() AS Last_Update,
- 'zAdmin' AS UpdatedBy,
- stag.PrimarySales_MemberID,
- 0,
- 0,
- stag.PrimarySalesPercentSplit,
- 0
- FROM #Import_Staging stag
- -- Insert to SO_Team for secondary rep
- INSERT INTO SO_Team
- (
- Owner_ID,
- Opportunity_RecID,
- RecID,
- [Description],
- Owner_Flag,
- Last_Update,
- Updated_By,
- member_id,
- referral_flag,
- Secondary_Flag,
- Percent_Split,
- Team_Flag
- )
- SELECT
- 1 AS Owner_ID,
- stag.New_Identity,
- stag.SecondarySales_RecID,
- stag.SecondarySales_FirstName + ' ' + stag.SecondarySales_LastName,
- 1 AS Owner_Flag,
- GETDATE() AS Last_Update,
- 'zAdmin' AS UpdatedBy,
- stag.SecondarySales_MemberID,
- 0,
- 1,
- stag.PrimarySalesPercentSplit,
- 0
- FROM #Import_Staging stag
- WHERE stag.SecondarySales_MemberID IS NOT NULL
- -- Insert to SO_Forecast_Dtl for product
- INSERT INTO SO_Forecast_Dtl
- (
- Opportunity_RecID,
- Description,
- Revenue,
- Cost,
- SO_Opp_Status_RecID,
- Include_Flag,
- Updated_By,
- Last_Update,
- SO_Forecast_Type_ID,
- Product_Flag,
- Link_Flag,
- Recurring_Flag
- )
- SELECT
- New_Identity,
- ForecastProductDescription,
- ForecastProductRev,
- ForecastProductCost,
- SO_Opp_Status_RecID,
- 1,
- 'zAdmin',
- GETDATE(),
- 'P',
- 0,
- 0,
- 0
- FROM #Import_Staging
- WHERE ForecastProductDescription IS NOT NULL
- -- Insert to SO_Forecast_Dtl for service
- INSERT INTO SO_Forecast_Dtl
- (
- Opportunity_RecID,
- Description,
- Revenue,
- Cost,
- SO_Opp_Status_RecID,
- Include_Flag,
- Updated_By,
- Last_Update,
- SO_Forecast_Type_ID,
- Product_Flag,
- Link_Flag,
- Recurring_Flag
- )
- SELECT
- New_Identity,
- ForecastServiceDescription,
- ForecastServiceRev,
- ForecastServiceCost,
- SO_Opp_Status_RecID,
- 1,
- 'zAdmin',
- GETDATE(),
- 'S',
- 0,
- 0,
- 0
- FROM #Import_Staging
- WHERE ForecastServiceDescription IS NOT NULL
- -- Insert to SO_Forecast_Dtl for Other - 1
- INSERT INTO SO_Forecast_Dtl
- (
- Opportunity_RecID,
- Description,
- Revenue,
- Cost,
- SO_Opp_Status_RecID,
- Include_Flag,
- Updated_By,
- Last_Update,
- SO_Forecast_Type_ID,
- Product_Flag,
- Link_Flag,
- Recurring_Flag
- )
- SELECT
- New_Identity,
- ForecastOther1Description,
- ForecastOther1Rev,
- ForecastOther1Cost,
- SO_Opp_Status_RecID,
- 1,
- 'zAdmin',
- GETDATE(),
- 'O1',
- 0,
- 0,
- 0
- FROM #Import_Staging
- WHERE ForecastOther1Description IS NOT NULL
- -- Insert to SO_Forecast_Dtl for Other - 2
- INSERT INTO SO_Forecast_Dtl
- (
- Opportunity_RecID,
- Description,
- Revenue,
- Cost,
- SO_Opp_Status_RecID,
- Include_Flag,
- Updated_By,
- Last_Update,
- SO_Forecast_Type_ID,
- Product_Flag,
- Link_Flag,
- Recurring_Flag
- )
- SELECT
- New_Identity,
- ForecastOther2Description,
- ForecastOther2Rev,
- ForecastOther2Cost,
- SO_Opp_Status_RecID,
- 1,
- 'zAdmin',
- GETDATE(),
- 'O2',
- 0,
- 0,
- 0
- FROM #Import_Staging
- WHERE ForecastOther2Description IS NOT NULL
- -- If forecast line sheet included, perform insert
- INSERT INTO SO_Forecast_Dtl
- (
- Opportunity_RecID,
- Description,
- Revenue,
- Cost,
- SO_Opp_Status_RecID,
- Include_Flag,
- Updated_By,
- Last_Update,
- SO_Forecast_Type_ID,
- Product_Flag,
- Link_Flag,
- Recurring_Flag
- )
- SELECT
- ol.SO_Opportunity_RecID,
- LEFT(ol.[Description], 50),
- Revenue,
- Cost,
- stag.SO_Opp_Status_RecID,
- 1,
- 'zAdmin',
- GETDATE(),
- ol.SO_Forecast_Type_ID,
- 0,
- 0,
- 0
- FROM #Opportunity_Lines ol
- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging stag WHERE stag.New_Identity = ol.SO_Opportunity_RecID) stag
- WHERE ol.SO_Opportunity_RecID IS NOT NULL
- ---- If debug mode and successful, select the rows that were inserted
- ---- and rollback transaction
- IF @DebugMode = 1 AND @@ERROR = 0
- BEGIN
- SELECT soa.* FROM SO_Activity soa INNER JOIN #Import_Staging stag ON stag.New_Identity = soa.Opportunity_Recid
- SELECT tm.* FROM SO_Team tm INNER JOIN #Import_Staging stag ON stag.New_Identity = tm.Opportunity_RecID
- SELECT sfd.* FROM SO_Forecast_Dtl sfd INNER JOIN #Import_Staging stag ON stag.New_Identity = sfd.Opportunity_RecID
- ROLLBACK TRANSACTION Opp_Import
- END
- IF @DebugMode = 2 AND @@ERROR = 0
- BEGIN
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- ROLLBACK TRANSACTION Opp_Import
- END
- EXEC usp_Import_UDF @TableName, 'Opportunity'
- IF @DebugMode = 0 AND @@Error = 0
- BEGIN
- -- Import successful - Save legacy_id's if necessary, commit and return results
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- IF OBJECT_ID('tempdb..#Legacy_IDs') IS NOT NULL
- DROP TABLE #Legacy_IDs
- SELECT
- Legacy_ID AS Legacy_ID,
- New_Identity AS CW_RecID,
- 'Opportunity' AS Record_Type
- INTO #Legacy_IDs
- FROM #Import_Staging stag
- WHERE Legacy_ID IS NOT NULL
- EXEC dbo.usp_Import_Legacy_IDs
- END
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- COMMIT TRANSACTION Opp_Import
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS Reason
- END
- END TRY
- BEGIN CATCH
- -- Return SQL error message encountered
- SELECT
- 0 AS Success,
- 'Unknown' AS ExcelRowNumber,
- ERROR_MESSAGE() + CONVERT(NVARCHAR, ERROR_LINE()) AS ErrorDetails
- -- Rollback transaction
- IF @@TRANCOUNT > 0
- ROLLBACK TRANSACTION
- END CATCH
- GO
- -- *************************************
- -- *********** ACTIVITIES **************
- -- *************************************
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_AC_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_AC_ImportValidate] AS SELECT 1')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_AC_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_AC_ImportPush] AS SELECT 1')
- END
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 04/11/2013
- -- Description: Validates data in spreadsheet
- --- for Activity Import
- -- Sample call: exec usp_AC_ImportValidate 'TMP_Import_1637365ab3ae44478726c8ec3e9faaba', 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_AC_ImportValidate]
- @TableName VARCHAR(MAX),
- @Forcemode BIT = 0
- AS
- BEGIN
- SET NOCOUNT ON
- -- Set date format to MDY to validate dates from excel
- SET DATEFORMAT MDY
- -- Variable declaration
- DECLARE @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
- BEGIN
- DROP TABLE #tblResults
- END
- -- Table to hold results of procedure
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
- InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Warning_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Pre-validation
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'Assign To' UNION ALL
- SELECT 'Subject' UNION ALL
- SELECT 'Activity Status' UNION ALL
- SELECT 'Company Name' UNION ALL
- SELECT 'Contact First Name' UNION ALL
- SELECT 'Contact Last Name' UNION ALL
- SELECT 'Activity Type' UNION ALL
- SELECT 'Assign By' UNION ALL
- SELECT 'Marketing Campaign' UNION ALL
- SELECT 'Due Date' UNION ALL
- SELECT 'Start Time' UNION ALL
- SELECT 'End Time' UNION ALL
- SELECT 'Reminder Minutes' UNION ALL
- SELECT 'Notes'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- -- Table to hold source data for this batch from temp table
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber int NULL,
- AssignTo nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Subject] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ActivityStatus nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactFirstName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactLastName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ActivityType nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- AssignBy nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- MarketingCampaign nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ReminderMinutes nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- DueDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- StartTime nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- EndTime nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- dtmDueDate DATETIME NULL,
- SO_Activity_Type_RecID INT NULL,
- ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_RecID INT NULL,
- Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_RecID INT NULL,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
- Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
- Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Legacy_Site_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Company_Address_RecID INT,
- SR_Service_RecID INT,
- SO_Opportunity_RecID INT,
- Duplicate_Flag BIT,
- Legacy_Ticket_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Opp_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Diff_Exclude_Flag BIT
- )
- CREATE INDEX IX_Comp ON #Import_Staging(Legacy_Company_ID)
- CREATE INDEX IX_Cont ON #Import_Staging(Legacy_Contact_ID)
- CREATE INDEX IX_XL ON #Import_Staging(ExcelRowNumber) INCLUDE(Legacy_Company_ID, Legacy_Contact_ID, Legacy_ID)
- -- Build statement to populate validation temp table
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- AssignTo,
- [Subject],
- ActivityStatus,
- Company_Name,
- ContactFirstName,
- ContactLastName,
- ActivityType,
- AssignBy,
- MarketingCampaign,
- DueDate,
- StartTime,
- EndTime,
- ReminderMinutes,
- Notes,
- Company_Match_Val
- )
- SELECT
- [Excel Row Number],
- [Assign To],
- [Subject],
- [Activity Status],
- [Company Name],
- [Contact First Name],
- [Contact Last Name],
- [Activity Type],
- [Assign By],
- [Marketing Campaign],
- [Due Date],
- [Start Time],
- [End Time],
- [Reminder Minutes],
- [Notes],
- LEFT([Company Name], 3)
- FROM ' + @SourceTable
- -- Pull records into temp table
- EXEC(@DSQL)
- BEGIN TRANSACTION AC_Validate
- -- If this is a custom migration, remove datatype config row
- DELETE FROM #Import_Staging
- WHERE [Subject] = 'CW_Import_Config_Row'
- -- Update single space or blank string to null
- UPDATE #Import_Staging SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- AssignTo = CASE WHEN AssignTo IN('', ' ') THEN NULL ELSE AssignTo END,
- [Subject] = CASE WHEN [Subject] IN('', ' ') THEN NULL ELSE [Subject] END,
- ActivityStatus = CASE WHEN ActivityStatus IN('', ' ') THEN NULL ELSE ActivityStatus END,
- Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
- ContactFirstName = CASE WHEN ContactFirstName IN('', ' ') THEN NULL ELSE ContactFirstName END,
- ContactLastName = CASE WHEN ContactLastName IN('', ' ') THEN NULL ELSE ContactLastName END,
- ActivityType = CASE WHEN ActivityType IN('', ' ') THEN NULL ELSE ActivityType END,
- AssignBy = CASE WHEN AssignBy IN('', ' ') THEN NULL ELSE AssignBy END,
- MarketingCampaign = CASE WHEN MarketingCampaign IN('', ' ') THEN NULL ELSE MarketingCampaign END,
- ReminderMinutes = CASE WHEN ReminderMinutes IN('', ' ') THEN NULL ELSE ReminderMinutes END,
- DueDate = CASE WHEN DueDate IN('', ' ') THEN NULL ELSE REPLACE(DueDate, '000000', '') END,
- StartTime = CASE WHEN StartTime IN('', ' ') THEN NULL ELSE StartTime END,
- EndTime = CASE WHEN EndTime IN('', ' ') THEN NULL ELSE EndTime END,
- Notes = CASE WHEN Notes IN('', ' ') THEN NULL ELSE Notes END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_ID = src.Legacy_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Condense contact first and last names to ContactName
- UPDATE tmp
- SET ContactName = LTRIM(ISNULL(tmp.ContactFirstName + ' ', '') + ISNULL(tmp.ContactLastName, ''))
- FROM #Import_Staging tmp
- -- Get DueDate as datetime if valid
- UPDATE tmp
- SET dtmDueDate = CAST(DueDate AS DATETIME)
- FROM #Import_Staging tmp
- WHERE ISDATE(DueDate) = 1
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Activity'
- END
- IF @Legacy_Flag = 0
- BEGIN
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE Delete_Flag = 0
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- INNER JOIN #Company comp
- ON comp.Company_RecID = cont.Company_RecID
- -- Match companies and contacts
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- END
- -- Get RecID for Activity Type
- UPDATE tmp
- SET tmp.SO_Activity_Type_RecID = aty.SO_Activity_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.SO_Activity_Type aty
- ON aty.[Description] = tmp.ActivityType
- UPDATE #Import_Staging SET [Subject] = '[No Subject]' WHERE [Subject] IS NULL
- -- If running in force mode, create references and override validations as necessary
- -- Insert will differ between CW releases (Entered_By column may or may not be present - handle accordingly
- IF(@Forcemode = 1 AND EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('SO_Activity_Type') AND name = 'Entered_By'))
- BEGIN
- -- Insert activity type if specified but not found
- INSERT INTO dbo.SO_Activity_Type
- (
- Owner_ID,
- SO_Activity_Type_ID,
- [Description],
- History_Flag,
- Updated_By,
- Cleanup_Flag,
- Default_Flag,
- Import_Flag,
- email_Flag,
- Memo_Flag,
- Points_Value,
- Inactive_Flag,
- Entered_By
- )
- SELECT DISTINCT
- 1,
- SUBSTRING(ActivityType, 1, 15),
- SUBSTRING(ActivityType, 1, 50),
- 0,
- @ImportBatchUser,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- @ImportBatchUser
- FROM #Import_Staging tmp
- WHERE tmp.SO_Activity_Type_RecID IS NULL
- AND tmp.ActivityType IS NOT NULL
- AND NOT EXISTS(SELECT TOP 1 * FROM SO_Activity_Type WHERE SO_Activity_Type_ID = SUBSTRING(ActivityType, 1, 15))
- END
- -- If running in force mode, create references and override validations as necessary
- -- Insert will differ between CW releases (Entered_By column may or may not be present - handle accordingly
- IF(@Forcemode = 1 AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('SO_Activity_Type') AND name = 'Entered_By'))
- BEGIN
- -- Insert activity type if specified but not found
- INSERT INTO dbo.SO_Activity_Type
- (
- Owner_ID,
- SO_Activity_Type_ID,
- [Description],
- History_Flag,
- Updated_By,
- Cleanup_Flag,
- Default_Flag,
- Import_Flag,
- email_Flag,
- Memo_Flag,
- Points_Value,
- Inactive_Flag
- )
- SELECT DISTINCT
- 1,
- SUBSTRING(ActivityType, 1, 15),
- SUBSTRING(ActivityType, 1, 50),
- 0,
- @ImportBatchUser,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- FROM #Import_Staging tmp
- WHERE tmp.SO_Activity_Type_RecID IS NULL
- AND tmp.ActivityType IS NOT NULL
- AND NOT EXISTS(SELECT TOP 1 * FROM SO_Activity_Type WHERE SO_Activity_Type_ID = SUBSTRING(ActivityType, 1, 15))
- END
- -- If running in force mode, truncate subjects > 100 characters
- UPDATE tmp
- SET tmp.Subject = SUBSTRING(tmp.Subject, 1, 100)
- FROM #Import_Staging tmp
- WHERE @ForceMode = 1
- -- If resource name is used for 'Assign To', update to use member_id instead
- UPDATE tmp
- SET tmp.AssignTo = mem.Member_ID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Member mem
- ON dbo.ufn_Import_Trim(ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_name, '')) = tmp.AssignTo
- -- Begin validations
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Assign To is required
- SELECT
- tmp.ExcelRowNumber,
- 'Assign to is required'
- FROM #Import_Staging tmp
- WHERE AssignTo IS NULL
- UNION ALL
- -- Assign to must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- '"' + tmp.AssignTo + '" is not a valid Member_ID for Assign To'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON tmp.AssignTo = mem.Member_ID
- WHERE mem.Member_RecID IS NULL
- AND tmp.AssignTo IS NOT NULL
- AND @ForceMode <> 1
- UNION ALL
- -- Subject is required
- SELECT
- tmp.ExcelRowNumber,
- 'Subject is required'
- FROM #Import_Staging tmp
- WHERE tmp.Subject IS NULL
- UNION ALL
- -- Subject must be <= 100 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Subject cannot exceed 100 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.[Subject]) > 100
- AND tmp.[Subject] IS NOT NULL
- UNION ALL
- -- Activity status is required
- SELECT
- tmp.ExcelRowNumber,
- 'Activity Status is required'
- FROM #Import_Staging tmp
- WHERE tmp.ActivityStatus IS NULL
- UNION ALL
- -- Activity status must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Activity status: "' + tmp.ActivityStatus + '" is not a valid status'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Act_Status stat
- ON stat.[Description] = tmp.ActivityStatus
- WHERE stat.SO_Act_Status_RecID IS NULL
- AND tmp.ActivityStatus IS NOT NULL
- UNION ALL
- -- Company name must be 50 characters or less
- SELECT
- tmp.ExcelRowNumber,
- 'Company name must be less than 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Company_Name) > 50
- AND tmp.Company_Name IS NOT NULL
- UNION ALL
- -- Company Name is Required
- SELECT
- tmp.ExcelRowNumber,
- 'Company Name is required'
- FROM #Import_Staging tmp
- WHERE tmp.Company_Name IS NULL
- AND Legacy_ID IS NULL
- UNION ALL
- -- Check that company names are valid
- SELECT
- tmp.ExcelRowNumber,
- 'Company not found: "' + ISNULL(tmp.Company_Name, '') + '"'
- FROM #Import_Staging tmp
- WHERE Company_Name IS NOT NULL
- AND Company_RecID IS NULL
- UNION ALL
- -- Check for more than one company with the same name
- SELECT
- tmp.ExcelRowNumber,
- 'There are more than one companies named "' + ISNULL(Company_Name, '') + '" - company name must be unique'
- FROM #Import_Staging tmp
- WHERE Company_Duplicate_Flag = 1
- UNION ALL
- -- Check that contact is valid
- SELECT
- tmp.ExcelRowNumber,
- 'Unable to locate contact: "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '') + '"'
- FROM #Import_Staging tmp
- WHERE Contact_RecID IS NULL
- AND tmp.ContactName IS NOT NULL
- AND tmp.Company_Duplicate_Flag = 0
- AND tmp.Company_RecID IS NOT NULL
- UNION ALL
- -- Check for duplicate contacts within company
- SELECT
- tmp.ExcelRowNumber,
- 'There are more than one contacts named "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Contact_Duplicate_Flag = 1
- AND tmp.Company_Duplicate_Flag = 0
- UNION ALL
- -- Check that a default contact for company exists if contact is null
- SELECT
- tmp.ExcelRowNumber,
- 'Contact must be specified for company: "' + ISNULL(tmp.Company_Name, '') + '" because no default contact exists for this company'
- FROM #Import_Staging tmp
- WHERE tmp.Contact_RecID IS NULL
- AND tmp.ContactName IS NULL
- AND tmp.Company_Name IS NOT NULL
- AND tmp.Company_RecID IS NOT NULL
- AND tmp.Company_Duplicate_Flag = 0
- UNION ALL
- -- Activity type must be a valid reference if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid activity type: "' + tmp.ActivityType + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Activity_Type aty
- ON aty.[Description] = tmp.ActivityType
- OR aty.SO_Activity_Type_ID = tmp.ActivityType
- WHERE tmp.ActivityType IS NOT NULL
- AND aty.SO_Activity_Type_RecID IS NULL
- UNION ALL
- -- Default activity type must exist if not entered on spreadsheet
- SELECT
- tmp.ExcelRowNumber,
- 'Activity type is not specified and no default exists'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN SO_Activity_Type sot
- ON sot.Default_Flag = 1
- AND sot.Inactive_Flag = 0
- WHERE tmp.ActivityType IS NULL
- AND sot.SO_Activity_Type_RecID IS NULL
- UNION ALL
- -- Assign By must be a valid reference if specified
- SELECT
- tmp.ExcelRowNumber,
- '"' + tmp.AssignBy + '" is not a valid Member_ID for Assign By'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON tmp.AssignBy = mem.Member_ID
- WHERE mem.Member_RecID IS NULL
- AND tmp.AssignBy IS NOT NULL
- UNION ALL
- -- If specified, Marketing campaign must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid marketing campaign: "' + MarketingCampaign + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Marketing_Campaign mc
- ON mc.Marketing_ID = tmp.MarketingCampaign
- WHERE mc.Marketing_Campaign_RecID IS NULL
- AND tmp.MarketingCampaign IS NOT NULL
- UNION ALL
- -- If marketing campaign specified, it must start prior to due date
- SELECT
- tmp.ExcelRowNumber,
- 'Marketing campaign start date cannot be after activity due date.'
- FROM #Import_Staging tmp
- INNER JOIN Marketing_Campaign mc
- ON mc.Marketing_ID = tmp.MarketingCampaign
- WHERE tmp.MarketingCampaign IS NOT NULL
- AND mc.Date_Start IS NOT NULL
- AND mc.Date_Start > dtmDueDate
- AND tmp.dtmDueDate IS NOT NULL
- UNION ALL
- -- If marketing campaign specified, Due date must be prior to end date
- SELECT
- tmp.ExcelRowNumber,
- 'Activity due date cannot be after end date of marketing campaign.'
- FROM #Import_Staging tmp
- INNER JOIN Marketing_Campaign mc
- ON mc.Marketing_ID = tmp.MarketingCampaign
- WHERE tmp.MarketingCampaign IS NOT NULL
- AND mc.Date_Cancel IS NOT NULL
- AND tmp.dtmDueDate > mc.Date_Cancel
- AND tmp.dtmDueDate IS NOT NULL
- UNION ALL
- -- Due date must be entered if start time, end time, or reminder minutes are used
- SELECT
- tmp.ExcelRowNumber,
- 'If start/end time or reminder minutes are used, Due date is required'
- FROM #Import_Staging tmp
- WHERE tmp.DueDate IS NULL
- AND COALESCE(tmp.StartTime, tmp.EndTime, tmp.ReminderMinutes) IS NOT NULL
- UNION ALL
- -- Due date must be a valid date if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Due date must be a valid date - Please use MM/DD/YYYY format'
- FROM #Import_Staging tmp
- WHERE (ISDATE(tmp.DueDate) = 0)
- AND tmp.DueDate IS NOT NULL
- UNION ALL
- -- Start time must be a valid time if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Start time must be in 24 hour format - "' + tmp.StartTime + '" is invalid'
- FROM #Import_Staging tmp
- WHERE ISDATE(tmp.StartTime) = 0
- AND tmp.StartTime IS NOT NULL
- UNION ALL
- -- End time must be a valid time if entered
- SELECT
- tmp.ExcelRowNumber,
- 'End time must be in 24 hour format - "' + tmp.EndTime + '" is invalid'
- FROM #Import_Staging tmp
- WHERE ISDATE(tmp.EndTime) = 0
- AND tmp.EndTime IS NOT NULL
- UNION ALL
- -- Start time required if reminder minutes used
- SELECT
- tmp.ExcelRowNumber,
- 'Start time is required if reminder minutes are used'
- FROM #Import_Staging tmp
- WHERE tmp.StartTime IS NULL
- AND tmp.ReminderMinutes IS NOT NULL
- UNION ALL
- -- End time required if reminder minutes used
- SELECT
- tmp.ExcelRowNumber,
- 'End time is required if reminder minutes are used'
- FROM #Import_Staging tmp
- WHERE tmp.EndTime IS NULL
- AND tmp.ReminderMinutes IS NOT NULL
- UNION ALL
- -- Reminder minutes must be valid
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid reminder minutes: "' + tmp.ReminderMinutes + '"'
- FROM #Import_Staging tmp
- 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')
- AND tmp.ReminderMinutes IS NOT NULL
- UNION ALL
- -- Activity status must be closed if Activity type is inactive
- SELECT
- tmp.ExcelRowNumber,
- 'Activity type: "' + tmp.ActivityType + '" is inactive - cannot import activity in open status with an inactive activity type'
- FROM #Import_Staging tmp
- INNER JOIN SO_Act_Status sos
- ON sos.Closed_Flag = 0
- AND sos.[Description] = tmp.ActivityStatus
- INNER JOIN SO_Activity_Type sot
- ON sot.Inactive_Flag = 1
- AND sot.[Description] = tmp.ActivityType
- WHERE tmp.ActivityType IS NOT NULL
- -- Insert notification messages for any created references
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag,
- ReferenceType
- )
- SELECT
- NULL,
- ISNULL(cont.First_Name, '') + ' ' + ISNULL(cont.Last_Name, ''),
- 1,
- 'Contact(s)'
- FROM dbo.Contact cont
- WHERE cont.Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- sot.[Description],
- 1,
- 'Activity Types(s)'
- FROM dbo.SO_Activity_Type sot
- WHERE sot.Updated_By = @ImportBatchUser
- UNION ALL
- SELECT DISTINCT
- ExcelRowNumber,
- 'Company: "' + tmp.Company_Name + '" fuzzy matched to Company: ' + tmp.Company_Name_Fuzzy,
- 1,
- NULL
- FROM #Import_Staging tmp
- WHERE Company_Name_Fuzzy IS NOT NULL
- UNION ALL
- SELECT DISTINCT
- ExcelRowNumber,
- 'Contact "' + tmp.ContactName + '" fuzzy matched to Contact: ' + tmp.Contact_Name_Fuzzy,
- 1,
- NULL
- FROM #Import_Staging tmp
- WHERE Contact_Name_Fuzzy IS NOT NULL
- -- Return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed
- ROLLBACK TRANSACTION
- RETURN
- END
- ELSE
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed res
- UNION ALL
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- 'The following ' + ReferenceType + ' will be created: '+
- STUFF(
- (SELECT ', ' + ValMsg
- FROM #tblResults
- WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
- FOR XML PATH (''))
- , 1, 1, '') AS ValMsg
- FROM #tblResults res
- WHERE ReferenceType IS NOT NULL
- GROUP BY ReferenceType
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- END
- ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS ValMsg
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- END
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 04/08/2013
- -- Description: Performs final validation
- -- and inserts for activities import
- -- Sample call: EXEC usp_AC_ImportPush 'TMP_Import_fff0c4a40ed041e688baac5959c268ff', 0, 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_AC_ImportPush]
- @TableName VARCHAR(MAX),
- @DebugMode INT = 0,
- @Forcemode BIT = 0
- AS
- BEGIN TRY
- -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT,
- AssignTo nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Subject] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ActivityStatus nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactFirstName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactLastName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ActivityType nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- AssignBy nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- MarketingCampaign nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ReminderMinutes nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- DueDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- StartTime nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- EndTime nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- BatchID uniqueidentifier NULL,
- AssignTo_Member_RecID VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- AssignTo_Member_ID VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Activity_Status_RecID INT,
- SO_Activity_Type_RecID INT,
- AssignBy_Member_RecID VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Marketing_Campaign_RecID INT,
- ConvertMessage VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Close_Flag BIT,
- New_Identity INT,
- StartDateTime DATETIME,
- EndDateTime DATETIME,
- Schedule_RecID INT,
- Company_RecID INT NULL,
- Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_RecID INT NULL,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy NVARCHAR(MAX),
- ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
- Legacy_Company_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Site_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Company_Address_RecID INT,
- SR_Service_RecID INT,
- SO_Opportunity_RecID INT,
- Duplicate_Flag BIT,
- Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Diff_Exclude_Flag BIT,
- Date_Time_Start_UTC DATETIME,
- Date_Time_End_UTC DATETIME
- )
- CREATE INDEX IX_Comp ON #Import_Staging(Legacy_Company_ID)
- CREATE INDEX IX_Cont ON #Import_Staging(Legacy_Contact_ID)
- SET NOCOUNT ON
- -- Variable declaration
- DECLARE
- @ExpRowCount INT, -- Expected rowcount inserts - Used for validation
- @ActualRowCount INT,
- @ErrorMsg VARCHAR(350), -- Variable to hold custom error message
- @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
- @ImportBatchUser VARCHAR(15), -- Unique value to identify records created by this import
- @MAX_SO_Activity_RecID INT, -- Highest SO_Activity_RecID (Performance - helps w/ slow join on this table)
- @MAX_Schedule_RecID INT, -- Highest SO_Activity_RecID (Performance - helps w/ slow join on this table)
- @MAX_Schedule_Detail_RecID INT, -- Highest Schedule_Detail_RecID (Performance - helps w/ slow join on this table)
- @UTCOffSet INT = (SELECT DATEDIFF(HOUR, GETDATE(), GETUTCDATE()))
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Populate Staging table with initial values
- -- Build statement to populate validation temp table
- SELECT @DSQL= '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- AssignTo,
- [Subject],
- ActivityStatus,
- Company_Name,
- ContactFirstName,
- ContactLastName,
- ActivityType,
- AssignBy,
- MarketingCampaign,
- DueDate,
- StartTime,
- EndTime,
- ReminderMinutes,
- Notes,
- Company_Match_Val
- )
- SELECT
- [Excel Row Number],
- [Assign To],
- [Subject],
- [Activity Status],
- [Company Name],
- [Contact First Name],
- [Contact Last Name],
- [Activity Type],
- [Assign By],
- [Marketing Campaign],
- [Due Date],
- [Start Time],
- [End Time],
- [Reminder Minutes],
- [Notes],
- LEFT([Company Name], 3)
- FROM ' + @SourceTable
- EXEC(@DSQL)
- BEGIN TRANSACTION AC_Import
- -- If this is a custom migration, remove datatype config row
- DELETE FROM #Import_Staging
- WHERE [Subject] = 'CW_Import_Config_Row'
- -- Trim subject as needed
- UPDATE #Import_Staging
- SET [Subject] = LEFT([Subject], 100)
- -- Update single space or blank string to null
- UPDATE #Import_Staging SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- AssignTo = CASE WHEN AssignTo IN('', ' ') THEN NULL ELSE AssignTo END,
- [Subject] = CASE WHEN [Subject] IN('', ' ') THEN NULL ELSE [Subject] END,
- ActivityStatus = CASE WHEN ActivityStatus IN('', ' ') THEN NULL ELSE ActivityStatus END,
- Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
- ContactFirstName = CASE WHEN ContactFirstName IN('', ' ') THEN NULL ELSE ContactFirstName END,
- ContactLastName = CASE WHEN ContactLastName IN('', ' ') THEN NULL ELSE ContactLastName END,
- ActivityType = CASE WHEN ActivityType IN('', ' ') THEN NULL ELSE ActivityType END,
- AssignBy = CASE WHEN AssignBy IN('', ' ') THEN NULL ELSE AssignBy END,
- MarketingCampaign = CASE WHEN MarketingCampaign IN('', ' ') THEN NULL ELSE MarketingCampaign END,
- ReminderMinutes = CASE WHEN ReminderMinutes IN('', ' ') THEN NULL ELSE ReminderMinutes END,
- Notes = CASE WHEN Notes IN('', ' ') THEN NULL ELSE Notes END,
- DueDate = CASE WHEN DueDate IN('', ' ') THEN NULL ELSE REPLACE(DueDate, '000000', '') END,
- StartTime = CASE WHEN StartTime IN('', ' ') THEN NULL ELSE StartTime END,
- EndTime = CASE WHEN EndTime IN('', ' ') THEN NULL ELSE EndTime END
- UPDATE #Import_Staging SET [Subject] = '[No Subject]' WHERE [Subject] IS NULL
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_ID = src.Legacy_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Condense contact first and last names to ContactName
- UPDATE tmp
- SET ContactName = LTRIM(ISNULL(tmp.ContactFirstName + ' ', '') + ISNULL(tmp.ContactLastName, ''))
- FROM #Import_Staging tmp
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Activity'
- END
- IF(@Legacy_Flag = 0)
- BEGIN
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT DISTINCT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE Delete_Flag = 0
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- INNER JOIN #Company comp
- ON comp.Company_RecID = cont.Company_RecID
- -- Match companies and contacts to grab recid
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- END
- -- If resource name is used for 'Assign To', update to use member_id instead
- UPDATE tmp
- SET tmp.AssignTo = mem.Member_ID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Member mem
- ON ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_name, '') = tmp.AssignTo
- -- Grab reference RecID's needed to start import
- -- AssignTo
- UPDATE stag
- SET stag.AssignTo_Member_RecID = mem.Member_RecID,
- stag.AssignTo_Member_ID = mem.Member_ID
- FROM #Import_Staging stag
- INNER JOIN Member mem
- ON mem.Member_ID = stag.AssignTo
- -- Activity Status
- UPDATE stag
- SET stag.Activity_Status_RecID = ast.SO_Act_Status_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Act_Status ast
- ON ast.[Description] = stag.ActivityStatus
- -- Status closed flag
- UPDATE stag
- SET stag.Close_Flag = ast.Closed_Flag
- FROM #Import_Staging stag
- INNER JOIN SO_Act_Status ast
- ON ast.SO_Act_Status_RecID = stag.Activity_Status_RecID
- -- If running in force mode, create references and override validations as necessary
- -- Insert will differ between CW releases (Entered_By column may or may not be present - handle accordingly
- IF(@Forcemode = 1 AND EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('SO_Activity_Type') AND name = 'Entered_By'))
- BEGIN
- -- Insert activity type if specified but not found
- INSERT INTO dbo.SO_Activity_Type
- (
- Owner_ID,
- SO_Activity_Type_ID,
- [Description],
- History_Flag,
- Updated_By,
- Cleanup_Flag,
- Default_Flag,
- Import_Flag,
- email_Flag,
- Memo_Flag,
- Points_Value,
- Inactive_Flag,
- Entered_By
- )
- SELECT DISTINCT
- 1,
- SUBSTRING(ActivityType, 1, 15),
- SUBSTRING(ActivityType, 1, 50),
- 0,
- @ImportBatchUser,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- @ImportBatchUser
- FROM #Import_Staging tmp
- WHERE tmp.SO_Activity_Type_RecID IS NULL
- AND tmp.ActivityType IS NOT NULL
- 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)
- END
- -- If running in force mode, create references and override validations as necessary
- -- Insert will differ between CW releases (Entered_By column may or may not be present - handle accordingly
- IF(@Forcemode = 1 AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('SO_Activity_Type') AND name = 'Entered_By'))
- BEGIN
- -- Insert activity type if specified but not found
- INSERT INTO dbo.SO_Activity_Type
- (
- Owner_ID,
- SO_Activity_Type_ID,
- [Description],
- History_Flag,
- Updated_By,
- Cleanup_Flag,
- Default_Flag,
- Import_Flag,
- email_Flag,
- Memo_Flag,
- Points_Value,
- Inactive_Flag
- )
- SELECT DISTINCT
- 1,
- SUBSTRING(ActivityType, 1, 15),
- SUBSTRING(ActivityType, 1, 50),
- 0,
- @ImportBatchUser,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- FROM #Import_Staging tmp
- WHERE tmp.SO_Activity_Type_RecID IS NULL
- AND tmp.ActivityType IS NOT NULL
- 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)
- END
- -- Activity type
- UPDATE stag
- SET stag.SO_Activity_Type_RecID = aty.SO_Activity_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Activity_Type aty
- ON aty.[Description] = stag.ActivityType
- OR aty.SO_Activity_Type_ID = stag.ActivityType
- WHERE stag.ActivityType IS NOT NULL
- -- Get default Activity type if null
- UPDATE stag
- SET stag.SO_Activity_Type_RecID = aty.SO_Activity_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Activity_Type aty
- ON aty.Default_Flag = 1
- AND aty.Inactive_Flag = 0
- WHERE stag.ActivityType IS NULL
- -- Assign By
- UPDATE stag
- SET stag.AssignBy_Member_RecID = mem.Member_RecID
- FROM #Import_Staging stag
- INNER JOIN Member mem
- ON mem.Member_ID = stag.AssignBy
- AND Stag.AssignBy IS NOT NULL
- -- Marketing campaign
- UPDATE stag
- SET stag.Marketing_Campaign_RecID = mc.Marketing_Campaign_RecID
- FROM #Import_Staging stag
- INNER JOIN Marketing_Campaign mc
- ON mc.Marketing_ID = stag.MarketingCampaign
- WHERE stag.MarketingCampaign IS NOT NULL
- -- Get zAdmin RecID
- SELECT @zAdmin_Member_RecID = Member_RecID
- FROM Member
- WHERE Member_ID = 'zadmin'
- -- If running in force mode, update invalid Member_ID to 'zAdmin
- UPDATE stag
- SET stag.AssignTo_Member_RecID = @zAdmin_Member_RecID,
- stag.AssignTo_Member_ID = 'zAdmin'
- FROM #Import_Staging stag
- WHERE stag.AssignTo_Member_RecID IS NULL
- AND @ForceMode = 1
- -- Set ConvertMessage and error out if any invalid references
- UPDATE stag
- SET ConvertMessage =
- CASE
- WHEN stag.AssignTo_Member_RecID IS NULL THEN 'Invalid Assign To'
- WHEN stag.Activity_Status_RecID IS NULL THEN 'Invalid Activity Status'
- WHEN stag.Company_RecID IS NULL AND stag.Company_Name iS NOT NULL THEN 'Invalid Company Name'
- WHEN stag.Contact_RecID IS NULL AND COALESCE(stag.Company_Name, stag.ContactFirstName, stag.ContactLastName) IS NOT NULL THEN 'Invalid contact'
- WHEN stag.SO_Activity_Type_RecID IS NULL AND stag.ActivityType IS NOT NULL THEN 'Invalid activity type'
- WHEN stag.AssignBy_Member_RecID IS NULL AND stag.AssignBy IS NOT NULL THEN 'Invalid Member ID'
- WHEN stag.Marketing_Campaign_RecID IS NULL AND stag.MarketingCampaign IS NOT NULL THEN 'Invalid Marketing Campaign'
- END
- FROM #Import_Staging stag
- -- Set original start/end times to time only (handles common mistake where entire date is supplied rather than time only)
- UPDATE stag
- SET stag.StartTime = CONVERT(CHAR(5), CAST(StartTime AS DATETIME), 108),
- stag.EndTime = CONVERT(CHAR(5), CAST(EndTime AS DATETIME), 108)
- FROM #Import_Staging stag
- -- Get Start and end as datetime
- UPDATE stag
- SET stag.StartDateTime = CONVERT(NVARCHAR(25), CONVERT(DATETIME, DueDate, 102), 101) + ' ' + ISNULL(StartTime, '00:00'),
- stag.EndDateTime = CONVERT(NVARCHAR(25), CONVERT(DATETIME, DueDate, 102), 101) + ' ' + + ISNULL(EndTime, '00:00')
- FROM #Import_Staging stag
- -- If there is an invalid reference, raise error
- IF EXISTS(SELECT * FROM #Import_Staging WHERE ConvertMessage IS NOT NULL)
- BEGIN
- -- Raise error w/ 16 severity to jump to catch
- RAISERROR('Validation Error', 16, 2)
- END
- -- Error if no zAdmin user
- IF @zAdmin_Member_RecID IS NULL
- BEGIN
- RAISERROR('zAdmin user not found for this implementation - required for import', 16, 2)
- END
- ELSE
- -- Validation suceeded - begin push
- -- Get expected rowcount for insert to SO_Activity
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging
- SELECT @Max_SO_Activity_RecID = ISNULL(MAX(SO_Activity_RecID), 0) FROM SO_Activity
- UPDATE stag
- SET stag.date_time_start_utc = DATEADD(HOUR, @UTCOFFSET, StartDateTime)
- FROM #Import_Staging stag
- WHERE ISDATE(StartDateTime) = 1
- UPDATE stag
- SET stag.date_time_end_utc = DATEADD(HOUR, @UTCOFFSET, EndDateTime)
- FROM #Import_Staging stag
- WHERE ISDATE(EndDateTime) = 1
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- CREATE TABLE #Force_Compile
- (
- Column_Name VARCHAR(20)
- )
- -- Perform insert to SO_Activity
- -- Conditional based on structure to support various CW releases
- IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
- BEGIN
- INSERT INTO SO_Activity
- (
- Owner_ID,
- Assign_To,
- Assigned_By,
- Company_RecID,
- SO_Activity_Type_RecID,
- [Subject],
- Date_Entered,
- Entered_By,
- Contact_RecID,
- Contact_Name,
- --Notes,
- Close_Flag,
- Date_Closed,
- Closed_By,
- Updated_By,
- Last_Update,
- so_act_status_recid,
- Marketing_Campaign_RecID,
- assignto_recid,
- assignby_recid,
- date_time_start,
- date_time_end
- )
- OUTPUT INSERTED.Contact_Name, INSERTED.SO_Activity_RecID, 'Activity' INTO Import_Legacy_ID_Custom
- SELECT
- stag.ExcelRowNumber,
- SUBSTRING(stag.AssignTo, 1, 15),
- stag.AssignBy,
- stag.Company_RecID,
- stag.SO_Activity_Type_RecID,
- stag.[Subject],
- GETDATE(),
- @ImportBatchUser,
- stag.Contact_RecID,
- Legacy_ID,
- --stag.Notes,
- stag.Close_Flag,
- CASE WHEN stag.Close_Flag = 1 THEN GETDATE() ELSE NULL END,
- CASE WHEN stag.Close_Flag = 1 THEN 'zAdmin' ELSE NULL END,
- @ImportBatchUser,
- GETDATE(),
- stag.Activity_Status_RecID,
- stag.Marketing_Campaign_RecID,
- stag.AssignTo_Member_RecID,
- stag.AssignBy_Member_RecID,
- stag.StartDateTime,
- stag.EndDateTime
- FROM #Import_Staging stag
- OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
- END
- IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
- AND EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
- BEGIN
- INSERT INTO SO_Activity
- (
- Owner_ID,
- Assign_To,
- Assigned_By,
- Company_RecID,
- SO_Activity_Type_RecID,
- [Subject],
- Date_Entered,
- Entered_By,
- Contact_RecID,
- Contact_Name,
- --Notes,
- Close_Flag,
- Date_Closed,
- Closed_By,
- Updated_By,
- Last_Update,
- so_act_status_recid,
- Marketing_Campaign_RecID,
- assignto_recid,
- assignby_recid,
- date_time_end,
- Date_Time_Start,
- Date_Time_Start_UTC,
- Date_Time_End_UTC,
- Date_Entered_UTC,
- Last_Update_UTC,
- Date_Closed_UTC,
- Currency_RecID
- )
- OUTPUT INSERTED.Contact_Name, INSERTED.SO_Activity_RecID, 'Activity' INTO Import_Legacy_ID_Custom
- SELECT
- stag.ExcelRowNumber,
- SUBSTRING(stag.AssignTo, 1, 15),
- stag.AssignBy,
- stag.Company_RecID,
- stag.SO_Activity_Type_RecID,
- stag.[Subject],
- GETDATE(),
- @ImportBatchUser,
- stag.Contact_RecID,
- Legacy_ID,
- --stag.Notes,
- stag.Close_Flag,
- CASE WHEN stag.Close_Flag = 1 THEN GETDATE() ELSE NULL END,
- CASE WHEN stag.Close_Flag = 1 THEN 'zAdmin' ELSE NULL END,
- @ImportBatchUser,
- GETDATE(),
- stag.Activity_Status_RecID,
- stag.Marketing_Campaign_RecID,
- stag.AssignTo_Member_RecID,
- stag.AssignBy_Member_RecID,
- stag.StartDateTime,
- stag.EndDateTime,
- stag.Date_Time_Start_UTC,
- stag.Date_Time_End_UTC,
- GETUTCDATE(),
- GETUTCDATE(),
- CASE WHEN stag.Close_Flag = 1 THEN GETUTCDATE() ELSE NULL END,
- 7
- FROM #Import_Staging stag
- OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
- END
- IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
- AND NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'SO_Activity')
- BEGIN
- INSERT INTO SO_Activity
- (
- Owner_ID,
- Assign_To,
- Assigned_By,
- Company_RecID,
- SO_Activity_Type_RecID,
- [Subject],
- Date_Entered,
- Entered_By,
- Contact_RecID,
- Contact_Name,
- --Notes,
- Close_Flag,
- Date_Closed,
- Closed_By,
- Updated_By,
- Last_Update,
- so_act_status_recid,
- Marketing_Campaign_RecID,
- assignto_recid,
- assignby_recid,
- date_time_end,
- Date_Time_Start,
- Date_Time_Start_UTC,
- Date_Time_End_UTC,
- Date_Entered_UTC,
- Last_Update_UTC,
- Date_Closed_UTC
- )
- OUTPUT INSERTED.Contact_Name, INSERTED.SO_Activity_RecID, 'Activity' INTO Import_Legacy_ID_Custom
- SELECT
- stag.ExcelRowNumber,
- SUBSTRING(stag.AssignTo, 1, 15),
- stag.AssignBy,
- stag.Company_RecID,
- stag.SO_Activity_Type_RecID,
- stag.[Subject],
- GETDATE(),
- @ImportBatchUser,
- stag.Contact_RecID,
- Legacy_ID,
- --stag.Notes,
- stag.Close_Flag,
- CASE WHEN stag.Close_Flag = 1 THEN GETDATE() ELSE NULL END,
- CASE WHEN stag.Close_Flag = 1 THEN 'zAdmin' ELSE NULL END,
- @ImportBatchUser,
- GETDATE(),
- stag.Activity_Status_RecID,
- stag.Marketing_Campaign_RecID,
- stag.AssignTo_Member_RecID,
- stag.AssignBy_Member_RecID,
- stag.StartDateTime,
- stag.EndDateTime,
- stag.Date_Time_Start_UTC,
- stag.Date_Time_End_UTC,
- GETUTCDATE(),
- GETUTCDATE(),
- CASE WHEN stag.Close_Flag = 1 THEN GETUTCDATE() ELSE NULL END
- FROM #Import_Staging stag
- OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
- END
- -- Join final table back to staging to capture newly inserted identities
- UPDATE stag
- SET stag.New_Identity = soa.SO_Activity_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.SO_Activity soa
- ON soa.Owner_ID = stag.ExcelRowNumber
- AND soa.Entered_By = @ImportBatchUser
- -- Update Owner_ID in SO_Activity to 1 for newly inserted records
- UPDATE act
- SET act.Owner_ID = 1,
- act.Contact_Name = ISNULL(ct.First_Name + ' ', '') + ISNULL(ct.Last_Name, '')
- FROM SO_Activity act
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Contact cont WHERE cont.Contact_RecID = act.Contact_RecID)ct
- WHERE act.SO_Activity_RecID > @Max_SO_Activity_RecID
- AND act.Entered_By = @ImportBatchUser
- IF EXISTS(SELECT TOP 1 * FROM sys.tables WHERE [Name] = 'SO_Activity_Notes')
- BEGIN
- INSERT INTO dbo.SO_Activity_Notes
- (
- SO_Activity_RecID,
- Notes,
- Internal_Analysis_Flag,
- Date_Created_UTC,
- Entered_By,
- Last_Update_UTC,
- Updated_By
- )
- SELECT
- stag.New_Identity, --SO_Activity_RecID,
- stag.Notes, --Notes,
- 0, --Internal_Analysis_Flag,
- GETUTCDATE(), --Date_Created_UTC,
- 'Migration', --Entered_By,
- GETUTCDATE(), --Last_Update_UTC,
- 'Migration'--Updated_By
- FROM #Import_Staging stag
- WHERE stag.Notes IS NOT NULL
- END
- -- Get highest Schedule_RecID
- SELECT @MAX_Schedule_RecID = ISNULL(MAX(Schedule_RecID), 0) FROM dbo.Schedule
- -- Perform insert to Schedule table
- IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Schedule')
- BEGIN
- INSERT INTO Schedule
- (
- Owner_ID,
- RecID,
- Schedule_Type_RecID,
- Member_ID,
- Date_Time_Start,
- Date_Time_End,
- close_flag,
- Hours_Estimated,
- Schedule_Desc,
- Last_Update,
- Updated_By,
- Syncable,
- Reminder_Flag,
- Reminder_Minutes,
- All_Day_Flag,
- Duration,
- Xref_Mbr_RecID,
- Hours_Sched,
- Hours_per_Day,
- Ack_Flag,
- --DW_1_Flag,
- --DW_2_Flag,
- --DW_3_Flag,
- --DW_4_Flag,
- --DW_5_Flag,
- --DW_6_Flag,
- --DW_7_Flag,
- --IncHol_Flag,
- Billable_Flag,
- Date_Entered,
- Date_Time_Start_UTC,
- Date_Time_End_UTC,
- Date_Entered_UTC
- )
- SELECT
- stag.ExcelRowNumber,
- stag.New_Identity,
- 1, -- (always 1????)
- stag.AssignTo_Member_ID,
- stag.StartDateTime,
- stag.EndDateTime,
- stag.Close_Flag,
- 0,
- COALESCE(ISNULL(stag.ActivityType + ' / ', '') + ISNULL(stag.Company_Name, ''), stag.[Subject]),
- GETDATE(),
- @ImportBatchUser,
- 1,
- CASE WHEN stag.ReminderMinutes IS NOT NULL THEN 1 ELSE 0 END,
- ISNULL(stag.ReminderMinutes, 0),
- 0,
- 1,
- stag.AssignTo_Member_RecID,
- DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
- DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
- 0,
- --0,
- --0,
- --0,
- --0,
- --0,
- --0,
- --0,
- --0,
- 0,
- GETDATE(),
- Date_Time_Start_UTC,
- Date_Time_End_UTC,
- GETUTCDATE()
- FROM #Import_Staging stag
- OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
- END
- IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Schedule')
- BEGIN
- INSERT INTO Schedule
- (
- Owner_ID,
- RecID,
- Schedule_Type_RecID,
- Member_ID,
- Date_Time_Start,
- Date_Time_End,
- close_flag,
- Hours_Estimated,
- Schedule_Desc,
- Last_Update,
- Updated_By,
- Syncable,
- Reminder_Flag,
- Reminder_Minutes,
- All_Day_Flag,
- Duration,
- Xref_Mbr_RecID,
- Hours_Sched,
- Hours_per_Day,
- Ack_Flag,
- --DW_1_Flag,
- --DW_2_Flag,
- --DW_3_Flag,
- --DW_4_Flag,
- --DW_5_Flag,
- --DW_6_Flag,
- --DW_7_Flag,
- --IncHol_Flag,
- Billable_Flag,
- Date_Entered
- )
- SELECT
- stag.ExcelRowNumber,
- stag.New_Identity,
- 1, -- (always 1????)
- stag.AssignTo_Member_ID,
- stag.StartDateTime,
- stag.EndDateTime,
- stag.Close_Flag,
- 0,
- COALESCE(ISNULL(stag.ActivityType + ' / ', '') + ISNULL(stag.Company_Name, ''), stag.[Subject]),
- GETDATE(),
- @ImportBatchUser,
- 1,
- CASE WHEN stag.ReminderMinutes IS NOT NULL THEN 1 ELSE 0 END,
- ISNULL(stag.ReminderMinutes, 0),
- 0,
- 1,
- stag.AssignTo_Member_RecID,
- DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
- DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
- 0,
- --0,
- --0,
- --0,
- --0,
- --0,
- --0,
- --0,
- --0,
- 0,
- GETDATE()
- FROM #Import_Staging stag
- OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
- END
- -- Join back to staging table to get Schedule RecID
- UPDATE stag
- SET stag.Schedule_RecID = sched.Schedule_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Schedule sched
- ON stag.ExcelRowNumber = sched.Owner_ID
- WHERE sched.Schedule_RecID > @MAX_Schedule_RecID
- AND Updated_By = @ImportBatchUser
- -- Set Owner_ID to 1 in schedule table for newly inserted records
- UPDATE dbo.Schedule
- SET Owner_ID = 1
- WHERE Schedule_RecID > @Max_Schedule_RecID
- AND Updated_By = @ImportBatchUser
- -- Get highest Schedule_Detail_RecID
- SELECT @MAX_Schedule_Detail_RecID = ISNULL(MAX(Schedule_Detail_RecID), 0) FROM dbo.Schedule_Detail
- -- Perform schedule detail insert
- IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Schedule')
- BEGIN
- INSERT INTO Schedule_Detail
- (
- Schedule_RecID,
- Date_Scheduled,
- Hours_Scheduled,
- Start_Time,
- End_Time,
- Member_RecID,
- Schedule_Type_ID,
- RecID,
- Updated_By,
- Last_Update,
- time_flag,
- --Upd_Flag,
- Date_Time_Start_UTC,
- Date_Time_End_UTC
- )
- SELECT
- stag.Schedule_RecID,
- stag.DueDate,
- DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
- CAST('1/1/1900 ' + ISNULL(StartTime, '00:00') AS DATETIME),
- CAST('1/1/1900 ' + ISNULL(EndTime, '00:00') AS DATETIME),
- stag.AssignTo_Member_RecID,
- 'C',
- stag.New_Identity,
- @ImportBatchUser,
- GETDATE(),
- 0,
- --0,
- Date_Time_Start_UTC,
- Date_Time_End_UTC
- FROM #Import_Staging stag
- OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
- WHERE Schedule_RecID IS NOT NULL
- END
- IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Date_Time_Start_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Schedule')
- BEGIN
- INSERT INTO Schedule_Detail
- (
- Schedule_RecID,
- Date_Scheduled,
- Hours_Scheduled,
- Start_Time,
- End_Time,
- Member_RecID,
- Schedule_Type_ID,
- RecID,
- Updated_By,
- Last_Update,
- time_flag
- --Upd_Flag
- )
- SELECT
- stag.Schedule_RecID,
- stag.DueDate,
- DATEDIFF(minute, stag.StartDateTime, stag.EndDateTime) * 1.0 / 60,
- CAST('1/1/1900 ' + ISNULL(StartTime, '00:00') AS DATETIME),
- CAST('1/1/1900 ' + ISNULL(EndTime, '00:00') AS DATETIME),
- stag.AssignTo_Member_RecID,
- 'C',
- stag.New_Identity,
- @ImportBatchUser,
- GETDATE(),
- 0
- --0
- FROM #Import_Staging stag
- OUTER APPLY(SELECT 1 AS Hack FROM #Force_Compile)hack
- WHERE Schedule_RecID IS NOT NULL
- END
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- -- If debug mode and successful, select the rows that were inserted
- -- and rollback transaction
- IF @DebugMode = 1 AND @@ERROR = 0
- BEGIN
- SELECT * FROM SO_Activity WHERE SO_Activity_Recid IN(SELECT New_Identity FROM #Import_Staging)
- SELECT * FROM Schedule WHERE Schedule_RecID IN(SELECT Schedule_RecID FROM #Import_Staging)
- SELECT * FROM Schedule_Detail WHERE Schedule_RecID IN(SELECT Schedule_RecID FROM #Import_Staging)
- ROLLBACK TRANSACTION AC_Import
- END
- IF @DebugMode = 2 AND @@ERROR = 0
- BEGIN
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- ROLLBACK TRANSACTION AC_Import
- END
- EXEC usp_Import_UDF @TableName, 'Activity'
- IF @DebugMode = 0 AND @@Error = 0
- BEGIN
- -- Import successful - commit and return results
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- COMMIT TRANSACTION AC_Import
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- END
- END TRY
- BEGIN CATCH
- -- An error has occured - determine if validation error
- IF ERROR_MESSAGE() = 'Validation Error'
- BEGIN
- -- Return details of error from staging table
- SELECT
- 0 AS Success,
- stag.ExcelRowNumber,
- stag.ConvertMessage AS ErrorDetails
- FROM #Import_Staging stag
- WHERE ConvertMessage IS NOT NULL
- ROLLBACK TRANSACTION AC_Import
- END
- ELSE
- -- Not a validation error - return SQL error message encountered
- SELECT
- 0 AS Success,
- 'Unknown' AS ExcelRowNumber,
- ISNULL(ERROR_MESSAGE(), '') + ISNULL(CONVERT(NVARCHAR(20), ERROR_LINE()), '') + ISNULL(ERROR_PROCEDURE(), '') AS ErrorDetails
- -- Rollback transaction
- IF @@TRANCOUNT > 0
- ROLLBACK TRANSACTION AC_Import
- END CATCH
- GO
- ---------------------------
- -- CONFIGURATIONS
- ---------------------------
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_CFG_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_CFG_ImportValidate] AS SELECT 1')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_CFG_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_CFG_ImportPush] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 04/17/2013
- -- Description: Validates data from spreadsheet
- -- for configuration Import
- -- Sample call: exec usp_CFG_ImportValidate 'TMP_Import_bfa8df223cca47a48d7eca6ce19bfb5f', 'TMP_Questions_bfa8df223cca47a48d7eca6ce19bfb5f', 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_CFG_ImportValidate]
- @TableName VARCHAR(MAX),
- @TempQuestionsName VARCHAR(MAX),
- @Forcemode BIT = 0
- AS
- BEGIN TRY
- BEGIN TRANSACTION CFG_Validate
- SET NOCOUNT ON
- -- Set date format to MDY to validate dates from excel
- SET DATEFORMAT MDY
- -- Variable declaration
- -- Dynamic statement to insert to validation table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Fully qualified name of Questions table
- DECLARE @QuestionsTable VARCHAR(300)
- SELECT @QuestionsTable = 'tempdb.dbo.' + @TempQuestionsName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Unique value to identify records created by this import
- DECLARE @ImportBatchUser VARCHAR(15)
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Handle current & legacy templates by renaming column 'Vendor Company Name' to 'Manufacturer Company Name'
- IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Company Name')
- AND NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE Object_id = object_id(@SourceTable) AND name = 'Manufacturer Company Name')
- BEGIN
- SELECT @DSQL =
- '
- USE tempdb
- EXEC sp_rename
- @objname = ''tempdb..' + @TableName + '.[Vendor Company Name]'' ,
- @newname = ''Manufacturer Company Name'',
- @objtype = ''COLUMN''
- '
- EXEC(@DSQL)
- END
- -- Add/Re-Add [Vendor Company Name] field to avoid any compilation errors based on structure
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Company Name')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Vendor Company Name] NVARCHAR(255) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Manufacturer field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Manufacturer')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Manufacturer] NVARCHAR(255) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Config_RecID if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Configuration RecID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Configuration RecID] NVARCHAR(255) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add [Vendor Notes] field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Notes')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Vendor Notes] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Legacy_ID field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Legacy_Company_ID field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Company_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Legacy_Contact_ID field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Contact_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Legacy_Opp_ID field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Opp_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD Legacy_Opp_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Legacy_Ticket_ID field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_Ticket_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD Legacy_Ticket_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
- BEGIN
- DROP TABLE #tblResults
- END
- -- Table to hold results of procedure
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
- InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Warning_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- -- Pre-validation
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'Excel Row Number' UNION ALL
- SELECT 'Configuration Type' UNION ALL
- SELECT 'Configuration Name' UNION ALL
- SELECT 'Manufacturer Company Name' UNION ALL
- SELECT 'Serial Number' UNION ALL
- SELECT 'Model Number' UNION ALL
- SELECT 'Tag Number' UNION ALL
- SELECT 'Purchase Date' UNION ALL
- SELECT 'Installed Date' UNION ALL
- SELECT 'Installed By' UNION ALL
- SELECT 'Warranty Date' UNION ALL
- SELECT 'Configuration Status' UNION ALL
- SELECT 'Company Name' UNION ALL
- SELECT 'Contact First Name' UNION ALL
- SELECT 'Contact Last Name' UNION ALL
- SELECT 'Company Address Site Name' UNION ALL
- SELECT 'Location' UNION ALL
- SELECT 'Group' UNION ALL
- SELECT 'Configuration Notes' UNION ALL
- SELECT 'Vendor Company Name' UNION ALL
- SELECT 'Manufacturer' UNION ALL
- SELECT 'Configuration RecID' UNION ALL
- SELECT 'Vendor Notes' UNION ALL
- SELECT 'Legacy_ID' UNION ALL
- SELECT 'Legacy_Company_ID' UNION ALL
- SELECT 'Legacy_Contact_ID' UNION ALL
- SELECT 'Legacy_Site_ID' UNION ALL
- SELECT 'Legacy_Opp_ID' UNION ALL
- SELECT 'Legacy_Ticket_ID'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- UNION ALL
- -- Check that there are no extra invalid columns (i.e. a 'Question' column that wasn't proceeded by 'Q:'
- SELECT
- 0,
- 'Invalid column: "' + sc.ColumnName + '". Question columns must begin with "Q:"'
- FROM @SourceColumns sc
- EXCEPT
- SELECT
- 0,
- 'Invalid column: "' + rc.ColumnName + '". Question columns must begin with "Q:"'
- FROM @RequiredColumns rc
- -- If any column related errors, stop here and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 0 AS ValPassed,
- RowNumber,
- ValMsg
- FROM #tblResults
- ORDER BY RowNumber, ValMsg
- ROLLBACK TRANSACTION
- RETURN
- END
- -- Capture question source into temp table
- IF (OBJECT_ID('tempdb..#QuestionSource')) IS NOT NULL
- BEGIN
- DROP TABLE #QuestionSource
- END
- CREATE TABLE #QuestionSource
- (
- ExcelRowNumber INT,
- Question NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Answer NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- SELECT @DSQL =
- '
- INSERT INTO #QuestionSource
- (
- ExcelRowNumber,
- Question,
- Answer
- )
- SELECT
- src.[Excel Row Number],
- src.[Question],
- src.[Answer]
- FROM ' + @QuestionsTable + ' src'
- EXEC (@DSQL)
- -- Table to hold questions for validation
- IF (OBJECT_ID('tempdb..#Questions')) IS NOT NULL
- BEGIN
- DROP TABLE #Questions
- END
- CREATE TABLE #Questions
- (
- ExcelRowNumber INT,
- Question VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Answer VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ConfigType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- CS_Survey_RecID INT,
- CS_Survey_Detail_RecID INT,
- SF_Field_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT,
- SF_Entry_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT,
- HasValueList BIT,
- IsRequired BIT,
- Decimals_Flag BIT,
- Max_Decimals INT,
- Num_Decimals INT,
- Action_Type NVARCHAR(10) COLLATE DATABASE_DEFAULT,
- Seq_Nbr DECIMAL(8,2)
- )
- -- Table to hold error columns (i.e. Question column w/ no corresponding answer column
- DECLARE @tblErrorColumns TABLE
- (
- ExcelRowNumber INT,
- ColumnName NVARCHAR(1000),
- ColumnType VARCHAR(1)
- )
- -- Table to hold source data for this batch from temp table
- IF (OBJECT_ID('#Import_Staging')) IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber int NULL,
- ConfigType nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- CS_Survey_RecID INT,
- ConfigName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ManufacturerCompanyName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Manufacturer nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Manufacturer_RecID INT NULL,
- SerialNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ModelNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- TagNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- InstalledBy nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- WarrantyDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ConfigStatus nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactFirstName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactLastName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- CompanyAddressSiteName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Location nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Group] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ConfigNotes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- PurchaseDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- InstalledDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Questions nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- QuestionErrorList VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- HasInvalidColumnID BIT NULL,
- Company_RecID INT NULL,
- Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_RecID INT NULL,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
- ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- [Configuration RecID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ConfigType_Old NVARCHAR(50) COLLATE DATABASE_DEFAULT,
- Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
- Duplicate_Flag BIT,
- Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Diff_Exclude_Flag BIT,
- Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Company_Address_RecID INT,
- Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- SR_Service_RecID INT,
- Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- SO_Opportunity_RecID INT
- )
- -- Build insert to populate validation table
- SET @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- ConfigType,
- ConfigName,
- ManufacturerCompanyName,
- Manufacturer,
- SerialNumber,
- ModelNumber,
- TagNumber,
- InstalledBy,
- WarrantyDate,
- ConfigStatus,
- Company_Name,
- ContactFirstName,
- ContactLastName,
- CompanyAddressSiteName,
- Location,
- [Group],
- ConfigNotes,
- PurchaseDate,
- InstalledDate,
- [Configuration RecID],
- Company_Match_Val
- )
- SELECT
- [Excel Row Number],
- [Configuration Type],
- [Configuration Name],
- [Manufacturer Company Name],
- [Manufacturer],
- [Serial Number],
- [Model Number],
- [Tag Number],
- [Installed By],
- [Warranty Date],
- [Configuration Status],
- [Company Name],
- [Contact First Name],
- [Contact Last Name],
- [Company Address Site Name],
- [Location],
- [Group],
- [Configuration Notes],
- [Purchase Date],
- [Installed Date],
- [Configuration RecID],
- LEFT([Company Name], 3)
- FROM ' + @SourceTable
- -- Pull data into validation table
- EXEC(@DSQL)
- -- Convert empty string and single space to null for all values in validation table
- UPDATE #Import_Staging SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- ConfigType = CASE WHEN ConfigType IN('', ' ') THEN NULL ELSE ConfigType END,
- ConfigName = CASE WHEN ConfigName IN('', ' ') THEN NULL ELSE ConfigName END,
- Manufacturer = CASE WHEN Manufacturer IN('', ' ') THEN NULL ELSE Manufacturer END,
- ManufacturerCompanyName = CASE WHEN ManufacturerCompanyName IN('', ' ') THEN NULL ELSE ManufacturerCompanyName END,
- SerialNumber = CASE WHEN SerialNumber IN('', ' ') THEN NULL ELSE SerialNumber END,
- ModelNumber = CASE WHEN ModelNumber IN('', ' ') THEN NULL ELSE ModelNumber END,
- TagNumber = CASE WHEN TagNumber IN('', ' ') THEN NULL ELSE TagNumber END,
- InstalledBy = CASE WHEN InstalledBy IN('', ' ') THEN NULL ELSE InstalledBy END,
- WarrantyDate = CASE WHEN WarrantyDate IN('', ' ') THEN NULL ELSE WarrantyDate END,
- ConfigStatus = CASE WHEN ConfigStatus IN('', ' ') THEN NULL ELSE ConfigStatus END,
- Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
- ContactFirstName = CASE WHEN ContactFirstName IN('', ' ') THEN NULL ELSE ContactFirstName END,
- ContactLastName = CASE WHEN ContactLastName IN('', ' ') THEN NULL ELSE ContactLastName END,
- CompanyAddressSiteName = CASE WHEN CompanyAddressSiteName IN('', ' ') THEN NULL ELSE CompanyAddressSiteName END,
- Location = CASE WHEN Location IN('', ' ') THEN NULL ELSE Location END,
- [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
- ConfigNotes = CASE WHEN ConfigNotes IN('', ' ') THEN NULL ELSE ConfigNotes END,
- PurchaseDate = CASE WHEN PurchaseDate IN('', ' ') THEN NULL ELSE PurchaseDate END,
- InstalledDate = CASE WHEN InstalledDate IN('', ' ') THEN NULL ELSE InstalledDate END,
- [Configuration RecID] = CASE WHEN [Configuration RecID] IN('', ' ') THEN NULL ELSE [Configuration RecID] END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_ID = src.Legacy_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Condense contact first and last names to ContactName
- UPDATE tmp
- SET ContactName = LTRIM(ISNULL(tmp.ContactFirstName + ' ', '')) + ISNULL(tmp.ContactLastName, '')
- FROM #Import_Staging tmp
- -- Get RecID for Config Type
- UPDATE tmp
- SET tmp.CS_Survey_RecID = csc.CS_Survey_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.CS_Survey csc
- ON tmp.ConfigType = csc.Survey_Name
- -- Remove datatype row created by export
- DELETE FROM #Import_Staging WHERE Company_Name = 'CW_Import_Config_Row'
- -- Force config types if necessary
- IF @Forcemode = 1 AND EXISTS(SELECT TOP 1 * FROM #Import_Staging tmp WHERE CS_Survey_RecID IS NULL)
- BEGIN
- INSERT INTO dbo.CS_Survey
- (
- Owner_ID,
- Survey_Name,
- Instructions,
- Inactive_Flag,
- Last_Update,
- Updated_By,
- Survey_Flag,
- System_Flag
- )
- SELECT DISTINCT
- 1,
- tmp.ConfigType,
- 'Created by import utility on ' + CONVERT(VARCHAR, GETDATE(), 101),
- 0,
- GETDATE(),
- @ImportBatchUser,
- 0,
- 0
- FROM #Import_Staging tmp
- WHERE tmp.CS_Survey_RecID IS NULL
- AND tmp.ConfigType IS NOT NULL
- -- Capture RecIDs for newly inserted config types
- UPDATE tmp
- SET tmp.CS_Survey_RecID = css.CS_Survey_RecID
- FROM #Import_Staging tmp
- INNER JOIN CS_Survey css
- ON css.Survey_Name = tmp.ConfigType
- AND tmp.CS_Survey_RecID IS NULL
- AND css.Updated_By = @ImportBatchUser
- END
- -- Prepare custom question records for each spreadsheet row
- INSERT INTO #Questions
- (
- ExcelRowNumber,
- ConfigType,
- Question,
- CS_Survey_RecID,
- CS_Survey_Detail_RecID,
- SF_Field_Type_ID,
- SF_Entry_Type_ID,
- IsRequired,
- Max_Decimals,
- Decimals_Flag,
- Answer,
- HasValueList
- )
- SELECT
- ISNULL(stag.ExcelRowNumber, qs.[ExcelRowNumber]),
- ct.ConfigType,
- ISNULL(qs.Question, csd.Question),
- ct.CS_Survey_RecID,
- csd.CS_Survey_Detail_RecID,
- csd.SF_Field_Type_ID,
- csd.SF_Entry_Type_ID,
- CASE WHEN csd.Required_Flag = 1 THEN 1 ELSE 0 END,
- csd.Nbr_Decimals,
- CASE WHEN csd.SF_Entry_Type_ID IN('L', 'O') THEN 1 ELSE 0 END,
- LEFT(ISNULL(qs.Answer, csv.CS_Survey_Value), 1000),
- CASE WHEN csv.CS_Survey_Value IS NOT NULL THEN 1 ELSE 0 END
- FROM CS_Survey_Detail csd
- INNER JOIN CS_Survey css
- ON css.CS_Survey_RecID = csd.CS_Survey_RecID
- AND csd.Inactive_Flag = 0
- INNER JOIN #Import_Staging stag
- ON stag.CS_Survey_RecID = css.CS_Survey_RecID
- FULL OUTER JOIN #QuestionSource qs
- ON qs.Question = csd.Question
- AND qs.ExcelRowNumber = stag.ExcelRowNumber
- OUTER APPLY
- (
- SELECT TOP 1 csv.CS_Survey_Value
- FROM CS_Survey_Value csv
- WHERE csv.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID
- AND csv.Default_Flag = 1
- ) csv
- CROSS APPLY(SELECT TOP 1 ConfigType, CS_Survey_RecID FROM #Import_Staging stag WHERE stag.ExcelRowNumber = qs.ExcelRowNumber) ct
- --LEFT OUTER JOIN CS_Survey_Value csv
- -- ON csv.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID
- -- AND csv.Default_Flag = 1
- --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
- --ON csv.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID
- -- Pull over config type for questions that didnt match
- --UPDATE qu
- -- SET qu.ConfigType = stag.ConfigType,
- -- qu.CS_Survey_RecID = stag.CS_Survey_RecID
- --FROM #Questions qu
- -- CROSS APPLY(SELECT TOP 1 ConfigType, CS_Survey_RecID FROM #Import_Staging stag WHERE stag.ExcelRowNumber = qu.ExcelRowNumber) stag
- -- Update blank string answers to null
- UPDATE qu
- SET qu.Answer = NULL
- FROM #Questions qu
- WHERE qu.Answer = ''
- ---- Get decimal flag
- --UPDATE qu
- -- SET qu.Decimals_Flag = 1
- --FROM #Questions qu
- --WHERE qu.SF_Field_Type_ID IN(SELECT SF_Field_Type_ID FROM SF_Field_Type WHERE Decimals_Flag = 1)
- -- Get number of decimals for decimal fields
- UPDATE qu
- SET Num_Decimals = LEN(PARSENAME(qu.Answer, 1))
- FROM #Questions qu
- WHERE qu.Answer IS NOT NULL
- AND qu.Decimals_Flag = 1
- AND qu.Answer LIKE('%.%')
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- -- Convert decimal fields to proper number of decimals based on question type
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,0), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 0
- AND qu.Num_Decimals > qu.Max_Decimals
- AND HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,1), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 1
- AND qu.Num_Decimals > qu.Max_Decimals
- AND HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,2), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 2
- AND qu.Num_Decimals > qu.Max_Decimals
- AND HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,3), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 3
- AND qu.Num_Decimals > qu.Max_Decimals
- AND HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,4), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 4
- AND qu.Num_Decimals > qu.Max_Decimals
- AND HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,5), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 5
- AND qu.Num_Decimals > qu.Max_Decimals
- AND HasValueList = 0
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT DISTINCT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE Delete_Flag = 0
- AND (LEFT(Company_Name, 3) IN(SELECT Company_Match_Val FROM #Import_Staging)
- OR Company_Name IN(SELECT ManufacturerCompanyName FROM #Import_Staging)
- OR Company_RecID = (SELECT TOP 1 Company_RecID FROM dbo.Owner)
- )
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- CROSS APPLY (SELECT DISTINCT Company_Name FROM #Company comp WHERE comp.Company_RecID = cont.Company_RecID) comp
- --INNER JOIN #Company comp
- --ON comp.Company_RecID = cont.Company_RecID
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_ID = src.Legacy_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Configuration'
- END
- IF @Legacy_Flag = 0
- BEGIN
- -- Match companies and contacts
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- END
- --Format dates as mm/dd/yyyy
- UPDATE tmp
- SET InstalledDate = CONVERT(VARCHAR, CAST(InstalledDate AS DATETIME), 101)
- FROM #Import_Staging tmp
- WHERE ISDATE(InstalledDate) = 1
- UPDATE tmp
- SET WarrantyDate = CONVERT(VARCHAR, CAST(WarrantyDate AS DATETIME), 101)
- FROM #Import_Staging tmp
- WHERE ISDATE(WarrantyDate) = 1
- UPDATE tmp
- SET PurchaseDate = CONVERT(VARCHAR, CAST(PurchaseDate AS DATETIME), 101)
- FROM #Import_Staging tmp
- WHERE ISDATE(PurchaseDate) = 1
- -- Update Date fields to NULL if 1900-01-01
- UPDATE #Import_Staging
- SET InstalledDate = NULL
- WHERE InstalledDate = '01/01/1900'
- UPDATE #Import_Staging
- SET WarrantyDate = NULL
- WHERE WarrantyDate = '01/01/1900'
- UPDATE #Import_Staging
- SET PurchaseDate = NULL
- WHERE PurchaseDate = '01/01/1900'
- -- Clean up export config row (used for SSIS to manage column datatypes)
- DELETE FROM #Import_Staging
- WHERE Company_Name = 'CW_IMPORT_CONFIG_ROW'
- -- Strip non-numeric characters from IP addresses so that SQL error does not occur when validating that numbers are < 256
- -- Force validation error by setting to 256
- UPDATE qu
- SET qu.Answer = '256.256.256.256'
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'I'
- AND ISNUMERIC(REPLACE(Answer, '.', '')) = 0
- AND Answer IS NOT NULL
- -- Get RecID for Manufacturer
- UPDATE tmp
- SET tmp.Manufacturer_RecID = mfg.Manufacturer_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Manufacturer mfg
- ON mfg.Manufacturer_Name = tmp.Manufacturer
- -- If @ForceMode = 1, create references as needed
- IF(@Forcemode = 1)
- BEGIN
- INSERT INTO dbo.CS_Survey_Detail
- (
- CS_Survey_RecID,
- Seq_Nbr,
- Question,
- SF_Field_Type_ID,
- Nbr_Decimals,
- SF_Entry_Type_ID,
- Required_Flag,
- Inactive_Flag,
- Last_Update,
- Updated_By
- )
- SELECT
- qu.CS_Survey_RecID,
- 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,
- qu.Question,
- CASE WHEN MAX(LEN(qu.Answer)) > 100 THEN 'A' ELSE 'T' END AS SF_Field_Type_ID,
- 0 AS Nbr_Decimals,
- 'E' AS SF_Entry_Type_ID,
- 0 AS Required_Flag,
- 0 AS Inactive_Flag,
- GETDATE() AS Last_Update,
- @ImportBatchUser AS Updated_By
- FROM #Questions qu
- CROSS APPLY(SELECT MAX(Seq_Nbr) AS Seq_Nbr FROM CS_Survey_Detail csd WHERE csd.CS_Survey_RecID = qu.CS_Survey_RecID) csd
- WHERE qu.CS_Survey_Detail_RecID IS NULL
- AND qu.CS_Survey_RecID IS NOT NULL
- AND qu.Answer IS NOT NULL
- GROUP BY CS_Survey_RecID, Question
- -- Update #Questions with appropriate information for newly inserted questions
- UPDATE qu
- SET qu.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID,
- qu.SF_Field_Type_ID = csd.SF_Field_Type_ID,
- qu.SF_Entry_Type_ID = 'E',
- qu.Max_Decimals = 0
- FROM #Questions qu
- 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
- WHERE qu.CS_Survey_Detail_RecID IS NULL
- -- Vendor company
- IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
- BEGIN
- INSERT INTO dbo.Company
- (
- Company_ID,
- Company_Name,
- Updated_By,
- Company_Type_RecID,
- Company_Status_RecID,
- Delete_Flag,
- Entered_by,
- Options_Last_Update_UTC,
- Options_Updated_by
- )
- SELECT DISTINCT
- 'M-' + LEFT(ManufacturerCompanyName, 48),
- SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
- @ImportBatchUser,
- ctype.Company_Type_RecID,
- cstat.Company_Status_RecID,
- 0,
- @ImportBatchUser,
- GETUTCDATE(),
- 'zAdmin'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN #Company comp
- ON comp.Company_Name = tmp.ManufacturerCompanyName
- INNER JOIN Company_Type ctype
- ON ctype.[Description] = 'Vendor'
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
- WHERE tmp.ManufacturerCompanyName IS NOT NULL
- AND comp.Company_RecID IS NULL
- END
- IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company')
- AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(OBJECT_ID) = 'Company')
- BEGIN
- INSERT INTO dbo.Company
- (
- Company_ID,
- Company_Name,
- Updated_By,
- Company_Type_RecID,
- Company_Status_RecID,
- Delete_Flag,
- Entered_by
- )
- SELECT DISTINCT
- 'M-' + LEFT(ManufacturerCompanyName, 48),
- SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
- @ImportBatchUser,
- ctype.Company_Type_RecID,
- cstat.Company_Status_RecID,
- 0,
- @ImportBatchUser
- FROM #Import_Staging tmp
- LEFT OUTER JOIN #Company comp
- ON comp.Company_Name = tmp.ManufacturerCompanyName
- INNER JOIN Company_Type ctype
- ON ctype.[Description] = 'Vendor'
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
- WHERE tmp.ManufacturerCompanyName IS NOT NULL
- AND comp.Company_RecID IS NULL
- END
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company')
- AND NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
- BEGIN
- INSERT INTO dbo.Company
- (
- Company_ID,
- Company_Name,
- Updated_By,
- Company_Type_RecID,
- Company_Status_RecID,
- Delete_Flag
- )
- SELECT DISTINCT
- 'M-' + LEFT(ManufacturerCompanyName, 48),
- SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
- @ImportBatchUser,
- ctype.Company_Type_RecID,
- cstat.Company_Status_RecID,
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN #Company comp
- ON comp.Company_Name = tmp.ManufacturerCompanyName
- INNER JOIN Company_Type ctype
- ON ctype.[Description] = 'Vendor'
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
- WHERE tmp.ManufacturerCompanyName IS NOT NULL
- AND comp.Company_RecID IS NULL
- END
- -- If more than one company inserted with same name, raise error
- -- This would be due to 2 or more types named 'Vendor' or 2 or more statuses set to Import_Flag = 1
- IF EXISTS(SELECT Company_Name FROM dbo.Company WHERE Updated_By = @ImportBatchUser GROUP BY Company_Name HAVING COUNT(*) > 1)
- BEGIN
- RAISERROR('More than one company reference created - check company types and statuses.', 16, 1)
- END
- ---- Insert a 'Main' site record for any manufacturer company created
- --IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
- --BEGIN
- -- INSERT INTO dbo.Company_Address
- -- (
- -- Owner_ID,
- -- Company_RecID,
- -- Zip, -- Place a dot in zip code because at least one address field must be filled out per PSA validation
- -- Default_Flag,
- -- Updated_By,
- -- [Description],
- -- Entered_By
- -- )
- -- SELECT DISTINCT
- -- 1,
- -- Company_RecID,
- -- '.',
- -- 1,
- -- @ImportBatchUser,
- -- 'Main',
- -- @ImportBatchUser
- -- FROM dbo.Company comp
- -- WHERE Updated_By = @ImportBatchUser
- -- -- Hack to suppress structural errors
- -- AND NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE 1=2)
- -- AND NOT EXISTS(SELECT 1 FROM dbo.Company_Address cad WHERE cad.Company_RecID = comp.Company_RecID)
- -- DELETE cad
- -- FROM Company_Address cad
- -- WHERE Updated_By = @ImportBatchUser
- -- AND cad.Zip = '.'
- -- AND EXISTS(SELECT 1 FROM Company_Address cad2 WHERE cad2.Company_RecID = cad.Company_RecID AND cad2.Company_Address_RecID < cad.Company_Address_RecID)
- --END
- --IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
- --BEGIN
- -- INSERT INTO dbo.Company_Address
- -- (
- -- Owner_ID,
- -- Company_RecID,
- -- Zip, -- Place a dot in zip code because at least one address field must be filled out per PSA validation
- -- Default_Flag,
- -- Updated_By,
- -- [Description]
- -- )
- -- SELECT DISTINCT
- -- 1,
- -- Company_RecID,
- -- '.',
- -- 1,
- -- @ImportBatchUser,
- -- 'Main'
- -- FROM dbo.Company comp
- -- WHERE Updated_By = @ImportBatchUser
- -- AND NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE 1=2)
- -- AND NOT EXISTS(SELECT 1 FROM dbo.Company_Address cad WHERE cad.Company_RecID = comp.Company_RecID)
- -- DELETE cad
- -- FROM Company_Address cad
- -- WHERE Updated_By = @ImportBatchUser
- -- AND cad.Zip = '.'
- -- AND EXISTS(SELECT 1 FROM Company_Address cad2 WHERE cad2.Company_RecID = cad.Company_RecID AND cad2.Company_Address_RecID < cad.Company_Address_RecID)
- --END
- -- Insert newly created companies to #Company
- INSERT INTO #Company
- (
- Company_RecID,
- Company_ID,
- Company_Name,
- Delete_Flag,
- Duplicate_Flag
- )
- SELECT
- Company_RecID,
- Company_ID,
- Company_Name,
- Delete_Flag,
- 0
- FROM dbo.Company
- WHERE Updated_By = @ImportBatchUser
- -- Configuration Status
- INSERT INTO dbo.Config_Status
- (
- [Description],
- Closed_Flag,
- Updated_By,
- Default_Flag
- )
- SELECT DISTINCT
- tmp.ConfigStatus,
- 0,
- @ImportBatchUser,
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Config_Status cfs
- ON LTRIM(RTRIM(cfs.[Description])) = tmp.ConfigStatus
- WHERE tmp.ConfigStatus IS NOT NULL
- AND cfs.Config_Status_RecID IS NULL
- -- Update invalid 'Installed By' members to 'zAdmin'
- UPDATE tmp
- SET tmp.InstalledBy = 'zAdmin'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON LTRIM(RTRIM(mem.Member_ID)) = tmp.InstalledBy
- WHERE tmp.InstalledBy IS NOT NULL
- AND mem.Member_RecID IS NULL
- -- Truncate model numbers > 50 characters
- UPDATE tmp
- SET tmp.ModelNumber = SUBSTRING(tmp.ModelNumber, 1, 50)
- FROM #Import_Staging tmp
- -- Insert manufacturer if missing
- INSERT INTO dbo.Manufacturer
- (
- Manufacturer_Name,
- Inactive_Flag,
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- Manufacturer,
- 0,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging
- WHERE Manufacturer IS NOT NULL
- AND Manufacturer_RecID IS NULL
- -- Update manufacturer RecID in source table so that validation passes
- UPDATE tmp
- SET tmp.Manufacturer_RecID = mfg.Manufacturer_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Manufacturer mfg
- ON mfg.Manufacturer_Name = tmp.Manufacturer
- END
- -- If configurations are being updated, get old config type
- UPDATE tmp
- SET tmp.ConfigType_OLD = css.Survey_Name
- FROM #Import_Staging tmp
- INNER JOIN dbo.Config conf
- ON conf.Config_RecID = tmp.[Configuration RecID]
- INNER JOIN dbo.CS_Survey css
- ON css.CS_Survey_RecID = conf.CS_Survey_RecID
- -- Begin validations
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Configuration Type must be valid
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Configuration type: "' + tmp.ConfigType + '"'
- FROM #Import_Staging tmp
- WHERE tmp.CS_Survey_RecID IS NULL
- UNION ALL
- -- No/blank column name for question or answer column
- SELECT TOP 1
- tmp.ExcelRowNumber,
- 'Question/Answer column names cannot be blank'
- FROM #Import_Staging tmp
- WHERE HasInvalidColumnID = 1
- UNION ALL
- -- Questions must be assigned to config type
- SELECT
- qu.ExcelRowNumber,
- 'Question: "' + qu.Question + '" is not assigned to Configuration Type "' + qu.ConfigType + '" - answer must be blank.'
- FROM #Questions qu
- WHERE qu.Answer IS NOT NULL
- AND qu.CS_Survey_RecID IS NOT NULL
- AND qu.CS_Survey_Detail_RecID IS NULL
- UNION ALL
- -- Validate that answers are valid for the type
- -- Text area cannot exceed 1000 characters
- SELECT
- qu.ExcelRowNumber,
- 'The answer for question: "' + qu.Question + '" cannot exceed 1000 characters.'
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'A'
- AND LEN(qu.Answer) > 1000
- AND qu.Answer IS NOT NULL
- UNION ALL
- -- Currency field must be numeric
- SELECT
- qu.ExcelRowNumber,
- 'The answer for question: "' + qu.Question + '" must be numeric.'
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'C'
- AND ISNUMERIC(qu.Answer) <> 1
- AND qu.Answer IS NOT NULL
- UNION ALL
- -- Date field must be a valid date
- SELECT
- qu.ExcelRowNumber,
- 'The answer for question "' + qu.Question + '" must be a valid date.'
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'D'
- AND ISDATE(qu.Answer) <> 1
- AND qu.Answer IS NOT NULL
- UNION ALL
- -- IP address field must contain valid IP address
- SELECT
- qu.ExcelRowNumber,
- 'The answer to question "' + qu.Question + '" must be a valid IP address.'
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'I'
- AND qu.Answer IS NOT NULL
- AND
- (
- ISNULL(PARSENAME(qu.Answer, 1), 999) NOT BETWEEN 0 AND 255
- OR ISNULL(PARSENAME(qu.Answer, 2), 999) NOT BETWEEN 0 AND 255
- OR ISNULL(PARSENAME(qu.Answer, 3), 999) NOT BETWEEN 0 AND 255
- OR ISNULL(PARSENAME(qu.Answer, 4), 999) NOT BETWEEN 0 AND 255
- )
- UNION ALL
- -- Checkbox field must evaluate to 0, 1, True, or False
- SELECT
- qu.ExcelRowNumber,
- 'The answer to question: "' + qu.Question + '" must be True or False.'
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'K'
- AND qu.Answer IS NOT NULL
- AND qu.Answer NOT IN('True', 'False', '0', '1', 'Y', 'N', 'T', 'F', 'Yes', 'No')
- UNION ALL
- -- Number field must be numeric
- SELECT
- qu.ExcelRowNumber,
- 'The answer to question: "' + qu.Question + '" must be numeric.'
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'N'
- AND qu.Answer IS NOT NULL
- AND ISNUMERIC(qu.Answer) = 0
- UNION ALL
- -- Percent field must be numeric and < 100
- SELECT
- qu.ExcelRowNumber,
- 'Question: "' + qu.Question + '" must be answered with a valid percentage'
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'P'
- AND ISNUMERIC(REPLACE(qu.Answer, '%', '')) <> 1
- AND qu.Answer IS NOT NULL
- UNION ALL
- -- Text field must not exceed 100 characters
- SELECT
- qu.ExcelRowNumber,
- 'The answer for Question: "' + qu.Question + '" cannot exceed 100 characters'
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'T'
- AND LEN(qu.Answer) > 100
- AND qu.Answer IS NOT NULL
- UNION ALL
- -- If question has a value list, check that answer is valid
- SELECT
- qu.ExcelRowNumber,
- 'The Answer: "' + qu.Answer + '" is not valid for Question: "' + qu.Question + '"'
- FROM #Questions qu
- LEFT OUTER JOIN CS_Survey_Value csv
- ON qu.Answer = LTRIM(RTRIM(csv.CS_Survey_Value))
- AND qu.CS_Survey_Detail_RecID = csv.CS_Survey_Detail_RecID
- WHERE qu.HasValueList = 1
- AND csv.CS_Survey_Detail_RecID IS NULL
- AND qu.Answer IS NOT NULL
- UNION ALL
- -- If question requires an answer, check that one is provided
- SELECT
- qu.ExcelRowNumber,
- 'The configuration type: "' + qu.ConfigType + '" requires an answer for the question: "' + qu.Question + '"'
- FROM #Questions qu
- WHERE qu.IsRequired = 1
- AND qu.Answer IS NULL
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Configuration Type is required
- SELECT
- tmp.ExcelRowNumber,
- 'Configuration type is required'
- FROM #Import_Staging tmp
- WHERE tmp.ConfigType IS NULL
- UNION ALL
- -- Configuration Type must be valid
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Configuration type: "' + tmp.ConfigType + '"'
- FROM #Import_Staging tmp
- WHERE tmp.CS_Survey_RecID IS NULL
- AND tmp.ConfigType IS NOT NULL
- UNION ALL
- -- Configuration name is required
- SELECT
- tmp.ExcelRowNumber,
- 'Configuration name is required'
- FROM #Import_Staging tmp
- WHERE tmp.ConfigName IS NULL
- UNION ALL
- -- Configuration name cannot exceed 100 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Configuration name cannot exceed 100 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.ConfigName) > 100
- AND tmp.ConfigName IS NOT NULL
- UNION ALL
- -- If specified, Vendor must be a company in CW
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Vendor: "' + tmp.ManufacturerCompanyName + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN #Company comp
- ON comp.Company_Name = tmp.ManufacturerCompanyName
- WHERE tmp.ManufacturerCompanyName IS NOT NULL
- AND comp.Company_RecID IS NULL
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid manufacturer: "' + tmp.Manufacturer + '"'
- FROM #Import_Staging tmp
- WHERE Manufacturer IS NOT NULL
- AND Manufacturer_RecID IS NULL
- UNION ALL
- -- Check for duplicate manufacturer company
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid manufacturer - There are more than 1 companies named "' + MIN(tmp.ManufacturerCompanyName) + '"'
- FROM #Import_Staging tmp
- INNER JOIN #Company comp
- ON comp.Company_Name = tmp.ManufacturerCompanyName
- WHERE tmp.ManufacturerCompanyName IS NOT NULL
- AND @Legacy_Flag = 0
- GROUP BY comp.Company_Name, ExcelRowNumber
- HAVING COUNT(*) > 1
- UNION ALL
- -- Serial number cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Serial number cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.SerialNumber) > 50
- AND tmp.SerialNumber IS NOT NULL
- UNION ALL
- -- Model number cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Model number cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.ModelNumber) > 50
- AND tmp.ModelNumber IS NOT NULL
- UNION ALL
- -- Tag number cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Tag number cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.TagNumber) > 50
- AND tmp.TagNumber IS NOT NULL
- UNION ALL
- -- Purchase date must be a valid date in mm/dd/yyyy format if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Purchase date must be a valid date - Please use MM/DD/YYYY format' + tmp.PurchaseDate
- FROM #Import_Staging tmp
- WHERE (ISDATE(tmp.PurchaseDate) = 0 OR tmp.PurchaseDate NOT LIKE '%/%/%')
- AND tmp.PurchaseDate IS NOT NULL
- UNION ALL
- -- Installed date must be a valid date in mm/dd/yyyy format if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Installed date must be a valid date - Please use MM/DD/YYYY format ' + tmp.InstalledDate
- FROM #Import_Staging tmp
- WHERE (ISDATE(tmp.InstalledDate) = 0 OR tmp.InstalledDate NOT LIKE '%/%/%')
- AND tmp.InstalledDate IS NOT NULL
- UNION ALL
- -- Installed by must be a valid member_id
- SELECT
- tmp.ExcelRowNumber,
- 'Installed by member not found: "' + tmp.InstalledBy + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON mem.Member_ID = tmp.InstalledBy
- OR tmp.InstalledBy = ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, '') WHERE tmp.InstalledBy IS NOT NULL
- AND mem.Member_RecID IS NULL
- UNION ALL
- -- Warranty date must be a valid date in mm/dd/yyyy format if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Warranty date must be a valid date - Please use MM/DD/YYYY format ' + tmp.WarrantyDate
- FROM #Import_Staging tmp
- WHERE (ISDATE(tmp.WarrantyDate) = 0 OR tmp.WarrantyDate NOT LIKE '%/%/%')
- AND tmp.WarrantyDate IS NOT NULL
- UNION ALL
- -- Configuration status must be valid if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid configuration status: "' + tmp.ConfigStatus + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Config_Status cfs
- ON dbo.ufn_Import_Trim(cfs.[Description]) = tmp.ConfigStatus
- WHERE tmp.ConfigStatus IS NOT NULL
- AND cfs.Config_Status_RecID IS NULL
- UNION ALL
- -- If Configuration status not specified, a default must exist
- SELECT
- tmp.ExcelRowNumber,
- 'Configuration status is required if no default status exists'
- FROM #Import_Staging tmp
- WHERE tmp.ConfigStatus IS NULL
- AND NOT EXISTS(SELECT TOP 1 * FROM Config_Status WHERE Default_Flag = 1)
- UNION ALL
- -- Company Name is Required
- SELECT
- tmp.ExcelRowNumber,
- 'Company Name is required'
- FROM #Import_Staging tmp
- WHERE tmp.Company_Name IS NULL
- AND tmp.Legacy_Company_ID IS NULL
- UNION ALL
- -- Check that company names are valid
- SELECT
- tmp.ExcelRowNumber,
- 'Company not found: "' + ISNULL(tmp.Company_Name, '') + '"'
- FROM #Import_Staging tmp
- WHERE Company_Name IS NOT NULL
- AND Company_RecID IS NULL
- UNION ALL
- -- Check for more than one company with the same name
- SELECT
- tmp.ExcelRowNumber,
- 'There are more than one companies named "' + ISNULL(Company_Name, '') + '" - company name must be unique'
- FROM #Import_Staging tmp
- WHERE Company_Duplicate_Flag = 1
- UNION ALL
- -- Check that contact is valid
- SELECT
- tmp.ExcelRowNumber,
- 'Unable to locate contact: "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '') + '"'
- FROM #Import_Staging tmp
- WHERE Contact_RecID IS NULL
- AND tmp.ContactName IS NOT NULL
- AND tmp.Company_Duplicate_Flag = 0
- AND tmp.Company_RecID IS NOT NULL
- UNION ALL
- -- Check for duplicate contacts within company
- SELECT
- tmp.ExcelRowNumber,
- 'There are more than one contacts named "' + ISNULL(tmp.ContactName, '') + '" for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Contact_Duplicate_Flag = 1
- AND tmp.Company_Duplicate_Flag = 0
- UNION ALL
- -- Check that a default contact for company exists if contact is null
- SELECT
- tmp.ExcelRowNumber,
- 'Contact must be specified for company: "' + ISNULL(tmp.Company_Name, '') + '" because no default contact exists for this company'
- FROM #Import_Staging tmp
- WHERE tmp.Contact_RecID IS NULL
- AND tmp.ContactName IS NULL
- AND tmp.Company_Name IS NOT NULL
- AND tmp.Company_RecID IS NOT NULL
- AND tmp.Company_Duplicate_Flag = 0
- UNION ALL
- -- Company site name must be valid if specified
- -- Also join if it matches on Address_Line1 (common mistake by partner)
- SELECT
- tmp.ExcelRowNumber,
- 'Company Address Site Name: "' + tmp.CompanyAddressSiteName + '" is invalid for company "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Company_Address cadd
- ON cadd.Company_RecID = tmp.Company_RecID
- AND (cadd.[Description] = tmp.CompanyAddressSiteName OR cadd.Address_Line1 = tmp.CompanyAddressSiteName)
- WHERE tmp.CompanyAddressSiteName IS NOT NULL
- AND tmp.Company_RecID IS NOT NULL
- AND cadd.Company_Address_RecID IS NULL
- UNION ALL
- -- If specified, location must be valid
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid location: "' + tmp.Location + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN dbo.Owner_Level ol
- ON ol.[Description] = tmp.Location
- WHERE tmp.Location IS NOT NULL
- AND ol.Owner_Level_RecID IS NULL
- UNION ALL
- -- If specified, group must exist
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid group: "' + tmp.[Group] + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Billing_Unit bu
- ON bu.[Description] = tmp.[Group]
- WHERE tmp.[Group] IS NOT NULL
- AND bu.Billing_Unit_RecID IS NULL
- UNION ALL
- -- If group specified, location must be entered
- SELECT
- tmp.ExcelRowNumber,
- 'Location is required if a group is specified'
- FROM #Import_Staging tmp
- WHERE tmp.[Group] IS NOT NULL
- AND tmp.[Location] IS NULL
- UNION ALL
- -- Group must be associated with location
- SELECT
- tmp.ExcelRowNumber,
- 'Group: "' + tmp.[Group] + '" is not valid for location: ' + tmp.Location
- FROM #Import_Staging tmp
- INNER JOIN Billing_Unit bu
- ON dbo.ufn_Import_Trim(bu.[Description]) = tmp.[Group]
- INNER JOIN Owner_Level ol
- ON dbo.ufn_Import_Trim(ol.[Description]) = tmp.Location
- LEFT OUTER JOIN Billing_Unit_Loc bul
- ON bul.Billing_Unit_RecID = bu.Billing_Unit_RecID
- AND bul.Owner_Level_RecID = ol.Owner_Level_RecID
- WHERE bul.Billing_Unit_RecID IS NULL
- AND tmp.[Group] IS NOT NULL
- AND tmp.[Location] IS NOT NULL
- UNION ALL
- -- If updating record, configuration type cannot be changed.
- SELECT
- tmp.ExcelRowNumber,
- 'When updating a configuration, configuration type cannot change'
- FROM #Import_Staging tmp
- WHERE tmp.ConfigType IS NOT NULL
- AND tmp.ConfigType_Old IS NOT NULL
- AND tmp.ConfigType <> tmp.ConfigType_Old
- UNION ALL
- -- If configuration recid is specified (to update configuration) - must be valid
- SELECT
- tmp.ExcelRowNumber,
- 'Cannot perform update: Configuration RecID: ' + [Configuration RecID] ' is invalid'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN dbo.Config conf
- ON conf.Config_RecID = tmp.[Configuration RecID]
- WHERE tmp.[Configuration RecID] IS NOT NULL
- AND conf.Config_RecID IS NULL
- UNION ALL
- -- Location must exist if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid location: "' + tmp.Location + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Owner_Level ol
- ON ol.[Description] = tmp.Location
- WHERE tmp.Location IS NOT NULL
- AND ol.Owner_Level_RecID IS NULL
- UNION ALL
- -- Invalid question columns
- SELECT DISTINCT
- 0,
- 'Question column: "' + ec.ColumnName + '" does not have a corresponding answer column named "' + REPLACE(ec.ColumnName, 'Q:', 'A:') + '"'
- FROM @tblErrorColumns ec
- WHERE ec.ColumnType = 'Q'
- UNION ALL
- -- Invalid answer columns
- SELECT DISTINCT
- 0,
- 'Answer column: "' + ec.ColumnName + '" does not have a corresponding question column named "' + REPLACE(ec.ColumnName, 'A:', 'Q:') + '"'
- FROM @tblErrorColumns ec
- WHERE ec.ColumnType = 'A'
- UNION ALL
- -- Invalid column names
- SELECT DISTINCT
- 0,
- 'Invalid column name: "' + ec.ColumnName + '" Question columns must begin with "Q:", answer columns must begin with "A:"'
- FROM @tblErrorColumns ec
- WHERE ec.ColumnType = 'I'
- UNION ALL
- -- Blank column names
- SELECT DISTINCT
- 0,
- 'Question/Answer column names cannot be blank - there are ' + CAST(COUNT(*) AS VARCHAR(10)) + ' blank column names'
- FROM @tblErrorColumns ec
- WHERE ec.ColumnType = 'B'
- HAVING COUNT(*) > 0
- -- Insert notification messages for any created references
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag,
- ReferenceType
- )
- SELECT
- NULL,
- Survey_Name,
- 1,
- 'Configuration Type(s)'
- FROM dbo.CS_Survey
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- Company_Name,
- 1,
- 'Vendor Company(s)'
- FROM dbo.Company
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- ISNULL(First_Name + ' ', '') + ISNULL(Last_Name, ''),
- 1,
- 'Contact(s)'
- FROM dbo.Contact
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- [Description],
- 1,
- 'Configuration Status(es)'
- FROM dbo.Config_Status
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- Manufacturer_Name,
- 1,
- 'Manufacturer(s)'
- FROM dbo.Manufacturer
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT DISTINCT
- ExcelRowNumber,
- 'Company: "' + tmp.Company_Name + '" fuzzy matched to Company: ' + tmp.Company_Name_Fuzzy,
- 1,
- NULL
- FROM #Import_Staging tmp
- WHERE Company_Name_Fuzzy IS NOT NULL
- UNION ALL
- SELECT DISTINCT
- ExcelRowNumber,
- 'Contact "' + tmp.ContactName + '" fuzzy matched to Contact: ' + tmp.Contact_Name_Fuzzy,
- 1,
- NULL
- FROM #Import_Staging tmp
- WHERE Contact_Name_Fuzzy IS NOT NULL
- UNION ALL
- SELECT
- NULL,
- '"' + csd.Question + '" for configuration type "' + css.Survey_Name + '"',
- 1,
- 'Custom Questions'
- FROM dbo.CS_Survey_Detail csd
- INNER JOIN CS_Survey css ON css.CS_Survey_RecID = csd.CS_Survey_RecID
- WHERE csd.Updated_By = @ImportBatchUser
- -- Return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed
- ROLLBACK TRANSACTION
- RETURN
- END
- ELSE
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed res
- UNION ALL
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- 'The following ' + ReferenceType + ' will be created: '+
- STUFF(
- (SELECT ', ' + ValMsg
- FROM #tblResults
- WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
- FOR XML PATH (''))
- , 1, 1, '') AS ValMsg
- FROM #tblResults res
- WHERE ReferenceType IS NOT NULL
- GROUP BY ReferenceType
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- RETURN
- END
- ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS ValMsg
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- RETURN
- END
- END TRY
- BEGIN CATCH
- -- Return error information and rollback transaction
- SELECT
- 0 AS ValPassed,
- ERROR_LINE() AS RowNumber,
- ERROR_MESSAGE() AS ValMsg
- ROLLBACK TRANSACTION CFG_Validate
- END CATCH
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 04/18/2013
- -- Description: Performs final validation
- -- and inserts for Configurations import
- -- Sample call: exec usp_CFG_ImportPush 'TMP_Import_544245135e294947973ed30b293f4033', 'TMP_Questions_544245135e294947973ed30b293f4033', 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_CFG_ImportPush]
- @TableName VARCHAR(MAX),
- @TempQuestionsName VARCHAR(MAX),
- @DebugMode INT = 0,
- @Forcemode BIT = 0
- AS
- BEGIN TRY
- SET NOCOUNT ON
- BEGIN TRANSACTION CFG_Import
- -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
- IF OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber int NULL,
- ConfigType nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ConfigName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ManufacturerCompanyName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Manufacturer nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- SerialNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ModelNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- TagNumber nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- InstalledBy nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- WarrantyDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ConfigStatus nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactFirstName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ContactLastName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- CompanyAddressSiteName nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Location nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Group] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- ConfigNotes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- PurchaseDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- InstalledDate nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Phone VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Ext VARCHAR(15) COLLATE DATABASE_DEFAULT NULL,
- Email VARCHAR(200) COLLATE DATABASE_DEFAULT NULL,
- Company_Address_RecID INT NULL,
- Address_Line1 VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Address_Line2 VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- City VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- State_ID VARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Zip VARCHAR(12) COLLATE DATABASE_DEFAULT NULL,
- SiteName VARCHAR(50) COLLATE DATABASE_DEFAULT,
- CS_Survey_RecID INT,
- Mfg_Company_RecID INT,
- Manufacturer_RecID INT,
- InstalledBy_RecID VARCHAR(10) COLLATE DATABASE_DEFAULT,
- Config_Status_RecID INT,
- Owner_Level_RecID INT,
- Billing_Unit_RecID INT,
- ConvertMessage VARCHAR(1000)COLLATE DATABASE_DEFAULT,
- Config_RecID INT,
- Company_RecID INT NULL,
- Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_RecID INT NULL,
- ContactName NVARCHAR(61) COLLATE DATABASE_DEFAULT,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy NVARCHAR(61) COLLATE DATABASE_DEFAULT,
- [Configuration RecID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Company_Match_Val NVARCHAR(3) COLLATE DATABASE_DEFAULT,
- Duplicate_Flag BIT,
- Vendor_Notes NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Diff_Exclude_Flag BIT,
- Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- SR_Service_RecID INT,
- Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- SO_Opportunity_RecID INT
- )
- -- Variable declaration
- DECLARE
- @ExpRowCount INT, -- Expected rowcount for inserts - Used for validation
- @ErrorMsg VARCHAR(350), -- Variable to hold custom error message
- @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
- @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Dynamic statement to insert to validation table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Fully qualified name of Questions table
- DECLARE @QuestionsTable VARCHAR(300)
- SELECT @QuestionsTable = 'tempdb.dbo.' + @TempQuestionsName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Handle current & legacy templates by renaming column 'Vendor Company Name' to 'Manufacturer Company Name'
- IF EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Company Name')
- AND NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE Object_id = object_id(@SourceTable) AND name = 'Manufacturer Company Name')
- BEGIN
- SELECT @DSQL =
- '
- USE tempdb
- EXEC sp_rename
- @objname = ''tempdb..' + @TableName + '.[Vendor Company Name]'' ,
- @newname = ''Manufacturer Company Name'',
- @objtype = ''COLUMN''
- '
- EXEC(@DSQL)
- END
- -- Add/Re-Add [Vendor Company Name] field to avoid any compilation errors based on structure
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Company Name')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Vendor Company Name] NVARCHAR(255) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Manufacturer field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Manufacturer')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Manufacturer] NVARCHAR(255) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add [Configuration RecID] field if it doesn't exist (field is optional and only used to update configurations)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Configuration RecID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Configuration RecID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add [Vendor Notes] field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Vendor Notes')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Vendor Notes] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Capture question source into temp table
- IF (OBJECT_ID('tempdb..#QuestionSource')) IS NOT NULL
- BEGIN
- DROP TABLE #QuestionSource
- END
- CREATE TABLE #QuestionSource
- (
- ExcelRowNumber INT,
- Question NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Answer NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- SELECT @DSQL =
- '
- INSERT INTO #QuestionSource
- (
- ExcelRowNumber,
- Question,
- Answer
- )
- SELECT
- src.[Excel Row Number],
- src.[Question],
- src.[Answer]
- FROM ' + @QuestionsTable + ' src'
- EXEC (@DSQL)
- -- Table to hold questions
- IF (OBJECT_ID('tempdb..#Questions')) IS NOT NULL
- BEGIN
- DROP TABLE #Questions
- END
- CREATE TABLE #Questions
- (
- ExcelRowNumber INT,
- Question VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Answer VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ConfigType NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- CS_Survey_RecID INT,
- CS_Survey_Detail_RecID INT,
- SF_Field_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT,
- SF_Entry_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT,
- HasValueList BIT,
- IsRequired BIT,
- Decimals_Flag BIT,
- Max_Decimals INT,
- Num_Decimals INT,
- ConvertMessage NVARCHAR(500) COLLATE DATABASE_DEFAULT,
- Config_RecID INT,
- Spreadsheet_Flag BIT,
- Seq_Nbr DECIMAL(8,2)
- )
- -- Build insert to populate Staging table variable with initial values
- SET @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- ConfigType,
- ConfigName,
- ManufacturerCompanyName,
- Manufacturer,
- SerialNumber,
- ModelNumber,
- TagNumber,
- InstalledBy,
- WarrantyDate,
- ConfigStatus,
- Company_Name,
- ContactFirstName,
- ContactLastName,
- CompanyAddressSiteName,
- Location,
- [Group],
- ConfigNotes,
- PurchaseDate,
- InstalledDate,
- [Configuration RecID],
- Company_Match_Val,
- Vendor_Notes
- )
- SELECT
- [Excel Row Number],
- [Configuration Type],
- LEFT([Configuration Name], 100),
- [Manufacturer Company Name],
- [Manufacturer],
- [Serial Number],
- [Model Number],
- [Tag Number],
- [Installed By],
- [Warranty Date],
- [Configuration Status],
- [Company Name],
- [Contact First Name],
- [Contact Last Name],
- [Company Address Site Name],
- [Location],
- [Group],
- [Configuration Notes],
- [Purchase Date],
- [Installed Date],
- [Configuration RecID],
- LEFT([Company Name], 3),
- [Vendor Notes]
- FROM ' + @SourceTable
- -- Pull data into staging table
- EXEC(@DSQL)
- -- Convert empty string and single space to null for all values in staging table
- UPDATE #Import_Staging SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- ConfigType = CASE WHEN ConfigType IN('', ' ') THEN NULL ELSE ConfigType END,
- ConfigName = CASE WHEN ConfigName IN('', ' ') THEN NULL ELSE ConfigName END,
- ManufacturerCompanyName = CASE WHEN ManufacturerCompanyName IN('', ' ') THEN NULL ELSE ManufacturerCompanyName END,
- SerialNumber = CASE WHEN SerialNumber IN('', ' ') THEN NULL ELSE SerialNumber END,
- ModelNumber = CASE WHEN ModelNumber IN('', ' ') THEN NULL ELSE ModelNumber END,
- TagNumber = CASE WHEN TagNumber IN('', ' ') THEN NULL ELSE TagNumber END,
- InstalledBy = CASE WHEN InstalledBy IN('', ' ') THEN NULL ELSE InstalledBy END,
- WarrantyDate = CASE WHEN WarrantyDate IN('', ' ') THEN NULL ELSE WarrantyDate END,
- ConfigStatus = CASE WHEN ConfigStatus IN('', ' ') THEN NULL ELSE ConfigStatus END,
- Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
- ContactFirstName = CASE WHEN ContactFirstName IN('', ' ') THEN NULL ELSE ContactFirstName END,
- ContactLastName = CASE WHEN ContactLastName IN('', ' ') THEN NULL ELSE ContactLastName END,
- CompanyAddressSiteName = CASE WHEN CompanyAddressSiteName IN('', ' ') THEN NULL ELSE CompanyAddressSiteName END,
- Location = CASE WHEN Location IN('', ' ') THEN NULL ELSE Location END,
- [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
- ConfigNotes = CASE WHEN ConfigNotes IN('', ' ') THEN NULL ELSE ConfigNotes END,
- PurchaseDate = CASE WHEN PurchaseDate IN('', ' ') THEN NULL ELSE PurchaseDate END,
- InstalledDate = CASE WHEN InstalledDate IN('', ' ') THEN NULL ELSE InstalledDate END,
- Manufacturer = CASE WHEN Manufacturer IN('', ' ') THEN NULL ELSE Manufacturer END,
- [Configuration RecID] = CASE WHEN [Configuration RecID] IN('', ' ') THEN NULL ELSE [Configuration RecID] END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_ID = src.Legacy_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Condense contact first and last names to ContactName
- UPDATE tmp
- SET ContactName = LTRIM(ISNULL(tmp.ContactFirstName + ' ', '')) + RTRIM(ISNULL(tmp.ContactLastName, ''))
- FROM #Import_Staging tmp
- -- Remove export datatype config row
- DELETE FROM #Import_Staging WHERE Company_Name = 'CW_Import_Config_Row'
- -- Get RecID for Config Type
- UPDATE tmp
- SET tmp.CS_Survey_RecID = csc.CS_Survey_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.CS_Survey csc
- ON tmp.ConfigType = csc.Survey_Name
- -- Force config types if necessary
- IF @Forcemode = 1 AND EXISTS(SELECT TOP 1 * FROM #Import_Staging tmp WHERE CS_Survey_RecID IS NULL)
- BEGIN
- INSERT INTO dbo.CS_Survey
- (
- Owner_ID,
- Survey_Name,
- Instructions,
- Inactive_Flag,
- Last_Update,
- Updated_By,
- Survey_Flag,
- System_Flag
- )
- SELECT DISTINCT
- 1,
- tmp.ConfigType,
- 'Created by import utility on ' + CONVERT(VARCHAR, GETDATE(), 101),
- 0,
- GETDATE(),
- @ImportBatchUser,
- 0,
- 0
- FROM #Import_Staging tmp
- WHERE tmp.CS_Survey_RecID IS NULL
- AND tmp.ConfigType IS NOT NULL
- -- Capture RecIDs for newly inserted config types
- UPDATE tmp
- SET tmp.CS_Survey_RecID = css.CS_Survey_RecID
- FROM #Import_Staging tmp
- INNER JOIN CS_Survey css
- ON css.Survey_Name = tmp.ConfigType
- AND tmp.CS_Survey_RecID IS NULL
- AND css.Updated_By = @ImportBatchUser
- END
- -- Prepare custom question records for each spreadsheet row
- INSERT INTO #Questions
- (
- ExcelRowNumber,
- ConfigType,
- Question,
- CS_Survey_RecID,
- CS_Survey_Detail_RecID,
- SF_Field_Type_ID,
- SF_Entry_Type_ID,
- IsRequired,
- Max_Decimals,
- Decimals_Flag,
- Answer,
- HasValueList,
- Spreadsheet_Flag
- )
- SELECT
- ISNULL(stag.ExcelRowNumber, qs.[ExcelRowNumber]),
- ct.ConfigType,
- ISNULL(qs.Question, csd.Question),
- ct.CS_Survey_RecID,
- csd.CS_Survey_Detail_RecID,
- csd.SF_Field_Type_ID,
- csd.SF_Entry_Type_ID,
- CASE WHEN csd.Required_Flag = 1 THEN 1 ELSE 0 END,
- csd.Nbr_Decimals,
- CASE WHEN csd.SF_Entry_Type_ID IN('L', 'O') THEN 1 ELSE 0 END,
- LEFT(ISNULL(qs.Answer, csv.CS_Survey_Value), 1000),
- CASE WHEN csv.CS_Survey_Value IS NOT NULL THEN 1 ELSE 0 END,
- CASE WHEN qs.Answer IS NOT NULL THEN 1 ELSE 0 END
- FROM CS_Survey_Detail csd
- INNER JOIN CS_Survey css
- ON css.CS_Survey_RecID = csd.CS_Survey_RecID
- AND csd.Inactive_Flag = 0
- INNER JOIN #Import_Staging stag
- ON stag.CS_Survey_RecID = css.CS_Survey_RecID
- FULL OUTER JOIN #QuestionSource qs
- ON qs.Question = csd.Question
- AND qs.ExcelRowNumber = stag.ExcelRowNumber
- OUTER APPLY
- (
- SELECT TOP 1 csv.CS_Survey_Value
- FROM CS_Survey_Value csv
- WHERE csv.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID
- AND csv.Default_Flag = 1
- ) csv
- CROSS APPLY(SELECT TOP 1 ConfigType, CS_Survey_RecID FROM #Import_Staging stag WHERE stag.ExcelRowNumber = qs.ExcelRowNumber) ct
- -- Update blank string answers to null
- UPDATE qu
- SET qu.Answer = NULL
- FROM #Questions qu
- WHERE qu.Answer = ''
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT DISTINCT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE Delete_Flag = 0
- AND (LEFT(Company_Name, 3) IN(SELECT Company_Match_Val FROM #Import_Staging)
- OR Company_Name IN(SELECT ManufacturerCompanyName FROM #Import_Staging)
- OR Company_RecID = (SELECT TOP 1 Company_RecID FROM dbo.Owner))
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- INNER JOIN #Company comp
- ON comp.Company_RecID = cont.Company_RecID
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Configuration'
- END
- IF @Legacy_Flag = 0
- BEGIN
- -- Match companies and contacts
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- END
- -- Update blank string answers to null
- UPDATE qu
- SET qu.Answer = NULL
- FROM #Questions qu
- WHERE qu.Answer = ''
- -- Get RecID for Manufacturer
- UPDATE tmp
- SET tmp.Manufacturer_RecID = mfg.Manufacturer_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Manufacturer mfg
- ON mfg.Manufacturer_Name = tmp.Manufacturer
- -- If @ForceMode = 1, create references as needed
- IF(@Forcemode = 1)
- BEGIN
- INSERT INTO dbo.CS_Survey_Detail
- (
- CS_Survey_RecID,
- Seq_Nbr,
- Question,
- SF_Field_Type_ID,
- Nbr_Decimals,
- SF_Entry_Type_ID,
- Required_Flag,
- Inactive_Flag,
- Last_Update,
- Updated_By
- )
- SELECT
- qu.CS_Survey_RecID,
- 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,
- qu.Question,
- CASE WHEN MAX(LEN(qu.Answer)) > 100 THEN 'A' ELSE 'T' END AS SF_Field_Type_ID,
- 0 AS Nbr_Decimals,
- 'E' AS SF_Entry_Type_ID,
- 0 AS Required_Flag,
- 0 AS Inactive_Flag,
- GETDATE() AS Last_Update,
- @ImportBatchUser AS Updated_By
- FROM #Questions qu
- CROSS APPLY(SELECT MAX(Seq_Nbr) AS Seq_Nbr FROM CS_Survey_Detail csd WHERE csd.CS_Survey_RecID = qu.CS_Survey_RecID) csd
- WHERE qu.CS_Survey_Detail_RecID IS NULL
- AND qu.CS_Survey_RecID IS NOT NULL
- AND qu.Answer IS NOT NULL
- GROUP BY CS_Survey_RecID, Question
- -- Update #Questions with appropriate information for newly inserted questions
- UPDATE qu
- SET qu.CS_Survey_Detail_RecID = csd.CS_Survey_Detail_RecID,
- qu.SF_Field_Type_ID = csd.SF_Field_Type_ID,
- qu.SF_Entry_Type_ID = 'E',
- qu.Max_Decimals = 0
- FROM #Questions qu
- 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
- WHERE qu.CS_Survey_Detail_RecID IS NULL
- -- Vendor company
- IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
- BEGIN
- INSERT INTO dbo.Company
- (
- Company_ID,
- Company_Name,
- Updated_By,
- Company_Type_RecID,
- Company_Status_RecID,
- Delete_Flag,
- Entered_by,
- Options_Last_Update_UTC,
- Options_Updated_by
- )
- SELECT DISTINCT
- 'M-' + LEFT(ManufacturerCompanyName, 48),
- SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
- @ImportBatchUser,
- ctype.Company_Type_RecID,
- cstat.Company_Status_RecID,
- 0,
- @ImportBatchUser,
- GETUTCDATE(),
- 'zAdmin'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN #Company comp
- ON comp.Company_Name = tmp.ManufacturerCompanyName
- INNER JOIN Company_Type ctype
- ON ctype.[Description] = 'Vendor'
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
- WHERE tmp.ManufacturerCompanyName IS NOT NULL
- AND comp.Company_RecID IS NULL
- END
- IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company')
- AND NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
- BEGIN
- INSERT INTO dbo.Company
- (
- Company_ID,
- Company_Name,
- Updated_By,
- Company_Type_RecID,
- Company_Status_RecID,
- Delete_Flag,
- Entered_by
- )
- SELECT DISTINCT
- 'M-' + LEFT(ManufacturerCompanyName, 48),
- SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
- @ImportBatchUser,
- ctype.Company_Type_RecID,
- cstat.Company_Status_RecID,
- 0,
- @ImportBatchUser
- FROM #Import_Staging tmp
- LEFT OUTER JOIN #Company comp
- ON comp.Company_Name = tmp.ManufacturerCompanyName
- INNER JOIN Company_Type ctype
- ON ctype.[Description] = 'Vendor'
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
- WHERE tmp.ManufacturerCompanyName IS NOT NULL
- AND comp.Company_RecID IS NULL
- END
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company')
- AND NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Options_Last_Update_UTC' AND OBJECT_NAME(object_ID) = 'Company')
- BEGIN
- INSERT INTO dbo.Company
- (
- Company_ID,
- Company_Name,
- Updated_By,
- Company_Type_RecID,
- Company_Status_RecID,
- Delete_Flag
- )
- SELECT DISTINCT
- 'M-' + LEFT(ManufacturerCompanyName, 48),
- SUBSTRING(tmp.ManufacturerCompanyName, 1, 50),
- @ImportBatchUser,
- ctype.Company_Type_RecID,
- cstat.Company_Status_RecID,
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN #Company comp
- ON comp.Company_Name = tmp.ManufacturerCompanyName
- INNER JOIN Company_Type ctype
- ON ctype.[Description] = 'Vendor'
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Status stat WHERE stat.Default_Flag = 1) cstat
- WHERE tmp.ManufacturerCompanyName IS NOT NULL
- AND comp.Company_RecID IS NULL
- END
- -- If more than one company inserted with same name, raise error
- -- This would be due to 2 or more types named 'Vendor' or 2 or more statuses set to Import_Flag = 1
- IF EXISTS(SELECT Company_Name FROM dbo.Company WHERE Updated_By = @ImportBatchUser GROUP BY Company_Name HAVING COUNT(*) > 1)
- BEGIN
- RAISERROR('More than one company reference created - check company types and statuses.', 16, 1)
- END
- -- -- Insert a 'Main' site record for any manufacturer company created
- -- IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
- -- BEGIN
- -- INSERT INTO dbo.Company_Address
- -- (
- -- Owner_ID,
- -- Company_RecID,
- -- Zip, -- Place a dot in zip code because at least one address field must be filled out per PSA validation
- -- Default_Flag,
- -- Updated_By,
- -- [Description],
- -- Entered_By
- -- )
- -- SELECT DISTINCT
- -- 1,
- -- Company_RecID,
- -- '.',
- -- 1,
- -- @ImportBatchUser,
- -- 'Main',
- -- @ImportBatchUser
- -- FROM dbo.Company
- -- WHERE Updated_By = @ImportBatchUser
- -- -- Hack to suppress structural errors
- -- AND NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE 1=2)
- -- END
- --IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
- --BEGIN
- -- INSERT INTO dbo.Company_Address
- -- (
- -- Owner_ID,
- -- Company_RecID,
- -- Zip, -- Place a dot in zip code because at least one address field must be filled out per PSA validation
- -- Default_Flag,
- -- Updated_By,
- -- [Description]
- -- )
- -- SELECT DISTINCT
- -- 1,
- -- Company_RecID,
- -- '.',
- -- 1,
- -- @ImportBatchUser,
- -- 'Main'
- -- FROM dbo.Company
- -- WHERE Updated_By = @ImportBatchUser
- -- AND NOT EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE 1=2)
- --END
- -- Insert newly created companies to @Company
- INSERT INTO #Company
- (
- Company_RecID,
- Company_ID,
- Company_Name,
- Delete_Flag,
- Duplicate_Flag
- )
- SELECT
- Company_RecID,
- Company_ID,
- Company_Name,
- Delete_Flag,
- 0
- FROM dbo.Company
- WHERE Updated_By = @ImportBatchUser
- -- Configuration Status
- INSERT INTO dbo.Config_Status
- (
- [Description],
- Closed_Flag,
- Updated_By,
- Default_Flag
- )
- SELECT DISTINCT
- tmp.ConfigStatus,
- 0,
- @ImportBatchUser,
- 0
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Config_Status cfs
- ON dbo.ufn_Import_Trim(cfs.[Description]) = tmp.ConfigStatus
- WHERE tmp.ConfigStatus IS NOT NULL
- AND cfs.Config_Status_RecID IS NULL
- -- Update invalid 'Installed By' members to 'zAdmin'
- UPDATE tmp
- SET tmp.InstalledBy = 'zAdmin'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN Member mem
- ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.InstalledBy
- WHERE tmp.InstalledBy IS NOT NULL
- AND mem.Member_RecID IS NULL
- -- Truncate model numbers > 50 characters
- UPDATE tmp
- SET tmp.ModelNumber = SUBSTRING(tmp.ModelNumber, 1, 50)
- FROM #Import_Staging tmp
- -- Insert manufacturer if missing
- INSERT INTO dbo.Manufacturer
- (
- Manufacturer_Name,
- Inactive_Flag,
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- Manufacturer,
- 0,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging
- WHERE Manufacturer IS NOT NULL
- AND Manufacturer_RecID IS NULL
- END
- -- Update manufacturer RecID in source table so that validation passes
- UPDATE tmp
- SET tmp.Manufacturer_RecID = mfg.Manufacturer_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Manufacturer mfg
- ON mfg.Manufacturer_Name = tmp.Manufacturer
- -- Encrypt password answers
- UPDATE qu
- SET qu.Answer = dbo.udf_EncrDecr(Answer, 'E')
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'W'
- -- For checkbox questions - convert various forms of T/F to True/False
- UPDATE qu
- SET qu.Answer =
- CASE
- WHEN qu.Answer IN('Y', 'True', 'T', 'Yes', '1') THEN 'True'
- WHEN qu.Answer IN('N', 'False', 'F', 'No', '0') THEN 'False'
- END
- FROM #Questions qu
- WHERE qu.SF_Field_Type_ID = 'K'
- AND qu.Answer IS NOT NULL
- -- Get number of decimals for decimal fields
- UPDATE qu
- SET Num_Decimals = LEN(PARSENAME(qu.Answer, 1))
- FROM #Questions qu
- WHERE qu.Answer IS NOT NULL
- AND qu.Decimals_Flag = 1
- AND qu.Answer LIKE('%.%')
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.HasValueList = 0
- -- Convert decimal fields to proper number of decimals based on question type
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,0), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 0
- AND qu.Num_Decimals > qu.Max_Decimals
- AND qu.HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,1), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 1
- AND qu.Num_Decimals > qu.Max_Decimals
- AND qu.HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,2), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 2
- AND qu.Num_Decimals > qu.Max_Decimals
- AND qu.HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,3), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 3
- AND qu.Num_Decimals > qu.Max_Decimals
- AND qu.HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,4), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 4
- AND qu.Num_Decimals > qu.Max_Decimals
- AND qu.HasValueList = 0
- UPDATE qu
- SET Answer = CONVERT(Decimal(30,5), Answer)
- FROM #Questions qu
- WHERE qu.Decimals_Flag = 1
- AND ISNUMERIC(qu.Answer + 'e0') = 1
- AND qu.Max_Decimals = 5
- AND qu.Num_Decimals > qu.Max_Decimals
- AND qu.HasValueList = 0
- -- Grab RecIDs & fields needed to start import
- -- Manufacturer company
- UPDATE stag
- SET stag.Mfg_Company_RecID = comp.Company_RecID
- FROM #Company comp
- INNER JOIN #Import_Staging stag
- ON comp.Company_Name = stag.ManufacturerCompanyName
- WHERE comp.Delete_Flag = 0
- AND stag.ManufacturerCompanyName IS NOT NULL
- -- Installed by
- UPDATE stag
- SET stag.InstalledBy_RecID = mem.Member_RecID
- FROM #Import_Staging stag
- INNER JOIN Member mem
- ON dbo.ufn_Import_Trim(mem.Member_ID) = stag.InstalledBy
- OR stag.InstalledBy = ISNULL(mem.First_Name + ' ', '') + ISNULL(mem.Last_Name, '')
- WHERE stag.InstalledBy IS NOT NULL
- -- Configuration status
- UPDATE stag
- SET stag.Config_Status_RecID = cs.Config_Status_RecID
- FROM #Import_Staging stag
- INNER JOIN Config_Status cs
- ON dbo.ufn_Import_Trim(cs.[Description]) = stag.ConfigStatus
- WHERE stag.ConfigStatus IS NOT NULL
- -- Get default config status if not specified
- UPDATE stag
- SET stag.Config_Status_RecID = cs.Config_Status_RecID
- FROM #Import_Staging stag
- INNER JOIN Config_Status cs
- ON cs.Default_Flag = 1
- WHERE stag.ConfigStatus IS NULL
- -- Company address site
- UPDATE stag
- SET stag.Company_Address_RecID = cad.Company_Address_RecID
- FROM #Import_Staging stag
- INNER JOIN Company_Address cad
- ON cad.Company_RecID = stag.Company_RecID
- AND (cad.[Description] = stag.CompanyAddressSiteName OR cad.Address_Line1 = stag.CompanyAddressSiteName)
- WHERE stag.CompanyAddressSiteName IS NOT NULL
- AND @Legacy_Flag = 0
- -- Company address site (where not specified)
- UPDATE stag
- SET stag.Company_Address_RecID = cad.Company_Address_RecID
- FROM #Import_Staging stag
- INNER JOIN Company_Address cad
- ON cad.Company_RecID = stag.Company_RecID
- AND cad.Default_Flag = 1
- WHERE stag.CompanyAddressSiteName IS NULL
- AND Legacy_Site_ID IS NULL
- -- Location (owner_level)
- UPDATE stag
- SET stag.Owner_Level_RecID = ol.Owner_Level_RecID
- FROM #Import_Staging stag
- INNER JOIN Owner_Level ol
- ON ol.[Description] = stag.Location
- WHERE stag.Location IS NOT NULL
- -- Group
- UPDATE stag
- SET stag.Billing_Unit_RecID = bu.Billing_Unit_RecID
- FROM #Import_Staging stag
- INNER JOIN Billing_Unit_Loc bul
- ON stag.Owner_Level_RecID = bul.Owner_Level_RecID
- INNER JOIN Billing_Unit bu
- ON dbo.ufn_Import_Trim(bu.[Description]) = stag.[Group]
- AND bu.Billing_Unit_RecID = bul.Billing_Unit_RecID
- WHERE stag.[Group] IS NOT NULL
- -- Get zAdmin RecID
- SELECT @zAdmin_Member_RecID = Member_RecID
- FROM dbo.Member
- WHERE Member_ID = 'zadmin'
- -- Error if no zAdmin user
- IF @zAdmin_Member_RecID IS NULL
- BEGIN
- RAISERROR('zAdmin user not found for this implementation - required for import', 16, 2)
- END
- -- Check required fields
- UPDATE stag
- SET stag.ConvertMessage =
- CASE
- WHEN stag.CS_Survey_RecID IS NULL THEN 'Invalid configuration type'
- WHEN stag.Mfg_Company_RecID IS NULL AND stag.ManufacturerCompanyName IS NOT NULL THEN 'Invalid Vendor'
- WHEN stag.InstalledBy_RecID IS NULL AND stag.InstalledBy IS NOT NULL THEN 'Invalid Installed By Member'
- WHEN stag.Config_Status_RecID IS NULL THEN 'Invalid Configuration Status'
- WHEN stag.Company_RecID IS NULL THEN 'Invalid Company Name'
- WHEN stag.Contact_RecID IS NULL THEN 'Invalid Contact'
- WHEN stag.Company_Address_RecID IS NULL AND stag.CompanyAddressSiteName IS NOT NULL THEN 'Invalid site name'
- WHEN stag.Owner_Level_RecID IS NULL AND stag.Location IS NOT NULL THEN 'Invalid location'
- WHEN stag.Billing_Unit_RecID IS NULL AND stag.[Group] IS NOT NULL THEN 'Invalid Group'
- WHEN stag.Manufacturer_RecID IS NULL AND stag.Manufacturer IS NOT NULL THEN 'Invalid Manufacturer'
- END
- FROM #Import_Staging stag
- UPDATE que
- SET que.ConvertMessage =
- CASE
- WHEN que.CS_Survey_Detail_RecID IS NULL THEN 'Invalid Question: ' + ISNULL(que.Question, '[Blank]')
- END
- FROM #Questions que
- -- If a required field is missing return failure message
- IF EXISTS(SELECT '1' FROM #Import_Staging WHERE ConvertMessage IS NOT NULL UNION ALL SELECT '1' FROM #Questions WHERE ConvertMessage IS NOT NULL)
- BEGIN
- -- Raise error w/ 16 severity to jump to catch
- RAISERROR('Validation Error', 16, 2)
- END
- ELSE
- -- Validation suceeded - begin push
- -- Get expected rowcount for insert to dbo.Config
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE [Configuration RecID] IS NULL
- -- Perform insert to dbo.Config
- -- Insert script is conditional based on CW version - Entered_by may or may not appear in table
- -- Table to force compilation regardless of structure
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- CREATE TABLE #Force_Compile
- (
- Column_Name VARCHAR(20)
- )
- IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(Object_ID) = 'Config')
- BEGIN
- INSERT INTO dbo.Config
- (
- CS_Survey_RecID,
- Config_Name,
- Mfg_Company_RecID,
- Manufacturer_RecID,
- Serial_Number,
- Date_Purchased,
- Date_Installed,
- Installed_By,
- Date_Expiration,
- Company_RecID,
- Contact_RecID,
- Company_Address_RecID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- Notes,
- Last_Update,
- Updated_By,
- Model_Number,
- Tag_Number,
- Config_Status_RecID,
- Backup_Year,
- Custom_Field,
- OS_Info
- )
- OUTPUT INSERTED.OS_Info, INSERTED.Config_RecID, 'Configuration' INTO Import_Legacy_ID_Custom
- SELECT
- stag.CS_Survey_RecID,
- stag.ConfigName,
- stag.Mfg_Company_RecID,
- stag.Manufacturer_RecID,
- stag.SerialNumber,
- CONVERT(DATETIME, stag.PurchaseDate),
- CONVERT(DATETIME, stag.InstalledDate),
- stag.InstalledBy_RecID,
- CONVERT(DATETIME, stag.WarrantyDate),
- stag.Company_RecID,
- stag.Contact_RecID,
- stag.Company_Address_RecID,
- stag.Owner_Level_RecID,
- stag.Billing_Unit_RecID,
- stag.ConfigNotes,
- GETDATE(),
- @ImportBatchUser,
- stag.ModelNumber,
- stag.TagNumber,
- stag.Config_Status_RecID,
- stag.ExcelRowNumber,
- stag.Vendor_Notes,
- stag.Legacy_ID
- FROM #Import_Staging stag
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- WHERE stag.[Configuration RecID] IS NULL
- ORDER BY stag.ExcelRowNumber ASC
- END
- IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(Object_ID) = 'Config')
- BEGIN
- INSERT INTO dbo.Config
- (
- CS_Survey_RecID,
- Config_Name,
- Mfg_Company_RecID,
- Manufacturer_RecID,
- Serial_Number,
- Date_Purchased,
- Date_Installed,
- Installed_By,
- Date_Expiration,
- Company_RecID,
- Contact_RecID,
- Company_Address_RecID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- Notes,
- Last_Update,
- Updated_By,
- Model_Number,
- Tag_Number,
- Config_Status_RecID,
- Backup_Year,
- Custom_Field,
- Entered_By,
- OS_Info
- )
- OUTPUT INSERTED.OS_Info, INSERTED.Config_RecID, 'Configuration' INTO Import_Legacy_ID_Custom
- SELECT
- stag.CS_Survey_RecID,
- stag.ConfigName,
- stag.Mfg_Company_RecID,
- stag.Manufacturer_RecID,
- stag.SerialNumber,
- CONVERT(DATETIME, stag.PurchaseDate),
- CONVERT(DATETIME, stag.InstalledDate),
- stag.InstalledBy_RecID,
- CONVERT(DATETIME, stag.WarrantyDate),
- stag.Company_RecID,
- stag.Contact_RecID,
- stag.Company_Address_RecID,
- stag.Owner_Level_RecID,
- stag.Billing_Unit_RecID,
- stag.ConfigNotes,
- GETDATE(),
- @ImportBatchUser,
- stag.ModelNumber,
- stag.TagNumber,
- stag.Config_Status_RecID,
- stag.ExcelRowNumber,
- stag.Vendor_Notes,
- 'zAdmin',
- stag.Legacy_ID
- FROM #Import_Staging stag
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- WHERE stag.[Configuration RecID] IS NULL
- ORDER BY stag.ExcelRowNumber ASC
- END
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- -- Join final table back to staging to capture new identities
- UPDATE stag
- SET stag.Config_RecID = conf.Config_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Config conf
- ON stag.ExcelRowNumber = conf.Backup_Year
- AND conf.Updated_By = @ImportBatchUser
- AND stag.[Configuration RecID] IS NULL
- -- 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)
- UPDATE conf
- SET conf.Config_Name = stag.ConfigName,
- conf.Company_RecID = stag.Company_RecID,
- conf.Mfg_Company_RecID = stag.Mfg_Company_RecID,
- conf.Model_Number = stag.ModelNumber,
- conf.Tag_Number = stag.TagNumber,
- conf.Date_Purchased = CONVERT(DATETIME, stag.PurchaseDate),
- conf.Date_Installed = CONVERT(DATETIME, stag.InstalledDate),
- conf.Installed_By = stag.InstalledBy_RecID,
- conf.Date_Expiration = CONVERT(DATETIME, stag.WarrantyDate),
- conf.Contact_RecID = stag.Contact_RecID,
- conf.Company_Address_RecID = stag.Company_Address_RecID,
- conf.Owner_Level_RecID = stag.Owner_Level_RecID,
- conf.Billing_Unit_RecID = stag.Billing_Unit_RecID,
- conf.Manufacturer_RecID = stag.Manufacturer_RecID,
- conf.Updated_By = @ImportBatchUser,
- conf.Last_Update = GETDATE(),
- conf.Config_Status_RecID = stag.Config_Status_RecID
- FROM dbo.Config conf
- INNER JOIN #Import_Staging stag
- ON stag.[Configuration RecID] = conf.Config_RecID
- -- If Manufacturer_RecID exists in dbo.Config, update final record with Manufacturer_RecID (Column does not exist in earlier versions of CW)
- IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Manufacturer_RecID' AND object_name(object_ID) = 'Config')
- BEGIN
- UPDATE conf
- SET conf.Manufacturer_RecID = stag.Manufacturer_RecID
- FROM dbo.Config conf
- INNER JOIN #Import_Staging stag
- ON conf.Manufacturer_RecID = stag.Manufacturer_RecID
- WHERE stag.Manufacturer_RecID IS NOT NULL
- END
- -- Update Backup_Year, OS_Info to NULL for newly inserted records
- UPDATE conf
- SET conf.Backup_Year = NULL,
- conf.OS_Info = NULL
- FROM dbo.Config conf
- WHERE conf.Updated_By = @ImportBatchUser
- -- Join Question table to staging and grab newly inserted identities
- UPDATE que
- SET que.Config_RecID = stag.Config_RecID
- FROM #Questions que
- INNER JOIN #Import_Staging stag
- ON stag.ExcelRowNumber = que.ExcelRowNumber
- -- Grab identities for configs to be updated
- UPDATE que
- SET que.Config_RecID = stag.[Configuration RecID]
- FROM #Questions que
- INNER JOIN #Import_Staging stag
- ON stag.ExcelRowNumber = que.ExcelRowNumber
- AND stag.[Configuration RecID] IS NOT NULL
- -- Perform updates to CS_Result_Detail as necessary
- UPDATE crd
- SET CS_Result_RecID = 0,
- Answer = que.Answer,
- Last_Update = GETDATE(),
- Updated_By = @ImportBatchUser
- FROM CS_Result_Detail crd
- INNER JOIN #Questions que
- ON que.Config_RecID = crd.Config_Recid
- AND que.CS_Survey_Detail_RecID = crd.CS_Survey_Detail_RecID
- -- Filter rows where column did not appear on spreadsheet
- WHERE que.Spreadsheet_Flag = 1
- -- Perform insert to CS_Result_Detail
- INSERT INTO CS_Result_Detail
- (
- CS_Result_RecID,
- CS_Survey_Detail_RecID,
- Answer,
- Config_Recid,
- Last_Update,
- Updated_By
- )
- SELECT
- 0,
- que.CS_Survey_Detail_RecID,
- ISNULL(que.Answer, ''),
- que.Config_RecID,
- GETDATE(),
- @ImportBatchUser
- FROM #Questions que
- LEFT OUTER JOIN CS_Result_Detail crd
- ON crd.Config_Recid = que.Config_RecID
- AND crd.CS_Survey_Detail_RecID = que.CS_Survey_Detail_RecID
- WHERE crd.CS_Result_Detail_RecID IS NULL
- -- If debug mode and successful, select the rows that were inserted
- -- and rollback transaction
- IF @DebugMode = 1 AND @@ERROR = 0
- BEGIN
- SELECT * FROM Config WHERE Config_RecID IN(SELECT Config_RecID FROM #Import_Staging)
- SELECT * FROM CS_Result_Detail WHERE Config_RecID IN(SELECT Config_RecID FROM #Import_Staging)
- ROLLBACK TRANSACTION CFG_Import
- END
- IF @DebugMode = 2 AND @@ERROR = 0
- BEGIN
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- ROLLBACK TRANSACTION CFG_Import
- END
- IF @DebugMode = 0 AND @@Error = 0
- BEGIN
- DROP TABLE #Import_Staging
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- COMMIT TRANSACTION CFG_Import
- END
- END TRY
- BEGIN CATCH
- -- An error has occured - determine if validation error
- IF ERROR_MESSAGE() = 'Validation Error'
- BEGIN
- -- Return details of error from staging table
- SELECT
- 0 AS Success,
- stag.ExcelRowNumber,
- stag.ConvertMessage AS ErrorDetails
- FROM #Import_Staging stag
- WHERE stag.ConvertMessage IS NOT NULL
- UNION ALL
- SELECT
- 0 AS Success,
- que.ExcelRowNumber,
- que.ConvertMessage AS ErrorDetails
- FROM #Questions que
- WHERE que.ConvertMessage IS NOT NULL
- ROLLBACK TRANSACTION
- END
- ELSE
- -- Not a validation error - return SQL error message encountered
- SELECT
- 0 AS Success,
- 'Unknown' AS ExcelRowNumber,
- ERROR_MESSAGE() + ' Line:' + CONVERT(VARCHAR(10), ERROR_LINE()) AS ErrorDetails
- -- Rollback transaction
- IF @@TRANCOUNT > 0
- ROLLBACK TRANSACTION CFG_Import
- END CATCH
- GO
- ----------------------
- -- Companies/Contacts
- ----------------------
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Comp_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Comp_ImportValidate] AS SELECT 1')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Comp_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Comp_ImportPush] AS SELECT 1')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Contact_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Contact_ImportValidate] AS SELECT 1')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Contact_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Contact_ImportPush] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 05/07/2013
- -- Description: Validates data from spreadsheet
- -- for company Import
- -- Sample call: exec usp_Comp_ImportValidate 'Comp_Import_Test', 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_Comp_ImportValidate]
- @TableName VARCHAR(MAX),
- @DiffMode BIT = 0, -- Differential mode - (for custom imports) does not import records which already exist on Company name
- @Forcemode BIT = 1
- AS
- BEGIN TRY
- -- Turn off diff mode - no longer used
- SELECT @DiffMode = 0
- SET NOCOUNT ON
- -- Set date format to MDY to validate dates from excel
- SET DATEFORMAT MDY
- -- Variable declaration
- -- Table to hold results of procedure
- IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
- BEGIN
- DROP TABLE #tblResults
- END
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
- InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Warning_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- -- Dynamic statement to insert to validation table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Unique value to identify records created by this import in updated_by fields
- DECLARE @ImportBatchUser VARCHAR(15)
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Add Tax Code ID field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Tax Code ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Tax Code ID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Billing Site field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Billing Site')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Billing Site] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Legacy_ID field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD Legacy_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Pre-validation
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'Company Name' UNION ALL
- SELECT 'Company ID' UNION ALL
- SELECT 'Company Type' UNION ALL
- SELECT 'Ownership Type' UNION ALL
- SELECT 'Company Status' UNION ALL
- SELECT 'Company Market' UNION ALL
- SELECT 'Track' UNION ALL
- SELECT 'Source List' UNION ALL
- SELECT 'Mark As Lead' UNION ALL
- SELECT 'Territory Name' UNION ALL
- SELECT 'Time Zone' UNION ALL
- SELECT 'Company Group' UNION ALL
- SELECT 'Company TaxID' UNION ALL
- SELECT 'Payment Terms' UNION ALL
- SELECT 'User Field 1' UNION ALL
- SELECT 'User Field 2' UNION ALL
- SELECT 'User Field 3' UNION ALL
- SELECT 'User Field 4' UNION ALL
- SELECT 'User Field 5' UNION ALL
- SELECT 'User Field 6' UNION ALL
- SELECT 'User Field 7' UNION ALL
- SELECT 'User Field 8' UNION ALL
- SELECT 'User Field 9' UNION ALL
- SELECT 'User Field 10' UNION ALL
- SELECT 'Phone Number' UNION ALL
- SELECT 'Fax Number' UNION ALL
- SELECT 'Site Name' UNION ALL
- SELECT 'Address Line 1' UNION ALL
- SELECT 'Address Line 2' UNION ALL
- SELECT 'City' UNION ALL
- SELECT 'State' UNION ALL
- SELECT 'Zip Code' UNION ALL
- SELECT 'Country' UNION ALL
- SELECT 'Website URL' UNION ALL
- SELECT 'Annual Revenue' UNION ALL
- SELECT 'Number Of Employees' UNION ALL
- SELECT 'SIC Code' UNION ALL
- SELECT 'Company Account' UNION ALL
- SELECT 'Company Note' UNION ALL
- SELECT 'Tax Code ID'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- -- If a column is missing, stop here and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 0 AS ValPassed,
- RowNumber,
- ValMsg
- FROM #tblResults
- ORDER BY RowNumber, ValMsg
- ROLLBACK TRANSACTION
- RETURN
- END
- -- Table to hold source data for this batch from temp table
- IF(OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL)
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT NULL,
- Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Status nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Market nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Track nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- SourceList nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- MarkAsLead nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Territory nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Group] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- PhoneNbr_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- PhoneNbr_Fax nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Site_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Address_Line1_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Address_Line2_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- City_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- State_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Zip_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Country_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Website_URL nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Annual_Revenue nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Nbr_Employees nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- SIC_Code_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Account_Nbr nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Note_Comp nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- Parent_Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Ownership_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- TimeZone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- TaxID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- PaymentTerms NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- UserField1 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField2 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField3 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField4 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField5 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField6 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField7 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField8 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField9 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField10 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Company_RecID INT,
- Company_Type_RecID INT,
- Company_Status_RecID INT,
- Market_RecID INT,
- WF_Track_Header_RecID INT,
- Territory_Owner_Level_RecID INT,
- Group_Type_RecID INT,
- Site_Company_Address_RecID INT,
- Comp_State_RecID INT,
- State_ID VARCHAR(50) COLLATE DATABASE_DEFAULT,
- Comp_Country_RecID INT,
- Parent_Company_RecID INT,
- Ownership_Type_RecID INT,
- Time_Zone_RecID INT,
- Billing_Terms_RecID INT,
- Contact_RecID INT,
- Contact_Type_RecID INT,
- Note_Type_RecID INT,
- UserField1Used BIT,
- UserField2Used BIT,
- UserField3Used BIT,
- UserField4Used BIT,
- UserField5Used BIT,
- UserField6Used BIT,
- UserField7Used BIT,
- UserField8Used BIT,
- UserField9Used BIT,
- UserField10Used BIT,
- NewCompany BIT,
- Tax_Code_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Tax_Code_RecID INT,
- Billing_Site NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Company_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Company_Address_RecID INT,
- SR_Service_RecID INT,
- SO_Opportunity_RecID INT,
- Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Diff_Exclude_Flag BIT,
- Legacy_Contact_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT
- )
- CREATE INDEX IX_Legacy_ID ON #Import_Staging(Legacy_ID)
- CREATE INDEX IX_ExcelRow ON #Import_Staging(ExcelRowNumber)
- CREATE INDEX IX_Legacy_Site_ID ON #Import_Staging(Legacy_Site_ID)
- IF NOT EXISTS(SELECT 1 FROM tempdb.sys.indexes WHERE OBJECT_ID = @Source_Object_ID AND Name = 'IX_ExcelRow')
- BEGIN
- EXEC('CREATE INDEX IX_ExcelRow ON tempdb.dbo.' + @TableName + '([Excel Row Number])')
- END
- -- Build statement to populate validation temp table
- -- Convert blank string or single space to null
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- Company_Name,
- Company_Type,
- Company_Status,
- Company_Market,
- Track,
- SourceList,
- MarkAsLead,
- Territory,
- [Group],
- Company_ID,
- PhoneNbr_Comp,
- PhoneNbr_Fax,
- Site_Name,
- Address_Line1_Comp,
- Address_Line2_Comp,
- City_Comp,
- State_Comp,
- Zip_Comp,
- Country_Comp,
- Website_URL,
- Annual_Revenue,
- Nbr_Employees,
- SIC_Code_ID,
- Account_Nbr,
- Note_Comp,
- Ownership_Type,
- TimeZone,
- TaxID,
- PaymentTerms,
- UserField1,
- UserField2,
- UserField3,
- UserField4,
- UserField5,
- UserField6,
- UserField7,
- UserField8,
- UserField9,
- UserField10,
- Tax_Code_ID,
- Billing_Site,
- Legacy_ID
- )
- SELECT
- [Excel Row Number],
- [Company Name],
- [Company Type],
- [Company Status],
- [Company Market],
- [Track],
- [Source List],
- [Mark As Lead],
- [Territory Name],
- [Company Group],
- [Company ID],
- [Phone Number],
- [Fax Number],
- [Site Name],
- [Address Line 1],
- [Address Line 2],
- [City],
- [State],
- [Zip Code],
- [Country],
- [Website URL],
- [Annual Revenue],
- [Number Of Employees],
- [SIC Code],
- [Company Account],
- [Company Note],
- [Ownership Type],
- [Time Zone],
- [Company TaxID],
- [Payment Terms],
- [User Field 1],
- [User Field 2],
- [User Field 3],
- [User Field 4],
- [User Field 5],
- [User Field 6],
- [User Field 7],
- [User Field 8],
- [User Field 9],
- [User Field 10],
- [Tax Code ID],
- [Billing Site],
- Legacy_ID
- FROM ' + @SourceTable
- EXEC(@DSQL)
- BEGIN TRANSACTION Comp_Validate
- -- Update single space or blank strings to null in validation table
- UPDATE #Import_Staging SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
- Company_Type = CASE WHEN Company_Type IN('', ' ') THEN NULL ELSE Company_Type END,
- Company_Status = CASE WHEN Company_Status IN('', ' ') THEN NULL ELSE Company_Status END,
- Company_Market = CASE WHEN Company_Market IN('', ' ') THEN NULL ELSE Company_Market END,
- Track = CASE WHEN Track IN('', ' ') THEN NULL ELSE Track END,
- SourceList = CASE WHEN SourceList IN('', ' ') THEN NULL ELSE SourceList END,
- MarkAsLead = CASE WHEN MarkAsLead IN('', ' ') THEN NULL ELSE MarkAsLead END,
- Territory = CASE WHEN Territory IN('', ' ') THEN NULL ELSE Territory END,
- [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
- Company_ID = CASE WHEN Company_ID IN('', ' ') THEN NULL ELSE Company_ID END,
- PhoneNbr_Comp = CASE WHEN PhoneNbr_Comp IN('', ' ') THEN NULL ELSE PhoneNbr_Comp END,
- PhoneNbr_Fax = CASE WHEN PhoneNbr_Fax IN('', ' ') THEN NULL ELSE PhoneNbr_Fax END,
- Site_Name = CASE WHEN Site_Name IN('', ' ') THEN NULL ELSE Site_Name END,
- Address_Line1_Comp = CASE WHEN Address_Line1_Comp IN('', ' ') THEN NULL ELSE Address_Line1_Comp END,
- Address_Line2_Comp = CASE WHEN Address_Line2_Comp IN('', ' ') THEN NULL ELSE Address_Line2_Comp END,
- City_Comp = CASE WHEN City_Comp IN('', ' ') THEN NULL ELSE City_Comp END,
- State_Comp = CASE WHEN State_Comp IN('', ' ') THEN NULL ELSE State_Comp END,
- Zip_Comp = CASE WHEN Zip_Comp IN('', ' ') THEN NULL ELSE Zip_Comp END,
- Country_Comp = CASE WHEN Country_Comp IN('', ' ') THEN NULL ELSE Country_Comp END,
- Website_URL = CASE WHEN Website_URL IN('', ' ') THEN NULL ELSE Website_URL END,
- Annual_Revenue = CASE WHEN Annual_Revenue IN('', ' ') THEN NULL ELSE Annual_Revenue END,
- Nbr_Employees = CASE WHEN Nbr_Employees IN('', ' ') THEN NULL ELSE Nbr_Employees END,
- SIC_Code_ID = CASE WHEN SIC_Code_ID IN('', ' ') THEN NULL ELSE SIC_Code_ID END,
- Account_Nbr = CASE WHEN Account_Nbr IN('', ' ') THEN NULL ELSE Account_Nbr END,
- Note_Comp = CASE WHEN Note_Comp IN('', ' ') THEN NULL ELSE Note_Comp END,
- Parent_Company_ID = CASE WHEN Parent_Company_ID IN('', ' ') THEN NULL ELSE Parent_Company_ID END,
- Ownership_Type = CASE WHEN Ownership_Type IN('', ' ') THEN NULL ELSE Ownership_Type END,
- TimeZone = CASE WHEN TimeZone IN('', ' ') THEN NULL ELSE TimeZone END,
- TaxID = CASE WHEN TaxID IN('', ' ') THEN NULL ELSE TaxID END,
- PaymentTerms = CASE WHEN PaymentTerms IN('', ' ') THEN NULL ELSE PaymentTerms END,
- UserField1 = CASE WHEN UserField1 IN('', ' ') THEN NULL ELSE UserField1 END,
- UserField2 = CASE WHEN UserField2 IN('', ' ') THEN NULL ELSE UserField2 END,
- UserField3 = CASE WHEN UserField3 IN('', ' ') THEN NULL ELSE UserField3 END,
- UserField4 = CASE WHEN UserField4 IN('', ' ') THEN NULL ELSE UserField4 END,
- UserField5 = CASE WHEN UserField5 IN('', ' ') THEN NULL ELSE UserField5 END,
- UserField6 = CASE WHEN UserField6 IN('', ' ') THEN NULL ELSE UserField6 END,
- UserField7 = CASE WHEN UserField7 IN('', ' ') THEN NULL ELSE UserField7 END,
- UserField8 = CASE WHEN UserField8 IN('', ' ') THEN NULL ELSE UserField8 END,
- UserField9 = CASE WHEN UserField9 IN('', ' ') THEN NULL ELSE UserField9 END,
- UserField10 = CASE WHEN UserField10 IN('', ' ') THEN NULL ELSE UserField10 END,
- Tax_Code_ID = CASE WHEN Tax_Code_ID IN('', ' ') THEN NULL ELSE Tax_Code_ID END,
- Billing_Site = CASE WHEN Billing_Site IN('', ' ') THEN NULL ELSE Billing_Site END,
- Legacy_ID = CASE WHEN Legacy_ID IN('', ' ') THEN NULL ELSE Legacy_ID END
- UPDATE #Import_Staging
- SET Company_Name = '[No Name]'
- WHERE Company_Name IS NULL
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Company'
- EXEC usp_Import_Match_Legacy @TableName, 'Site'
- END
- -- Clean up Number of Employees field by stripping any commas
- UPDATE #Import_Staging
- SET Nbr_Employees = REPLACE(Nbr_Employees, ',', '')
- ---- If differential mode, delete records which match an existing site -- no longer used
- --DELETE tmp
- --FROM #Import_Staging tmp
- -- INNER JOIN dbo.Company comp
- -- ON comp.Company_Name = tmp.Company_Name
- -- 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
- --WHERE @DiffMode = 1
- -- AND @Legacy_Flag = 0
- ---- If adding a site, inherit company_id from existing company
- --UPDATE tmp
- -- SET tmp.Company_ID = comp.Company_ID
- --FROM #Import_Staging tmp
- -- CROSS APPLY(SELECT TOP 1 * FROM Company comp WHERE comp.Company_Name = tmp.Company_Name) comp
- --WHERE tmp.Company_ID IS NULL
- -- Company_RecID - (for companies which already exist)
- UPDATE tmp
- SET tmp.Company_RecID = comp.Company_RecID
- FROM #Import_Staging tmp
- 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
- WHERE @Legacy_Flag = 0
- -- Tax_Code_RecID
- UPDATE tmp
- SET tmp.Tax_Code_RecID = tc.Tax_Code_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Tax_Code tc
- ON tc.Tax_Code_ID = tmp.Tax_Code_ID
- WHERE tmp.Tax_Code_ID IS NOT NULL
- AND GETDATE() BETWEEN Date_Effective AND ISNULL(Date_Cancel, '1/1/2900')
- -- Company_Type_RecID
- UPDATE tmp
- SET tmp.Company_Type_RecID = ct.Company_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Type ct
- ON ct.[Description] = tmp.Company_Type
- -- If company type not specified, grab default if exists
- UPDATE tmp
- SET tmp.Company_Type_RecID = ct.Company_Type_RecID
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 Company_Type_RecID FROM dbo.Company_Type ct WHERE ct.Default_Flag = 1)ct
- WHERE tmp.Company_Type IS NULL
- -- Company_Status_RecID
- UPDATE tmp
- SET tmp.Company_Status_RecID = cst.Company_Status_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Status cst
- ON cst.[Description] = tmp.Company_Status
- -- Get default company status if not specified
- UPDATE tmp
- SET tmp.Company_Status_RecID = cst.Company_Status_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Status cst
- ON cst.Inactive_Flag = 0
- AND cst.Default_Flag =1
- AND tmp.Company_Status IS NULL
- -- Market_RecID
- UPDATE tmp
- SET tmp.Market_RecID = mk.Market_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Market mk
- ON mk.[Description] = tmp.Company_Market
- ---- WF_Track_Header_RecID
- --UPDATE tmp
- -- SET tmp.WF_Track_Header_RecID = wf.WF_Track_Header_RecID
- --FROM #Import_Staging tmp
- -- INNER JOIN dbo.WF_Track_Header wf
- -- ON wf.[Description] = tmp.Track
- -- AND wf.Inactive_Flag = 0
- -- Territory_Owner_Level_RecID
- UPDATE tmp
- SET tmp.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Owner_Level ol
- ON ol.[Description] = tmp.Territory
- AND ol.Sales_Territory_Flag = 1
- -- If territory not found on name, match on manager member_id
- UPDATE tmp
- SET tmp.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Owner_Level ol
- ON ol.Member_ID = tmp.Territory
- AND ol.Sales_Territory_Flag = 1
- WHERE tmp.Territory_Owner_Level_RecID IS NULL
- AND tmp.Territory IS NOT NULL
- AND ol.Member_ID <> ''
- -- Group_Type_RecID
- UPDATE tmp
- SET tmp.Group_Type_RecID = gt.Group_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Group_Type gt
- ON gt.Company_Group_Name = tmp.[Group]
- AND gt.Company_Flag = 1
- -- Site_Company_Address_RecID
- UPDATE tmp
- SET tmp.Site_Company_Address_RecID = ca.Company_Address_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Address ca
- ON tmp.Company_RecID = ca.Company_RecID
- AND ca.[Description] = tmp.Site_Name
- -- Get State_ID
- UPDATE tmp
- SET tmp.State_ID = st.State_ID
- FROM #Import_Staging tmp
- INNER JOIN dbo.States st
- ON st.[Description] = tmp.State_Comp
- OR st.[State_ID] = tmp.State_Comp
- -- Comp_Country_RecID
- UPDATE tmp
- SET tmp.Comp_Country_RecID = co.Country_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Country co
- ON co.Country = tmp.Country_Comp
- -- Parent_Company_RecID
- UPDATE tmp
- SET tmp.Parent_Company_RecID = cmp.Company_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company cmp
- ON cmp.Company_ID = tmp.Parent_Company_ID
- AND cmp.Delete_Flag = 0
- -- Ownership_Type_RecID
- UPDATE tmp
- SET tmp.Ownership_Type_RecID = ot.Ownership_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Ownership_Type ot
- ON ot.[Description] = tmp.Ownership_Type
- -- Time_Zone_RecID
- UPDATE tmp
- SET tmp.Time_Zone_RecID = tz.Time_Zone_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Time_Zone tz
- ON tz.Time_Zone_Name = tmp.TimeZone
- --OR tz.Hours_Offset = tmp.TimeZone
- -- Billing_Terms_RecID
- UPDATE tmp
- SET tmp.Billing_Terms_RecID = bt.Billing_Terms_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Billing_Terms bt
- ON bt.[Description] = tmp.PaymentTerms
- -- Note_Type_RecID
- UPDATE tmp
- SET tmp.Note_Type_RecID = nt.Note_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN Note_Type nt ON nt.Default_Flag = 1
- -- Determine if each user defined field is used
- ;WITH ufstatus AS
- (
- SELECT TOP 1
- CASE WHEN Company_Userfield_1 = 'Not Used' THEN 0 ELSE 1 END AS UserField1Used,
- CASE WHEN Company_Userfield_2 = 'Not Used' THEN 0 ELSE 1 END AS UserField2Used,
- CASE WHEN Company_Userfield_3 = 'Not Used' THEN 0 ELSE 1 END AS UserField3Used,
- CASE WHEN Company_Userfield_4 = 'Not Used' THEN 0 ELSE 1 END AS UserField4Used,
- CASE WHEN Company_Userfield_5 = 'Not Used' THEN 0 ELSE 1 END AS UserField5Used,
- CASE WHEN Company_Userfield_6 = 'Not Used' THEN 0 ELSE 1 END AS UserField6Used,
- CASE WHEN Company_Userfield_7 = 'Not Used' THEN 0 ELSE 1 END AS UserField7Used,
- CASE WHEN Company_Userfield_8 = 'Not Used' THEN 0 ELSE 1 END AS UserField8Used,
- CASE WHEN Company_Userfield_9 = 'Not Used' THEN 0 ELSE 1 END AS UserField9Used,
- CASE WHEN Company_Userfield_10 = 'Not Used' THEN 0 ELSE 1 END AS UserField10Used
- FROM dbo.[Owner]
- )
- UPDATE tmp
- SET tmp.UserField1Used = ufstatus.UserField1Used,
- tmp.UserField2Used = ufstatus.UserField2Used,
- tmp.UserField3Used = ufstatus.UserField3Used,
- tmp.UserField4Used = ufstatus.UserField4Used,
- tmp.UserField5Used = ufstatus.UserField5Used,
- tmp.UserField6Used = ufstatus.UserField6Used,
- tmp.UserField7Used = ufstatus.UserField7Used,
- tmp.UserField8Used = ufstatus.UserField8Used,
- tmp.UserField9Used = ufstatus.UserField9Used,
- tmp.UserField10Used = ufstatus.UserField10Used
- FROM #Import_Staging tmp
- CROSS APPLY ufstatus
- -- Determine if each record will constitute a new company
- UPDATE tmp
- SET tmp.NewCompany = 1
- FROM #Import_Staging tmp
- WHERE Company_RecID IS NULL
- AND ExcelRowNumber IN(SELECT MIN(ExcelRowNumber) FROM #Import_Staging WHERE Company_RecID IS NULL GROUP BY Company_Name)
- -- Update Site_Name to 'Main' for new company records
- UPDATE tmp
- SET tmp.Site_Name = 'Main'
- FROM #Import_Staging tmp
- WHERE NewCompany = 1
- AND tmp.Site_Name IS NULL
- -- Generate Site_Name for sites being added to new company records
- ;WITH gsn AS
- (
- SELECT
- ExcelRowNumber,
- 'Site ' + CAST(ROW_NUMBER() OVER(PARTITION BY Company_Name ORDER BY ExcelRowNumber) AS VARCHAR(50)) AS Site_Name
- FROM #Import_Staging stag
- WHERE stag.Site_Name IS NULL
- AND stag.Company_RecID IS NULL
- )
- UPDATE stag
- SET stag.Site_Name = gsn.Site_Name
- FROM #Import_Staging stag
- INNER JOIN gsn
- ON gsn.ExcelRowNumber = stag.ExcelRowNumber
- -- Table to Force compilation regardless of structure
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- CREATE TABLE #Force_Compile
- (
- Column_Name VARCHAR(20)
- )
- -- If running in 'Force Mode', create necessary references
- IF @ForceMode = 1
- BEGIN
- -- Insert states
- -- Pre-2017.1
- IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(OBJECT_ID) = 'States')
- BEGIN
- INSERT INTO dbo.States
- (
- State_ID,
- [Description],
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- SUBSTRING(State_Comp, 1, 50),
- SUBSTRING(State_Comp, 1, 50),
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging tmp
- WHERE tmp.State_Comp IS NOT NULL
- AND tmp.State_ID IS NULL
- END
- -- Post-2017.1
- IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(OBJECT_ID) = 'States')
- BEGIN
- INSERT INTO dbo.States
- (
- State_ID,
- [Description],
- Last_Update,
- Updated_By,
- Entered_By,
- Date_Entered_UTC
- )
- SELECT DISTINCT
- SUBSTRING(State_Comp, 1, 50),
- SUBSTRING(State_Comp, 1, 50),
- GETDATE(),
- @ImportBatchUser,
- 'zAdmin',
- GETUTCDATE()
- FROM #Import_Staging tmp
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- WHERE tmp.State_Comp IS NOT NULL
- AND tmp.State_ID IS NULL
- END
- -- Get State_ID for newly inserted records
- UPDATE tmp
- SET tmp.State_ID = st.State_ID
- FROM #Import_Staging tmp
- INNER JOIN dbo.States st
- ON st.[Description] = tmp.State_Comp
- OR st.[State_ID] = tmp.State_Comp
- WHERE st.Updated_By = @ImportBatchUser
- -- Insert countries
- INSERT INTO dbo.Country
- (
- Owner_ID,
- Country,
- City_Caption,
- State_Caption,
- Zip_Caption,
- Updated_By,
- Currency_ID
- )
- SELECT DISTINCT
- 1,
- Country_Comp,
- 'City',
- 'State',
- 'Zip',
- @ImportBatchUser,
- 'USD'
- FROM #Import_Staging tmp
- WHERE tmp.Country_Comp IS NOT NULL
- AND tmp.Comp_Country_RecID IS NULL
- -- Get Country_RecID for newly inserted records
- UPDATE tmp
- SET tmp.Comp_Country_RecID = cn.Country_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Country cn
- ON cn.Country = tmp.Country_Comp
- WHERE cn.Updated_By = @ImportBatchUser
- -- Insert Markets
- INSERT INTO dbo.Market
- (
- Owner_ID,
- [Description],
- Updated_By
- )
- SELECT DISTINCT
- 1,
- Company_Market,
- @ImportBatchUser
- FROM #Import_Staging tmp
- WHERE tmp.Market_RecID IS NULL
- AND tmp.Company_Market IS NOT NULL
- -- Market_RecID
- UPDATE stag
- SET stag.Market_RecID = mk.Market_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Market mk
- ON mk.[Description] = stag.Company_Market
- WHERE mk.Updated_By = @ImportBatchUser
- AND stag.Market_RecID IS NULL
- AND stag.Company_Market IS NOT NULL
- -- Insert company types
- INSERT INTO Company_Type
- (
- [Description],
- Company_Type_ID,
- Updated_By
- )
- SELECT DISTINCT
- Company_Type,
- SUBSTRING(Company_Type, 1, 5),
- @ImportBatchUser
- FROM #Import_Staging tmp
- WHERE tmp.Company_Type_RecID IS NULL
- -- Company_Type_RecID
- UPDATE tmp
- SET tmp.Company_Type_RecID = ct.Company_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Type ct
- ON ct.[Description] = tmp.Company_Type
- AND ct.Updated_By = @ImportBatchUser
- -- Insert Payment Terms
- INSERT INTO Billing_terms
- (
- Owner_ID,
- [Description],
- Default_Flag,
- Updated_By,
- --Last_Update,
- Due_Days,
- Terms_Xref
- )
- SELECT DISTINCT
- 1,
- PaymentTerms,
- 0,
- @ImportBatchUser,
- --GETDATE(),
- 0,
- ''
- FROM #Import_Staging tmp
- WHERE tmp.PaymentTerms IS NOT NULL
- AND tmp.Billing_Terms_RecID IS NULL
- -- Billing_Terms_RecID
- UPDATE tmp
- SET tmp.Billing_Terms_RecID = bt.Billing_Terms_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Billing_Terms bt
- ON bt.[Description] = tmp.PaymentTerms
- -- Insert company statuses
- INSERT INTO dbo.Company_Status
- (
- Owner_ID,
- Company_Status_ID,
- [Description],
- Default_Flag,
- Inactive_Flag,
- Last_Update,
- Updated_By,
- Import_Flag,
- Survey_RecID,
- Notify_Flag,
- Notify_Message,
- StandardNote_Flag,
- CustomNote_Flag,
- Cancel_Track_Flag
- )
- SELECT DISTINCT
- 1,
- '',
- tmp.Company_Status,
- 0,
- 0,
- GETDATE(),
- @ImportBatchUser,
- 0,
- 0,
- 0,
- '',
- 0,
- 0,
- 0
- FROM #Import_Staging tmp
- WHERE tmp.Company_Status_RecID IS NULL
- AND tmp.Company_Status IS NOT NULL
- -- Company_Status_RecID
- UPDATE tmp
- SET tmp.Company_Status_RecID = cst.Company_Status_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Status cst
- ON cst.[Description] = tmp.Company_Status
- -- If company name already exists for another company name, place a 'z' at the front (used for CW migration)
- UPDATE tmp
- SET tmp.Company_ID = 'z' + tmp.Company_ID
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_ID = tmp.Company_ID AND comp.Company_Name <> tmp.Company_Name) comp
- WHERE @Legacy_Flag = 0
- -- Billing site cannot exist for target company
- UPDATE tmp
- SET tmp.[Billing_Site] = 0
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_RecID = tmp.Company_ReciD AND cad.Default_Bill_Flag = 1)cad
- WHERE tmp.Billing_Site = 1
- AND @Legacy_Flag = 1
- END
- -- Begin validation
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Company name is required
- SELECT
- tmp.ExcelRowNumber,
- 'Company name is required'
- FROM #Import_Staging tmp
- WHERE tmp.Company_Name IS NULL
- AND @Legacy_Flag = 0
- UNION ALL
- -- Company_ID is required if a company with the same name already exists
- SELECT
- tmp.ExcelRowNumber,
- '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'
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company comp
- ON comp.Company_Name = tmp.Company_Name
- AND tmp.Company_ID IS NULL
- AND comp.Delete_Flag = 0
- AND @Legacy_Flag = 0
- UNION ALL
- -- Company name cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Company name cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(Company_Name) > 50
- UNION ALL
- -- Company with the same Company_ID cannot exist with a different company name (even if deleted - mirrored from PSA validation)
- SELECT
- tmp.ExcelRowNumber,
- '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 + '"'
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company comp
- ON comp.Company_ID = tmp.Company_ID
- AND comp.Company_Name <> tmp.Company_Name
- WHERE tmp.Company_Name IS NOT NULL
- AND tmp.Company_ID IS NOT NULL
- AND @Legacy_Flag = 0
- UNION ALL
- -- Can't have companies with duplicate company_id but different name in spreadsheet
- SELECT
- tmp.ExcelRowNumber,
- '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
- exactly'
- FROM #Import_Staging tmp
- INNER JOIN #Import_Staging tmp2
- ON tmp.Company_ID = tmp2.Company_ID
- AND tmp.Company_Name <> tmp2.Company_Name
- WHERE tmp.Company_ID IS NOT NULL
- AND tmp.Company_Name IS NOT NULL
- AND @Legacy_Flag = 0
- UNION ALL
- -- If adding a site/address, site name is required (Same as PSA)
- SELECT
- tmp.ExcelRowNumber,
- '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.'
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company comp
- ON tmp.Company_RecID = comp.Company_RecID
- WHERE tmp.Site_Name IS NULL
- AND @Legacy_Flag = 0
- UNION ALL
- -- Site name cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Site name cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Site_Name) > 50
- UNION ALL
- -- Can't add a site to a deleted company
- SELECT
- tmp.ExcelRowNumber,
- 'Unable to add a site to the deleted company: "' + tmp.Company_Name + '"'
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company comp
- ON tmp.Company_RecID = comp.Company_RecID
- WHERE comp.Delete_Flag = 1
- AND @Legacy_Flag = 0
- UNION ALL
- -- Company_Type is required and must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- CASE
- WHEN tmp.Company_Type IS NULL THEN 'No company type was supplied and no default type exists'
- WHEN tmp.Company_Type_RecID IS NULL THEN 'The company type: "' + tmp.Company_Type + '" does not exist. [Setup] -> [Setup Tables] -> [Company Type]'
- END
- FROM #Import_Staging tmp
- WHERE Company_Type_RecID IS NULL
- UNION ALL
- -- Company_Status is required and must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- CASE
- WHEN tmp.Company_Status IS NULL THEN 'No company status was supplied and no default status exists'
- WHEN tmp.Company_Status_RecID IS NULL THEN 'The company status: "' + tmp.Company_Status + '" does not exist. [Setup] -> [Setup Tables] -> [Company Status]'
- END
- FROM #Import_Staging tmp
- WHERE tmp.Company_Status_RecID IS NULL
- UNION ALL
- -- If specified, market must be valid
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Market: "' + tmp.Company_Market + '" [Setup] -> [Setup Tables] -> [Market Description]'
- FROM #Import_Staging tmp
- WHERE tmp.Market_RecID IS NULL
- AND tmp.Company_Market IS NOT NULL
- UNION ALL
- ---- If specified, track must be valid
- --SELECT
- -- tmp.ExcelRowNumber,
- -- 'Invalid Track: "' + tmp.Track + '" track does not exist or is inactive - [Setup] -> [Setup Tables] -> [Tracks]'
- --FROM #Import_Staging tmp
- --WHERE tmp.WF_Track_Header_RecID IS NULL
- -- AND tmp.Track IS NOT NULL
- --UNION ALL
- ---- Track must not already be assigned to company
- --SELECT
- -- tmp.ExcelRowNumber,
- -- 'Track: ' + tr.[Description] + ' is already assigned to Company: "' + tmp.Company_Name
- --FROM #Import_Staging tmp
- -- INNER JOIN WF_Track_Attach_Header tr
- -- ON tr.Table_Reference = 'company'
- -- AND tr.RecID_Field = 'Company_RecID'
- -- AND tr.RecID = tmp.Company_RecID
- -- AND (tr.Date_End IS NULL OR tr.Date_End >= GETDATE())
- -- AND tmp.WF_Track_Header_RecID = tr.WF_Track_Header_RecID
- --UNION ALL
- -- Source List cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Source list cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.SourceList) > 50
- UNION ALL
- -- MarkAsLead must evaluate to True or False (null assumes no)
- SELECT
- tmp.ExcelRowNumber,
- 'If specified, "Mark as Lead" must be Yes or No'
- FROM #Import_Staging tmp
- WHERE MarkAsLead IS NOT NULL
- AND MarkAsLead NOT IN('Y', 'N', '0', '1', 'Yes', 'No', 'T', 'F', 'True', 'False')
- UNION ALL
- -- Territory must be a valid reference if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid territory: "' + tmp.Territory + '" - does not exist or is not marked as a territory'
- FROM #Import_Staging tmp
- WHERE tmp.Territory_Owner_Level_RecID IS NULL
- AND tmp.Territory IS NOT NULL
- UNION ALL
- -- Group must be a valid reference if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid group: "' + tmp.[Group] + '" does not exist, or is not configured as a company group [Setup] -> [Setup Tables] -> [Group]'
- FROM #Import_Staging tmp
- WHERE tmp.[Group] IS NOT NULL
- AND tmp.Group_Type_RecID IS NULL
- UNION ALL
- -- Company Phone number cannot exceed 30 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Company Phone number cannot exceed 30 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.PhoneNbr_Comp) > 30
- AND @ForceMode <> 1
- UNION ALL
- -- Company fax number cannot exceed 30 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Company fax number cannot exceed 30 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.PhoneNbr_Fax) > 30
- AND @ForceMode <> 1
- UNION ALL
- -- Company address line 1 cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Company address line 1 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Address_Line1_Comp) > 50
- UNION ALL
- -- Company address line 2 cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Company address line 2 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Address_Line2_Comp) > 50
- UNION ALL
- -- City cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'City cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.City_Comp) > 50
- UNION ALL
- -- Tax_Code_ID must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Tax_Code_ID: "' + tmp.Tax_Code_ID + '" is invalid or inactive.'
- FROM #Import_Staging tmp
- WHERE tmp.Tax_Code_ID IS NOT NULL
- AND tmp.Tax_Code_RecID IS NULL
- UNION ALL
- -- State must be a valid reference if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid State: "' + tmp.State_Comp + '" [Setup] -> [Setup Tables] -> [State]'
- FROM #Import_Staging tmp
- WHERE tmp.State_ID IS NULL
- AND State_Comp IS NOT NULL
- UNION ALL
- -- Country must be a valid reference if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Country: "' + tmp.Country_Comp + '" [Setup] -> [Setup Tables] -> [Country]'
- FROM #Import_Staging tmp
- WHERE tmp.Comp_Country_RecID IS NULL
- AND tmp.Country_Comp IS NOT NULL
- UNION ALL
- -- Website URL cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Website URL cannot exceed 250 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Website_URL) > 250
- AND @Forcemode = 0
- UNION ALL
- -- Annual Revenue must be numeric
- SELECT
- tmp.ExcelRowNumber,
- 'Annual revenue must be numeric with no punctuation or symbols'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.Annual_Revenue + 'e0') <> 1
- AND tmp.Annual_Revenue IS NOT NULL
- UNION ALL
- -- Cannot have more than one billing site
- SELECT
- MIN(tmp.ExcelRowNumber),
- 'Cannot have more than one billing site for company ' + Company_Name
- FROM #Import_Staging tmp
- WHERE Billing_Site = 1
- AND @Legacy_Flag = 0
- GROUP BY Company_Name
- HAVING COUNT(*) > 1
- UNION ALL
- SELECT
- MIN(tmp.ExcelRowNumber),
- 'Cannot have more than one billing site for legacy company ' + Legacy_ID
- FROM #Import_Staging tmp
- WHERE Billing_Site = 1
- AND @Legacy_Flag = 1
- GROUP BY Legacy_ID
- HAVING COUNT(*) > 1
- UNION ALL
- -- Billing site must be 0 or 1
- SELECT
- tmp.ExcelRowNumber,
- 'Billing Site must be 0 or 1'
- FROM #Import_Staging tmp
- WHERE Billing_Site IS NOT NULL
- AND Billing_Site NOT IN('0', '1')
- UNION ALL
- -- Billing site cannot exist for target company
- SELECT
- tmp.ExcelRowNumber,
- 'A billing site already exists for company : ' + tmp.Company_Name
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_Name = tmp.Company_Name) comp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_RecID = comp.Company_ReciD AND cad.Default_Bill_Flag = 1)cad
- WHERE tmp.Billing_Site = 1
- AND @Legacy_Flag = 0
- UNION ALL
- -- Billing site cannot exist for target company
- SELECT
- tmp.ExcelRowNumber,
- 'A billing site already exists for company : ' + tmp.Legacy_Company_ID
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_RecID = tmp.Company_RecID) comp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_RecID = comp.Company_ReciD AND cad.Default_Bill_Flag = 1)cad
- WHERE tmp.Billing_Site = 1
- AND @Legacy_Flag = 1
- UNION ALL
- -- Number of employees must be an integer
- SELECT
- tmp.ExcelRowNumber,
- 'Number of employees must be a whole number (no decimals)'
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.Nbr_Employees + '.e0') <> 1
- AND tmp.Nbr_Employees IS NOT NULL
- UNION ALL
- -- SIC_Code_ID must be a valid reference if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid SIC_Code_ID: "' + tmp.SIC_Code_ID + '"'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN dbo.SIC_Code sc
- ON dbo.ufn_Import_Trim(sc.SIC_Code_ID) = tmp.SIC_Code_ID
- WHERE tmp.SIC_Code_ID IS NULL
- AND tmp.SIC_Code_ID IS NOT NULL
- UNION ALL
- -- Account_Nbr cannot exceed 100 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Account number cannot exceed 100 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Account_Nbr) > 100
- UNION ALL
- -- If company notes are provided, there must be a default note type
- SELECT DISTINCT
- 0,
- 'In order to enter company notes, there must be a default note type set up. [Setup] -> [Setup Tables] -> [Note Type]'
- FROM #Import_Staging tmp
- WHERE tmp.Note_Type_RecID IS NULL
- UNION ALL
- -- Parent company must exist in Company table or elsewhere in spreadsheet
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid parent company - No company with the Company_ID: "' + tmp.Parent_Company_ID + '" exists in ConnectWise, or in this spreadsheet.'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN #Import_Staging tmp2
- ON tmp.Parent_Company_ID = tmp2.Company_ID
- AND tmp.ExcelRowNumber <> tmp2.ExcelRowNumber
- WHERE tmp.Parent_Company_ID IS NOT NULL
- AND tmp.Parent_Company_RecID IS NULL
- AND tmp2.Company_ID IS NULL
- AND @Legacy_Flag = 0
- UNION ALL
- -- Ownership_Type must be a valid reference if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid ownership type: "' + tmp.Ownership_Type + '" [Setup] -> [Setup Tables] -> [Ownership Type]'
- FROM #Import_Staging tmp
- WHERE tmp.Ownership_Type IS NOT NULL
- AND tmp.Ownership_Type_RecID IS NULL
- UNION ALL
- -- Time_Zone must be a valid reference if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid time zone: "' + tmp.TimeZone + '"'
- FROM #Import_Staging tmp
- WHERE tmp.TimeZone IS NOT NULL
- AND tmp.Time_Zone_RecID IS NULL
- UNION ALL
- -- TaxID cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Tax ID cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.TaxID) > 50
- UNION ALL
- -- Payment terms must be a valid reference if entered
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid payment terms: "' + tmp.PaymentTerms + '" [Setup] -> [Setup Tables] -> [Billing Terms]'
- FROM #Import_Staging tmp
- WHERE tmp.PaymentTerms IS NOT NULL
- AND tmp.Billing_Terms_RecID IS NULL
- UNION ALL
- -- User fields can't be entered if 'Not used' in dbo.Owner
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 1 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField1 IS NOT NULL
- AND UserField1Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 2 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField2 IS NOT NULL
- AND UserField2Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 3 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField3 IS NOT NULL
- AND UserField3Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 4 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField4 IS NOT NULL
- AND UserField4Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 5 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField5 IS NOT NULL
- AND UserField5Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 6 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField6 IS NOT NULL
- AND UserField6Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 7 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField7 IS NOT NULL
- AND UserField7Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 8 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField8 IS NOT NULL
- AND UserField8Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 9 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField9 IS NOT NULL
- AND UserField9Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 10 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE UserField10 IS NOT NULL
- AND UserField10Used = 0
- UNION ALL
- -- User fields cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'User field 1 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField1) > 50
- AND UserField1Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 2 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField2) > 50
- AND UserField2Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 3 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField3) > 50
- AND UserField3Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 4 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField4) > 50
- AND UserField4Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 5 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField5) > 50
- AND UserField5Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 6 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField6) > 50
- AND UserField6Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 7 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField7) > 50
- AND UserField7Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 8 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField8) > 50
- AND UserField8Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 9 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField9) > 50
- AND UserField9Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 10 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(UserField10) > 50
- AND UserField10Used = 1
- -- Clean up
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- -- Return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- UPDATE #tblResults SET ValMsg = '<NULL>' WHERE ValMsg IS NULL
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed
- ROLLBACK TRANSACTION
- END
- ELSE
- BEGIN
- -- Insert warning for duplicate on company name but different Company_ID:
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag
- )
- SELECT
- tmp.ExcelRowNumber,
- '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.',
- 1
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company comp
- ON comp.Company_Name = tmp.Company_Name
- AND ISNULL(comp.Company_ID, 'zxCompany_ID') <> ISNULL(tmp.Company_ID, 'zxCompany_ID')
- WHERE tmp.Company_Name IS NOT NULL
- AND comp.Delete_Flag = 0
- AND tmp.Company_RecID IS NULL
- AND @Legacy_Flag = 0
- -- If force mode = 1, insert notification messages for any created references
- IF @ForceMode = 1
- BEGIN
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag,
- ReferenceType
- )
- SELECT
- NULL,
- [Description],
- 1,
- 'State(s)'
- FROM dbo.States
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- Country,
- 1,
- 'Country(s)'
- FROM dbo.Country
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- [Description],
- 1,
- 'Market(s)'
- FROM dbo.Market
- WHERE Updated_by = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- [Description],
- 1,
- 'Company Type(s)'
- FROM dbo.Company_Type
- WHERE Updated_by = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- [Description],
- 1,
- 'Payment Term(s)'
- FROM dbo.Billing_Terms
- WHERE Updated_by = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- [Description],
- 1,
- 'Payment Term(s)'
- FROM dbo.Company_Status
- WHERE Updated_by = @ImportBatchUser
- END
- -- Warn about duplicate site names (not applicable in differential mode)
- IF @DiffMode = 0
- BEGIN
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag
- )
- SELECT
- tmp.ExcelRowNumber,
- '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',
- 1
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company comp
- ON comp.Company_RecID = tmp.Company_RecID
- INNER JOIN Company_Address ca
- ON ca.Company_RecID = comp.Company_RecID
- AND dbo.ufn_Import_Trim(ca.[Description]) = tmp.Site_Name
- AND ca.Inactive_Flag = 0
- AND @Legacy_Flag = 0
- END
- -- Return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed res
- UNION ALL
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- LEFT('The following ' + ReferenceType + ' will be created: '+
- STUFF(
- (SELECT ', ' + ValMsg
- FROM #tblResults
- WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
- FOR XML PATH (''))
- , 1, 1, ''), 750) AS ValMsg
- FROM #tblResults res
- WHERE ReferenceType IS NOT NULL
- GROUP BY ReferenceType
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- END
- ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS ValMsg
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- END
- END
- END TRY
- BEGIN CATCH
- -- Return error information and rollback transaction
- SELECT
- 0 AS ValPassed,
- ERROR_LINE() AS ExcelRowNumber,
- ERROR_MESSAGE() AS ErrorDetails
- ROLLBACK TRANSACTION
- END CATCH
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 05/08/2013
- -- Description: Performs final insert of data
- -- from import spreadsheet for Company Import
- -- Sample call: exec usp_Comp_ImportPush 'Comp_Import_Test', 0, 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_Comp_ImportPush]
- @TableName VARCHAR(MAX),
- @DiffMode BIT = 0, -- Differential mode - (for custom imports) does not import records where company_name already exists
- @Forcemode BIT = 1
- AS
- BEGIN TRY
- SET NOCOUNT ON
- -- Turn off diff mode - no longer used
- SELECT @DiffMode = 0
- -- Set date format to MDY to validate dates from excel
- SET DATEFORMAT MDY
- -- Variable declaration
- DECLARE
- @ExpRowCount INT, -- Expected rowcount for inserts
- @ImportBatchID INT, -- Import batch number used for mass-maintenance
- @ImportBatchUser VARCHAR(15), -- Member_ID to use for 'UpdatedBy' to identify this batch (i.e. Import3049)
- @ErrorMsg VARCHAR(1500),
- @Curr_Track_Dtl_Record INT -- Identity used to drive the loop to insert track detail records
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Dynamic statement to insert to validation table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Table to hold trimmed company names and company_ids from dbo.company
- -- Prevents need to join on trim function each time we touch company table (performance concern)
- DECLARE @Company TABLE
- (
- Company_RecID INT,
- Company_ID VARCHAR(50),
- Company_Name VARCHAR(50),
- Delete_Flag BIT
- )
- INSERT INTO @Company
- (
- Company_RecID,
- Company_ID,
- Company_Name,
- Delete_Flag
- )
- SELECT
- Company_RecID,
- Company_ID,
- Company_Name,
- Delete_Flag
- FROM dbo.Company
- -- Add Tax Code ID field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Tax Code ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Tax Code ID] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Billing Site field if it doesn't exist (field is optional to accommodate legacy templates)
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Billing Site')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Billing Site] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Add Legacy_ID field if it doesn't exist
- IF NOT EXISTS(SELECT TOP 1 * FROM tempdb.sys.columns WHERE object_id = object_id(@SourceTable) AND name = 'Legacy_ID')
- BEGIN
- SELECT @DSQL =
- '
- ALTER TABLE ' + @SourceTable + '
- ADD [Legacy_ID] NVARCHAR(250) COLLATE DATABASE_DEFAULT
- '
- EXEC(@DSQL)
- END
- -- Table to hold source data for this batch from temp table
- IF (OBJECT_ID('tempdb..#Import_Staging') IS NOT NULL)
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT NULL,
- Company_Name varchar(50) COLLATE DATABASE_DEFAULT NULL,
- Company_ID varchar(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Type varchar(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Status varchar(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Market varchar(50) COLLATE DATABASE_DEFAULT NULL,
- Track nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- SourceList nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- MarkAsLead nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Territory nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Group] nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- PhoneNbr_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- PhoneNbr_Fax nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Site_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Address_Line1_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Address_Line2_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- City_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- State_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Zip_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Country_Comp nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Website_URL nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Annual_Revenue nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Nbr_Employees nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- SIC_Code_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Account_Nbr nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Note_Comp nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- Parent_Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Ownership_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- TimeZone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- TaxID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- PaymentTerms NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- UserField1 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField2 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField3 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField4 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField5 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField6 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField7 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField8 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField9 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- UserField10 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- BatchID UNIQUEIDENTIFIER NULL,
- Company_RecID INT,
- Company_Type_RecID INT,
- Company_Status_RecID INT,
- Market_RecID INT,
- WF_Track_Header_RecID INT,
- Territory_Owner_Level_RecID INT,
- Group_Type_RecID INT,
- Site_Company_Address_RecID INT,
- State_ID VARCHAR(50) COLLATE DATABASE_DEFAULT,
- Comp_Country_RecID INT,
- Parent_Company_RecID INT,
- Ownership_Type_RecID INT,
- Time_Zone_RecID INT,
- Billing_Terms_RecID INT,
- Contact_RecID INT,
- Contact_Type_RecID INT,
- Note_Type_RecID INT,
- NewCompany BIT,
- EnteredBy VARCHAR(15) COLLATE DATABASE_DEFAULT,
- InsertOrder INT,
- PhoneCleanupReq BIT,
- FaxCleanupReq BIT,
- New_Identity INT,
- Company_Address_RecID_New INT,
- Owner_ID INT,
- Auto_Company_ID BIT,
- WF_Track_Attach_Header_RecID INT,
- Track_Detail_Processed BIT,
- Tax_Code_ID VARCHAR(50) COLLATE DATABASE_DEFAULT,
- Tax_Code_RecID INT,
- Billing_Delivery_RecID INT,
- Billing_Site NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_ID NVARCHAR(250) COLLATE DATABASE_DEFAULT,
- Exclude BIT DEFAULT 0,
- Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Company_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Company_Address_RecID INT,
- SR_Service_RecID INT,
- SO_Opportunity_RecID INT,
- Legacy_Contact_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Legacy_Ticket_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Legacy_Opp_ID NVARCHAR(255) COLLATE DATABASE_DEFAULT,
- Diff_Exclude_Flag BIT
- )
- CREATE INDEX IX_Legacy_ID ON #Import_Staging(Legacy_ID)
- CREATE INDEX IX_ExcelRow ON #Import_Staging(ExcelRowNumber)
- IF NOT EXISTS(SELECT 1 FROM tempdb.sys.indexes WHERE OBJECT_ID = @Source_Object_ID AND Name = 'IX_ExcelRow')
- BEGIN
- EXEC('CREATE INDEX IX_ExcelRow ON tempdb.dbo.' + @TableName + '([Excel Row Number])')
- END
- -- Build statement to populate staging table
- -- Convert blank string or single space to null
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- Company_Name,
- Company_Type,
- Company_Status,
- Company_Market,
- Track,
- SourceList,
- MarkAsLead,
- Territory,
- [Group],
- Company_ID,
- PhoneNbr_Comp,
- PhoneNbr_Fax,
- Site_Name,
- Address_Line1_Comp,
- Address_Line2_Comp,
- City_Comp,
- State_Comp,
- Zip_Comp,
- Country_Comp,
- Website_URL,
- Annual_Revenue,
- Nbr_Employees,
- SIC_Code_ID,
- Account_Nbr,
- Note_Comp,
- Ownership_Type,
- TimeZone,
- TaxID,
- PaymentTerms,
- UserField1,
- UserField2,
- UserField3,
- UserField4,
- UserField5,
- UserField6,
- UserField7,
- UserField8,
- UserField9,
- UserField10,
- NewCompany,
- Track_Detail_Processed,
- Tax_Code_ID,
- Billing_Site,
- Legacy_ID
- )
- SELECT
- [Excel Row Number],
- LEFT([Company Name], 50),
- LEFT([Company Type], 50),
- LEFT([Company Status], 50),
- LEFT([Company Market], 50),
- [Track],
- [Source List],
- [Mark As Lead],
- [Territory Name],
- [Company Group],
- LEFT([Company ID], 50),
- [Phone Number],
- [Fax Number],
- [Site Name],
- [Address Line 1],
- [Address Line 2],
- [City],
- [State],
- [Zip Code],
- [Country],
- [Website URL],
- [Annual Revenue],
- [Number Of Employees],
- [SIC Code],
- [Company Account],
- [Company Note],
- [Ownership Type],
- [Time Zone],
- [Company TaxID],
- [Payment Terms],
- [User Field 1],
- [User Field 2],
- [User Field 3],
- [User Field 4],
- [User Field 5],
- [User Field 6],
- [User Field 7],
- [User Field 8],
- [User Field 9],
- [User Field 10],
- 0,
- 0,
- LEFT([Tax Code ID], 50),
- [Billing Site],
- Legacy_ID
- FROM ' + @SourceTable
- EXEC(@DSQL)
- BEGIN TRANSACTION Comp_Import
- -- Convert empty string or single space to null in source table
- UPDATE #Import_Staging SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
- Company_Type = CASE WHEN Company_Type IN('', ' ') THEN NULL ELSE Company_Type END,
- Company_Status = CASE WHEN Company_Status IN('', ' ') THEN NULL ELSE Company_Status END,
- Company_Market = CASE WHEN Company_Market IN('', ' ') THEN NULL ELSE Company_Market END,
- Track = CASE WHEN Track IN('', ' ') THEN NULL ELSE Track END,
- SourceList = CASE WHEN SourceList IN('', ' ') THEN NULL ELSE SourceList END,
- MarkAsLead = CASE WHEN MarkAsLead IN('', ' ') THEN NULL ELSE MarkAsLead END,
- Territory = CASE WHEN Territory IN('', ' ') THEN NULL ELSE Territory END,
- [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
- Company_ID = CASE WHEN Company_ID IN('', ' ') THEN NULL ELSE Company_ID END,
- PhoneNbr_Comp = CASE WHEN PhoneNbr_Comp IN('', ' ') THEN NULL ELSE PhoneNbr_Comp END,
- PhoneNbr_Fax = CASE WHEN PhoneNbr_Fax IN('', ' ') THEN NULL ELSE PhoneNbr_Fax END,
- Site_Name = CASE WHEN Site_Name IN('', ' ') THEN NULL ELSE Site_Name END,
- Address_Line1_Comp = CASE WHEN Address_Line1_Comp IN('', ' ') THEN NULL ELSE Address_Line1_Comp END,
- Address_Line2_Comp = CASE WHEN Address_Line2_Comp IN('', ' ') THEN NULL ELSE Address_Line2_Comp END,
- City_Comp = CASE WHEN City_Comp IN('', ' ') THEN NULL ELSE City_Comp END,
- State_Comp = CASE WHEN State_Comp IN('', ' ') THEN NULL ELSE State_Comp END,
- Zip_Comp = CASE WHEN Zip_Comp IN('', ' ') THEN NULL ELSE Zip_Comp END,
- Country_Comp = CASE WHEN Country_Comp IN('', ' ') THEN NULL ELSE Country_Comp END,
- Website_URL = CASE WHEN Website_URL IN('', ' ') THEN NULL ELSE Website_URL END,
- Annual_Revenue = CASE WHEN Annual_Revenue IN('', ' ') THEN NULL ELSE Annual_Revenue END,
- Nbr_Employees = CASE WHEN Nbr_Employees IN('', ' ') THEN NULL ELSE Nbr_Employees END,
- SIC_Code_ID = CASE WHEN SIC_Code_ID IN('', ' ') THEN NULL ELSE SIC_Code_ID END,
- Account_Nbr = CASE WHEN Account_Nbr IN('', ' ') THEN NULL ELSE Account_Nbr END,
- Note_Comp = CASE WHEN Note_Comp IN('', ' ') THEN NULL ELSE Note_Comp END,
- Parent_Company_ID = CASE WHEN Parent_Company_ID IN('', ' ') THEN NULL ELSE Parent_Company_ID END,
- Ownership_Type = CASE WHEN Ownership_Type IN('', ' ') THEN NULL ELSE Ownership_Type END,
- TimeZone = CASE WHEN TimeZone IN('', ' ') THEN NULL ELSE TimeZone END,
- TaxID = CASE WHEN TaxID IN('', ' ') THEN NULL ELSE TaxID END,
- PaymentTerms = CASE WHEN PaymentTerms IN('', ' ') THEN NULL ELSE PaymentTerms END,
- UserField1 = CASE WHEN UserField1 IN('', ' ') THEN NULL ELSE UserField1 END,
- UserField2 = CASE WHEN UserField2 IN('', ' ') THEN NULL ELSE UserField2 END,
- UserField3 = CASE WHEN UserField3 IN('', ' ') THEN NULL ELSE UserField3 END,
- UserField4 = CASE WHEN UserField4 IN('', ' ') THEN NULL ELSE UserField4 END,
- UserField5 = CASE WHEN UserField5 IN('', ' ') THEN NULL ELSE UserField5 END,
- UserField6 = CASE WHEN UserField6 IN('', ' ') THEN NULL ELSE UserField6 END,
- UserField7 = CASE WHEN UserField7 IN('', ' ') THEN NULL ELSE UserField7 END,
- UserField8 = CASE WHEN UserField8 IN('', ' ') THEN NULL ELSE UserField8 END,
- UserField9 = CASE WHEN UserField9 IN('', ' ') THEN NULL ELSE UserField9 END,
- UserField10 = CASE WHEN UserField10 IN('', ' ') THEN NULL ELSE UserField10 END,
- Tax_Code_ID = CASE WHEN Tax_Code_ID IN('', ' ') THEN NULL ELSE Tax_Code_ID END
- UPDATE stag
- SET stag.Company_Name = '[No Name]'
- FROM #Import_Staging stag
- WHERE stag.Company_Name IS NULL
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Company'
- EXEC usp_Import_Match_Legacy @TableName, 'Site'
- END
- -- If adding a site, inherit company_id from existing company
- UPDATE tmp
- SET tmp.Company_ID = comp.Company_ID
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 * FROM Company comp WHERE comp.Company_Name = tmp.Company_Name) comp
- WHERE tmp.Company_ID IS NULL
- AND @Legacy_Flag = 0
- -- Clean up number of employees field by stripping commas
- UPDATE #Import_Staging
- SET Nbr_Employees = REPLACE(Nbr_Employees, ',', '')
- -- Set Annual_Revenue to 0.00 if NULL
- UPDATE #Import_Staging
- SET Annual_Revenue = '0.00'
- WHERE Annual_Revenue IS NULL
- -- Company_RecID - (for companies which already exist)
- UPDATE stag
- SET stag.Company_RecID = comp.Company_RecID
- FROM #Import_Staging stag
- INNER JOIN @Company comp
- ON comp.Company_Name = stag.Company_Name
- AND comp.Company_ID = stag.Company_ID
- WHERE @Legacy_Flag = 0
- -- Site_Company_Address_RecID
- UPDATE stag
- SET stag.Site_Company_Address_RecID = ca.Company_Address_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company_Address ca
- ON ca.[Description] = stag.Site_Name
- AND stag.Company_RecID = ca.Company_RecID
- WHERE @Legacy_Flag = 0
- -- Company_Type_RecID
- UPDATE stag
- SET stag.Company_Type_RecID = ct.Company_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company_Type ct
- ON ct.[Description] = stag.Company_Type
- -- If company type not specified, grab default if exists
- UPDATE stag
- SET stag.Company_Type_RecID = ct.Company_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company_Type ct
- ON ct.Default_Flag = 1
- AND stag.Company_Type IS NULL
- -- Tax_Code_RecID
- UPDATE tmp
- SET tmp.Tax_Code_RecID = tc.Tax_Code_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Tax_Code tc
- ON tc.Tax_Code_ID = tmp.Tax_Code_ID
- WHERE GETDATE() BETWEEN Date_Effective AND ISNULL(Date_Cancel, '1/1/2900')
- -- Company_Status_RecID
- UPDATE stag
- SET stag.Company_Status_RecID = cst.Company_Status_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company_Status cst
- ON cst.[Description] = stag.Company_Status
- -- Get default company status if not specified
- UPDATE stag
- SET stag.Company_Status_RecID = cst.Company_Status_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company_Status cst
- ON cst.Inactive_Flag = 0
- AND cst.Default_Flag =1
- AND stag.Company_Status IS NULL
- -- Market_RecID
- UPDATE stag
- SET stag.Market_RecID = mk.Market_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Market mk
- ON mk.[Description] = stag.Company_Market
- -- WF_Track_Header_RecID
- UPDATE stag
- SET stag.WF_Track_Header_RecID = wf.WF_Track_Header_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.WF_Track_Header wf
- ON wf.[Description] = stag.Track
- -- Territory_Owner_Level_RecID
- UPDATE stag
- SET stag.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Owner_Level ol
- ON ol.[Description] = stag.Territory
- AND (ol.Sales_Territory_Flag = 1 OR ol.Location_Flag = 1)
- -- Owner_Level_RecID (if null, default to top location)
- UPDATE stag
- SET stag.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Owner_Level ol WHERE ol.Location_Flag = 1 ORDER BY Owner_Level_ID ASC) ol
- WHERE stag.Territory IS NULL
- -- If territory not found on name, match on manager member_id
- UPDATE tmp
- SET tmp.Territory_Owner_Level_RecID = ol.Owner_Level_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Owner_Level ol
- ON ol.Member_ID = tmp.Territory
- AND ol.Sales_Territory_Flag = 1
- WHERE tmp.Territory_Owner_Level_RecID IS NULL
- AND tmp.Territory IS NOT NULL
- AND ol.Member_ID <> ''
- -- Group_Type_RecID
- UPDATE stag
- SET stag.Group_Type_RecID = gt.Group_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Group_Type gt
- ON gt.Company_Group_Name = stag.[Group]
- AND gt.Company_Flag = 1
- -- Get State_ID
- UPDATE stag
- SET stag.State_ID = st.State_ID
- FROM #Import_Staging stag
- INNER JOIN dbo.States st
- ON st.[Description] = stag.State_Comp
- OR st.[State_ID] = stag.State_Comp
- -- Comp_Country_RecID
- UPDATE stag
- SET stag.Comp_Country_RecID = co.Country_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Country co
- ON co.Country = stag.Country_Comp
- -- Ownership_Type_RecID
- UPDATE stag
- SET stag.Ownership_Type_RecID = ot.Ownership_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Ownership_Type ot
- ON ot.[Description] = stag.Ownership_Type
- -- Time_Zone_RecID
- UPDATE stag
- SET stag.Time_Zone_RecID = tz.Time_Zone_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Time_Zone tz
- ON tz.Time_Zone_Name = stag.TimeZone
- --OR tz.Hours_Offset = stag.TimeZone
- -- Note_Type_RecID
- UPDATE stag
- SET stag.Note_Type_RecID = nt.Note_Type_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Note_Type nt ON nt.Default_Flag = 1
- -- Billing_Terms_RecID
- UPDATE stag
- SET stag.Billing_Terms_RecID = ISNULL(bt.Billing_Terms_RecID, def.Billing_Terms_RecID)
- FROM #Import_Staging stag
- INNER JOIN dbo.Billing_Terms bt
- ON bt.[Description] = stag.PaymentTerms
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Billing_Terms def WHERE def.Default_Flag = 1) def
- -- Billing_Delivery_RecID
- UPDATE stag
- SET stag.Billing_Delivery_RecID = def.Billing_Delivery_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Billing_Delivery def WHERE def.Default_Flag =1) def
- -- Evaluate MarkAsLead and set accordingly
- UPDATE stag
- SET stag.MarkAsLead =
- CASE
- WHEN stag.MarkAsLead IN('Y', '1', 'Yes', 'T', 'True') THEN '1'
- WHEN stag.MarkAsLead IN('N', '0', 'No', 'F', 'False') THEN '0'
- WHEN stag.MarkAsLead IS NULL THEN '0'
- END
- FROM #Import_Staging stag
- -- Owner_ID
- UPDATE stag
- SET stag.Owner_ID = (SELECT TOP 1 Owner_ID FROM dbo.[Owner] ORDER BY Owner_ID ASC)
- FROM #Import_Staging stag
- ---- Determine phone/fax numbers that need cleanup (pre-processing step to save on resource intensive string cleanup operation)
- --UPDATE #Import_Staging
- --SET PhoneCleanupReq = 1
- --WHERE PATINDEX('%[^0-9()-+ ]%', PhoneNbr_Comp) > 0
- --UPDATE #Import_Staging
- --SET FaxCleanupReq = 1
- --WHERE PATINDEX('%[^0-9()-+ ]%', PhoneNbr_Fax) > 0
- ---- Cleanup phone numbers that have non-numeric characters
- --;WITH Num1 (n) AS
- -- (SELECT 1 UNION ALL SELECT 1),
- --Num2 (n) AS
- -- (SELECT 1 FROM Num1 AS X, Num1 AS Y),
- --Num3 (n) AS
- -- (SELECT 1 FROM Num2 AS X, Num2 AS Y),
- --Num4 (n) AS
- -- (SELECT 1 FROM Num3 AS X, Num3 AS Y),
- --Nums (n) AS
- -- (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
- --Cleaner AS
- -- (
- -- SELECT PhoneNbr_Comp, (
- -- SELECT CASE WHEN SUBSTRING(PhoneNbr_Comp, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(PhoneNbr_Comp, n, 1) ELSE '' END + ''
- -- FROM Nums
- -- WHERE n <= LEN(PhoneNbr_Comp)
- -- FOR XML PATH('')) AS PhoneNbr_Comp_clean
- -- FROM #Import_Staging
- -- WHERE PhoneCleanupReq = 1
- -- )
- --UPDATE stag
- -- SET PhoneNbr_Comp = REPLACE(cl.PhoneNbr_Comp_clean, ' ', ' ')
- --FROM #Import_Staging stag
- -- INNER JOIN Cleaner cl
- -- ON cl.PhoneNbr_Comp = stag.PhoneNbr_Comp
- ---- Cleanup fax numbers that have non-numeric characters
- --;WITH Num1 (n) AS
- -- (SELECT 1 UNION ALL SELECT 1),
- --Num2 (n) AS
- -- (SELECT 1 FROM Num1 AS X, Num1 AS Y),
- --Num3 (n) AS
- -- (SELECT 1 FROM Num2 AS X, Num2 AS Y),
- --Num4 (n) AS
- -- (SELECT 1 FROM Num3 AS X, Num3 AS Y),
- --Nums (n) AS
- -- (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
- --Cleaner AS
- -- (
- -- SELECT PhoneNbr_Fax, (
- -- SELECT CASE WHEN SUBSTRING(PhoneNbr_Fax, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(PhoneNbr_Fax, n, 1) ELSE '' END + ''
- -- FROM Nums
- -- WHERE n <= LEN(PhoneNbr_Fax)
- -- FOR XML PATH('')) AS PhoneNbr_Fax_clean
- -- FROM #Import_Staging
- -- WHERE FaxCleanupReq = 1
- -- )
- --UPDATE stag
- -- SET PhoneNbr_Fax = REPLACE(cl.PhoneNbr_Fax_clean, ' ', ' ')
- --FROM #Import_Staging stag
- -- INNER JOIN Cleaner cl
- -- ON cl.PhoneNbr_Fax = stag.PhoneNbr_Fax
- -- set billing site to '0' if null
- UPDATE stag
- SET stag.Billing_Site = 0
- FROM #Import_Staging stag
- WHERE stag.Billing_Site IS NULL
- -- Table to Force compilation regardless of structure
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- CREATE TABLE #Force_Compile
- (
- Column_Name VARCHAR(20)
- )
- -- If running in 'Force Mode', create necessary references & perform cleanup
- IF @ForceMode = 1
- BEGIN
- -- Truncate website_url to 50 characters
- UPDATE #Import_Staging
- SET Website_URL = LEFT(Website_URL, 50)
- FROM #Import_Staging
- -- Insert states
- -- Pre-2017.1
- IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(OBJECT_ID) = 'States')
- BEGIN
- INSERT INTO dbo.States
- (
- State_ID,
- [Description],
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- SUBSTRING(State_Comp, 1, 50),
- SUBSTRING(State_Comp, 1, 50),
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging tmp
- WHERE tmp.State_Comp IS NOT NULL
- AND tmp.State_ID IS NULL
- END
- -- Post-2017.1
- IF EXISTS(SELECT 1 FROM sys.columns WHERE name = 'Entered_By' AND OBJECT_NAME(OBJECT_ID) = 'States')
- BEGIN
- INSERT INTO dbo.States
- (
- State_ID,
- [Description],
- Last_Update,
- Updated_By,
- Entered_By,
- Date_Entered_UTC
- )
- SELECT DISTINCT
- SUBSTRING(State_Comp, 1, 50),
- SUBSTRING(State_Comp, 1, 50),
- GETDATE(),
- @ImportBatchUser,
- 'zAdmin',
- GETUTCDATE()
- FROM #Import_Staging tmp
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- WHERE tmp.State_Comp IS NOT NULL
- AND tmp.State_ID IS NULL
- END
- -- Get State_ID for newly inserted records
- UPDATE tmp
- SET tmp.State_ID = st.State_ID
- FROM #Import_Staging tmp
- INNER JOIN dbo.States st
- ON st.[Description] = tmp.State_Comp
- OR st.[State_ID] = tmp.State_Comp
- WHERE st.Updated_By = @ImportBatchUser
- -- Insert countries
- INSERT INTO dbo.Country
- (
- Owner_ID,
- Country,
- City_Caption,
- State_Caption,
- Zip_Caption,
- Updated_By,
- Currency_ID
- )
- SELECT DISTINCT
- 1,
- Country_Comp,
- 'City',
- 'State',
- 'Zip',
- @ImportBatchUser,
- 'USD'
- FROM #Import_Staging tmp
- WHERE tmp.Country_Comp IS NOT NULL
- AND tmp.Comp_Country_RecID IS NULL
- -- Get Country_RecID for newly inserted records
- UPDATE tmp
- SET tmp.Comp_Country_RecID = cn.Country_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Country cn
- ON cn.Country = tmp.Country_Comp
- WHERE cn.Updated_By = @ImportBatchUser
- -- Insert Markets
- INSERT INTO dbo.Market
- (
- Owner_ID,
- [Description],
- Updated_By
- )
- SELECT DISTINCT
- 1,
- Company_Market,
- @ImportBatchUser
- FROM #Import_Staging tmp
- WHERE tmp.Market_RecID IS NULL
- AND tmp.Company_Market IS NOT NULL
- -- Market_RecID
- UPDATE stag
- SET stag.Market_RecID = mk.Market_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Market mk
- ON mk.[Description] = stag.Company_Market
- WHERE mk.Updated_By = @ImportBatchUser
- AND stag.Market_RecID IS NULL
- AND stag.Company_Market IS NOT NULL
- -- Insert company types
- INSERT INTO Company_Type
- (
- [Description],
- Company_Type_ID,
- Updated_By
- )
- SELECT DISTINCT
- Company_Type,
- SUBSTRING(Company_Type, 1, 5),
- @ImportBatchUser
- FROM #Import_Staging tmp
- WHERE tmp.Company_Type_RecID IS NULL
- -- Company_Type_RecID
- UPDATE tmp
- SET tmp.Company_Type_RecID = ct.Company_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Type ct
- ON ct.[Description] = tmp.Company_Type
- AND ct.Updated_By = @ImportBatchUser
- -- Insert Payment Terms
- INSERT INTO Billing_terms
- (
- Owner_ID,
- [Description],
- Default_Flag,
- Updated_By,
- --Last_Update,
- Due_Days,
- Terms_Xref
- )
- SELECT DISTINCT
- 1,
- PaymentTerms,
- 0,
- @ImportBatchUser,
- --GETDATE(),
- 0,
- ''
- FROM #Import_Staging tmp
- WHERE tmp.PaymentTerms IS NOT NULL
- AND tmp.Billing_Terms_RecID IS NULL
- -- Billing_Terms_RecID
- UPDATE tmp
- SET tmp.Billing_Terms_RecID = bt.Billing_Terms_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Billing_Terms bt
- ON bt.[Description] = tmp.PaymentTerms
- -- Insert company statuses
- INSERT INTO dbo.Company_Status
- (
- Owner_ID,
- Company_Status_ID,
- [Description],
- Default_Flag,
- Inactive_Flag,
- Last_Update,
- Updated_By,
- Import_Flag,
- Survey_RecID,
- Notify_Flag,
- Notify_Message,
- StandardNote_Flag,
- CustomNote_Flag,
- Cancel_Track_Flag
- )
- SELECT DISTINCT
- 1,
- '',
- tmp.Company_Status,
- 0,
- 0,
- GETDATE(),
- @ImportBatchUser,
- 0,
- 0,
- 0,
- '',
- 0,
- 0,
- 0
- FROM #Import_Staging tmp
- WHERE tmp.Company_Status_RecID IS NULL
- AND tmp.Company_Status IS NOT NULL
- -- Company_Status_RecID
- UPDATE tmp
- SET tmp.Company_Status_RecID = cst.Company_Status_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Status cst
- ON cst.[Description] = tmp.Company_Status
- -- If company id already exists for another company name, place a 'z' at the front (used for CW migration)
- UPDATE tmp
- SET tmp.Company_ID = 'z' + tmp.Company_ID
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_ID = tmp.Company_ID AND comp.Company_Name <> tmp.Company_Name) comp
- -- Billing site cannot exist for target company
- UPDATE tmp
- SET tmp.[Billing_Site] = 0
- FROM #Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company_Address cad WHERE cad.Company_RecID = tmp.Company_ReciD AND cad.Default_Bill_Flag = 1)cad
- WHERE tmp.Billing_Site = 1
- AND @Legacy_Flag = 1
- END
- -- Begin Push
- -- Insert to dbo.Lead_Import_Batch to generate new batch
- INSERT INTO Lead_Import_Batch
- (
- [Description]
- )
- SELECT 'Company Batch: ' + CONVERT(NVARCHAR(25), GETDATE())
- -- Set Member_ID for Updated_By and Mass Maintenance import batch ID
- SELECT
- @ImportBatchID = CAST(SCOPE_IDENTITY() AS VARCHAR(9)),
- @ImportBatchUser = 'Import' + CAST(SCOPE_IDENTITY() AS VARCHAR(9))
- -- If matching on Legacy_ID - auto-assign missing Company_IDs and make sure that site records inherit Company_Name and Company_ID from parent
- IF @Legacy_Flag = 1
- BEGIN
- IF OBJECT_ID('tempdb..#Master_Company_Records') IS NOT NULL
- DROP TABLE #Master_Company_Records
- SELECT
- MIN(ExcelRowNumber) AS ExcelRowNumber,
- Legacy_ID
- INTO #Master_Company_Records
- FROM #Import_Staging
- WHERE Company_RecID IS NULL
- GROUP BY Legacy_ID
- -- Determine if each record will constitute a new company
- UPDATE stag
- SET stag.NewCompany = 1
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM #Master_Company_Records mas WHERE mas.ExcelRowNumber = stag.ExcelRowNumber)mas
- WHERE stag.Company_RecID IS NULL
- -- Strip non-alpha from Company_ID where exists
- UPDATE stag
- SET stag.Company_ID = LEFT(ISNULL(ReducedString, NEWID()), 25)
- FROM #Import_Staging stag
- CROSS APPLY dbo.udf_Import_StripNonAlpha(stag.Company_Name, '%[a-zA-Z0-9]%')
- WHERE Company_ID IS NOT NULL
- AND Company_RecID IS NULL
- -- Assign Company_ID for rows where it does not exist
- UPDATE stag
- SET stag.Company_ID = LEFT(ISNULL(ReducedString, NEWID()), 25),
- stag.Auto_Company_ID = 1
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM #Master_Company_Records mas WHERE mas.ExcelRowNumber = stag.ExcelRowNumber)mas
- CROSS APPLY dbo.udf_Import_StripNonAlpha(stag.Company_Name, '%[a-zA-Z0-9]%')
- WHERE Company_ID IS NULL
- AND Company_RecID IS NULL
- -- Strip invalid characters from generated company ID's
- UPDATE stag
- SET stag.Company_ID = REPLACE(REPLACE(REPLACE(REPLACE(Company_ID, ',', ''), '-', ''), '&', ''), '.', '')
- FROM #Import_Staging stag
- WHERE stag.Auto_Company_ID = 1
- -- Handle duplicate company id's which already exist in CW
- UPDATE stag
- SET stag.Company_ID = LEFT(stag.Company_ID, 22) + LEFT(NewID(), 3)
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Company_ID FROM dbo.Company comp WHERE comp.Company_ID = stag.Company_ID)comp
- WHERE stag.Company_ID IS NOT NULL
- AND stag.Company_ID <> ''
- AND stag.Company_RecID IS NULL
- AND stag.NewCompany = 1
- -- Handle duplicate company id's within spreadsheet
- UPDATE stag
- SET stag.Company_ID = LEFT(stag.Company_ID, 20) + LEFT(NewID(), 5)
- FROM #Import_Staging stag
- WHERE EXISTS(SELECT 1 FROM #Import_Staging dup WHERE dup.Company_ID = stag.Company_ID AND dup.ExcelRowNumber <> stag.ExcelRowNumber)
- OR EXISTS(SELECT 1 FROM dbo.Company dup2 WHERE dup2.Company_ID = stag.Company_ID)
- ---- Make sure that child/site records inherit Company_ID and Company_Name from parent
- --UPDATE chld
- -- SET chld.Company_Name = par.Company_Name,
- -- chld.Company_ID = par.Company_ID
- --FROM #Import_Staging chld
- -- CROSS APPLY(SELECT TOP 1 * FROM #Master_Company_Records mas WHERE mas.Legacy_ID = chld.Legacy_ID)mas
- -- CROSS APPLY(SELECT TOP 1 * FROM #Import_Staging par WHERE par.ExcelRowNumber = mas.ExcelRowNumber)par
- END
- -- Determine if each record will constitute a new company
- UPDATE stag
- SET stag.NewCompany = 1
- FROM #Import_Staging stag
- WHERE Company_RecID IS NULL
- AND ExcelRowNumber IN(SELECT MIN(ExcelRowNumber) FROM #Import_Staging WHERE Company_RecID IS NULL GROUP BY Company_Name, Company_ID)
- AND @Legacy_Flag = 0
- -- Assign Company_ID for rows where it does not exist
- UPDATE stag
- SET stag.Company_ID = dbo.udf_GetCompanyID(stag.Company_Name),
- stag.Auto_Company_ID = 1
- FROM #Import_Staging stag
- WHERE Company_ID IS NULL
- AND @Legacy_Flag = 0
- -- Strip invalid characters from generated company ID's
- UPDATE stag
- SET stag.Company_ID = REPLACE(REPLACE(REPLACE(REPLACE(Company_ID, ',', ''), '-', ''), '&', ''), '.', '')
- FROM #Import_Staging stag
- WHERE stag.Auto_Company_ID = 1
- AND @Legacy_Flag = 0
- -- If any auto-assigned company_id has a duplicate in staging, append with number to make distinct prior to comparing to final table
- ;WITH dupids AS
- (
- SELECT
- stag.ExcelRowNumber,
- SUBSTRING(stag.Company_ID, 1, 23) + LEFT(NEWID(), 5) AS Reassign
- FROM #Import_Staging stag
- INNER JOIN #Import_Staging dup
- ON stag.ExcelRowNumber <> dup.ExcelRowNumber
- AND stag.Company_ID = dup.Company_ID
- AND stag.Auto_Company_ID = 1
- AND (dup.Auto_Company_ID = 0 OR dup.Company_Name <> stag.Company_Name)
- )
- UPDATE stag
- SET stag.Company_ID = dupids.Reassign
- FROM #Import_Staging stag
- INNER JOIN dupids
- ON dupids.ExcelRowNumber = stag.ExcelRowNumber
- WHERE @Legacy_Flag = 0
- -- Throw error in the event that auto-assigned Company_ID is still not unique from final table
- 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)
- BEGIN
- SELECT * FROM #Import_Staging stag INNER JOIN dbo.Company comp on stag.Auto_Company_ID = 1 AND comp.Company_ID = stag.Company_ID
- 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'
- RAISERROR(@ErrorMsg, 16, 1)
- END
- -- Update Site_Name to 'Main' for new company records
- UPDATE stag
- SET stag.Site_Name = 'Main'
- FROM #Import_Staging stag
- WHERE NewCompany = 1
- AND stag.Site_Name IS NULL
- -- Generate Site_Name for sites being added to new company records
- ;WITH gsn AS
- (
- SELECT
- ExcelRowNumber,
- 'Site ' + CAST(ROW_NUMBER() OVER(PARTITION BY Company_Name, Company_ID ORDER BY ExcelRowNumber) AS VARCHAR(50)) AS Site_Name
- FROM #Import_Staging stag
- WHERE stag.Site_Name IS NULL
- AND stag.Company_RecID IS NULL
- )
- UPDATE stag
- SET stag.Site_Name = gsn.Site_Name
- FROM #Import_Staging stag
- INNER JOIN gsn
- ON gsn.ExcelRowNumber = stag.ExcelRowNumber
- AND stag.Site_Name IS NULL
- -- Update Company_ID for site records to match 'Main' site record
- UPDATE stag
- SET stag.Company_ID = stagmain.Company_ID
- FROM #Import_Staging stag
- INNER JOIN #Import_Staging stagmain
- ON stag.Company_Name = stagmain.Company_Name
- AND stagmain.NewCompany = 1
- AND stag.NewCompany = 0
- AND @Legacy_Flag = 0
- WHERE NOT EXISTS(SELECT 1 FROM #Import_Staging exm WHERE exm.Company_ID = stag.Company_ID AND exm.NewCompany = 1)
- -- Get expected rowcount for dbo.Company insert
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE NewCompany = 1 AND Exclude = 0
- UPDATE stag
- SET stag.Tax_Code_RecID = tx.Tax_Code_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Tax_Code tx WHERE tx.Default_Flag = 1)tx
- WHERE stag.Tax_Code_RecID IS NULL
- -- Insert new companies to dbo.Company
- -- Repurpose Revenue_Year field to catch excel row number from source table (Update to 0 after insert)
- -- Repurpose Keywords column to catch Legacy_ID
- -- Perform conditional insert based on structure of dbo.Company
- IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Options_Updated_By' AND OBJECT_NAME(Object_ID) = 'Company')
- BEGIN
- INSERT INTO dbo.Company WITH(TABLOCK)
- (
- Company_ID,
- Company_Name,
- PhoneNbr,
- PhoneNbr_Fax,
- Website_URL,
- Account_Nbr,
- Time_Zone_RecID,
- SIC_Code_ID,
- Tax_ID,
- Updated_By,
- Company_Type_RecID,
- Company_Status_RecID,
- Owner_Level_RecID,
- Userfield_1,
- Userfield_2,
- Userfield_3,
- Userfield_4,
- Userfield_5,
- Userfield_6,
- Userfield_7,
- Userfield_8,
- Userfield_9,
- Userfield_10,
- Market_RecID,
- Lead_Flag,
- Lead_Source,
- Annual_Revenue,
- Nbr_Employees,
- Date_Entered_UTC,
- Ownership_Type_RecID,
- Billing_Terms_RecID,
- Date_Acquired_UTC,
- Revenue_Year, -- Holds identity of staging table row to join back and capture Company_RecID
- Tax_Code_RecID,
- Billing_Delivery_RecID,
- Entered_By,
- Keywords,
- Options_Last_Update_UTC,
- Options_Updated_By
- )
- OUTPUT INSERTED.Keywords, INSERTED.Company_RecID, 'Company' INTO Import_Legacy_ID_Custom
- SELECT
- LEFT(Company_ID, 50),
- LEFT(Company_Name, 50),
- SUBSTRING(PhoneNbr_Comp, 1, 30),
- SUBSTRING(PhoneNbr_Fax, 1, 30),
- LEFT(Website_URL, 50),
- Account_Nbr,
- Time_Zone_RecID,
- LEFT(SIC_Code_ID, 10),
- LEFT(TaxID, 50),
- @ImportBatchUser,
- Company_Type_RecID,
- Company_Status_RecID,
- Territory_Owner_Level_RecID,
- UserField1,
- UserField2,
- UserField3,
- UserField4,
- UserField5,
- UserField6,
- UserField7,
- UserField8,
- UserField9,
- UserField10,
- Market_RecID,
- MarkAsLead,
- SourceList,
- Annual_Revenue,
- Nbr_Employees,
- GETUTCDATE(),
- Ownership_Type_RecID,
- Billing_Terms_RecID,
- GETUTCDATE(),
- ExcelRowNumber,
- ISNULL(stag.Tax_Code_RecID, tx.Tax_Code_RecID),
- Billing_Delivery_RecID,
- @ImportBatchUser,
- Legacy_ID,
- GETUTCDATE(),
- 'zAdmin'
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 Tax_Code_RecID FROM Tax_Code tc ORDER BY Default_Flag DESC)tx
- WHERE stag.NewCompany = 1
- ORDER BY stag.ExcelRowNumber ASC
- END
- IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Date_Acquired' AND OBJECT_NAME(Object_ID) = 'Company')
- AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Options_Updated_By' AND OBJECT_NAME(OBJECT_ID) = 'Company')
- BEGIN
- INSERT INTO dbo.Company WITH(TABLOCK)
- (
- Company_ID,
- Company_Name,
- PhoneNbr,
- PhoneNbr_Fax,
- Website_URL,
- Account_Nbr,
- Time_Zone_RecID,
- SIC_Code_ID,
- Tax_ID,
- Updated_By,
- Company_Type_RecID,
- Company_Status_RecID,
- Owner_Level_RecID,
- Userfield_1,
- Userfield_2,
- Userfield_3,
- Userfield_4,
- Userfield_5,
- Userfield_6,
- Userfield_7,
- Userfield_8,
- Userfield_9,
- Userfield_10,
- Market_RecID,
- Lead_Flag,
- Lead_Source,
- Annual_Revenue,
- Nbr_Employees,
- Date_Entered,
- Ownership_Type_RecID,
- Billing_Terms_RecID,
- Date_Acquired,
- Revenue_Year, -- Holds identity of staging table row to join back and capture Company_RecID
- Tax_Code_RecID,
- Billing_Delivery_RecID,
- Keywords
- )
- OUTPUT INSERTED.Keywords, INSERTED.Company_RecID, 'Company' INTO Import_Legacy_ID_Custom
- SELECT
- LEFT(Company_ID, 50),
- LEFT(Company_Name, 50),
- SUBSTRING(PhoneNbr_Comp, 1, 30),
- SUBSTRING(PhoneNbr_Fax, 1, 30),
- LEFT(Website_URL, 50),
- Account_Nbr,
- Time_Zone_RecID,
- LEFT(SIC_Code_ID, 10),
- LEFT(TaxID, 50),
- @ImportBatchUser,
- Company_Type_RecID,
- Company_Status_RecID,
- Territory_Owner_Level_RecID,
- UserField1,
- UserField2,
- UserField3,
- UserField4,
- UserField5,
- UserField6,
- UserField7,
- UserField8,
- UserField9,
- UserField10,
- Market_RecID,
- MarkAsLead,
- SourceList,
- Annual_Revenue,
- Nbr_Employees,
- GETDATE(),
- Ownership_Type_RecID,
- Billing_Terms_RecID,
- GETDATE(),
- ExcelRowNumber,
- ISNULL(stag.Tax_Code_RecID, tx.Tax_Code_RecID),
- Billing_Delivery_RecID,
- Legacy_ID
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 Tax_Code_RecID FROM Tax_Code tc ORDER BY Default_Flag DESC)tx
- WHERE stag.NewCompany = 1
- ORDER BY stag.ExcelRowNumber ASC
- END
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Date_Acquired' AND OBJECT_NAME(Object_ID) = 'Company')
- AND EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Date_Acquired_UTC' AND OBJECT_NAME(Object_ID) = 'Company')
- AND NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Options_Updated_By' AND OBJECT_NAME(OBJECT_ID) = 'Company')
- BEGIN
- INSERT INTO dbo.Company WITH(TABLOCK)
- (
- Company_ID,
- Company_Name,
- PhoneNbr,
- PhoneNbr_Fax,
- Website_URL,
- Account_Nbr,
- Time_Zone_RecID,
- SIC_Code_ID,
- Tax_ID,
- Updated_By,
- Company_Type_RecID,
- Company_Status_RecID,
- Owner_Level_RecID,
- Userfield_1,
- Userfield_2,
- Userfield_3,
- Userfield_4,
- Userfield_5,
- Userfield_6,
- Userfield_7,
- Userfield_8,
- Userfield_9,
- Userfield_10,
- Market_RecID,
- Lead_Flag,
- Lead_Source,
- Annual_Revenue,
- Nbr_Employees,
- Date_Entered_UTC,
- Ownership_Type_RecID,
- Billing_Terms_RecID,
- Date_Acquired_UTC,
- Revenue_Year, -- Holds identity of staging table row to join back and capture Company_RecID
- Tax_Code_RecID,
- Billing_Delivery_RecID,
- Entered_By,
- Keywords
- )
- OUTPUT INSERTED.Keywords, INSERTED.Company_RecID, 'Company' INTO Import_Legacy_ID_Custom
- SELECT
- LEFT(Company_ID, 50),
- LEFT(Company_Name, 50),
- SUBSTRING(PhoneNbr_Comp, 1, 30),
- SUBSTRING(PhoneNbr_Fax, 1, 30),
- LEFT(Website_URL, 50),
- Account_Nbr,
- Time_Zone_RecID,
- LEFT(SIC_Code_ID, 10),
- LEFT(TaxID, 50),
- @ImportBatchUser,
- Company_Type_RecID,
- Company_Status_RecID,
- Territory_Owner_Level_RecID,
- UserField1,
- UserField2,
- UserField3,
- UserField4,
- UserField5,
- UserField6,
- UserField7,
- UserField8,
- UserField9,
- UserField10,
- Market_RecID,
- MarkAsLead,
- SourceList,
- Annual_Revenue,
- Nbr_Employees,
- GETUTCDATE(),
- Ownership_Type_RecID,
- Billing_Terms_RecID,
- GETUTCDATE(),
- ExcelRowNumber,
- ISNULL(stag.Tax_Code_RecID, tx.Tax_Code_RecID),
- Billing_Delivery_RecID,
- @ImportBatchUser,
- Legacy_ID
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 Tax_Code_RecID FROM Tax_Code tc ORDER BY Default_Flag DESC)tx
- WHERE stag.NewCompany = 1
- ORDER BY stag.ExcelRowNumber ASC
- END
- -- Get new identities from legacy_Id table
- IF @Legacy_Flag = 1
- BEGIN
- UPDATE stag
- SET stag.New_Identity = leg.CW_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM Import_Legacy_ID_Custom leg WHERE leg.Legacy_ID = stag.Legacy_ID AND leg.Record_Type = 'Company')leg
- END
- -- Join dbo.Company back to staging table to get new identities
- IF @Legacy_Flag = 0
- BEGIN
- UPDATE stag
- SET stag.New_Identity = comp.Company_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company comp
- ON comp.Revenue_Year = stag.ExcelRowNumber
- AND comp.Updated_By = @ImportBatchUser
- END
- -- Set Revenue_Year, Keywords to NULL for inserted rows
- IF @Legacy_Flag = 0
- BEGIN
- UPDATE dbo.Company
- SET Revenue_Year = NULL,
- Keywords = NULL,
- Remit_To_RecID = Company_RecID
- WHERE Updated_By = @ImportBatchUser
- -- For all records whose dbo.Company record was just inserted, populate the Company_RecID
- UPDATE stag
- SET stag.Company_RecID = stagpop.New_Identity
- FROM #Import_Staging stag
- INNER JOIN #Import_Staging stagpop
- ON stag.Company_Name = stagpop.Company_Name
- AND ISNULL(stag.Company_ID, 'zxCompany_ID') = ISNULL(stagpop.Company_ID, 'zxCompany_ID')
- AND stagpop.New_Identity IS NOT NULL
- AND @Legacy_Flag = 0
- -- Update dbo.Company with appropriate Parent_Company_RecID from staging table
- UPDATE comp
- SET comp.Parent_Company_RecID = par.Company_RecID
- FROM dbo.Company comp
- INNER JOIN #Import_Staging chi
- ON chi.Company_ID = comp.Company_ID
- AND chi.Parent_Company_ID IS NOT NULL
- INNER JOIN dbo.Company par
- ON par.Company_ID = chi.Parent_Company_ID
- END
- IF @Legacy_Flag = 1
- BEGIN
- UPDATE comp
- SET comp.Revenue_Year = NULL,
- comp.Keywords = NULL,
- comp.Remit_To_RecID = comp.Company_RecID
- FROM dbo.Company comp
- WHERE EXISTS(SELECT 1 FROM #Import_Staging stag WHERE stag.New_Identity = comp.Company_RecID)
- UPDATE stag
- SET stag.Company_RecID = stagpop.New_Identity
- FROM #Import_Staging stag
- 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
- WHERE @Legacy_Flag = 1
- AND stag.Company_RecID IS NULL
- END
- -- All records should have a Company_RecID now - error/rollback if not
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Company_RecID IS NULL)
- BEGIN
- RAISERROR('NULL Company_RecID after insert to dbo.Company', 16, 1)
- END
- -- Update expected rowcount for 'Main' site insert to dbo.Company_Address
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE NewCompany = 1 AND Exclude = 0
- -- Insert to dbo.Company_Address for new companies - 'Main' site
- -- Repurpose Owner_ID field to catch excel row from source table (Update Owner_ID to proper value after insert)
- -- Repurpose Company_Name field to catch Legacy_Site_ID
- IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
- BEGIN
- INSERT INTO dbo.Company_Address WITH(TABLOCK)
- (
- Owner_ID,
- Company_RecID,
- Address_Line1,
- Address_Line2,
- City,
- State_ID,
- Zip,
- PhoneNbr,
- PhoneNbr_Fax,
- Default_Flag,
- Updated_By,
- [Description],
- Country_RecID,
- tax_code_recid,
- Default_Bill_Flag,
- Entered_By,
- Company_Name
- )
- OUTPUT INSERTED.Company_Name, INSERTED.Company_Address_RecID, 'Site' INTO Import_Legacy_ID_Custom
- SELECT
- ExcelRowNumber, -- Use row number from staging table to join back to source
- New_Identity,
- SUBSTRING(Address_Line1_Comp, 1, 50),
- SUBSTRING(Address_Line2_Comp, 1, 50),
- SUBSTRING(City_Comp, 1, 50),
- SUBSTRING(State_ID, 1, 50),
- SUBSTRING(Zip_Comp, 1, 12),
- SUBSTRING(PhoneNbr_Comp, 1, 30),
- SUBSTRING(PhoneNbr_Fax, 1, 30),
- 1,
- @ImportBatchUser,
- ISNULL(SUBSTRING(Site_Name, 1, 50), 'Main'),
- Comp_Country_RecID,
- tax_code_recid,
- Billing_Site,
- @ImportBatchUser,
- Legacy_Site_ID
- FROM #Import_Staging stag
- WHERE stag.New_Identity IS NOT NULL
- AND stag.NewCompany = 1
- ORDER BY stag.ExcelRowNumber ASC
- END
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
- BEGIN
- INSERT INTO dbo.Company_Address WITH(TABLOCK)
- (
- Owner_ID,
- Company_RecID,
- Address_Line1,
- Address_Line2,
- City,
- State_ID,
- Zip,
- PhoneNbr,
- PhoneNbr_Fax,
- Default_Flag,
- Updated_By,
- [Description],
- Country_RecID,
- tax_code_recid,
- Default_Bill_Flag,
- Company_Name
- )
- OUTPUT INSERTED.Company_Name, INSERTED.Company_Address_RecID, 'Site' INTO Import_Legacy_ID_Custom
- SELECT
- ExcelRowNumber, -- Use row number from staging table to join back to source
- New_Identity,
- SUBSTRING(Address_Line1_Comp, 1, 50),
- SUBSTRING(Address_Line2_Comp, 1, 50),
- SUBSTRING(City_Comp, 1, 50),
- SUBSTRING(State_ID, 1, 50),
- SUBSTRING(Zip_Comp, 1, 12),
- SUBSTRING(PhoneNbr_Comp, 1, 30),
- SUBSTRING(PhoneNbr_Fax, 1, 30),
- 1,
- @ImportBatchUser,
- ISNULL(SUBSTRING(Site_Name, 1, 50), 'Main'),
- Comp_Country_RecID,
- tax_code_recid,
- Billing_Site,
- Legacy_Site_ID
- FROM #Import_Staging stag
- WHERE stag.New_Identity IS NOT NULL
- AND stag.NewCompany = 1
- ORDER BY stag.ExcelRowNumber ASC
- END
- ---- Compare expected rowcount to actual - error on mistmatch to force rollback
- --IF @@ROWCOUNT <> @ExpRowCount
- --BEGIN
- -- SELECT @ErrorMsg = 'dbo.Company_Address insert fails for "Main" sites - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
- -- RAISERROR(@ErrorMsg, 16, 1)
- --END
- -- Join dbo.Company_Address back to staging table to get new identities
- UPDATE stag
- SET stag.Company_Address_RecID_New = cad.Company_Address_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company_Address cad
- ON cad.Owner_ID = stag.ExcelRowNumber
- AND cad.Updated_By = @ImportBatchUser
- -- Update Owner_ID, Company_Name to appropriate value for inserted records
- UPDATE cad
- SET cad.Owner_ID = stag.Owner_ID,
- cad.Company_Name = NULL
- FROM dbo.Company_Address cad
- INNER JOIN #Import_Staging stag
- ON stag.Company_Address_RecID_New = cad.Company_Address_RecID
- WHERE cad.Updated_By = @ImportBatchUser
- -- Get expected Rowcount for 'site' record insert
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Company_Address_RecID_New IS NULL AND Exclude = 0
- -- Insert to dbo.Company_Address for 'site' records
- -- Repurpose Owner_ID field to catch identity from source table (Update Owner_ID to proper value after insert)
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
- BEGIN
- INSERT INTO dbo.Company_Address
- (
- Owner_ID, -- Use identity from staging table to join back to source
- Company_RecID,
- Address_Line1,
- Address_Line2,
- City,
- State_ID,
- Zip,
- PhoneNbr,
- PhoneNbr_Fax,
- Default_Flag,
- Updated_By,
- [Description],
- Country_RecID,
- tax_code_recid,
- Default_Bill_Flag,
- Company_Name
- )
- OUTPUT INSERTED.Company_Name, INSERTED.Company_Address_RecID, 'Site' INTO Import_Legacy_ID_Custom
- SELECT
- ExcelRowNumber,
- Company_RecID,
- Address_Line1_Comp,
- Address_Line2_Comp,
- City_Comp,
- State_ID,
- Zip_Comp,
- SUBSTRING(PhoneNbr_Comp, 1, 30),
- SUBSTRING(PhoneNbr_Fax, 1, 30),
- 0,
- @ImportBatchUser,
- Site_Name,
- Comp_Country_RecID,
- Tax_Code_RecID,
- Billing_Site,
- Legacy_Site_ID
- FROM #Import_Staging stag
- WHERE Company_Address_RecID_New IS NULL
- ORDER BY stag.ExcelRowNumber ASC
- END
- IF EXISTS(SELECT TOP 1 * FROM sys.Columns WHERE name = 'Entered_By' AND OBJECT_NAME(object_ID) = 'Company_Address')
- BEGIN
- INSERT INTO dbo.Company_Address
- (
- Owner_ID, -- Use identity from staging table to join back to source
- Company_RecID,
- Address_Line1,
- Address_Line2,
- City,
- State_ID,
- Zip,
- PhoneNbr,
- PhoneNbr_Fax,
- Default_Flag,
- Updated_By,
- [Description],
- Country_RecID,
- tax_code_recid,
- Default_Bill_Flag,
- Entered_By,
- Company_Name
- )
- OUTPUT INSERTED.Company_Name, INSERTED.Company_Address_RecID, 'Site' INTO Import_Legacy_ID_Custom
- SELECT
- ExcelRowNumber,
- Company_RecID,
- Address_Line1_Comp,
- Address_Line2_Comp,
- City_Comp,
- State_ID,
- Zip_Comp,
- SUBSTRING(PhoneNbr_Comp, 1, 30),
- SUBSTRING(PhoneNbr_Fax, 1, 30),
- 0,
- @ImportBatchUser,
- Site_Name,
- Comp_Country_RecID,
- Tax_Code_RecID,
- Billing_Site,
- @ImportBatchUser,
- Legacy_Site_ID
- FROM #Import_Staging stag
- WHERE Company_Address_RecID_New IS NULL
- ORDER BY stag.ExcelRowNumber ASC
- END
- -- Join dbo.Company_Address back to staging table to get new identities
- UPDATE stag
- SET stag.Company_Address_RecID_New = cad.Company_Address_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company_Address cad
- ON stag.ExcelRowNumber = cad.Owner_ID
- AND cad.Updated_By = @ImportBatchUser
- AND stag.Exclude = 0
- -- Update Owner_ID, Company_Name to appropriate value for inserted records
- UPDATE cad
- SET cad.Owner_ID = stag.Owner_ID,
- cad.Company_Name = NULL
- FROM dbo.Company_Address cad
- INNER JOIN #Import_Staging stag
- ON stag.Company_Address_RecID_New = cad.Company_Address_RecID
- WHERE cad.Updated_By = @ImportBatchUser
- AND stag.Exclude = 0
- -- Perform insert to dbo.Company_Note
- -- Only bring over distinct notes
- INSERT INTO dbo.Company_Note
- (
- Owner_ID,
- Company_RecID,
- Note_Type_RecID,
- Notes,
- Updated_By
- )
- SELECT DISTINCT
- Owner_ID,
- Company_RecID,
- Note_Type_RecID,
- Note_Comp,
- @ImportBatchUser
- FROM #Import_Staging
- WHERE Note_Comp IS NOT NULL
- ---- Clear WF_Track_Header_RecID for duplicate on Company and Track (a track should only be inserted once per company)
- --;with duptracks AS
- --(
- -- SELECT
- -- ExcelRowNumber,
- -- Row_Number() OVER(PARTITION BY Company_RecID, WF_Track_Header_RecID ORDER BY ExcelRowNumber ASC) AS Order_Num
- -- FROM #Import_Staging
- --)
- --UPDATE stag
- -- SET WF_Track_Header_RecID = NULL
- --FROM #Import_Staging stag
- -- INNER JOIN duptracks
- -- ON duptracks.ExcelRowNumber = stag.ExcelRowNumber
- --WHERE duptracks.Order_Num > 1
- ---- Perform insert to dbo.WF_Track_Attach_Header
- ---- Repurpose Attached_By field to catch RecID from source table (update to appropriate value afterwards)
- --INSERT INTO dbo.WF_Track_Attach_Header
- --(
- -- RecID,
- -- Table_Reference,
- -- WF_Track_Header_RecID,
- -- [Description],
- -- RecID_Field,
- -- date_attached,
- -- Attached_By, -- Re-purposed to catch source table identity
- -- Last_Update,
- -- Updated_By
- --)
- --SELECT
- -- stag.Company_RecID,
- -- 'company',
- -- stag.WF_Track_Header_RecID,
- -- head.[Description],
- -- 'company_recid',
- -- GETDATE(),
- -- ExcelRowNumber,
- -- GETDATE(),
- -- @ImportBatchUser
- --FROM #Import_Staging stag
- -- INNER JOIN WF_Track_Header head
- -- ON head.WF_Track_Header_RecID = stag.WF_Track_Header_RecID
- --WHERE stag.WF_Track_Header_RecID IS NOT NULL
- -- AND stag.Exclude = 0
- ---- Join WF_Track_Attach_Header back to staging table to get new identities
- --UPDATE stag
- -- SET stag.WF_Track_Attach_Header_RecID = wta.WF_Track_Attach_Header_RecID
- --FROM #Import_Staging stag
- -- INNER JOIN WF_Track_Attach_Header wta
- -- ON CAST(stag.ExcelRowNumber AS VARCHAR(20)) = wta.Attached_By
- ---- Update Attached_By to appropriate value for imported records
- --UPDATE WF_Track_Attach_Header
- -- SET Attached_By = @ImportBatchUser
- --WHERE Updated_By = @ImportBatchUser
- ---- Create track detail records
- --WHILE EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE WF_Track_Attach_Header_RecID IS NOT NULL AND Track_Detail_Processed = 0)
- --BEGIN
- -- -- Get current record for processing
- -- 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)
- -- -- Build procedure call based on values in staging table
- -- SELECT
- -- @DSQL = 'EXEC usp_CreateWFTrackAttachDtlRecords ' + CAST(WF_Track_Header_RecID AS NVARCHAR(25)) + ', ' + CAST(WF_Track_Attach_Header_RecID AS NVARCHAR(25)) + ', ''' + @ImportBatchUser + ''''
- -- FROM #Import_Staging stag
- -- WHERE stag.ExcelRowNumber = @Curr_Track_Dtl_Record
- -- -- Call procedure
- -- EXEC(@DSQL)
- -- -- Set current record as processed
- -- UPDATE #Import_Staging
- -- SET Track_Detail_Processed = 1
- -- WHERE ExcelRowNumber = @Curr_Track_Dtl_Record
- --END
- -- Insert Company_Group record
- INSERT INTO dbo.Company_Group
- (
- Owner_ID,
- Group_Type_RecID,
- Company_RecID,
- DefaultContact_Flag,
- [Description],
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- stag.Owner_ID,
- stag.Group_Type_RecID,
- stag.Company_RecID,
- 1,
- '',
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging stag
- WHERE stag.Group_Type_RecID IS NOT NULL
- AND stag.Exclude = 0
- -- Insert to dbo.LeadImport
- INSERT INTO dbo.Lead_Import
- (
- Lead_Import_Batch_RecID,
- L_Company_Name,
- L_PhoneNbr,
- L_PhoneNbr_Fax,
- L_Address_Line1,
- L_Address_Line2,
- L_City,
- L_State_ID,
- L_Zip,
- L_Country,
- L_Website,
- L_Revenue,
- L_Nbr_Employees,
- L_SIC_Code,
- L_Account,
- L_Company_Note,
- L_Company_RecID,
- L_NewCompany_Flag,
- L_Site_Name
- )
- SELECT
- @ImportBatchID,
- SUBSTRING(Company_Name, 1, 50),
- SUBSTRING(PhoneNbr_Comp, 1, 50),
- SUBSTRING(PhoneNbr_Fax, 1, 50),
- SUBSTRING(Address_Line1_Comp, 1, 50),
- SUBSTRING(Address_Line2_Comp, 1, 50),
- SUBSTRING(City_Comp,1, 50),
- SUBSTRING(State_Comp, 1, 50),
- SUBSTRING(Zip_Comp, 1, 50),
- SUBSTRING(Country_Comp, 1, 10),
- SUBSTRING(Website_URL, 1, 50),
- SUBSTRING(Annual_Revenue, 1, 50),
- SUBSTRING(Nbr_Employees, 1, 50),
- SUBSTRING(SIC_Code_ID, 1, 50),
- SUBSTRING(Account_Nbr, 1, 50),
- SUBSTRING(Note_Comp, 1, 5000),
- Company_RecID,
- NewCompany,
- SUBSTRING(Site_Name, 1, 50)
- FROM #Import_Staging
- WHERE Exclude = 0
- EXEC usp_Import_UDF @TableName, 'Company'
- -- Clean up
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- -- Commit transaction
- IF @@Error = 0 AND XACT_STATE() = 1
- BEGIN
- -- Commit and return
- COMMIT TRANSACTION Comp_Import
- SELECT
- 1 AS Success,
- @ImportBatchID AS Import_Batch_ID,
- COUNT(*) AS Companies_Imported,
- (SELECT COUNT (*) FROM Company_Address WHERE Updated_By = @ImportBatchUser) AS SitesImported
- FROM dbo.Company
- WHERE Updated_By = @ImportBatchUser
- END
- END TRY
- BEGIN CATCH
- -- An error occured, display error info
- SELECT
- ERROR_NUMBER() AS ErrorNumber,
- ERROR_SEVERITY() AS ErrorSeverity,
- ERROR_STATE() AS ErrorState,
- ERROR_PROCEDURE() AS ErrorProcedure,
- ERROR_LINE() AS ErrorLine,
- ERROR_MESSAGE() AS ErrorMessage
- -- Determine whether transaction needs to be rolled back and act accordingly
- IF(XACT_STATE()) IN(-1, 1)
- BEGIN
- ROLLBACK TRANSACTION Comp_Import
- END
- END CATCH
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Contact_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Contact_ImportValidate] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 05/17/2013
- -- Description: Validates data in temp table
- -- tempdb.dbo.TMP_Contacts_Import - for Contacts
- -- Import
- -- Sample call: exec usp_Contact_ImportValidate '769E2AAC-C0D6-483B-AC09-8326F7851F1C', 0
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_Contact_ImportValidate]
- @TableName VARCHAR(MAX),
- @DiffMode BIT = 0, -- Differential mode - does not import contacts with existing duplicates on name/company
- @Forcemode BIT = 0
- AS
- BEGIN
- -- Turn off diff mode - no longer used
- SELECT @DiffMode = 0
- SET NOCOUNT ON
- -- Set date format to MDY to validate dates from excel
- SET DATEFORMAT MDY
- -- Variable declaration
- -- Table to hold results of procedure
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750),
- Warning_Flag BIT DEFAULT 0,
- ReferenceType NVARCHAR(MAX)
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX),
- ValMsg NVARCHAR(MAX)
- )
- -- Schedule_Type_RecID for activities
- DECLARE @Schedule_Type_RecID INT
- -- Flag to indicate custom conversion (i.e. Autotask)
- DECLARE @CustomMigration BIT
- SELECT @CustomMigration = 0
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Default SO_Act_Status_RecID for activity status
- DECLARE @SO_Act_Status_RecID INT
- -- Default SR_Location_RecID for activity status
- DECLARE @SR_Location_RecID INT
- -- Dynamic statement to insert to validation table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Pre-validation
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'Company Name' UNION ALL
- SELECT 'Company ID' UNION ALL
- SELECT 'Site Name' UNION ALL
- SELECT 'First Name' UNION ALL
- SELECT 'Last Name' UNION ALL
- SELECT 'Contact Type' UNION ALL
- SELECT 'Relationship' UNION ALL
- SELECT 'Department' UNION ALL
- SELECT 'Job Title' UNION ALL
- SELECT 'Direct Phone' UNION ALL
- SELECT 'Direct Extension' UNION ALL
- SELECT 'Email Address' UNION ALL
- SELECT 'Home Phone' UNION ALL
- SELECT 'Cell Phone' UNION ALL
- SELECT 'Primary Contact' UNION ALL
- SELECT 'Billing Contact' UNION ALL
- SELECT 'User Field 1' UNION ALL
- SELECT 'User Field 2' UNION ALL
- SELECT 'User Field 3' UNION ALL
- SELECT 'User Field 4' UNION ALL
- SELECT 'User Field 5' UNION ALL
- SELECT 'User Field 6' UNION ALL
- SELECT 'User Field 7' UNION ALL
- SELECT 'User Field 8' UNION ALL
- SELECT 'User Field 9' UNION ALL
- SELECT 'User Field 10' UNION ALL
- SELECT 'Contact Notes'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- -- If a column is missing, stop here and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 0 AS ValPassed,
- RowNumber,
- ValMsg
- FROM #tblResults
- ORDER BY RowNumber, ValMsg
- RETURN
- END
- -- Table to hold source data for this batch from temp table
- IF (OBJECT_ID('#Import_Staging') IS NOT NULL)
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT NULL,
- Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- First_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Last_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Site_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Contact_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Relationship nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Department nvarchar(30) COLLATE DATABASE_DEFAULT NULL,
- Job_Title nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Direct_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Direct_Extension nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Email_Address nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Home_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Cell_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Assign_To_Member_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Subject nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- Activity_Due_Date NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Marketing_Campaign NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Primary_Contact nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Billing_Contact nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Contact_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- Company_RecID INT,
- Department_RecID INT,
- Company_Address_RecID INT,
- Contact_Type_RecID INT,
- Note_Type_RecID INT,
- Activity_Member_RecID INT,
- SO_Activity_Type_RecID INT,
- Marketing_Campaign_RecID INT,
- Invalid_Email BIT,
- User_Field_1 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_2 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_3 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_4 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_5 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_6 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_7 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_8 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_9 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_10 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_1_Used BIT NULL,
- User_Field_2_Used BIT NULL,
- User_Field_3_Used BIT NULL,
- User_Field_4_Used BIT NULL,
- User_Field_5_Used BIT NULL,
- User_Field_6_Used BIT NULL,
- User_Field_7_Used BIT NULL,
- User_Field_8_Used BIT NULL,
- User_Field_9_Used BIT NULL,
- User_Field_10_Used BIT NULL,
- Portal_Security_Level_IN NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Portal_PW NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- CM_Password NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Portal_Security_Level_OUT INT,
- Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Company_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Contact_RecID INT,
- Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- SR_Service_RecID INT,
- Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- SO_Opportunity_RecID INT,
- Diff_Exclude_Flag BIT
- )
- -- Build statement to populate validation temp table
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- Company_Name,
- Company_ID,
- First_Name,
- Last_Name,
- Site_Name,
- Contact_Type,
- Relationship,
- Department,
- Job_Title,
- Direct_Phone,
- Direct_Extension,
- Email_Address,
- Home_Phone,
- Cell_Phone,
- Activity_Assign_To_Member_ID,
- Activity_Type,
- Activity_Subject,
- Activity_Notes,
- Activity_Due_Date,
- Activity_Marketing_Campaign,
- Primary_Contact,
- Billing_Contact,
- Contact_Notes,
- User_Field_1,
- User_Field_2,
- User_Field_3,
- User_Field_4,
- User_Field_5,
- User_Field_6,
- User_Field_7,
- User_Field_8,
- User_Field_9,
- User_Field_10
- )
- SELECT
- [Excel Row Number],
- [Company Name],
- [Company ID],
- [First Name],
- [Last Name],
- [Site Name],
- [Contact Type],
- [Relationship],
- LEFT([Department],30),
- [Job Title],
- [Direct Phone],
- [Direct Extension],
- [Email Address],
- [Home Phone],
- [Cell Phone],
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- [Primary Contact],
- [Billing Contact],
- [Contact Notes],
- [User Field 1],
- [User Field 2],
- [User Field 3],
- [User Field 4],
- [User Field 5],
- [User Field 6],
- [User Field 7],
- [User Field 8],
- [User Field 9],
- [User Field 10]
- FROM ' + @SourceTable
- -- Pull data into validation table
- EXEC(@DSQL)
- -- Update temp table with optional field values if they exist
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Portal Security Level')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Portal_Security_Level_IN = src.[Portal Security Level]
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Portal Password')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Portal_PW = src.[Portal Password]
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_ID = src.Legacy_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- BEGIN TRANSACTION Contact_Val
- -- Update empty string or single space to null in validation table
- UPDATE #Import_Staging SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
- Company_ID = CASE WHEN Company_ID IN('', ' ') THEN NULL ELSE Company_ID END,
- First_Name = CASE WHEN First_Name IN('', ' ') THEN NULL ELSE First_Name END,
- Last_Name = CASE WHEN Last_Name IN('', ' ') THEN NULL ELSE Last_Name END,
- Site_Name = CASE WHEN Site_Name IN('', ' ') THEN NULL ELSE Site_Name END,
- Contact_Type = CASE WHEN Contact_Type IN('', ' ') THEN NULL ELSE Contact_Type END,
- Relationship = CASE WHEN Relationship IN('', ' ') THEN NULL ELSE Relationship END,
- Department = CASE WHEN Department IN('', ' ') THEN NULL ELSE Department END,
- Job_Title = CASE WHEN Job_Title IN('', ' ') THEN NULL ELSE Job_Title END,
- Direct_Phone = CASE WHEN Direct_Phone IN('', ' ') THEN NULL ELSE Direct_Phone END,
- Direct_Extension = CASE WHEN Direct_Extension IN('', ' ') THEN NULL ELSE Direct_Extension END,
- Email_Address = CASE WHEN Email_Address IN('', ' ') THEN NULL ELSE Email_Address END,
- Home_Phone = CASE WHEN Home_Phone IN('', ' ') THEN NULL ELSE Home_Phone END,
- Cell_Phone = CASE WHEN Cell_Phone IN('', ' ') THEN NULL ELSE Cell_Phone END,
- Activity_Assign_To_Member_ID = CASE WHEN Activity_Assign_To_Member_ID IN('', ' ') THEN NULL ELSE Activity_Assign_To_Member_ID END,
- Activity_Type = CASE WHEN Activity_Type IN('', ' ') THEN NULL ELSE Activity_Type END,
- Activity_Subject = CASE WHEN Activity_Subject IN('', ' ') THEN NULL ELSE Activity_Subject END,
- Activity_Notes = CASE WHEN Activity_Notes IN('', ' ') THEN NULL ELSE Activity_Notes END,
- Activity_Due_Date = CASE WHEN Activity_Due_Date IN('', ' ') THEN NULL ELSE Activity_Due_Date END,
- Activity_Marketing_Campaign = CASE WHEN Activity_Marketing_Campaign IN('', ' ') THEN NULL ELSE Activity_Marketing_Campaign END,
- Primary_Contact = CASE WHEN Primary_Contact IN('', ' ') THEN NULL ELSE Primary_Contact END,
- Billing_Contact = CASE WHEN Billing_Contact IN('', ' ') THEN NULL ELSE Billing_Contact END,
- Contact_Notes = CASE WHEN Contact_Notes IN('', ' ') THEN NULL ELSE Contact_Notes END,
- User_Field_1 = CASE WHEN User_Field_1 IN('', ' ') THEN NULL ELSE User_Field_1 END,
- User_Field_2 = CASE WHEN User_Field_2 IN('', ' ') THEN NULL ELSE User_Field_2 END,
- User_Field_3 = CASE WHEN User_Field_3 IN('', ' ') THEN NULL ELSE User_Field_3 END,
- User_Field_4 = CASE WHEN User_Field_4 IN('', ' ') THEN NULL ELSE User_Field_4 END,
- User_Field_5 = CASE WHEN User_Field_5 IN('', ' ') THEN NULL ELSE User_Field_5 END,
- User_Field_6 = CASE WHEN User_Field_6 IN('', ' ') THEN NULL ELSE User_Field_6 END,
- User_Field_7 = CASE WHEN User_Field_7 IN('', ' ') THEN NULL ELSE User_Field_7 END,
- User_Field_8 = CASE WHEN User_Field_8 IN('', ' ') THEN NULL ELSE User_Field_8 END,
- User_Field_9 = CASE WHEN User_Field_9 IN('', ' ') THEN NULL ELSE User_Field_9 END,
- User_Field_10 = CASE WHEN User_Field_10 IN('', ' ') THEN NULL ELSE User_Field_10 END,
- Portal_Security_Level_IN = CASE WHEN Portal_Security_Level_IN IN('', ' ') THEN NULL ELSE Portal_Security_Level_IN END,
- Portal_PW = CASE WHEN Portal_PW IN('', ' ') THEN NULL ELSE Portal_PW END
- -- Match contacts to companies/site
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Contact'
- END
- -- Identify if Autotask/Custom conversion and handle appropriately
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Contact_Type = 'CW_Custom_Conversion')
- BEGIN
- -- Get rid of export config row created by SSIS
- DELETE FROM #Import_Staging
- WHERE Contact_Type = 'CW_Custom_Conversion'
- -- Set flag to indicate custom migration
- SELECT @CustomMigration = 1
- END
- -- Table to hold trimmed company names and company_ids from dbo.company
- -- Prevents need to join on trim function each time we touch company table (performance concern)
- -- Also filters rows that are unrelated to import batch
- DECLARE @Company TABLE
- (
- Company_RecID INT,
- Company_ID VARCHAR(50),
- Company_Name VARCHAR(50),
- Delete_Flag BIT
- )
- -- Populate @Company
- INSERT INTO @Company
- (
- Company_RecID,
- Company_ID,
- Company_Name,
- Delete_Flag
- )
- SELECT
- Company_RecID,
- LTRIM(RTRIM(Company_ID)),
- LTRIM(RTRIM(Company_Name)),
- Delete_Flag
- FROM dbo.Company comp
- -- Join to tables in CW to gather RecID's for references
- -- Company_RecID
- -- Get by Company_ID first
- UPDATE tmp
- SET tmp.Company_RecID = comp.Company_RecID
- FROM #Import_Staging tmp
- INNER JOIN @Company comp
- ON comp.Company_ID = tmp.Company_ID
- AND comp.Delete_Flag = 0
- WHERE tmp.Company_ID IS NOT NULL
- -- Get by Company name for records where Company_ID is null
- UPDATE tmp
- SET tmp.Company_RecID = comp.Company_RecID
- FROM #Import_Staging tmp
- INNER JOIN @Company comp
- ON comp.Company_Name = tmp.Company_Name
- AND comp.Delete_Flag = 0
- WHERE tmp.Company_ID IS NULL
- -- Portal security level
- -- By security level caption
- UPDATE tmp
- SET tmp.Portal_Security_Level_Out =
- CASE cc.Field_Name
- WHEN 'portal_security_level_1' THEN 1
- WHEN 'portal_security_level_2' THEN 2
- WHEN 'portal_security_level_3' THEN 3
- WHEN 'portal_security_level_4' THEN 4
- WHEN 'portal_security_level_5' THEN 5
- WHEN 'portal_security_level_6' THEN 6
- ELSE NULL END
- FROM #Import_Staging tmp
- 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
- WHERE tmp.Portal_Security_Level_IN IS NOT NULL
- AND tmp.Portal_Security_Level_IN <> ''
- -- By security level number
- UPDATE tmp
- SET tmp.Portal_Security_Level_OUT = tmp.Portal_Security_Level_IN
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.Portal_Security_Level_IN) = 1
- AND tmp.Portal_Security_Level_IN BETWEEN 1 AND 6
- AND tmp.Portal_Security_Level_OUT IS NULL
- -- Get portal password
- UPDATE tmp
- SET tmp.CM_Password = dbo.udf_EncrDecr(Portal_PW, 'E')
- FROM #Import_Staging tmp
- WHERE tmp.Portal_PW IS NOT NULL
- AND LEN(Portal_PW) <= 15
- -- Department_RecID
- UPDATE tmp
- SET tmp.Department_RecID = dep.Department_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Department dep
- ON dbo.ufn_Import_Trim(dep.Department_Name) = tmp.Department
- -- Company_Address_RecID
- -- If site name specified, get by site name
- UPDATE tmp
- SET tmp.Company_Address_RecID = cad.Company_Address_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Address cad
- ON cad.Company_RecID = tmp.Company_RecID
- AND tmp.Site_Name = dbo.ufn_Import_Trim(cad.[Description])
- WHERE tmp.Site_Name IS NOT NULL
- -- If site name not specified, get default
- UPDATE tmp
- SET tmp.Company_Address_RecID = cad.Company_Address_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Address cad
- ON cad.Company_RecID = tmp.Company_RecID
- AND cad.Default_Flag = 1
- WHERE tmp.Site_Name IS NULL
- -- Note_Type_RecID for default note type
- UPDATE tmp
- SET tmp.Note_Type_RecID = nt.Note_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Note_Type nt
- ON nt.Default_Flag = 1
- -- Activity_Member_RecID
- UPDATE tmp
- SET tmp.Activity_Member_RecID = mem.Member_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Member mem
- ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.Activity_Assign_To_Member_ID
- -- Basic validation of email address
- UPDATE #Import_Staging
- SET Invalid_Email = 1
- WHERE @CustomMigration <> 1 AND
- (Email_Address LIKE '%[^a-z,0-9,@,.,_,-]%' OR Email_Address NOT like '%_@_%_.__%')
- -- Contact_Type_RecID
- UPDATE tmp
- SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact_Type ct
- ON tmp.Contact_Type = dbo.ufn_Import_Trim(ct.[Description])
- WHERE tmp.Contact_Type IS NOT NULL
- -- Get default contact type if not specified in spreadsheet
- UPDATE tmp
- SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact_Type ct
- ON ct.Default_Flag = 1
- WHERE tmp.Contact_Type IS NULL
- -- Marketing_Campaign_RecID
- UPDATE tmp
- SET tmp.Marketing_Campaign_RecID = mc.Marketing_Campaign_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Marketing_Campaign mc
- ON tmp.Activity_Marketing_Campaign = dbo.ufn_Import_Trim(mc.Marketing_ID)
- WHERE tmp.Activity_Marketing_Campaign IS NOT NULL
- -- SO_Activity_Type_RecID
- UPDATE tmp
- SET tmp.SO_Activity_Type_RecID = at.SO_Activity_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.SO_Activity_Type at
- ON dbo.ufn_Import_Trim(at.[Description]) = tmp.Activity_Type
- WHERE tmp.Activity_Type IS NOT NULL
- -- Get default Activity_Type if not specified
- UPDATE tmp
- SET tmp.SO_Activity_Type_RecID = at.SO_Activity_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.SO_Activity_Type at
- ON at.Default_Flag = 1
- WHERE tmp.Activity_Type IS NULL
- AND tmp.Activity_Assign_To_Member_ID IS NOT NULL
- -- Get Schedule_Type_RecID for so_activity
- SELECT @Schedule_Type_RecID = (SELECT TOP 1 Schedule_Type_RecID FROM dbo.Schedule_Type WHERE Table_Reference = 'so_activity')
- -- Get default SO_Act_Status_RecID for activity status
- SELECT @SO_Act_Status_RecID = (SELECT TOP 1 SO_Act_Status_RecID FROM dbo.SO_Act_Status WHERE Default_Flag = 1)
- -- Get default SR_Location_RecID for activity location
- SELECT @SR_Location_RecID = (SELECT TOP 1 SR_Location_RecID FROM dbo.SR_Location WHERE Default_Flag = 1)
- -- Update boolean fields to 0 or 1
- UPDATE tmp
- SET tmp.Primary_Contact =
- CASE
- WHEN tmp.Primary_Contact IN('1', 'Y', 'Yes', 'True', 'T') THEN '1'
- WHEN tmp.Primary_Contact IN('0', 'N', 'No', 'False', 'F') THEN '0'
- WHEN tmp.Primary_Contact IS NULL THEN '0'
- ELSE tmp.Primary_Contact
- END,
- tmp.Billing_Contact =
- CASE
- WHEN tmp.Billing_Contact IN('1', 'Y', 'Yes', 'True', 'T') THEN '1'
- WHEN tmp.Billing_Contact IN('0', 'N', 'No', 'False', 'F') THEN '0'
- WHEN tmp.Billing_Contact IS NULL THEN '0'
- ELSE tmp.Billing_Contact
- END
- FROM #Import_Staging tmp
- -- Determine if each user defined field is used
- ;WITH ufstatus AS
- (
- SELECT TOP 1
- CASE WHEN Company_Userfield_1 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_1_Used,
- CASE WHEN Company_Userfield_2 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_2_Used,
- CASE WHEN Company_Userfield_3 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_3_Used,
- CASE WHEN Company_Userfield_4 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_4_Used,
- CASE WHEN Company_Userfield_5 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_5_Used,
- CASE WHEN Company_Userfield_6 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_6_Used,
- CASE WHEN Company_Userfield_7 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_7_Used,
- CASE WHEN Company_Userfield_8 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_8_Used,
- CASE WHEN Company_Userfield_9 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_9_Used,
- CASE WHEN Company_Userfield_10 = 'Not Used' THEN 0 ELSE 1 END AS User_Field_10_Used
- FROM dbo.[Owner]
- )
- UPDATE tmp
- SET tmp.User_Field_1_Used = ufstatus.User_Field_1_Used,
- tmp.User_Field_2_Used = ufstatus.User_Field_2_Used,
- tmp.User_Field_3_Used = ufstatus.User_Field_3_Used,
- tmp.User_Field_4_Used = ufstatus.User_Field_4_Used,
- tmp.User_Field_5_Used = ufstatus.User_Field_5_Used,
- tmp.User_Field_6_Used = ufstatus.User_Field_6_Used,
- tmp.User_Field_7_Used = ufstatus.User_Field_7_Used,
- tmp.User_Field_8_Used = ufstatus.User_Field_8_Used,
- tmp.User_Field_9_Used = ufstatus.User_Field_9_Used,
- tmp.User_Field_10_Used = ufstatus.User_Field_10_Used
- FROM #Import_Staging tmp
- CROSS APPLY ufstatus
- -- Delete duplicates if running in differential mode
- DELETE tmp
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact cont
- ON @DiffMode = 1
- AND tmp.Company_RecID = cont.Company_RecID
- AND ISNULL(tmp.Last_Name, '') = ISNULL(cont.Last_Name, '')
- AND ISNULL(tmp.First_Name, '') = ISNULL(cont.First_Name, '')
- AND @Legacy_Flag = 0
- -- Make adjustments to force if @ForceMode = 1
- -- Set primary/billing contact to 0 where one exists
- UPDATE tmp
- SET tmp.Primary_Contact = 0
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact cont
- ON tmp.Company_RecID = cont.Company_RecID
- AND cont.Default_Flag = 1
- AND tmp.Primary_Contact = 1
- AND @ForceMode = 1
- UPDATE tmp
- SET tmp.Billing_Contact = 0
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact cont
- ON tmp.Company_RecID = cont.Company_RecID
- AND cont.Default_Billing_Flag = 1
- AND tmp.Billing_Contact = 1
- AND @ForceMode = 1
- INSERT INTO dbo.Department
- (
- Owner_ID,
- Department_Name,
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- 1,
- Department,
- GETDATE(),
- 'Import'
- FROM #Import_Staging tmp
- WHERE tmp.Department IS NOT NULL
- AND tmp.Department_RecID IS NULL
- AND @ForceMode = 1
- -- Department_RecID
- UPDATE tmp
- SET tmp.Department_RecID = dep.Department_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Department dep
- ON dbo.ufn_Import_Trim(dep.Department_Name) = tmp.Department
- WHERE tmp.Department IS NOT NULL
- AND tmp.Department_RecID IS NULL
- AND @ForceMode = 1
- INSERT INTO Contact_Type
- (
- Contact_Type_ID,
- [Description],
- Default_Flag,
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- '',
- tmp.Contact_Type,
- 0,
- GETDATE(),
- 'Import'
- FROM #Import_Staging tmp
- WHERE Contact_Type IS NOT NULL
- AND Contact_Type_RecID IS NULL
- AND @ForceMode = 1
- UPDATE tmp
- SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact_Type ct
- ON tmp.Contact_Type = dbo.ufn_Import_Trim(ct.[Description])
- WHERE tmp.Contact_Type IS NOT NULL
- AND tmp.Contact_Type_RecID IS NULL
- AND @ForceMode = 1
- -- Begin validation
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Communication Type setup table must have defined values for 'Direct', 'Mobile', 'Home', and 'Email'
- SELECT
- NULL,
- 'Import cannot be completed because there is no communication type named "Direct" for direct phone. [Setup] -> [Setup Tables] -> [Communication Type]'
- WHERE NOT EXISTS(SELECT TOP 1 * FROM dbo.Communication_Type WHERE Communication_Name = 'Direct' AND Phone_Flag = 1)
- UNION ALL
- SELECT
- NULL,
- 'Import cannot be completed because there is no communication type named "Mobile" or "Cell" for mobile phone. [Setup] -> [Setup Tables] -> [Communication Type]'
- WHERE NOT EXISTS(SELECT TOP 1 * FROM dbo.Communication_Type WHERE Communication_Name IN ('Mobile', 'Cell') AND Phone_Flag = 1)
- UNION ALL
- SELECT
- NULL,
- 'Import cannot be completed because there is no communication type named "Home" for Home phone. [Setup] -> [Setup Tables] -> [Communication Type]'
- WHERE NOT EXISTS(SELECT TOP 1 * FROM dbo.Communication_Type WHERE Communication_Name IN ('Home', 'Home Phone') AND Phone_Flag = 1)
- UNION ALL
- SELECT
- NULL,
- 'Import cannot be completed because there is no communication type named "Email" for Email address. [Setup] -> [Setup Tables] -> [Communication Type]'
- WHERE NOT EXISTS(SELECT TOP 1 * FROM dbo.Communication_Type WHERE Communication_Name = 'Email' AND Email_Flag = 1)
- UNION ALL
- -- If company is specified, it must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Company: "' + tmp.Company_Name + '" with Company_ID: "' + ISNULL(tmp.Company_ID, '[BLANK]') + '" does not exist or has been deleted.'
- FROM #Import_Staging tmp
- WHERE tmp.Company_Name IS NOT NULL
- AND Company_RecID IS NULL
- UNION ALL
- -- If company_id entered, company_name must also be specified
- SELECT
- tmp.ExcelRowNumber,
- 'If Company_ID is specified, Company_Name must also be entered.'
- FROM #Import_Staging tmp
- WHERE Company_ID IS NOT NULL
- AND Company_Name IS NULL
- UNION ALL
- -- Company_ID is required if multiple companies with the same name already exist
- SELECT
- tmp.ExcelRowNumber,
- 'Multiple companies exist named "' + MIN(tmp.Company_Name) + '". Please specify the Company_ID field to identify which company you are adding this contact to'
- FROM #Import_Staging tmp
- INNER JOIN @Company comp
- ON Comp.company_name = tmp.Company_Name
- AND comp.Delete_Flag = 0
- WHERE tmp.Company_ID IS NULL
- AND tmp.Company_Name IS NOT NULL
- GROUP BY tmp.ExcelRowNumber, comp.Company_Name
- HAVING COUNT(comp.Company_RecID) > 1
- UNION ALL
- -- Company with the same Company_ID cannot exist with a different company name (even if deleted - mirrored from PSA validation)
- SELECT
- tmp.ExcelRowNumber,
- 'The Company_ID: "' + tmp.Company_ID + '" exists, but is not assigned to the company named: ' + tmp.Company_Name
- FROM #Import_Staging tmp
- INNER JOIN @Company comp
- ON comp.Company_ID = tmp.Company_ID
- AND comp.Company_Name <> tmp.Company_Name
- WHERE tmp.Company_Name IS NOT NULL
- AND tmp.Company_ID IS NOT NULL
- UNION ALL
- -- Company_ID must be a valid reference if supplied
- SELECT
- tmp.ExcelRowNUmber,
- 'The Company_ID: "' + tmp.Company_ID + '" does not exist.'
- FROM #Import_Staging tmp
- LEFT OUTER JOIN @Company comp
- ON tmp.Company_ID = comp.Company_ID
- WHERE comp.Company_RecID IS NULL
- AND tmp.Company_ID IS NOT NULL
- UNION ALL
- -- Site must exist if specified
- SELECT
- tmp.ExcelRowNumber,
- 'No site named "' + tmp.Site_Name + '" exists for company: ' + tmp.Company_Name
- FROM #Import_Staging tmp
- INNER JOIN @Company comp
- ON comp.Company_RecID = tmp.Company_RecID
- LEFT OUTER JOIN dbo.Company_Address cad
- ON cad.[Description] = tmp.Site_Name
- WHERE comp.Company_RecID IS NOT NULL
- AND cad.Company_Address_RecID IS NULL
- AND tmp.Company_Name IS NOT NULL
- AND tmp.Site_Name IS NOT NULL
- UNION ALL
- -- If site name not specified, company must have a default
- SELECT
- tmp.ExcelRowNumber,
- 'No default site or address found for Company: "' + Company_Name + '" and no site name was specified in the spreadsheet.'
- FROM #Import_Staging tmp
- WHERE Company_Address_RecID IS NULL
- AND Company_RecID IS NOT NULL
- AND Site_Name IS NULL
- UNION ALL
- -- Department must exist if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid department: "' + tmp.Department + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Department IS NOT NULL
- AND tmp.Department_RecID IS NULL
- UNION ALL
- -- Contact_Type must exist if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Contact Type: "' + tmp.Contact_Type + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Contact_Type IS NOT NULL
- AND tmp.Contact_Type_RecID IS NULL
- UNION ALL
- -- AssignTo must exist if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid "Assign To" Member_ID: "' + tmp.Activity_Assign_To_Member_ID + '"'
- FROM #Import_Staging tmp
- WHERE Activity_Assign_To_Member_ID IS NOT NULL
- AND tmp.Activity_Member_RecID IS NULL
- UNION ALL
- -- Due date, subject, marketing campaign, activity_type not allowed unless AssignTo specified
- SELECT
- tmp.ExcelRowNumber,
- 'Activity Type, Due date, Subject, Notes, and Marketing campaign fields are invalid unless a Member_ID is specified to assign the activity to'
- FROM #Import_Staging tmp
- WHERE tmp.Activity_Assign_To_Member_ID IS NULL
- AND COALESCE(tmp.Activity_Type, tmp.Activity_Subject, tmp.Activity_Due_Date, tmp.Activity_Marketing_Campaign, tmp.Activity_Notes) IS NOT NULL
- UNION ALL
- -- Activity_Due_Date must be a date
- SELECT
- tmp.ExcelRowNumber,
- 'Activity due date must be a valid date: "' + tmp.Activity_Due_Date + '" is invalid. MM/DD/YYYY format is recommended'
- FROM #Import_Staging tmp
- WHERE tmp.Activity_Assign_To_Member_ID IS NOT NULL
- AND tmp.Activity_Due_Date IS NOT NULL
- AND ISDATE(tmp.Activity_Due_Date) = 0
- UNION ALL
- -- Activity marketing campaign must be valid
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid activity marketing campaign: "' + tmp.Activity_Marketing_Campaign + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Marketing_Campaign_RecID IS NULL
- AND tmp.Activity_Marketing_Campaign IS NOT NULL
- UNION ALL
- -- Activity type must be valid if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid activity type: "' + tmp.Activity_Type + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Activity_Type IS NOT NULL
- AND tmp.SO_Activity_Type_RecID IS NULL
- UNION ALL
- -- Email must be valid
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Email Address: "' + tmp.Email_Address
- FROM #Import_Staging tmp
- WHERE tmp.Invalid_Email = 1
- AND @ForceMode = 0
- UNION ALL
- -- Check that boolean fields evaluate to true or false
- SELECT
- tmp.ExcelRowNumber,
- 'Billing Contact must be 0 or 1'
- FROM #Import_Staging tmp
- WHERE tmp.Billing_Contact IS NOT NULL
- AND tmp.Billing_Contact NOT IN('0', '1')
- UNION ALL
- SELECT TOP 1
- NULL,
- 'Cannot add activity because no default Activity Status is defined for new activities - [Setup tables] -> [Activities] -> [Activity Status-CRM]'
- FROM #Import_Staging tmp
- WHERE EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Activity_Member_RecID IS NOT NULL)
- AND @SO_Act_Status_RecID IS NULL
- UNION ALL
- -- Primary contact must evaluate to 0 or 1
- SELECT
- tmp.ExcelRowNumber,
- 'Primary Contact must be 0 or 1'
- FROM #Import_Staging tmp
- WHERE Primary_Contact IS NOT NULL
- AND Primary_Contact NOT IN('0', '1')
- UNION ALL
- -- Site Name cannot be specified if contact is not associated with a company
- SELECT
- tmp.ExcelRowNumber,
- 'Site Name cannot be specified if a contact is not associated with a company'
- FROM #Import_Staging tmp
- WHERE Site_Name IS NOT NULL
- AND COALESCE(tmp.Company_Name, tmp.Company_ID) IS NULL
- UNION ALL
- -- Can't set primary contact = 1 if a primary contact already exists
- SELECT
- tmp.ExcelRowNumber,
- 'A primary contact already exists for company: "' + ISNULL(tmp.Company_Name, tmp.Legacy_Company_ID) + '"'
- FROM #Import_Staging tmp
- WHERE Primary_Contact = '1'
- AND EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Flag = 1)
- AND @Legacy_Flag = 0
- UNION ALL
- -- Can't set billing contact = 1 if a primary contact already exists
- SELECT
- tmp.ExcelRowNumber,
- 'A billing contact already exists for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
- FROM #Import_Staging tmp
- WHERE Primary_Contact = '1'
- AND EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Billing_Flag = 1)
- AND @Legacy_Flag = 0
- UNION ALL
- -- Cannot have more than one primary contact
- SELECT
- MIN(tmp.ExcelRowNumber),
- 'Cannot have more than one primary contact for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Primary_Contact = '1'
- AND @Legacy_Flag = 0
- AND NOT EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Flag = 1)
- GROUP BY tmp.Company_Name, tmp.Company_RecID
- HAVING COUNT(*) > 1
- UNION ALL
- -- Cannot have more than one billing contact
- SELECT
- MIN(tmp.ExcelRowNumber),
- 'Cannot have more than one billing contact for company: "' + ISNULL(tmp.Company_Name, '[BLANK]') + '"'
- FROM #Import_Staging tmp
- WHERE tmp.Billing_Contact = '1'
- AND @Legacy_Flag = 0
- AND NOT EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Billing_Flag = 1)
- GROUP BY tmp.Company_Name, tmp.Company_RecID
- HAVING COUNT(*) > 1
- UNION ALL
- -- Check max-length for all non-reference fields
- SELECT
- tmp.ExcelRowNumber,
- 'First name cannot exceed 30 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.First_Name) > 30
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Last name cannot exceed 30 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Last_Name) > 30
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Job title cannot exceed 100 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Job_Title) > 100
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Direct phone cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Direct_Phone) > 50
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Extension cannot exceed 15 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Direct_Extension) > 15
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Email address cannot exceed 250 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Email_Address) > 250
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Home phone cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Home_Phone) > 50
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Cell Phone cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Cell_Phone) > 50
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Activity Subject cannot exceed 100 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Activity_Subject) > 100
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Relationship cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(tmp.Relationship) > 50
- UNION ALL
- -- User fields cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'User field 1 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_1) > 50
- AND User_Field_1_Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 2 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_2) > 50
- AND User_Field_2_Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 3 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_3) > 50
- AND User_Field_3_Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 4 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_4) > 50
- AND User_Field_4_Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 5 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_5) > 50
- AND User_Field_5_Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 6 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_6) > 50
- AND User_Field_6_Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 7 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_7) > 50
- AND User_Field_7_Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 8 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_8) > 50
- AND User_Field_8_Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 9 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_9) > 50
- AND User_Field_9_Used = 1
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User field 10 cannot exceed 50 characters'
- FROM #Import_Staging tmp
- WHERE LEN(User_Field_10) > 50
- AND User_Field_10_Used = 1
- UNION ALL
- -- User fields can't be entered if 'Not _Used' in dbo.Owner
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 1 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_1 IS NOT NULL
- AND User_Field_1_Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 2 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_2 IS NOT NULL
- AND User_Field_2_Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 3 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_3 IS NOT NULL
- AND User_Field_3_Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 4 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_4 IS NOT NULL
- AND User_Field_4_Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 5 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_5 IS NOT NULL
- AND User_Field_5_Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 6 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_6 IS NOT NULL
- AND User_Field_6_Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 7 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_7 IS NOT NULL
- AND User_Field_7_Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 8 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_8 IS NOT NULL
- AND User_Field_8_Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 9 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_9 IS NOT NULL
- AND User_Field_9_Used = 0
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'User Field 10 cannot be entered because no question has been defined for that field'
- FROM #Import_Staging tmp
- WHERE User_Field_10 IS NOT NULL
- AND User_Field_10_Used = 0
- UNION ALL
- -- Validate portal security level
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid portal security level'
- FROM #Import_Staging tmp
- WHERE Portal_Security_Level_IN IS NOT NULL
- AND Portal_Security_Level_OUT IS NULL
- UNION ALL
- -- Validate portal password
- SELECT
- tmp.ExcelRowNumber,
- 'Portal password cannot exceed 15 characters'
- FROM #Import_Staging tmp
- WHERE Portal_PW IS NOT NULL
- AND CM_Password IS NULL
- UNION ALL
- -- Security level required if password specified
- SELECT
- tmp.ExcelRowNumber,
- 'If a portal password is specified, portal security level is required'
- FROM #Import_Staging tmp
- WHERE Portal_PW IS NOT NULL
- AND Portal_Security_Level_IN IS NULL
- UNION ALL
- -- Password required if security level specified
- SELECT
- tmp.ExcelRowNumber,
- 'If a portal security level is specified, password is required'
- FROM #Import_Staging tmp
- WHERE Portal_PW IS NULL
- AND Portal_Security_Level_IN IS NOT NULL
- -- Return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed
- ROLLBACK TRANSACTION
- RETURN
- END
- ELSE
- BEGIN
- -- Insert warning for duplicate on Company, First_Name, and Last_Name in final table
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag
- )
- SELECT
- tmp.ExcelRowNumber,
- '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.',
- 1
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact cont
- ON ISNULL(dbo.ufn_Import_Trim(cont.First_Name), '') = ISNULL(tmp.First_Name, '')
- AND ISNULL(dbo.ufn_Import_Trim(cont.Last_Name), '') = ISNULL(tmp.Last_Name, '')
- AND cont.Company_RecID = tmp.Company_RecID
- WHERE tmp.Company_Name IS NOT NULL
- UNION ALL
- -- Insert warning if more than one contact on Company, First_Name, Last_Name within this file
- SELECT
- 0,
- '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]') + '".',
- 1
- FROM #Import_Staging tmp
- WHERE @Legacy_Flag = 0
- GROUP BY tmp.First_name, tmp.Last_Name, tmp.Company_Name
- HAVING COUNT(*) > 1
- UNION ALL
- SELECT
- 0,
- '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.',
- 1
- FROM #Import_Staging temp
- WHERE Activity_Assign_To_Member_ID IS NOT NULL
- GROUP BY temp.Company_Name, temp.Company_RecID
- HAVING COUNT(*) > 1
- -- Insert a warning if no primary contact for a company
- --;WITH noprim AS
- --(
- -- -- Get all companies
- -- SELECT DISTINCT Company_Name FROM #Import_Staging WHERE Company_RecID IS NOT NULL
- -- EXCEPT
- -- -- Minus those which have a primary contact set within the spreadsheet
- -- SELECT DISTINCT Company_Name FROM #Import_Staging tmp
- -- WHERE Primary_Contact = '1'
- -- EXCEPT
- -- -- Minus those which have a primary contact set in CW
- -- SELECT DISTINCT Company_Name FROM #Import_Staging tmp
- -- WHERE EXISTS(SELECT TOP 1 * FROM Contact WHERE Company_RecID = tmp.Company_RecID AND Default_Flag = 1)
- --)
- --INSERT INTO #tblResults
- --(
- -- RowNumber,
- -- ValMsg,
- -- Warning_Flag
- --)
- --SELECT
- -- 0,
- -- 'NO PRIMARY CONTACT WARNING: These companies do not have primary contacts. Consider adding them: "' +
- -- STUFF(
- -- (SELECT '", ' + ISNULL(noprim.Company_Name, '') FROM noprim WHERE Company_Name IS NOT NULL FOR XML PATH(''), TYPE)
- -- .value('text()[1]','nvarchar(max)'),1,2,N''),
- -- 1
- -- If there are warnings, return warning messages, but pass validation
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed res
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- RETURN
- END
- ELSE
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS Valmsg
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- RETURN
- END
- END
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_Contact_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_Contact_ImportPush] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 05/22/2013
- -- Description: Performs final validation and inserts
- -- for contacts import
- -- Sample call: exec usp_Contact_ImportPush '5954214F-479D-4FBB-A133-6B2EE862F9A9'
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_Contact_ImportPush]
- @TableName VARCHAR(MAX),
- @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
- @ForceMode BIT = 0
- AS
- BEGIN TRY
- -- Turn off diff mode - no longer used
- SELECT @DiffMode = 0
- SET NOCOUNT ON
- -- Set date format to MDY to validate dates from excel
- SET DATEFORMAT MDY
- -- Variable declaration
- DECLARE
- @ExpRowCount INT, -- Expected rowcount for inserts
- @ImportBatchUser VARCHAR(15), -- Member_ID to use for 'UpdatedBy' to identify this batch (i.e. Import3049)
- @ImportBatchID INT, -- RecID from dbo.Lead_Import_Batch
- @ErrorMsg VARCHAR(1500),
- @Owner_ID INT,
- @Communication_Type_RecID INT,
- @Schedule_Type_RecID INT, -- Schedule_Type_RecID for activities
- @Schedule_Type_ID CHAR(1), -- Schedule_Type_ID for activities
- @SO_Act_Status_RecID INT, -- RecID for default activity status
- @SR_Location_RecID INT, -- RecID for default service location
- @Curr_Insert_RecID INT, -- RecID for staging record currently being inserted to Schedule_Detail in loop
- @Max_RecID INT -- Holds max RecID prior to insert on various final tables (used for performance when capturing new identities)
- -- Dynamic statement to insert to validation table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Flag to indicate custom conversion (i.e. Autotask)
- DECLARE @CustomMigration BIT
- SELECT @CustomMigration = 0
- -- Flag to indicate migration being matched on Legacy_ID
- DECLARE @Legacy_Flag BIT = 0
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Add optional columns to source
- IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Portal Security Level')
- EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Portal Security Level] NVARCHAR(100)')
- IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Portal Password')
- EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Portal Password] NVARCHAR(100)')
- IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
- EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Legacy_ID] NVARCHAR(100)')
- IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
- EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Legacy_Company_ID] NVARCHAR(100)')
- IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Legacy_Site_ID')
- EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Legacy_Site_ID] NVARCHAR(100)')
- IF NOT EXISTS(SELECT 1 FROM @SourceColumns WHERE ColumnName = 'Inactive_Flag')
- EXEC('ALTER TABLE ' + @SourceTable + ' ADD [Inactive_Flag] NVARCHAR(100)')
- -- Table to hold source data for this batch from temp table
- IF (OBJECT_ID('#Import_Staging') IS NOT NULL)
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT NULL,
- Company_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- First_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Last_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Site_Name nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Contact_Type nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Relationship nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Department nvarchar(30) COLLATE DATABASE_DEFAULT NULL,
- Job_Title nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Direct_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Direct_Extension NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Email_Address nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Home_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Cell_Phone nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Assign_To_Member_ID nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Type NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Subject nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- Activity_Due_Date NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Activity_Marketing_Campaign NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Primary_Contact nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Billing_Contact nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Contact_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- User_Field_1 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_2 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_3 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_4 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_5 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_6 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_7 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_8 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_9 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- User_Field_10 NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- BatchID uniqueidentifier NULL,
- Company_RecID INT,
- Department_RecID INT,
- Company_Address_RecID INT,
- Contact_Type_RecID INT,
- Note_Type_RecID INT,
- Relationship_RecID INT,
- Activity_Member_RecID INT,
- SO_Activity_Type_RecID INT,
- Marketing_Campaign_RecID INT,
- Invalid_Email BIT,
- New_Identity INT,
- Activity_RecID_New INT,
- Schedule_RecID_New INT,
- Contact_RecID_Dup INT,
- Direct_Cleanup_Req BIT,
- Home_Cleanup_Req BIT,
- Cell_Cleanup_Req BIT,
- InsertOrder INT,
- DefaultCommType INT, -- Used to calculate which communication type should be default based on what is/isn't null
- Schedule_Detail_Inserted BIT,
- Portal_Security_Level_IN NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Portal_PW NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- CM_Password NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Portal_Security_Level_OUT INT,
- Legacy_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Company_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Site_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- Contact_RecID INT,
- Legacy_Ticket_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- SR_Service_RecID INT,
- Legacy_Opp_ID NVARCHAR(100) COLLATE DATABASE_DEFAULT,
- SO_Opportunity_RecID INT,
- Diff_Exclude_Flag BIT,
- Inactive_Flag BIT
- )
- -- Build statement to populate staging table
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- ExcelRowNumber,
- Company_Name,
- Company_ID,
- First_Name,
- Last_Name,
- Site_Name,
- Contact_Type,
- Relationship,
- Department,
- Job_Title,
- Direct_Phone,
- Direct_Extension,
- Email_Address,
- Home_Phone,
- Cell_Phone,
- Activity_Assign_To_Member_ID,
- Activity_Type,
- Activity_Subject,
- Activity_Notes,
- Activity_Due_Date,
- Activity_Marketing_Campaign,
- Primary_Contact,
- Billing_Contact,
- Contact_Notes,
- User_Field_1,
- User_Field_2,
- User_Field_3,
- User_Field_4,
- User_Field_5,
- User_Field_6,
- User_Field_7,
- User_Field_8,
- User_Field_9,
- User_Field_10,
- Portal_Security_Level_IN,
- Portal_PW,
- Legacy_ID,
- Legacy_Company_ID,
- Legacy_Site_ID,
- Inactive_Flag
- )
- SELECT
- [Excel Row Number],
- [Company Name],
- [Company ID],
- [First Name],
- [Last Name],
- [Site Name],
- [Contact Type],
- [Relationship],
- LEFT([Department], 30),
- [Job Title],
- [Direct Phone],
- [Direct Extension],
- [Email Address],
- [Home Phone],
- [Cell Phone],
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- [Primary Contact],
- [Billing Contact],
- [Contact Notes],
- [User Field 1],
- [User Field 2],
- [User Field 3],
- [User Field 4],
- [User Field 5],
- [User Field 6],
- [User Field 7],
- [User Field 8],
- [User Field 9],
- [User Field 10],
- [Portal Security Level],
- [Portal Password],
- Legacy_ID,
- Legacy_Company_ID,
- Legacy_Site_ID,
- Inactive_Flag
- FROM ' + @SourceTable
- -- Pull data into staging table
- EXEC(@DSQL)
- ---- Update temp table with optional field values if they exist
- --IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Portal Security Level')
- --BEGIN
- -- SELECT @DSQL = '
- -- UPDATE tmp
- -- SET tmp.Portal_Security_Level_IN = src.[Portal Security Level]
- -- FROM #Import_Staging tmp
- -- INNER JOIN ' + @SourceTable + ' src
- -- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- -- EXEC(@DSQL)
- --END
- --IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Portal Password')
- --BEGIN
- -- SELECT @DSQL = '
- -- UPDATE tmp
- -- SET tmp.Portal_PW = src.[Portal Password]
- -- FROM #Import_Staging tmp
- -- INNER JOIN ' + @SourceTable + ' src
- -- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- -- EXEC(@DSQL)
- --END
- --IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_ID')
- --BEGIN
- -- SELECT @DSQL = '
- -- UPDATE tmp
- -- SET tmp.Legacy_ID = src.Legacy_ID
- -- FROM #Import_Staging tmp
- -- INNER JOIN ' + @SourceTable + ' src
- -- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- -- EXEC(@DSQL)
- --END
- --IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Inactive_Flag')
- --BEGIN
- -- SELECT @DSQL = '
- -- UPDATE tmp
- -- SET tmp.Inactive_Flag = src.Inactive_Flag
- -- FROM #Import_Staging tmp
- -- CROSS APPLY(SELECT TOP 1 Inactive_Flag FROM ' + @SourceTable + ' src WHERE src.[Excel Row Number] = tmp.ExcelRowNumber)src
- -- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- -- EXEC(@DSQL)
- --END
- -- Update empty string or single space to null in staging table
- UPDATE #Import_Staging SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- Company_Name = CASE WHEN Company_Name IN('', ' ') THEN NULL ELSE Company_Name END,
- Company_ID = CASE WHEN Company_ID IN('', ' ') THEN NULL ELSE Company_ID END,
- First_Name = CASE WHEN First_Name IN('', ' ') THEN NULL ELSE First_Name END,
- Last_Name = CASE WHEN Last_Name IN('', ' ') THEN NULL ELSE Last_Name END,
- Site_Name = CASE WHEN Site_Name IN('', ' ') THEN NULL ELSE Site_Name END,
- Contact_Type = CASE WHEN Contact_Type IN('', ' ') THEN NULL ELSE Contact_Type END,
- Relationship = CASE WHEN Relationship IN('', ' ') THEN NULL ELSE Relationship END,
- Department = CASE WHEN Department IN('', ' ') THEN NULL ELSE Department END,
- Job_Title = CASE WHEN Job_Title IN('', ' ') THEN NULL ELSE Job_Title END,
- Direct_Phone = CASE WHEN Direct_Phone IN('', ' ') THEN NULL ELSE Direct_Phone END,
- Direct_Extension = CASE WHEN Direct_Extension IN('', ' ') THEN NULL ELSE Direct_Extension END,
- Email_Address = CASE WHEN Email_Address IN('', ' ') THEN NULL ELSE Email_Address END,
- Home_Phone = CASE WHEN Home_Phone IN('', ' ') THEN NULL ELSE Home_Phone END,
- Cell_Phone = CASE WHEN Cell_Phone IN('', ' ') THEN NULL ELSE Cell_Phone END,
- Activity_Assign_To_Member_ID = CASE WHEN Activity_Assign_To_Member_ID IN('', ' ') THEN NULL ELSE Activity_Assign_To_Member_ID END,
- Activity_Type = CASE WHEN Activity_Type IN('', ' ') THEN NULL ELSE Activity_Type END,
- Activity_Subject = CASE WHEN Activity_Subject IN('', ' ') THEN NULL ELSE Activity_Subject END,
- Activity_Notes = CASE WHEN Activity_Notes IN('', ' ') THEN NULL ELSE Activity_Notes END,
- Activity_Due_Date = CASE WHEN Activity_Due_Date IN('', ' ') THEN NULL ELSE Activity_Due_Date END,
- Activity_Marketing_Campaign = CASE WHEN Activity_Marketing_Campaign IN('', ' ') THEN NULL ELSE Activity_Marketing_Campaign END,
- Primary_Contact = CASE WHEN Primary_Contact IN('', ' ') THEN NULL ELSE Primary_Contact END,
- Billing_Contact = CASE WHEN Billing_Contact IN('', ' ') THEN NULL ELSE Billing_Contact END,
- Contact_Notes = CASE WHEN Contact_Notes IN('', ' ') THEN NULL ELSE Contact_Notes END,
- User_Field_1 = CASE WHEN User_Field_1 IN('', ' ') THEN NULL ELSE User_Field_1 END,
- User_Field_2 = CASE WHEN User_Field_2 IN('', ' ') THEN NULL ELSE User_Field_2 END,
- User_Field_3 = CASE WHEN User_Field_3 IN('', ' ') THEN NULL ELSE User_Field_3 END,
- User_Field_4 = CASE WHEN User_Field_4 IN('', ' ') THEN NULL ELSE User_Field_4 END,
- User_Field_5 = CASE WHEN User_Field_5 IN('', ' ') THEN NULL ELSE User_Field_5 END,
- User_Field_6 = CASE WHEN User_Field_6 IN('', ' ') THEN NULL ELSE User_Field_6 END,
- User_Field_7 = CASE WHEN User_Field_7 IN('', ' ') THEN NULL ELSE User_Field_7 END,
- User_Field_8 = CASE WHEN User_Field_8 IN('', ' ') THEN NULL ELSE User_Field_8 END,
- User_Field_9 = CASE WHEN User_Field_9 IN('', ' ') THEN NULL ELSE User_Field_9 END,
- User_Field_10 = CASE WHEN User_Field_10 IN('', ' ') THEN NULL ELSE User_Field_10 END,
- Portal_Security_Level_IN = CASE WHEN Portal_Security_Level_IN IN('', ' ') THEN NULL ELSE Portal_Security_Level_IN END,
- Portal_PW = CASE WHEN Portal_PW IN('', ' ') THEN NULL ELSE Portal_PW END
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Legacy_ID IS NOT NULL)
- BEGIN
- SELECT @Legacy_Flag = 1
- EXEC usp_Import_Match_Legacy @TableName, 'Contact'
- END
- -- Identify if Autotask/Custom conversion and handle appropriately
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Contact_Type = 'CW_Custom_Conversion')
- BEGIN
- -- Get rid of export config row created by SSIS
- DELETE FROM #Import_Staging
- WHERE Contact_Type = 'CW_Custom_Conversion'
- -- Set flag to indicate custom migration
- SELECT @CustomMigration = 1
- END
- -- Table to hold trimmed company names and company_ids from dbo.company
- -- Prevents need to join on trim function each time we touch company table (performance concern)
- -- Also filters rows that are unrelated to import batch
- DECLARE @Company TABLE
- (
- Company_RecID INT,
- Company_ID VARCHAR(50),
- Company_Name VARCHAR(50),
- Delete_Flag BIT
- )
- -- Populate @Company
- INSERT INTO @Company
- (
- Company_RecID,
- Company_ID,
- Company_Name,
- Delete_Flag
- )
- -- With rows that require trimming
- SELECT
- Company_RecID,
- dbo.ufn_Import_Trim(Company_ID),
- dbo.ufn_Import_Trim(Company_Name),
- Delete_Flag
- FROM dbo.Company comp
- -- Use ASCII match to detect leading or trailing spaces
- WHERE ASCII(LEFT(comp.Company_Name, 1)) = 32
- OR ASCII(RIGHT(comp.Company_Name, 1)) = 32
- OR ASCII(LEFT(comp.Company_ID, 1)) = 32
- OR ASCII(RIGHT(comp.Company_Name, 1)) = 32
- UNION
- -- And rows that do not require trimming
- SELECT
- Company_RecID,
- Company_ID,
- Company_Name,
- Delete_Flag
- FROM dbo.Company
- -- WHERE condition to exclude rows unrelated to import batch
- WHERE Company_Name IN(SELECT Company_Name FROM #Import_Staging)
- OR Company_ID IN(SELECT Company_ID FROM #Import_Staging)
- -- Join to tables in CW to gather RecID's for references
- -- Company_RecID
- -- Get by Company_ID first
- UPDATE tmp
- SET tmp.Company_RecID = comp.Company_RecID
- FROM #Import_Staging tmp
- INNER JOIN @Company comp
- ON comp.Company_ID = tmp.Company_ID
- AND comp.Delete_Flag = 0
- WHERE tmp.Company_ID IS NOT NULL
- -- Get by Company name for records where Company_ID is null
- UPDATE tmp
- SET tmp.Company_RecID = comp.Company_RecID
- FROM #Import_Staging tmp
- INNER JOIN @Company comp
- ON comp.Company_Name = tmp.Company_Name
- AND comp.Delete_Flag = 0
- WHERE tmp.Company_ID IS NULL
- -- Department_RecID
- UPDATE tmp
- SET tmp.Department_RecID = dep.Department_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Department dep
- ON dbo.ufn_Import_Trim(dep.Department_Name) = tmp.Department
- -- Company_Address_RecID
- -- If site name specified, get by site name
- UPDATE tmp
- SET tmp.Company_Address_RecID = cad.Company_Address_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Address cad
- ON cad.Company_RecID = tmp.Company_RecID
- AND tmp.Site_Name = cad.[Description]
- WHERE tmp.Site_Name IS NOT NULL
- -- If site name not specified, get default
- UPDATE tmp
- SET tmp.Company_Address_RecID = cad.Company_Address_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Company_Address cad
- ON cad.Company_RecID = tmp.Company_RecID
- AND cad.Default_Flag = 1
- WHERE tmp.Company_Address_RecID IS NULL
- -- Note_Type_RecID for default note type
- UPDATE tmp
- SET tmp.Note_Type_RecID = nt.Note_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Note_Type nt
- ON nt.Default_Flag = 1
- -- Activity_Member_RecID
- UPDATE tmp
- SET tmp.Activity_Member_RecID = mem.Member_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Member mem
- ON dbo.ufn_Import_Trim(mem.Member_ID) = tmp.Activity_Assign_To_Member_ID
- -- Contact_Type_RecID
- UPDATE tmp
- SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact_Type ct
- ON tmp.Contact_Type = dbo.ufn_Import_Trim(ct.[Description])
- WHERE tmp.Contact_Type IS NOT NULL
- -- Get default contact type if not specified in spreadsheet
- UPDATE tmp
- SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact_Type ct
- ON ct.Default_Flag = 1
- WHERE tmp.Contact_Type IS NULL
- -- Marketing_Campaign_RecID
- UPDATE tmp
- SET tmp.Marketing_Campaign_RecID = mc.Marketing_Campaign_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Marketing_Campaign mc
- ON tmp.Activity_Marketing_Campaign = dbo.ufn_Import_Trim(mc.Marketing_ID)
- WHERE tmp.Activity_Marketing_Campaign IS NOT NULL
- -- SO_Activity_Type_RecID
- UPDATE tmp
- SET tmp.SO_Activity_Type_RecID = at.SO_Activity_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.SO_Activity_Type at
- ON dbo.ufn_Import_Trim(at.[Description]) = tmp.Activity_Type
- WHERE tmp.Activity_Type IS NOT NULL
- -- Get default Activity_Type if not specified
- UPDATE tmp
- SET tmp.SO_Activity_Type_RecID = at.SO_Activity_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.SO_Activity_Type at
- ON at.Default_Flag = 1
- WHERE tmp.Activity_Type IS NULL
- AND tmp.Activity_Assign_To_Member_ID IS NOT NULL
- -- Get Schedule_Type ID and RecID for so_activity
- SELECT @Schedule_Type_RecID = (SELECT TOP 1 Schedule_Type_RecID FROM dbo.Schedule_Type WHERE Table_Reference = 'so_activity')
- SELECT @Schedule_Type_ID = (SELECT Schedule_Type_ID FROM dbo.Schedule_Type WHERE Schedule_Type_RecID = @Schedule_Type_RecID)
- -- Get default SO_Act_Status_RecID
- SELECT @SO_Act_Status_RecID = (SELECT TOP 1 SO_Act_Status_RecID FROM dbo.SO_Act_Status WHERE Default_Flag = 1)
- -- Get default SR_Location_RecID for activity location
- SELECT @SR_Location_RecID = (SELECT TOP 1 SR_Location_RecID FROM dbo.SR_Location WHERE Default_Flag = 1)
- -- Update boolean fields to 0 or 1
- UPDATE stag
- SET stag.Primary_Contact = CASE WHEN stag.Primary_Contact IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' ELSE 0 END,
- stag.Billing_Contact = CASE WHEN stag.Billing_Contact IN('1', 'Y', 'Yes', 'True', 'T') THEN '1' ELSE 0 END
- FROM #Import_Staging stag
- UPDATE stag
- SET stag.Inactive_Flag = '0'
- FROM #Import_Staging stag
- WHERE stag.Inactive_Flag IS NULL
- OR stag.Inactive_Flag <> '1'
- -- Determine if contacts have a duplicate on Company and Contact Name and remove from staging table (only for differential mode)
- IF @DiffMode = 1 AND @Legacy_Flag = 0
- BEGIN
- DELETE stag
- FROM #Import_Staging stag
- INNER JOIN dbo.Contact cont
- ON ISNULL(cont.Company_RecID, -1) = ISNULL(stag.Company_RecID, -1)
- AND ISNULL(dbo.ufn_Import_Trim(cont.First_Name), '') = ISNULL(stag.First_Name, '')
- AND ISNULL(dbo.ufn_Import_Trim(cont.Last_Name), '') = ISNULL(stag.Last_Name, '')
- END
- -- Determine phone numbers that need cleanup (pre-processing step to save on resource intensive string cleanup operation)
- UPDATE #Import_Staging
- SET Direct_Cleanup_Req = 1
- WHERE PATINDEX('%[^0-9()-+ ]%', Direct_Phone) > 0
- UPDATE #Import_Staging
- SET Home_Cleanup_Req = 1
- WHERE PATINDEX('%[^0-9()-+ ]%', Home_Phone) > 0
- UPDATE #Import_Staging
- SET Cell_Cleanup_Req = 1
- WHERE PATINDEX('%[^0-9()-+ ]%', Cell_Phone) > 0
- -- Cleanup phone numbers that have non-numeric characters
- -- Direct Phone
- ;WITH Num1 (n) AS
- (SELECT 1 UNION ALL SELECT 1),
- Num2 (n) AS
- (SELECT 1 FROM Num1 AS X, Num1 AS Y),
- Num3 (n) AS
- (SELECT 1 FROM Num2 AS X, Num2 AS Y),
- Num4 (n) AS
- (SELECT 1 FROM Num3 AS X, Num3 AS Y),
- Nums (n) AS
- (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
- Cleaner AS
- (
- SELECT Direct_Phone, (
- SELECT CASE WHEN SUBSTRING(Direct_Phone, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(Direct_Phone, n, 1) ELSE '' END + ''
- FROM Nums
- WHERE n <= LEN(Direct_Phone)
- FOR XML PATH('')) AS PhoneNbr_Comp_clean
- FROM #Import_Staging
- WHERE Direct_Cleanup_Req = 1
- )
- UPDATE stag
- SET stag.Direct_Phone = REPLACE(cl.PhoneNbr_Comp_clean, ' ', ' ')
- FROM #Import_Staging stag
- INNER JOIN Cleaner cl
- ON cl.Direct_Phone = stag.Direct_Phone
- -- Home Phone
- ;WITH Num1 (n) AS
- (SELECT 1 UNION ALL SELECT 1),
- Num2 (n) AS
- (SELECT 1 FROM Num1 AS X, Num1 AS Y),
- Num3 (n) AS
- (SELECT 1 FROM Num2 AS X, Num2 AS Y),
- Num4 (n) AS
- (SELECT 1 FROM Num3 AS X, Num3 AS Y),
- Nums (n) AS
- (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
- Cleaner AS
- (
- SELECT Home_Phone, (
- SELECT CASE WHEN SUBSTRING(Home_Phone, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(Home_Phone, n, 1) ELSE '' END + ''
- FROM Nums
- WHERE n <= LEN(Home_Phone)
- FOR XML PATH('')) AS PhoneNbr_Comp_clean
- FROM #Import_Staging
- WHERE Home_Cleanup_Req = 1
- )
- UPDATE stag
- SET stag.Home_Phone = REPLACE(cl.PhoneNbr_Comp_clean, ' ', ' ')
- FROM #Import_Staging stag
- INNER JOIN Cleaner cl
- ON cl.Home_Phone = stag.Home_Phone
- -- Cell Phone
- ;WITH Num1 (n) AS
- (SELECT 1 UNION ALL SELECT 1),
- Num2 (n) AS
- (SELECT 1 FROM Num1 AS X, Num1 AS Y),
- Num3 (n) AS
- (SELECT 1 FROM Num2 AS X, Num2 AS Y),
- Num4 (n) AS
- (SELECT 1 FROM Num3 AS X, Num3 AS Y),
- Nums (n) AS
- (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
- Cleaner AS
- (
- SELECT Cell_Phone, (
- SELECT CASE WHEN SUBSTRING(Cell_Phone, n, 1) NOT LIKE '[^0-9()-+ ]' THEN SUBSTRING(Cell_Phone, n, 1) ELSE '' END + ''
- FROM Nums
- WHERE n <= LEN(Cell_Phone)
- FOR XML PATH('')) AS PhoneNbr_Comp_clean
- FROM #Import_Staging
- WHERE Cell_Cleanup_Req = 1
- )
- UPDATE stag
- SET stag.Cell_Phone = REPLACE(cl.PhoneNbr_Comp_clean, ' ', ' ')
- FROM #Import_Staging stag
- INNER JOIN Cleaner cl
- ON cl.Cell_Phone = stag.Cell_Phone
- -- Determine which communication should be inserted as default for each contact (Preference order: Direct Phone -> Cell Phone -> Home Phone -> Email
- UPDATE stag
- SET stag.DefaultCommType =
- CASE
- WHEN Direct_Phone IS NOT NULL THEN 1
- WHEN Cell_Phone IS NOT NULL THEN 2
- WHEN Home_Phone IS NOT NULL THEN 3
- WHEN Email_Address IS NOT NULL THEN 4
- ELSE NULL
- END
- FROM #Import_Staging stag
- -- Portal security level
- -- By security level caption
- UPDATE tmp
- SET tmp.Portal_Security_Level_Out =
- CASE cc.Field_Name
- WHEN 'portal_security_level_1' THEN 1
- WHEN 'portal_security_level_2' THEN 2
- WHEN 'portal_security_level_3' THEN 3
- WHEN 'portal_security_level_4' THEN 4
- WHEN 'portal_security_level_5' THEN 5
- WHEN 'portal_security_level_6' THEN 6
- ELSE NULL END
- FROM #Import_Staging tmp
- 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
- WHERE tmp.Portal_Security_Level_IN IS NOT NULL
- AND tmp.Portal_Security_Level_IN <> ''
- -- By security level number
- UPDATE tmp
- SET tmp.Portal_Security_Level_OUT = tmp.Portal_Security_Level_IN
- FROM #Import_Staging tmp
- WHERE ISNUMERIC(tmp.Portal_Security_Level_IN) = 1
- AND tmp.Portal_Security_Level_IN BETWEEN 1 AND 6
- AND tmp.Portal_Security_Level_OUT IS NULL
- -- Get portal password
- UPDATE tmp
- SET tmp.CM_Password = dbo.udf_EncrDecr(Portal_PW, 'E')
- FROM #Import_Staging tmp
- WHERE tmp.Portal_PW IS NOT NULL
- AND LEN(Portal_PW) <= 15
- -- Clean up/insert references as-necessary for force mode
- UPDATE tmp
- SET tmp.Primary_Contact = 0
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact cont
- ON tmp.Company_RecID = cont.Company_RecID
- AND cont.Default_Flag = 1
- AND tmp.Primary_Contact = 1
- WHERE @ForceMode = 1
- UPDATE tmp
- SET tmp.Billing_Contact = 0
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact cont
- ON tmp.Company_RecID = cont.Company_RecID
- AND cont.Default_Billing_Flag = 1
- AND tmp.Billing_Contact = 1
- WHERE @ForceMode = 1
- INSERT INTO Contact_Type
- (
- Contact_Type_ID,
- [Description],
- Default_Flag,
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- '',
- tmp.Contact_Type,
- 0,
- GETDATE(),
- 'Import'
- FROM #Import_Staging tmp
- WHERE Contact_Type IS NOT NULL
- AND Contact_Type_RecID IS NULL
- AND @ForceMode = 1
- UPDATE tmp
- SET tmp.Contact_Type_RecID = ct.Contact_Type_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Contact_Type ct
- ON tmp.Contact_Type = dbo.ufn_Import_Trim(ct.[Description])
- WHERE tmp.Contact_Type IS NOT NULL
- AND tmp.Contact_Type_RecID IS NULL
- AND @ForceMode = 1
- INSERT INTO dbo.Department
- (
- Owner_ID,
- Department_Name,
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- 1,
- Department,
- GETDATE(),
- 'Import'
- FROM #Import_Staging tmp
- WHERE tmp.Department IS NOT NULL
- AND tmp.Department_RecID IS NULL
- AND @ForceMode = 1
- -- Department_RecID
- UPDATE tmp
- SET tmp.Department_RecID = dep.Department_RecID
- FROM #Import_Staging tmp
- INNER JOIN dbo.Department dep
- ON dbo.ufn_Import_Trim(dep.Department_Name) = tmp.Department
- WHERE Department IS NOT NULL
- AND tmp.Department_RecID IS NULL
- AND @ForceMode = 1
- UPDATE #Import_Staging
- SET First_Name = '[No Name]'
- WHERE First_Name IS NULL
- AND Last_Name IS NULL
- -- Begin Push
- BEGIN TRANSACTION Contact_Import
- -- Insert to dbo.Lead_Import_Batch to generate new batch
- INSERT INTO Lead_Import_Batch
- (
- [Description]
- )
- SELECT 'Contact import batch run at: ' + CAST(GETDATE() AS VARCHAR(25))
- -- Get RecID FROM Lead_Import_Batch
- SELECT @ImportBatchID = SCOPE_IDENTITY()
- -- Set Member_ID to use for 'UpdatedBy' to identify this batch
- SELECT @ImportBatchUser = 'Import' + CAST(@ImportBatchID AS VARCHAR(9))
- -- Get expected rowcount for dbo.Contact insert
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging
- -- Get Owner_ID for inserts
- SELECT @Owner_ID = (SELECT TOP 1 Owner_ID FROM dbo.[Owner])
- -- Handle case where site no longer exists (Phase 2 migration)
- UPDATE stag
- SET stag.Company_Address_RecID = pri.Company_Address_RecID
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 * FROM Company_Address pri WHERE pri.Company_RecID = stag.Company_RecID ORDER BY Default_Flag DESC)pri
- WHERE NOT EXISTS(SELECT 1 FROM Company_Address cad WHERE cad.Company_Address_RecID = stag.Company_Address_RecID)
- -- Insert new contacts to dbo.Contact
- -- Repurpose Seq_Nbr field to catch identity from source table
- -- Pre-2016.3
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.tables WHERE name = 'Contact_Portal_Access')
- BEGIN
- INSERT INTO dbo.Contact
- (
- Owner_ID,
- Company_RecID,
- First_Name,
- Last_Name,
- Title,
- Relationship,
- Default_Flag,
- Last_Update,
- Updated_By,
- Contact_Type_RecID,
- Userfield1,
- Userfield2,
- Userfield3,
- Userfield4,
- Userfield5,
- Userfield6,
- Userfield7,
- Userfield8,
- Userfield9,
- Userfield10,
- Company_Address_RecID,
- Default_Billing_Flag,
- Date_Entered,
- Seq_Nbr,
- Portal_Security_Level,
- CM_Password,
- Inactive_Flag
- )
- SELECT
- @Owner_ID,
- Company_RecID,
- First_Name,
- Last_Name,
- Job_Title,
- Relationship,
- Primary_Contact,
- GETDATE(),
- @ImportBatchUser,
- Contact_Type_RecID,
- User_Field_1,
- User_Field_2,
- User_Field_3,
- User_Field_4,
- User_Field_5,
- User_Field_6,
- User_Field_7,
- User_Field_8,
- User_Field_9,
- User_Field_10,
- Company_Address_RecID,
- Billing_Contact,
- GETDATE(),
- ExcelRowNumber,
- Portal_Security_Level_OUT,
- CM_Password,
- Inactive_Flag
- FROM #Import_Staging stag
- ORDER BY ExcelRowNumber ASC
- END
- IF EXISTS(SELECT TOP 1 * FROM sys.tables WHERE name = 'Contact_Portal_Access')
- BEGIN
- INSERT INTO dbo.Contact
- (
- Owner_ID,
- Company_RecID,
- First_Name,
- Last_Name,
- Title,
- Relationship,
- Default_Flag,
- Last_Update,
- Updated_By,
- Contact_Type_RecID,
- Userfield1,
- Userfield2,
- Userfield3,
- Userfield4,
- Userfield5,
- Userfield6,
- Userfield7,
- Userfield8,
- Userfield9,
- Userfield10,
- Company_Address_RecID,
- Default_Billing_Flag,
- Date_Entered,
- Seq_Nbr,
- Inactive_Flag
- )
- SELECT
- @Owner_ID,
- Company_RecID,
- First_Name,
- Last_Name,
- Job_Title,
- Relationship,
- Primary_Contact,
- GETDATE(),
- @ImportBatchUser,
- Contact_Type_RecID,
- User_Field_1,
- User_Field_2,
- User_Field_3,
- User_Field_4,
- User_Field_5,
- User_Field_6,
- User_Field_7,
- User_Field_8,
- User_Field_9,
- User_Field_10,
- Company_Address_RecID,
- Billing_Contact,
- GETDATE(),
- ExcelRowNumber,
- Inactive_Flag
- FROM #Import_Staging stag
- ORDER BY ExcelRowNumber ASC
- END
- -- Join dbo.Contact back to staging table to get new identities
- UPDATE stag
- SET stag.New_Identity = cont.Contact_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Contact cont
- ON cont.Seq_Nbr = stag.ExcelRowNumber
- AND Updated_By = @ImportBatchUser
- -- Contact_Portal_Access insert for 2016.3+
- IF EXISTS(SELECT TOP 1 * FROM sys.tables WHERE name = 'Contact_Portal_Access')
- BEGIN
- INSERT INTO Contact_Portal_Access
- (
- Contact_RecID,
- CM_Password,
- Disable_Flag,
- Portal_Security_Level,
- Last_Update_UTC,
- Updated_By,
- Login_Attempts,
- Account_Locked
- )
- SELECT
- New_Identity,
- CM_Password,
- 0,
- Portal_Security_Level_Out,
- GETUTCDATE(),
- @ImportBatchUser,
- 0,
- 0
- FROM #Import_Staging
- WHERE CM_Password IS NOT NULL
- END
- -- Reset Seq_Nbr to 0 for rows in this batch
- UPDATE cont
- SET cont.Seq_Nbr = 0
- FROM dbo.Contact cont
- WHERE Updated_By = @ImportBatchUser
- -- All records should have a New_Identity now - error/rollback if not
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE New_Identity IS NULL)
- BEGIN
- RAISERROR('NULL New_Identity after insert to dbo.Contact', 16, 1)
- END
- -- Get rowcount for dbo.Contact_Note insert
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Contact_Notes IS NOT NULL
- -- Perform insert to dbo.Contact_Note
- INSERT INTO dbo.Contact_Note
- (
- Owner_ID,
- Contact_RecID,
- Note_Type_RecID,
- Notes,
- Entered_By,
- Last_Update,
- Updated_By
- )
- SELECT
- @Owner_ID,
- New_Identity,
- Note_Type_RecID,
- Contact_Notes,
- @ImportBatchUser,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging stag
- WHERE stag.Contact_Notes IS NOT NULL
- -- Compare expected rowcount to actual - error on mistmatch to force rollback
- IF @@ROWCOUNT <> @ExpRowCount
- BEGIN
- SELECT @ErrorMsg = 'dbo.Contact_Note insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
- RAISERROR(@ErrorMsg, 16, 1)
- END
- -- Set expected rowcount for direct number insert
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Direct_Phone IS NOT NULL
- -- Set Communication_Type_RecID for Direct
- SELECT @Communication_Type_RecID = (SELECT TOP 1 Communication_Type_RecID FROM dbo.Communication_Type WHERE Communication_Name = 'Direct' and Phone_Flag = 1)
- -- Perform insert to dbo.Contact_Communication for direct phone
- INSERT INTO dbo.Contact_Communication
- (
- Owner_ID,
- Contact_RecID,
- Communication_Type_RecID,
- Default_Flag,
- [Description],
- Extension,
- Last_Update,
- Updated_By
- )
- SELECT
- @Owner_ID,
- New_Identity,
- @Communication_Type_RecID,
- 1,
- Direct_Phone,
- Direct_Extension,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging stag
- WHERE stag.Direct_Phone IS NOT NULL
- ORDER BY ExcelRowNumber ASC
- -- Compare expected rowcount to actual - error on mistmatch to force rollback
- IF @@ROWCOUNT <> @ExpRowCount
- BEGIN
- SELECT @ErrorMsg = 'Direct phone insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
- RAISERROR(@ErrorMsg, 16, 1)
- END
- -- Set expected rowcount for cell number insert
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Cell_Phone IS NOT NULL
- -- Set Communication_Type_RecID for Cell phone
- SELECT @Communication_Type_RecID = (SELECT TOP 1 Communication_Type_RecID FROM dbo.Communication_Type WHERE Communication_Name IN ('Mobile', 'Cell') and Phone_Flag = 1)
- -- Perform insert to dbo.Contact_Communication for cell phone
- INSERT INTO dbo.Contact_Communication
- (
- Owner_ID,
- Contact_RecID,
- Communication_Type_RecID,
- Default_Flag,
- [Description],
- Last_Update,
- Updated_By
- )
- SELECT
- @Owner_ID,
- New_Identity,
- @Communication_Type_RecID,
- CASE WHEN stag.DefaultCommType = 2 THEN 1 ELSE 0 END,
- Cell_Phone,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging stag
- WHERE stag.Cell_Phone IS NOT NULL
- ORDER BY ExcelRowNumber ASC
- -- Compare expected rowcount to actual - error on mistmatch to force rollback
- IF @@ROWCOUNT <> @ExpRowCount
- BEGIN
- SELECT @ErrorMsg = 'Cell phone insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
- RAISERROR(@ErrorMsg, 16, 1)
- END
- -- Set expected rowcount for Home number insert
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Home_Phone IS NOT NULL
- -- Set Communication_Type_RecID for Home phone
- 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)
- -- Perform insert to dbo.Contact_Communication for Home phone
- INSERT INTO dbo.Contact_Communication
- (
- Owner_ID,
- Contact_RecID,
- Communication_Type_RecID,
- Default_Flag,
- [Description],
- Last_Update,
- Updated_By
- )
- SELECT
- @Owner_ID,
- New_Identity,
- @Communication_Type_RecID,
- 0,
- Home_Phone,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging stag
- WHERE stag.Home_Phone IS NOT NULL
- ORDER BY ExcelRowNumber ASC
- -- Compare expected rowcount to actual - error on mistmatch to force rollback
- IF @@ROWCOUNT <> @ExpRowCount
- BEGIN
- SELECT @ErrorMsg = 'Home phone insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
- RAISERROR(@ErrorMsg, 16, 1)
- END
- -- Set expected rowcount for email insert
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Email_Address IS NOT NULL
- -- Set Communication_Type_RecID for Email
- SELECT @Communication_Type_RecID = (SELECT TOP 1 Communication_Type_RecID FROM dbo.Communication_Type WHERE Communication_Name = 'Email' and Email_Flag = 1)
- -- Perform insert to dbo.Contact_Communication for Email
- INSERT INTO dbo.Contact_Communication
- (
- Owner_ID,
- Contact_RecID,
- Communication_Type_RecID,
- Default_Flag,
- [Description],
- Last_Update,
- Updated_By
- )
- SELECT
- @Owner_ID,
- New_Identity,
- @Communication_Type_RecID,
- 1,
- Email_Address,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging stag
- WHERE stag.Email_Address IS NOT NULL
- ORDER BY ExcelRowNumber ASC
- -- Compare expected rowcount to actual - error on mismatch to force rollback
- IF @@ROWCOUNT <> @ExpRowCount
- BEGIN
- SELECT @ErrorMsg = 'Email insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
- RAISERROR(@ErrorMsg, 16, 1)
- END
- -- Get expected Rowcount for dbo.SO_Activity insert
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging WHERE Activity_Assign_To_Member_ID IS NOT NULL
- -- Set Schedule_Detail_Inserted for records to be inserted to Activity/Schedule/Schedule Detail
- UPDATE stag
- SET Schedule_Detail_Inserted = 0
- FROM #Import_Staging stag
- WHERE Activity_Assign_To_Member_ID IS NOT NULL
- -- Perform insert to SO_Activity
- -- Get Max RecID prior to insert
- SELECT @Max_RecID = MAX(SO_Activity_RecID) FROM dbo.SO_Activity
- -- Repurpose Owner_ID to catch identity from source table
- INSERT INTO dbo.SO_Activity
- (
- Owner_ID,
- Assign_To,
- Company_RecID,
- SO_Activity_Type_RecID,
- [Subject],
- Date_Entered,
- Entered_By,
- Contact_RecID,
- --Notes,
- Close_Flag,
- Updated_By,
- Last_Update,
- --Read_Flag,
- Notify_Complete_Flag,
- Notification_Sent_Flag,
- so_act_status_recid,
- Marketing_Campaign_RecID,
- assignto_recid,
- SR_Location_RecID
- )
- SELECT
- ExcelRowNumber,
- Activity_Assign_To_Member_ID,
- Company_RecID,
- SO_Activity_Type_RecID,
- Activity_Subject,
- GETDATE(),
- @ImportBatchUser,
- New_Identity,
- --Activity_Notes,
- 0,
- @ImportBatchUser,
- GETDATE(),
- --0,
- 0,
- 0,
- @SO_Act_Status_RecID,
- Marketing_Campaign_RecID,
- Activity_Member_RecID,
- @SR_Location_RecID
- FROM #Import_Staging
- WHERE Activity_Assign_To_Member_ID IS NOT NULL
- ORDER BY ExcelRowNumber ASC
- -- Compare expected rowcount to actual - error on mistmatch to force rollback
- IF @@ROWCOUNT <> @ExpRowCount
- BEGIN
- SELECT @ErrorMsg = 'dbo.SO_Activity insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
- RAISERROR(@ErrorMsg, 16, 1)
- END
- -- Join dbo.SO_Activity back to staging table to get new identities
- UPDATE stag
- SET stag.Activity_RecID_New = soa.SO_Activity_RecID
- FROM #Import_Staging stag
- INNER JOIN SO_Activity soa
- ON stag.ExcelRowNumber = soa.Owner_ID
- WHERE soa.SO_Activity_Recid > @Max_RecID
- -- Update Owner_ID in SO_Activity to appropriate value
- UPDATE dbo.SO_Activity
- SET Owner_ID = @Owner_ID
- WHERE Updated_By = @ImportBatchUser
- AND SO_Activity_Recid > @Max_RecID
- -- Perform insert to dbo.Schedule
- -- Grab max RecID prior to insert
- SELECT @MAX_RecID = MAX(Schedule_RecID) FROM dbo.Schedule
- -- Repurpose Owner_ID to catch identity from source table
- INSERT INTO dbo.Schedule
- (
- Owner_ID,
- RecID,
- Schedule_Type_RecID,
- Member_ID,
- Date_Time_Start,
- Date_Time_End,
- close_flag,
- Hours_Estimated,
- Schedule_Desc,
- Last_Update,
- Updated_By,
- Syncable,
- Reminder_Flag,
- Reminder_Minutes,
- All_Day_Flag,
- Xref_Mbr_RecID,
- Ack_Flag,
- Billable_Flag
- )
- SELECT
- ExcelRowNumber,
- Activity_RecID_New,
- @Schedule_Type_RecID,
- Activity_Assign_To_Member_ID,
- Activity_Due_Date,
- Activity_Due_Date,
- 0,
- 0,
- 'Follow up/' + COALESCE(Company_Name, (ISNULL(First_Name + ' ', '') + ISNULL(Last_Name, ''))),
- GETDATE(),
- @ImportBatchUser,
- 1,
- 0,
- 0,
- 0,
- Activity_Member_RecID,
- 0,
- 0
- FROM #Import_Staging
- WHERE Activity_Assign_To_Member_ID IS NOT NULL
- ORDER BY ExcelRowNumber ASC
- -- Compare expected rowcount to actual - error on mistmatch to force rollback
- IF @@ROWCOUNT <> @ExpRowCount
- BEGIN
- SELECT @ErrorMsg = 'dbo.Schedule insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
- RAISERROR(@ErrorMsg, 16, 1)
- END
- -- Join dbo.Schedule back to staging table to get new identities
- UPDATE stag
- SET stag.Schedule_RecID_New = sched.Schedule_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Schedule sched
- ON sched.Owner_ID = stag.ExcelRowNumber
- AND sched.Updated_By = @ImportBatchUser
- WHERE sched.Schedule_RecID > @Max_RecID
- -- Update Owner_ID in dbo.Schedule to appropriate value
- UPDATE dbo.Schedule
- SET Owner_ID = @Owner_ID
- WHERE Updated_By = @ImportBatchUser
- AND Schedule_RecID > @Max_RecID
- -- Perform insert to dbo.Schedule_Detail
- -- Records cannot be inserted as batch due to trigger on this table
- WHILE EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE Schedule_Detail_Inserted = 0)
- BEGIN
- -- Get identity for current record
- SET @Curr_Insert_RecID = (SELECT TOP 1 ExcelRowNumber FROM #Import_Staging WHERE Schedule_Detail_Inserted = 0 ORDER BY InsertOrder ASC)
- -- Perform insert
- INSERT INTO dbo.Schedule_Detail
- (
- Schedule_RecID,
- Date_Scheduled,
- Hours_Scheduled,
- Start_Time,
- End_Time,
- Member_RecID,
- Schedule_Type_ID,
- RecID,
- Updated_By,
- Last_Update
- --Upd_Flag
- )
- SELECT
- Schedule_RecID_New,
- Activity_Due_Date,
- 0,
- Activity_Due_Date,
- Activity_Due_Date,
- Activity_Member_RecID,
- @Schedule_Type_ID,
- Activity_RecID_New,
- @ImportBatchUser,
- GETDATE()
- --0
- FROM #Import_Staging stag
- WHERE stag.ExcelRowNumber = @Curr_Insert_RecID
- -- Set Schedule_Detail_Inserted = 1
- UPDATE #Import_Staging
- SET Schedule_Detail_Inserted = 1
- WHERE ExcelRowNumber = @Curr_Insert_RecID
- END
- -- Set expected rowcount for insert to dbo.Lead_Import
- SELECT @ExpRowCount = COUNT(*) FROM #Import_Staging
- -- Perform insert to dbo.Lead_Import
- INSERT INTO dbo.Lead_Import
- (
- Lead_Import_Batch_RecID,
- L_Company_Name,
- L_First_Name,
- L_Last_Name,
- L_Title,
- L_Direct_Phone,
- L_Direct_Ext,
- L_Email_Address,
- L_Cell_Phone,
- L_Contact_Note,
- L_Company_RecID,
- L_Contact_RecID,
- L_NewContact_Flag,
- L_NewCompany_Flag,
- L_Activity_Subject,
- L_Activity_AssignTo,
- L_Activity_RecID,
- L_Marketing_ID,
- L_Marketing_Campaign_RecID,
- L_Site_Name
- )
- SELECT
- @ImportBatchID,
- LEFT(stag.Company_Name, 50),
- LEFT(stag.First_Name, 50),
- LEFT(stag.Last_Name, 50),
- LEFT(stag.Job_Title, 50),
- LEFT(stag.Direct_Phone, 50),
- LEFT(stag.Direct_Extension, 50),
- LEFT(stag.Email_Address, 100),
- LEFT(stag.Cell_Phone, 50),
- LEFT(stag.Contact_Notes, 5000),
- stag.Company_RecID,
- stag.New_Identity,
- 1,
- 0,
- stag.Activity_Subject,
- stag.Activity_Assign_To_Member_ID,
- stag.Activity_RecID_New,
- stag.Activity_Marketing_Campaign,
- stag.Marketing_Campaign_RecID,
- LEFT(stag.Site_Name, 50)
- FROM #Import_Staging stag
- -- Compare expected rowcount to actual - error on mistmatch to force rollback
- IF @@ROWCOUNT <> @ExpRowCount
- BEGIN
- SELECT @ErrorMsg = 'dbo.Lead_Import insert fails - expected rowcount: ' + CAST(@ExpRowCount AS VARCHAR(20)) + ' actual rowcount: ' + CAST(@@ROWCOUNT AS VARCHAR(20))
- RAISERROR(@ErrorMsg, 16, 1)
- END
- EXEC usp_Import_UDF @TableName, 'Contact'
- -- Commit transaction and return results
- IF @@Error = 0 AND XACT_STATE() = 1
- BEGIN
- IF OBJECT_ID('tempdb..#Legacy_IDs') IS NOT NULL
- DROP TABLE #Legacy_IDs
- SELECT
- Legacy_ID AS Legacy_ID,
- New_Identity AS CW_RecID,
- 'Contact' AS Record_Type
- INTO #Legacy_IDs
- FROM #Import_Staging stag
- WHERE Legacy_ID IS NOT NULL
- exec usp_Import_Legacy_IDs
- COMMIT TRANSACTION Contact_Import
- SELECT
- 1 AS Success,
- @ImportBatchID AS Import_Batch_ID,
- COUNT(*) AS Contacts_Imported
- FROM dbo.Contact
- WHERE Updated_By = @ImportBatchUser
- END
- END TRY
- BEGIN CATCH
- -- An error occured, display error info
- SELECT
- ERROR_NUMBER() AS ErrorNumber,
- ERROR_SEVERITY() AS ErrorSeverity,
- ERROR_STATE() AS ErrorState,
- ERROR_PROCEDURE() AS ErrorProcedure,
- ERROR_LINE() AS ErrorLine,
- ERROR_MESSAGE() AS ErrorMessage
- -- Grab dump of data for debugging
- SELECT
- @ImportBatchID,
- stag.Company_Name,
- stag.First_Name,
- stag.Last_Name,
- stag.Job_Title,
- stag.Direct_Phone,
- stag.Direct_Extension,
- stag.Email_Address,
- stag.Cell_Phone,
- stag.Contact_Notes,
- stag.New_Identity,
- 1,
- stag.Activity_Subject,
- stag.Activity_Assign_To_Member_ID,
- stag.Activity_RecID_New,
- stag.Activity_Marketing_Campaign,
- stag.Marketing_Campaign_RecID,
- stag.Site_Name
- FROM #Import_Staging stag
- -- Determine whether transaction needs to be rolled back and act accordingly
- IF(XACT_STATE()) IN(-1, 1)
- BEGIN
- ROLLBACK TRANSACTION
- END
- END CATCH
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_PR_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_PR_ImportValidate] AS SELECT 1')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_PR_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_PR_ImportPush] AS SELECT 1')
- END
- GO
- ALTER PROCEDURE [dbo].[usp_PR_ImportValidate]
- @TableName VARCHAR(MAX),
- @Forcemode BIT = 0
- AS
- BEGIN
- SET NOCOUNT ON
- -- Set date format to MDY to validate dates from excel
- SET DATEFORMAT MDY
- -- Variable declaration
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX),
- @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- -- Table to hold results of procedure
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750) COLLATE DATABASE_DEFAULT,
- InvalidReason VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ReferenceType VARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Warning_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- -- Table to hold serial numbers for validation
- DECLARE @tblSerialNums TABLE
- (
- ExcelRowNumber INT,
- ProductID NVARCHAR(MAX),
- SerialNum VARCHAR(MAX)
- )
- -- Pre-validation
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'Product ID' UNION ALL
- SELECT 'Description' UNION ALL
- SELECT 'Long Description' UNION ALL
- SELECT 'Category' UNION ALL
- SELECT 'Sub-Category' UNION ALL
- SELECT 'Product Type' UNION ALL
- SELECT 'Product Class' UNION ALL
- SELECT 'UOM' UNION ALL
- SELECT 'Unit Price' UNION ALL
- SELECT 'Unit Cost' UNION ALL
- SELECT 'Serialized (Y/N)' UNION ALL
- SELECT 'Taxable (Y/N)' UNION ALL
- SELECT 'Manufacturer' UNION ALL
- SELECT 'Manufacturer Part Number' UNION ALL
- SELECT 'SOH' UNION ALL
- SELECT 'Warehouse' UNION ALL
- SELECT 'Warehouse Bin' UNION ALL
- SELECT 'Serial Numbers'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- -- If a column is missing, stop here and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 0 AS ValPassed,
- RowNumber,
- ValMsg
- FROM #tblResults
- ORDER BY RowNumber, ValMsg
- RETURN
- END
- -- Table to hold source data for this batch from temp table
- IF EXISTS(SELECT * FROM tempdb.sys.tables WHERE Name LIKE('%PR_Import_Val_Temp%'))
- BEGIN
- DROP TABLE #PR_Import_Val_Temp
- END
- CREATE TABLE #PR_Import_Val_Temp
- (
- [ExcelRowNumber] [int] NULL,
- [ProductID] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [Description] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [LongDesc] [varchar](max) COLLATE DATABASE_DEFAULT NULL,
- [Category] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [SubCategory] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [ProductType] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [ProductClass] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [UOM] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [UnitPrice] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [UnitCost] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [Serialized] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [Taxable] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [Manufacturer] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [PartNumber] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [SOH] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Warehouse] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [WarehouseBin] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [SerialNumbers] [varchar](max) COLLATE DATABASE_DEFAULT NULL,
- [SerialNumbersXML][xml] NULL,
- [SNCount] INT NULL,
- [intSOH] INT NULL,
- [SOHNumeric] BIT NULL,
- [Price_Attribute] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- IV_Price_Attribute_ID NVARCHAR(10) COLLATE DATABASE_DEFAULT,
- Vendor_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Vendor_SKU NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Vendor_Company_RecID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Serialized_Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- IV_Item_RecID INT
- )
- -- Build statement to populate validation temp table
- SELECT @DSQL = '
- INSERT INTO #PR_Import_Val_Temp
- (
- ExcelRowNumber,
- ProductID,
- Description,
- LongDesc,
- Category,
- SubCategory,
- ProductType,
- ProductClass,
- UOM,
- UnitPrice,
- UnitCost,
- Serialized,
- Taxable,
- Manufacturer,
- PartNumber,
- SOH,
- Warehouse,
- WarehouseBin,
- SerialNumbers
- )
- SELECT
- [Excel Row Number],
- [Product ID],
- [Description],
- [Long Description],
- [Category],
- [Sub-Category],
- [Product Type],
- [Product Class],
- [UOM],
- [Unit Price],
- [Unit Cost],
- [Serialized (Y/N)],
- [Taxable (Y/N)],
- [Manufacturer],
- [Manufacturer Part Number],
- [SOH],
- [Warehouse],
- [Warehouse Bin],
- [Serial Numbers]
- FROM ' + @SourceTable
- EXEC(@DSQL)
- BEGIN TRANSACTION
- -- Update temp table with optional field values if they exist
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Price Attribute')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Price_Attribute = src.[Price Attribute]
- FROM #PR_Import_Val_Temp tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Vendor')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Vendor_Name = src.[Vendor]
- FROM #PR_Import_Val_Temp tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Vendor SKU')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Vendor_SKU = LEFT(src.[Vendor SKU], 50)
- FROM #PR_Import_Val_Temp tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Serialized Cost')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Serialized_Cost = LEFT(src.[Serialized Cost], 50)
- FROM #PR_Import_Val_Temp tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Update blank string to null for all columns in staging table
- UPDATE #PR_Import_Val_Temp SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- ProductID = CASE WHEN ProductID IN('', ' ') THEN NULL ELSE ProductID END,
- Description = CASE WHEN Description IN('', ' ') THEN NULL ELSE Description END,
- LongDesc = CASE WHEN LongDesc IN('', ' ') THEN NULL ELSE LongDesc END,
- Category = CASE WHEN Category IN('', ' ') THEN NULL ELSE Category END,
- SubCategory = CASE WHEN SubCategory IN('', ' ') THEN NULL ELSE SubCategory END,
- ProductType = CASE WHEN ProductType IN('', ' ') THEN NULL ELSE ProductType END,
- ProductClass = CASE WHEN ProductClass IN('', ' ') THEN NULL ELSE ProductClass END,
- UOM = CASE WHEN UOM IN('', ' ') THEN NULL ELSE UOM END,
- UnitPrice = CASE WHEN UnitPrice IN('', ' ') THEN NULL ELSE UnitPrice END,
- UnitCost = CASE WHEN UnitCost IN('', ' ') THEN NULL ELSE UnitCost END,
- Serialized = CASE WHEN Serialized IN('', ' ') THEN NULL ELSE Serialized END,
- Taxable = CASE WHEN Taxable IN('', ' ') THEN NULL ELSE Taxable END,
- Manufacturer = CASE WHEN Manufacturer IN('', ' ') THEN NULL ELSE Manufacturer END,
- PartNumber = CASE WHEN PartNumber IN('', ' ') THEN NULL ELSE PartNumber END,
- SOH = CASE WHEN SOH IN('', ' ') THEN NULL ELSE SOH END,
- Warehouse = CASE WHEN Warehouse IN('', ' ') THEN NULL ELSE Warehouse END,
- WarehouseBin = CASE WHEN WarehouseBin IN('', ' ') THEN NULL ELSE WarehouseBin END,
- SerialNumbers = CASE WHEN SerialNumbers IN('', ' ') THEN NULL ELSE SerialNumbers END,
- Price_Attribute = CASE WHEN Price_Attribute IN('', ' ') THEN NULL ELSE Price_Attribute END,
- Vendor_Name = CASE WHEN Vendor_Name IN('', ' ') THEN NULL ELSE Vendor_Name END,
- Vendor_SKU = CASE WHEN Vendor_SKU IN('', ' ') THEN NULL ELSE Vendor_SKU END,
- Serialized_Cost = CASE WHEN Serialized_Cost IN('', ' ') THEN NULL ELSE Serialized_Cost END
- -- Remove SSIS import row if exists
- DELETE FROM #PR_Import_Val_Temp
- WHERE UnitPrice = 'Connectwise'
- AND ProductID = 'Connectwise'
- AND SOH = 'Connectwise'
- -- Update class to 'I' if inventory, 'N' if Non-Inventory, 'S' if service, 'A' if 'Agreement', 'N' if null (default per spreadsheet instructions)
- UPDATE tmp
- SET tmp.ProductClass =
- CASE tmp.ProductClass
- WHEN 'Inventory' THEN 'I'
- WHEN 'Non-Inventory' THEN 'N'
- WHEN 'Non Inventory' THEN 'N'
- WHEN 'Service' THEN 'S'
- WHEN 'Services' THEN 'S'
- WHEN 'Agreement' THEN 'A'
- WHEN NULL THEN 'N'
- ELSE tmp.ProductClass
- END
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.ProductClass IN('Inventory', 'Non-Inventory', 'Non Inventory', 'Service', 'Agreement')
- OR tmp.ProductClass IS NULL
- -- Get IV_Price_Attribute_ID
- UPDATE tmp
- SET tmp.IV_Price_Attribute_ID = pa.IV_Price_Attribute_ID
- FROM #PR_Import_Val_Temp tmp
- 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
- -- Strip dollar sign and commas from price/cost fields (common cause of validation error)
- UPDATE tmp
- SET tmp.UnitPrice = REPLACE(tmp.UnitPrice, '$', ''),
- tmp.UnitCost = REPLACE(tmp.UnitCost, '$', '')
- FROM #PR_Import_Val_Temp tmp
- UPDATE tmp
- SET tmp.UnitPrice = REPLACE(tmp.UnitPrice, ',', ''),
- tmp.UnitCost = REPLACE(tmp.UnitCost, ',', '')
- FROM #PR_Import_Val_Temp tmp
- -- Get IV_Item_RecID for existing products
- UPDATE tmp
- SET tmp.IV_Item_RecID = ivi.IV_Item_RecID
- FROM #PR_Import_Val_Temp tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.IV_Item ivi WHERE ivi.Item_ID = tmp.ProductID) ivi
- -- Assume 0 SOH if null
- UPDATE #PR_Import_Val_Temp
- SET SOH = '0'
- WHERE SOH IS NULL
- -- Convert SerialNumbers to XML
- UPDATE tmp
- SET SerialNumbersXML = CAST('<SerNum>' + REPLACE(tmp.SerialNumbers,',','</SerNum><SerNum>')+ '</SerNum>' AS XML)
- FROM #PR_Import_Val_Temp tmp
- -- Get Vendor_Company_RecID
- UPDATE tmp
- SET tmp.Vendor_Company_RecID = comp.Company_RecID
- FROM #PR_Import_Val_Temp tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_Name = tmp.Vendor_Name) comp
- -- Insert list of serial numbers from XML to serial number table
- INSERT INTO @tblSerialNums
- (
- ExcelRowNumber,
- ProductID,
- SerialNum
- )
- SELECT DISTINCT ExcelRowNumber, ProductID, RTRIM(LTRIM(SNums.Split.value('.', 'VARCHAR(8000)'))) AS 'SN'
- FROM #PR_Import_Val_Temp
- CROSS APPLY SerialNumbersXML.nodes('/SerNum') AS SNums(Split)
- -- Update staging table with counts of serial numbers per row
- ;with SNCounts
- AS
- (
- SELECT ExcelRowNumber, Count(*) AS SNCount
- FROM @tblSerialNums
- GROUP BY ExcelRowNumber
- )
- UPDATE stag
- SET stag.SNCount = counts.SNCount
- FROM SNCounts counts
- INNER JOIN #PR_Import_Val_Temp stag
- ON stag.ExcelRowNumber = counts.ExcelRowNumber
- -- Strip commas from SOH
- UPDATE #PR_Import_Val_Temp
- SET SOH = REPLACE(SOH, ',', '')
- -- If SOH evaluates to integer, convert and capture in intSOH field
- UPDATE #PR_Import_Val_Temp
- SET SOHNumeric =
- CASE
- WHEN ISNUMERIC(SOH) = 0 THEN 0
- WHEN SOH LIKE '%\[^-+ 0-9\]%' THEN 0
- WHEN CAST(SOH AS NUMERIC(38, 0))
- NOT BETWEEN -2147483648. AND 2147483647. THEN 0
- ELSE 1
- END
- UPDATE #PR_Import_Val_Temp
- SET intSOH = CONVERT(INT, CAST(SOH AS DECIMAL))
- WHERE SOHNumeric = 1
- -- If @ForceMode = 1, create necessary references
- IF @Forcemode = 1
- BEGIN
- INSERT INTO dbo.Manufacturer
- (
- Manufacturer_Name,
- Inactive_Flag,
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- tmp.Manufacturer,
- 0,
- GETDATE(),
- @ImportBatchUser
- FROM #PR_Import_Val_Temp tmp
- LEFT OUTER JOIN Manufacturer mf
- ON mf.Manufacturer_Name = tmp.Manufacturer
- WHERE mf.Manufacturer_RecID IS NULL
- AND tmp.Manufacturer IS NOT NULL
- -- Category
- INSERT INTO dbo.IV_Category
- (
- [Description],
- Inactive_Flag,
- Updated_By,
- Last_Update
- )
- SELECT DISTINCT
- tmp.Category,
- 0,
- @ImportBatchUser,
- GETDATE()
- FROM #PR_Import_Val_Temp tmp
- LEFT OUTER JOIN IV_Category cat
- ON cat.[Description] = tmp.Category
- WHERE cat.IV_Cat_RecID IS NULL
- AND tmp.Category IS NOT NULL
- -- Subcategory
- INSERT INTO dbo.IV_SubCategory
- (
- IV_Cat_RecID,
- [Description],
- Inactive_Flag,
- Updated_By,
- Last_Update
- )
- SELECT DISTINCT
- cat.IV_Cat_RecID,
- tmp.SubCategory,
- 0,
- @ImportBatchUser,
- GETDATE()
- FROM #PR_Import_Val_Temp tmp
- INNER JOIN IV_Category cat
- ON cat.[Description] = tmp.Category
- LEFT OUTER JOIN IV_SubCategory subc
- ON subc.[Description] = tmp.SubCategory
- AND subc.IV_Cat_RecID = cat.IV_Cat_RecID
- WHERE subc.IV_SubCat_RecID IS NULL
- AND tmp.SubCategory IS NOT NULL
- AND LEN(tmp.Subcategory) <= 50
- -- Product Type
- INSERT INTO IV_Type
- (
- Owner_ID,
- [Description],
- Inactive_Flag,
- Updated_By,
- Last_Update,
- Item_Type_Xref
- )
- SELECT DISTINCT
- 1,
- tmp.ProductType,
- 0,
- @ImportBatchUser,
- GETDATE(),
- NULL
- FROM #PR_Import_Val_Temp tmp
- LEFT OUTER JOIN IV_Type ivt
- ON ivt.[Description] = tmp.ProductType
- WHERE ivt.IV_Type_RecID IS NULL
- AND tmp.ProductType IS NOT NULL
- AND LEN(tmp.ProductType) <= 50
- -- Force short description by trimming to 50 characters
- UPDATE #PR_Import_Val_Temp
- SET [Description] = SUBSTRING([Description], 1, 50)
- WHERE LEN([Description]) > 50
- END
- -- Begin validations
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Product ID is required
- SELECT
- tmp.ExcelRowNumber,
- 'Product ID cannot be blank'
- FROM #PR_Import_Val_Temp tmp
- WHERE ProductID IS NULL
- UNION ALL
- -- Product ID must be <= 30 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Product ID cannot exceed 60 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(ProductID) > 60
- UNION ALL
- -- Description is required
- SELECT
- tmp.ExcelRowNumber,
- 'Description cannot be blank'
- FROM #PR_Import_Val_Temp tmp
- WHERE Description IS NULL
- UNION ALL
- -- Description must be <= 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Short Description cannot exceed 50 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN([Description]) > 50
- UNION ALL
- -- Long description is required
- SELECT
- tmp.ExcelRowNumber,
- 'Long description cannot be blank'
- FROM #PR_Import_Val_Temp tmp
- WHERE LongDesc IS NULL
- UNION ALL
- -- Long description cannot exceed 6000 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Long description cannot exceed 6000 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(LongDesc) > 6000
- UNION ALL
- -- Category is required
- SELECT
- tmp.ExcelRowNumber,
- 'Category cannot be blank'
- FROM #PR_Import_Val_Temp tmp
- WHERE Category IS NULL
- UNION ALL
- -- Category cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Category cannot exceed 50 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(Category) > 50
- UNION ALL
- -- Category must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Category: "' + tmp.Category + '"'
- FROM #PR_Import_Val_Temp tmp
- LEFT OUTER JOIN IV_Category cat
- ON cat.[Description] = tmp.Category
- WHERE cat.IV_Cat_RecID IS NULL
- AND tmp.Category IS NOT NULL
- AND LEN(tmp.Category) <= 50
- UNION ALL
- -- Sub-category is required
- SELECT
- tmp.ExcelRowNumber,
- 'Sub-Category cannot be blank'
- FROM #PR_Import_Val_Temp tmp
- WHERE SubCategory IS NULL
- UNION ALL
- -- Sub-category cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Sub-Category cannot exceed 50 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(tmp.SubCategory) > 50
- UNION ALL
- -- Sub-category must be a valid reference and map back to category
- SELECT
- tmp.ExcelRowNumber,
- 'Sub-Category "' + tmp.SubCategory + '" does not exist for Category: "' + tmp.Category + '"'
- FROM #PR_Import_Val_Temp tmp
- INNER JOIN IV_Category cat
- ON cat.[Description] = tmp.Category
- LEFT OUTER JOIN IV_SubCategory subc
- ON subc.[Description] = tmp.SubCategory
- AND subc.IV_Cat_RecID = cat.IV_Cat_RecID
- WHERE subc.IV_SubCat_RecID IS NULL
- AND tmp.SubCategory IS NOT NULL
- AND LEN(tmp.Subcategory) <= 50
- UNION ALL
- -- Product type is required
- SELECT
- tmp.ExcelRowNumber,
- 'Product type cannot be blank'
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.ProductType IS NULL
- UNION ALL
- -- Product type must be <= 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Product type cannot exceed 50 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(tmp.ProductType) > 50
- UNION ALL
- -- Product type must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid product type: "' + tmp.ProductType + '"'
- FROM #PR_Import_Val_Temp tmp
- LEFT OUTER JOIN IV_Type ivt
- ON ivt.[Description] = tmp.ProductType
- WHERE ivt.IV_Type_RecID IS NULL
- AND tmp.ProductType IS NOT NULL
- AND LEN(tmp.ProductType) <= 50
- UNION ALL
- -- Product class is required
- SELECT
- tmp.ExcelRowNumber,
- 'Product class cannot be blank'
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.ProductClass IS NULL
- UNION ALL
- -- Product class must be 1 character
- --SELECT
- -- tmp.ExcelRowNumber,
- -- 'Product class cannot exceed 1 character'
- --FROM #PR_Import_Val_Temp tmp
- --WHERE LEN(tmp.ProductClass) <> 1
- --UNION ALL
- -- Product class must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid product class: "' + tmp.ProductClass + '"'
- FROM #PR_Import_Val_Temp tmp
- LEFT OUTER JOIN IV_Class ivc
- ON ivc.IV_Class_ID = tmp.ProductClass
- WHERE ivc.IV_Class_ID IS NULL
- AND tmp.ProductClass IS NOT NULL
- UNION ALL
- -- Bundle class is not supported
- SELECT
- tmp.ExcelRowNumber,
- 'Bundle class is not supported'
- FROM #PR_Import_Val_Temp tmp
- INNER JOIN IV_Class ivc
- ON ivc.IV_Class_ID = tmp.ProductClass
- OR Class_Description = tmp.ProductClass
- WHERE ivc.IV_Class_ID = 'B'
- AND tmp.ProductClass IS NOT NULL
- UNION ALL
- -- UOM is required
- SELECT
- tmp.ExcelRowNumber,
- 'UOM cannot be blank'
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.UOM IS NULL
- UNION ALL
- -- UOM cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'UOM cannot exceed 50 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(tmp.UOM) > 50
- UNION ALL
- -- UOM must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid UOM: "' + tmp.UOM + '"'
- FROM #PR_Import_Val_Temp tmp
- LEFT OUTER JOIN IV_UOM uom
- ON uom.[Description] = tmp.UOM
- WHERE uom.IV_UOM_RecID IS NULL
- AND tmp.UOM IS NOT NULL
- AND LEN(tmp.UOM) < 50
- UNION ALL
- -- If entered, unit price must be numeric (decimal) with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Unit price must be numeric (decimal) with no formatting.'
- FROM #PR_Import_Val_Temp tmp
- WHERE ISNUMERIC(tmp.UnitPrice + 'e0') = 0
- AND tmp.UnitPrice IS NOT NULL
- UNION ALL
- -- If entered, unit cost must be numeric (decimal) with no formatting
- SELECT
- tmp.ExcelRowNumber,
- 'Unit cost must be numeric (decimal) with no formatting.'
- FROM #PR_Import_Val_Temp tmp
- WHERE ISNUMERIC(tmp.UnitCost + 'e0') = 0
- AND tmp.UnitCost IS NOT NULL
- UNION ALL
- -- SOH must be an integer (test for decimal)
- SELECT
- tmp.ExcelRowNumber,
- 'SOH must be an integer'
- FROM #PR_Import_Val_Temp tmp
- WHERE SOH IS NOT NULL
- AND SOHNumeric IS NULL
- OR SOHNumeric <> 1
- UNION ALL
- -- SOH must be an integer (test for non-numeric)
- SELECT
- tmp.ExcelRowNumber,
- 'SOH must be an integer'
- FROM #PR_Import_Val_Temp tmp
- WHERE SOH IS NOT NULL
- AND ISNUMERIC(SOH + 'e0') = 0
- UNION ALL
- -- SOH cannot be negative
- SELECT
- tmp.ExcelRowNumber,
- 'SOH cannot be negative'
- FROM #PR_Import_Val_Temp tmp
- WHERE intSOH < 0
- UNION ALL
- -- If entered, Serialized cannot exceed 1 character
- --SELECT
- -- tmp.ExcelRowNumber,
- -- 'Serialized cannot be more than 1 character'
- --FROM #PR_Import_Val_Temp tmp
- --WHERE LEN(tmp.Serialized) > 1
- --UNION ALL
- -- Serialized must evaluate to yes/no (1, 0, Y, N are acceptable values with NULL defaulting to N)
- SELECT
- tmp.ExcelRowNumber,
- 'Serialized must be either "Y" or "N" - (1 or 0 are also acceptable)'
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.Serialized NOT IN('Y', 'N', '0', '1', 'True', 'False', 'Yes', 'No')
- UNION ALL
- -- Serialized cost must evaluate to yes/no (1, 0, Y, N are acceptable values with NULL defaulting to N)
- SELECT
- tmp.ExcelRowNumber,
- 'Serialized cost must be either "Y" or "N" - (1 or 0 are also acceptable)'
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.Serialized_Cost NOT IN('Y', 'N', '0', '1', 'True', 'False')
- UNION ALL
- -- Only products with class of 'I' can be serialized
- SELECT
- tmp.ExcelRowNumber,
- 'Only products with a class of "I" may be serialized'
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.ProductClass <> 'I'
- AND tmp.Serialized IN('1', 'Y', 'True')
- UNION ALL
- SELECT
- tmp.ExcelRowNumber,
- 'Cannot add non-serialized inventory to a product which is serialized in ConnectWise.'
- FROM #PR_Import_Val_Temp tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.IV_Item ivi WHERE ivi.Item_ID = tmp.ProductID AND ivi.Serialized_Flag = 1) ivi
- WHERE (tmp.SNCount = 0 OR tmp.SNCount IS NULL)
- AND tmp.intSOH > 0
- UNION ALL
- -- Only serialized products can have serialized cost
- SELECT
- tmp.ExcelRowNumber,
- 'Only serialized products can have serialized cost'
- FROM #PR_Import_Val_Temp tmp
- WHERE (tmp.Serialized IS NULL OR tmp.Serialized NOT IN('1', 'Y', 'True'))
- AND tmp.Serialized_cost IN('1', 'Y', 'True')
- UNION ALL
- -- Only products with a a class of 'I' may have SOH
- SELECT
- tmp.ExcelRowNumber,
- 'Only products with a class of "I" may have SOH'
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.ProductClass <> 'I'
- AND intSOH >= 1
- UNION ALL
- -- If entered, Taxable cannot exceed 1 character
- --SELECT
- -- tmp.ExcelRowNumber,
- -- 'Taxable cannot be more than 1 character'
- --FROM #PR_Import_Val_Temp tmp
- --WHERE LEN(tmp.Taxable) > 1
- --UNION ALL
- -- Taxable must evaluate to yes/no (1, 0, Y, N are acceptable values with NULL defaulting to N)
- SELECT
- tmp.ExcelRowNumber,
- 'Taxable must be either "Y" or "N" - (1 or 0 are also acceptable)'
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.Taxable NOT IN('Y', 'N', '0', '1', 'TRUE', 'FALSE')
- UNION ALL
- -- Cannot update product to serialized if inventory exists
- SELECT
- tmp.ExcelRowNumber,
- 'Cannot update a non-serialized product to serialized - this change must be performed in the ConnectWise UI'
- FROM #PR_Import_Val_Temp tmp
- 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
- UNION ALL
- -- Cannot update product to non-serialized
- SELECT
- tmp.ExcelRowNumber,
- 'Cannot update a non-serialized product to serialized - this change must be performed in the ConnectWise UI'
- FROM #PR_Import_Val_Temp tmp
- 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
- UNION ALL
- -- Unable to update class on agreement class products (mirrored from PSA)
- SELECT
- tmp.ExcelRowNumber,
- 'Cannot update Product Class for an agreement class product'
- FROM #PR_Import_Val_Temp tmp
- 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
- UNION ALL
- -- Manufacturer cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Manufacturer cannot be more than 50 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(tmp.Manufacturer) > 50
- UNION ALL
- -- Manufacturer must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid Manufacturer: "' + tmp.Manufacturer
- FROM #PR_Import_Val_Temp tmp
- LEFT OUTER JOIN Manufacturer mf
- ON mf.Manufacturer_Name = tmp.Manufacturer
- WHERE mf.Manufacturer_RecID IS NULL
- AND tmp.Manufacturer IS NOT NULL
- UNION ALL
- -- Manufacturer part number cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Manufacturer part number cannot be more than 50 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(tmp.PartNumber) > 50
- AND tmp.PartNumber IS NOT NULL
- UNION ALL
- -- Warehouse cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Warehouse cannot be more than 50 characters'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(tmp.Warehouse) > 50
- AND tmp.Warehouse IS NOT NULL
- UNION ALL
- -- Warehouse must be a valid reference
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid warehouse: "' + tmp.Warehouse
- FROM #PR_Import_Val_Temp tmp
- LEFT OUTER JOIN Warehouse wh
- ON tmp.Warehouse = wh.Warehouse_Name
- WHERE tmp.Warehouse IS NOT NULL
- AND wh.Warehouse_RecID IS NULL
- UNION ALL
- -- Warehouse required if SOH > 0
- SELECT
- tmp.ExcelRowNumber,
- 'Warehouse must be specified if product has SOH'
- FROM #PR_Import_Val_Temp tmp
- WHERE SOH IS NOT NULL
- AND intSOH > 0
- AND Warehouse IS NULL
- UNION ALL
- -- Warehouse bin cannot exceed 50 characters
- SELECT
- tmp.ExcelRowNumber,
- 'Warehouse bin must be 50 characters or less'
- FROM #PR_Import_Val_Temp tmp
- WHERE LEN(tmp.WarehouseBin) > 50
- UNION ALL
- -- Warehouse bin must be assigned to warehouse
- SELECT
- tmp.ExcelRowNumber,
- 'Warehouse bin: "' + tmp.WarehouseBin + '" does not exist for Warehouse: "' + tmp.Warehouse + '"'
- FROM #PR_Import_Val_Temp tmp
- INNER JOIN Warehouse wh
- ON wh.Warehouse_Name = tmp.Warehouse
- LEFT OUTER JOIN Warehouse_Bin whb
- ON whb.[Description] = tmp.WarehouseBin
- AND whb.Warehouse_RecID = wh.Warehouse_RecID
- WHERE whb.Warehouse_RecID IS NULL
- AND tmp.WarehouseBin IS NOT NULL
- AND tmp.Warehouse IS NOT NULL
- UNION ALL
- -- Warehouse bin required if SOH > 0
- SELECT
- tmp.ExcelRowNumber,
- 'Warehouse bin must be specified if product has SOH'
- FROM #PR_Import_Val_Temp tmp
- WHERE SOH IS NOT NULL
- AND intSOH > 0
- AND WarehouseBin IS NULL
- UNION ALL
- -- Serial numbers only valid if Serialized is 'Y'
- SELECT
- tmp.ExcelRowNumber,
- 'Serial numbers cannot be supplied unless a product is Serialized'
- FROM #PR_Import_Val_Temp tmp
- WHERE SerialNumbers IS NOT NULL
- AND (Serialized NOT IN('Y', '1', 'TRUE', 'Yes') OR Serialized IS NULL)
- UNION ALL
- -- Serial numbers only valid if Product class = I
- SELECT
- tmp.ExcelRowNumber,
- 'Serial numbers cannot be supplied unless product class is Inventory (I)'
- FROM #PR_Import_Val_Temp tmp
- WHERE (tmp.ProductClass IS NULL OR tmp.ProductClass <> 'I')
- AND tmp.SerialNumbers IS NOT NULL
- UNION ALL
- -- If product is serialized AND SOH > 0, require serial numbers
- SELECT
- tmp.ExcelRowNumber,
- 'Serial numbers must be entered when SOH is > 0'
- FROM #PR_Import_Val_Temp tmp
- WHERE intSOH > 0
- AND ISNULL(SNCount, 0) = 0
- AND ProductClass = 'I'
- AND Serialized IN('Y', '1')
- UNION ALL
- -- Number of serial numbers must match number of product in inventory
- SELECT
- tmp.ExcelRowNumber,
- 'Serial Number mismatch: Amount of serial numbers in list must match SOH quantity'
- FROM #PR_Import_Val_Temp tmp
- WHERE tmp.ProductClass = 'I'
- AND tmp.SNCount > 0
- AND tmp.SNCount <> tmp.intSOH
- UNION ALL
- -- Serial number cannot appear more than once per product id
- SELECT
- MAX(sn.ExcelRowNumber),
- 'Serial number: "' + sn.SerialNum + '" cannot appear more than once for Product ID: "' + ProductID + '"'
- FROM @tblSerialNums sn
- GROUP BY SerialNum, ProductID
- HAVING COUNT(*) > 1
- UNION ALL
- -- Serial number must not already exist in CW
- SELECT
- stag.ExcelRowNumber,
- 'Serial Number: "' + sn.Serial_Number + '" already exists in ConnectWise'
- FROM @tblSerialNums stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.IV_Serial_Number sn WHERE sn.Serial_Number = stag.SerialNum) sn
- 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
- UNION ALL
- -- If price attribute specified, must be valid
- SELECT
- tmp.ExcelRowNumber,
- 'Invalid price attribute: "' + tmp.Price_Attribute + '"'
- FROM #PR_Import_Val_Temp tmp
- WHERE Price_Attribute IS NOT NULL
- AND IV_Price_Attribute_ID IS NULL
- UNION ALL
- -- If price attribute specified, class must be 'S'
- SELECT
- tmp.ExcelRowNumber,
- 'Price attribute can only be specified for Service class products'
- FROM #PR_Import_Val_Temp tmp
- WHERE Price_Attribute IS NOT NULL
- AND ProductClass <> 'S'
- UNION ALL
- -- Vendor must exist if specified
- SELECT
- tmp.ExcelRowNumber,
- 'Vendor not found: ' + Vendor_Name
- FROM #PR_Import_Val_Temp tmp
- WHERE Vendor_Name IS NOT NULL
- AND Vendor_Company_RecID IS NULL
- --UNION ALL
- ---- Cannot have duplicate on ProductID, Warehouse, Warehouse Bin
- --SELECT
- -- MAX(tmp.ExcelRowNumber),
- -- 'There are multiple rows for Product ID: "' + tmp.ProductID + '" Warehouse: "' + tmp.Warehouse + '" Bin: "' + tmp.WarehouseBin + '"'
- --FROM #PR_Import_Val_Temp tmp
- --WHERE tmp.ProductID IS NOT NULL
- -- AND tmp.Warehouse IS NOT NULL
- -- AND tmp.WarehouseBin IS NOT NULL
- --GROUP BY tmp.ProductID, tmp.Warehouse, tmp.WarehouseBin
- --HAVING COUNT(*) > 1
- -- Insert notification messages for any created references
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg,
- Warning_Flag,
- ReferenceType
- )
- SELECT
- NULL,
- Manufacturer_Name,
- 1,
- 'Manufacturer(s)'
- FROM dbo.Manufacturer
- WHERE Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- cat.[Description] + '->' + sc.[Description],
- 1,
- 'Category -> Subcategory Relationship(s)'
- FROM dbo.IV_Category cat
- INNER JOIN IV_SubCategory sc
- ON cat.IV_Cat_RecID = sc.IV_Cat_RecID
- WHERE sc.Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- cat.[Description],
- 1,
- 'Category(s)'
- FROM dbo.IV_Category cat
- WHERE cat.Updated_By = @ImportBatchUser
- UNION ALL
- SELECT
- NULL,
- ivt.[Description],
- 1,
- 'Product Type(s)'
- FROM dbo.IV_Type ivt
- WHERE ivt.Updated_By = @ImportBatchUser
- -- Return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed
- ROLLBACK TRANSACTION
- RETURN
- END
- ELSE
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- ValMsg
- FROM #ResultsCondensed res
- UNION ALL
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- 'The following ' + ReferenceType + ' will be created: '+
- STUFF(
- (SELECT ', ' + ValMsg
- FROM #tblResults
- WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
- FOR XML PATH (''))
- , 1, 1, '') AS ValMsg
- FROM #tblResults res
- WHERE ReferenceType IS NOT NULL
- GROUP BY ReferenceType
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- END
- ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS ValMsg
- ROLLBACK TRANSACTION
- EXEC usp_Import_Record_Validation @TableName
- END
- END
- GO
- -- ============================================
- -- Author: m.gray
- -- Create date: 04/08/2013
- -- Description: Performs final validation
- -- and inserts for products import
- -- Sample call: exec usp_PR_ImportPush 'TMP_Import_3fd1bb4a474645abaf98c90d64389a80', 1, 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_PR_ImportPush]
- @TableName VARCHAR(MAX),
- @DebugMode INT = 0,
- @Forcemode BIT = 0
- AS
- BEGIN TRY
- SET NOCOUNT ON
- -- Staging Table with source data for this batch from tempdb, plus info needed for inserts
- IF OBJECT_ID('tempdb..#PR_Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #PR_Import_Staging
- END
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- CREATE TABLE #PR_Import_Staging
- (
- [ExcelRowNumber] [int] NULL,
- [ProductID] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [Description] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [LongDesc] [varchar](max) COLLATE DATABASE_DEFAULT NULL,
- [Category] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [SubCategory] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [ProductType] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [ProductClass] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [UOM] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [UnitPrice] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [UnitCost] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [Serialized] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [Taxable] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [Manufacturer] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [PartNumber] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [SOH] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- [Warehouse] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [WarehouseBin] [nvarchar](MAX) COLLATE DATABASE_DEFAULT NULL,
- [SerialNumbers] [varchar](max) COLLATE DATABASE_DEFAULT NULL,
- [BatchID] [uniqueidentifier] NULL,
- [SerialNumbersXML][xml] NULL,
- [SNCount] INT NULL,
- IV_Category_RecID INT NULL,
- IV_Subcategory_RecID INT NULL,
- IV_Type_RecID INT NULL,
- IV_Class_ID NVARCHAR(5) COLLATE DATABASE_DEFAULT NULL,
- IV_UOM_RecID INT NULL,
- Manufacturer_RecID INT NULL,
- Warehouse_RecID INT NULL,
- Warehouse_Bin_RecID INT NULL,
- Method VARCHAR(10) COLLATE DATABASE_DEFAULT NULL,
- ConvertMessage VARCHAR(1000) COLLATE DATABASE_DEFAULT NULL,
- Adjustment_RecID INT NULL,
- IV_Item_RecID_New INT NULL,
- New_Inventory_Record BIT NULL,
- IV_Item_RecID INT NULL,
- Inventory_By_Warehouse_RecID INT NULL,
- IV_Adjustment_Detail_RecID INT NULL,
- GL_Amount DECIMAL(18, 2),
- GL_Inserted BIT NULL,
- intSOH INT,
- SOHNumeric BIT NULL,
- SOHTotal INT NULL,
- IV_Audit_RecID INT NULL,
- [Price_Attribute] NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- IV_Price_Attribute_ID NVARCHAR(10) COLLATE DATABASE_DEFAULT,
- Vendor_Name NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Vendor_SKU NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Vendor_Company_RecID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Product_Notes NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Serialized_Cost NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- -- Variable declaration
- DECLARE
- @ExpRowCount INT, -- Expected rowcount inserts - Used for validation
- @ErrorMsg VARCHAR(350), -- Variable to hold custom error message
- @zAdmin_Member_RecID INT, -- RecID from dbo.Member for zAdmin user
- @IV_Adjustment_Type_RecID INT,
- @ImportBatchUser VARCHAR(15), -- Unique value to identify records created by this import
- @IV_Adjustment_RecID INT, -- IV_Adjustment_RecID for this batch
- -- Variables needed for insert loop for GL records
- @taxable bit,
- @typeRecid int,
- @billAmount decimal(18,2),
- @glCost decimal(18,2),
- @subCatRecid int,
- @catRecid int,
- @olRecid int,
- @buRecid int,
- @segmentNbr int,
- @glCogs varchar(255),
- @glInventory varchar(255),
- @glItem varchar(255),
- @glSalesCode varchar(255),
- @seg1 varchar(255), @seg2 varchar(255), @seg3 varchar(255), @seg4 varchar(255), @seg5 varchar(255),
- @seg6 varchar(255), @seg7 varchar(255), @seg8 varchar(255), @seg9 varchar(255), @seg10 varchar(255),
- @Curr_Detail_RecID INT,
- @Curr_Audit_Row INT,
- @Prev_Quantity INT,
- @Prev_Audit_RecID INT,
- @Prev_Avg_Cost FLOAT,
- @Total_Cost FLOAT,
- @New_Avg_Cost FLOAT,
- @Curr_Avg_Cost FLOAT,
- @Curr_Quantity INT,
- @IV_Audit_RecID INT,
- @Curr_IV_Item_RecID INT,
- @Curr_Warehouse_Bin_RecID INT
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- -- Table to hold serial numbers for validation
- DECLARE @SerNums TABLE
- (
- ExcelRowNumber INT,
- SerialNum VARCHAR(MAX)
- )
- -- Table for storing the GL Accounts based on heirarchy for adjustments
- DECLARE @GLAccounts TABLE
- (
- GL_Item varchar(255),
- GL_SalesCode varchar(255),
- GL_Cogs varchar(255),
- GL_Inventory varchar(255),
- segment1 varchar(255),
- segment2 varchar(255),
- segment3 varchar(255),
- segment4 varchar(255),
- segment5 varchar(255),
- segment6 varchar(255),
- segment7 varchar(255),
- segment8 varchar(255),
- segment9 varchar(255),
- segment10 varchar(255),
- sort int
- )
- -- Build statement to populate validation temp table
- SELECT @DSQL = '
- INSERT INTO #PR_Import_Staging
- (
- ExcelRowNumber,
- ProductID,
- Description,
- LongDesc,
- Category,
- SubCategory,
- ProductType,
- ProductClass,
- UOM,
- UnitPrice,
- UnitCost,
- Serialized,
- Taxable,
- Manufacturer,
- PartNumber,
- SOH,
- Warehouse,
- WarehouseBin,
- SerialNumbers
- )
- SELECT
- [Excel Row Number],
- [Product ID],
- [Description],
- [Long Description],
- [Category],
- [Sub-Category],
- [Product Type],
- [Product Class],
- [UOM],
- [Unit Price],
- [Unit Cost],
- [Serialized (Y/N)],
- [Taxable (Y/N)],
- [Manufacturer],
- [Manufacturer Part Number],
- [SOH],
- [Warehouse],
- [Warehouse Bin],
- [Serial Numbers]
- FROM ' + @SourceTable
- EXEC(@DSQL)
- BEGIN TRANSACTION PR_Import
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Update temp table with optional field values if they exist
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Price Attribute')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Price_Attribute = src.[Price Attribute]
- FROM #PR_Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Vendor')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Vendor_Name = src.[Vendor]
- FROM #PR_Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Vendor SKU')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Vendor_SKU = LEFT(src.[Vendor SKU], 50)
- FROM #PR_Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Product Notes')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Product_Notes = src.[Product Notes]
- FROM #PR_Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Serialized Cost')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Serialized_Cost = LEFT(src.[Serialized Cost], 50)
- FROM #PR_Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Update blank string to null for all columns in staging table
- UPDATE #PR_Import_Staging SET
- ExcelRowNumber = CASE WHEN ExcelRowNumber IN('', ' ') THEN NULL ELSE ExcelRowNumber END,
- ProductID = CASE WHEN ProductID IN('', ' ') THEN NULL ELSE ProductID END,
- Description = CASE WHEN Description IN('', ' ') THEN NULL ELSE Description END,
- LongDesc = CASE WHEN LongDesc IN('', ' ') THEN NULL ELSE LongDesc END,
- Category = CASE WHEN Category IN('', ' ') THEN NULL ELSE Category END,
- SubCategory = CASE WHEN SubCategory IN('', ' ') THEN NULL ELSE SubCategory END,
- ProductType = CASE WHEN ProductType IN('', ' ') THEN NULL ELSE ProductType END,
- ProductClass = CASE WHEN ProductClass IN('', ' ') THEN NULL ELSE ProductClass END,
- UOM = CASE WHEN UOM IN('', ' ') THEN NULL ELSE UOM END,
- UnitPrice = CASE WHEN UnitPrice IN('', ' ') THEN NULL ELSE UnitPrice END,
- UnitCost = CASE WHEN UnitCost IN('', ' ') THEN NULL ELSE UnitCost END,
- Serialized = CASE WHEN Serialized IN('', ' ') THEN NULL ELSE Serialized END,
- Taxable = CASE WHEN Taxable IN('', ' ') THEN NULL ELSE Taxable END,
- Manufacturer = CASE WHEN Manufacturer IN('', ' ') THEN NULL ELSE Manufacturer END,
- PartNumber = CASE WHEN PartNumber IN('', ' ') THEN NULL ELSE PartNumber END,
- SOH = CASE WHEN SOH IN('', ' ') THEN NULL ELSE SOH END,
- Warehouse = CASE WHEN Warehouse IN('', ' ') THEN NULL ELSE Warehouse END,
- WarehouseBin = CASE WHEN WarehouseBin IN('', ' ') THEN NULL ELSE WarehouseBin END,
- SerialNumbers = CASE WHEN SerialNumbers IN('', ' ') THEN NULL ELSE SerialNumbers END,
- Price_Attribute = CASE WHEN Price_Attribute IN('', ' ') THEN NULL ELSE Price_Attribute END,
- Vendor_Name = CASE WHEN Vendor_Name IN('', ' ') THEN NULL ELSE Vendor_Name END,
- Vendor_SKU = CASE WHEN Vendor_SKU IN('', ' ') THEN NULL ELSE Vendor_SKU END,
- Serialized_Cost = CASE WHEN Serialized_Cost IN('', ' ') THEN NULL ELSE Serialized_Cost END
- -- Update class to 'I' if inventory, 'N' if Non-Inventory, 'S' if service
- UPDATE stag
- SET stag.ProductClass =
- CASE stag.ProductClass
- WHEN 'Inventory' THEN 'I'
- WHEN 'Non-Inventory' THEN 'N'
- WHEN 'Non Inventory' THEN 'N'
- WHEN 'Service' THEN 'S'
- WHEN 'Services' THEN 'S'
- WHEN 'Agreement' THEN 'A'
- WHEN NULL THEN 'N'
- ELSE stag.ProductClass
- END
- FROM #PR_Import_Staging stag
- WHERE stag.ProductClass IN('Inventory', 'Non-Inventory', 'Non Inventory', 'Service', 'Services', 'Agreement')
- OR stag.ProductClass IS NULL
- -- Get IV_Price_Attribute_ID
- UPDATE tmp
- SET tmp.IV_Price_Attribute_ID = pa.IV_Price_Attribute_ID
- FROM #PR_Import_Staging tmp
- 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
- -- Strip dollar sign and commas from price/cost fields (common cause of validation error)
- UPDATE stag
- SET stag.UnitPrice = REPLACE(stag.UnitPrice, '$', ''),
- stag.UnitCost = REPLACE(stag.UnitCost, '$', '')
- FROM #PR_Import_Staging stag
- UPDATE stag
- SET stag.UnitPrice = REPLACE(stag.UnitPrice, ',', ''),
- stag.UnitCost = REPLACE(stag.UnitCost, ',', '')
- FROM #PR_Import_Staging stag
- -- Strip commas from SOH
- UPDATE #PR_Import_Staging
- SET SOH = REPLACE(SOH, ',', '')
- -- Assume 0 SOH if null
- UPDATE #PR_Import_Staging
- SET SOH = '0'
- WHERE SOH IS NULL
- -- Remove SSIS import row if exists
- DELETE FROM #PR_Import_Staging
- WHERE UnitPrice = 'Connectwise'
- AND ProductID = 'Connectwise'
- AND SOH = 'Connectwise'
- -- Get Vendor_Company_RecID
- UPDATE tmp
- SET tmp.Vendor_Company_RecID = comp.Company_RecID
- FROM #PR_Import_Staging tmp
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Company comp WHERE comp.Company_Name = tmp.Vendor_Name) comp
- -- Convert SerialNumbers to XML
- UPDATE stag
- SET SerialNumbersXML = CAST('<SerNum>' + REPLACE(stag.SerialNumbers,',','</SerNum><SerNum>')+ '</SerNum>' AS XML)
- FROM #PR_Import_Staging stag
- WHERE SerialNumbers IS NOT NULL
- -- If SOH evaluates to integer, convert and capture in intSOH field
- UPDATE #PR_Import_Staging
- SET SOHNumeric =
- CASE
- WHEN ISNUMERIC(SOH) = 0 THEN 0
- WHEN SOH LIKE '%\[^-+ 0-9\]%' THEN 0
- WHEN CAST(SOH AS NUMERIC(38, 0))
- NOT BETWEEN -2147483648. AND 2147483647. THEN 0
- ELSE 1
- END
- UPDATE #PR_Import_Staging
- SET intSOH = CONVERT(INT, CAST(SOH AS DECIMAL))
- WHERE SOHNumeric = 1
- -- Insert list of serial numbers from XML to serial number table
- INSERT INTO @SerNums
- (
- ExcelRowNumber,
- SerialNum
- )
- SELECT DISTINCT ExcelRowNumber, RTRIM(LTRIM(SNums.Split.value('.', 'VARCHAR(MAX)'))) AS 'SN'
- FROM #PR_Import_Staging stag
- CROSS APPLY SerialNumbersXML.nodes('/SerNum') AS SNums(Split)
- -- If @ForceMode = 1, create necessary references
- IF @Forcemode = 1
- BEGIN
- INSERT INTO dbo.Manufacturer
- (
- Manufacturer_Name,
- Inactive_Flag,
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- tmp.Manufacturer,
- 0,
- GETDATE(),
- @ImportBatchUser
- FROM #PR_Import_Staging tmp
- LEFT OUTER JOIN Manufacturer mf
- ON mf.Manufacturer_Name = tmp.Manufacturer
- WHERE mf.Manufacturer_RecID IS NULL
- AND tmp.Manufacturer IS NOT NULL
- -- Category
- INSERT INTO dbo.IV_Category
- (
- [Description],
- Inactive_Flag,
- Updated_By,
- Last_Update
- )
- SELECT DISTINCT
- tmp.Category,
- 0,
- @ImportBatchUser,
- GETDATE()
- FROM #PR_Import_Staging tmp
- LEFT OUTER JOIN IV_Category cat
- ON cat.[Description] = tmp.Category
- WHERE cat.IV_Cat_RecID IS NULL
- AND tmp.Category IS NOT NULL
- -- Subcategory
- INSERT INTO dbo.IV_SubCategory
- (
- IV_Cat_RecID,
- [Description],
- Inactive_Flag,
- Updated_By,
- Last_Update
- )
- SELECT DISTINCT
- cat.IV_Cat_RecID,
- tmp.SubCategory,
- 0,
- @ImportBatchUser,
- GETDATE()
- FROM #PR_Import_Staging tmp
- INNER JOIN IV_Category cat
- ON cat.[Description] = tmp.Category
- LEFT OUTER JOIN IV_SubCategory subc
- ON subc.[Description] = tmp.SubCategory
- AND subc.IV_Cat_RecID = cat.IV_Cat_RecID
- WHERE subc.IV_SubCat_RecID IS NULL
- AND tmp.SubCategory IS NOT NULL
- AND LEN(tmp.Subcategory) <= 50
- -- Product Type
- INSERT INTO IV_Type
- (
- Owner_ID,
- [Description],
- Inactive_Flag,
- Updated_By,
- Last_Update,
- Item_Type_Xref
- )
- SELECT DISTINCT
- 1,
- tmp.ProductType,
- 0,
- @ImportBatchUser,
- GETDATE(),
- NULL
- FROM #PR_Import_Staging tmp
- LEFT OUTER JOIN IV_Type ivt
- ON ivt.[Description] = tmp.ProductType
- WHERE ivt.IV_Type_RecID IS NULL
- AND tmp.ProductType IS NOT NULL
- AND LEN(tmp.ProductType) <= 50
- -- Force short description by trimming to 50 characters
- UPDATE #PR_Import_Staging
- SET [Description] = SUBSTRING([Description], 1, 50)
- WHERE LEN([Description]) > 50
- END
- -- Grab reference RecIDs needed to start import
- -- Category & Sub-Category RecID
- UPDATE stag
- SET stag.IV_Category_RecID = ivc.IV_Cat_RecID,
- stag.IV_SubCategory_RecID = ivsc.IV_Subcat_RecID
- FROM IV_Category ivc
- INNER JOIN IV_SubCategory ivsc
- ON ivsc.IV_Cat_RecID = ivc.IV_Cat_RecID
- INNER JOIN #PR_Import_Staging stag
- ON stag.SubCategory = ivsc.[Description]
- AND stag.Category = ivc.[Description]
- -- Type
- UPDATE stag
- SET stag.IV_Type_RecID = ivt.IV_Type_RecID
- FROM IV_Type ivt
- INNER JOIN #PR_Import_Staging stag
- ON ivt.[Description] = stag.ProductType
- -- Class
- UPDATE stag
- SET stag.IV_Class_ID = ivc.IV_Class_ID
- FROM #PR_Import_Staging stag
- INNER JOIN IV_Class ivc
- ON ivc.IV_Class_ID = stag.ProductClass
- -- Manufacturer (where specified)
- UPDATE stag
- SET stag.Manufacturer_RecID = mn.Manufacturer_RecID
- FROM #PR_Import_Staging stag
- INNER JOIN Manufacturer mn
- ON mn.Manufacturer_Name = stag.Manufacturer
- WHERE stag.Manufacturer IS NOT NULL
- -- Warehouse (where specified)
- UPDATE stag
- SET stag.Warehouse_RecID = wh.Warehouse_RecID
- FROM #PR_Import_Staging stag
- INNER JOIN Warehouse wh
- ON wh.Warehouse_Name = stag.Warehouse
- -- Warehouse bin (where specified)
- UPDATE stag
- SET stag.Warehouse_Bin_RecID = whb.Warehouse_Bin_RecID
- FROM #PR_Import_Staging stag
- INNER JOIN Warehouse_Bin whb
- ON whb.Description = stag.WarehouseBin
- INNER JOIN Warehouse wh
- ON wh.Warehouse_RecID = whb.Warehouse_RecID
- -- UOM
- UPDATE stag
- SET stag.IV_UOM_RecID = uom.IV_UOM_RecID
- FROM #PR_Import_Staging stag
- INNER JOIN IV_UOM uom
- ON uom.[Description] = stag.UOM
- -- Get zAdmin RecID
- SELECT @zAdmin_Member_RecID = Member_RecID
- FROM dbo.Member
- WHERE Member_ID = 'zadmin'
- -- Update serialized flag
- UPDATE stag
- 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
- FROM #PR_Import_Staging stag
- -- Update serialized cost flag
- UPDATE stag
- 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
- FROM #PR_Import_Staging stag
- -- Update taxable flag
- UPDATE stag
- SET stag.Taxable = '0'
- FROM #PR_Import_Staging stag
- WHERE stag.Taxable IS NULL
- UPDATE stag
- 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
- FROM #PR_Import_Staging stag
- -- Strip dollar sign from price/cost
- UPDATE stag
- SET stag.UnitPrice = REPLACE(stag.UnitPrice, '$', ''),
- stag.UnitCost = REPLACE(stag.UnitCost, '$', '')
- FROM #PR_Import_Staging stag
- -- Set ConvertMessage and error out if any invalid references
- UPDATE stag
- SET ConvertMessage =
- CASE
- WHEN IV_Category_RecID IS NULL THEN 'Invalid category: ' + ISNULL(Category, '[BLANK]') + '"'
- WHEN IV_Subcategory_RecID IS NULL THEN 'Invalid subcategory: "' + ISNULL(SubCategory, '[BLANK]') + '"'
- WHEN IV_Type_RecID IS NULL THEN 'Invalid type: "' + ISNULL(ProductType, '[BLANK]') + '"'
- WHEN IV_Class_ID IS NULL THEN 'Invalid class: "' + ISNULL(ProductClass, '[BLANK]') + '"'
- WHEN IV_UOM_RecID IS NULL THEN 'Invalid UOM: "' + ISNULL(UOM, '[BLANK]') + '"'
- WHEN Manufacturer_RecID IS NULL AND Manufacturer IS NOT NULL THEN 'Invalid manufacturer: "' + ISNULL(Manufacturer, '[BLANK]') + '"'
- WHEN Warehouse_RecID IS NULL AND Warehouse IS NOT NULL THEN 'Invalid warehouse: "' + ISNULL(Warehouse, '[BLANK]') + '"'
- WHEN Warehouse_Bin_RecID IS NULL AND WarehouseBin IS NOT NULL THEN 'Invalid warehouse bin: "' + ISNULL(WarehouseBin, '[BLANK]') + '"'
- END
- FROM #PR_Import_Staging stag
- -- If there is an invalid reference, raise error
- IF EXISTS(SELECT * FROM #PR_Import_Staging WHERE ConvertMessage IS NOT NULL)
- BEGIN
- DECLARE @ConvError NVARCHAR(1000)
- SELECT @ConvError = 'Validation Error - ' + (SELECT TOP 1 ConvertMessage FROM #PR_Import_Staging WHERE ConvertMessage IS NOT NULL)
- RAISERROR(@ConvError, 16, 2)
- END
- -- Error if no zAdmin user
- IF @zAdmin_Member_RecID IS NULL
- BEGIN
- RAISERROR('zAdmin user not found for this implementation - required for import', 16, 2)
- END
- ELSE
- -- Validation success - begin push
- -- Determine if adjustment record is needed
- IF EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE intSOH > 0)
- BEGIN
- -- Update null taxable flag to 0 to prevent error on GL insert
- UPDATE #PR_Import_Staging
- SET Taxable = 0
- WHERE Taxable IS NULL
- -- If adjustment type for import utility does not exist, insert a type record
- IF NOT EXISTS(SELECT TOP 1 * FROM IV_Adjustment_Type WHERE IV_Adjustment_Type_ID = 'Initial Count')
- BEGIN
- INSERT INTO IV_Adjustment_Type
- (
- IV_Adjustment_Type_ID,
- [Description],
- --Last_Update,
- Updated_By
- )
- SELECT
- 'Initial Count',
- 'Initial Count',
- --GETDATE(),
- @ImportBatchUser
- END
- 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'))
- -- Create adjustment
- INSERT INTO IV_Adjustment
- (
- IV_Adjustment_Type_RecID,
- [Description],
- Reason,
- Notes,
- Updated_By,
- Closed_Flag,
- Date_Closed,
- Closed_By
- )
- SELECT
- @IV_Adjustment_Type_RecID,
- 'Import Utility - ' + CAST(GETDATE() AS VARCHAR(50)),
- 'Import Utility - ' + CAST(GETDATE() AS VARCHAR(50)),
- 'Import Utility - ' + CAST(GETDATE() AS VARCHAR(50)),
- @ImportBatchUser,
- 1,
- GETDATE(),
- @ImportBatchUser
- -- Capture IV_Adjustment_RecID for this batch
- SELECT @IV_Adjustment_RecID = SCOPE_IDENTITY()
- END
- -- Determine whether each row should be inserted or updated
- UPDATE stag
- SET Method = 'UPDATE'
- FROM #PR_Import_Staging stag
- INNER JOIN dbo.IV_Item ivi
- ON ivi.[Item_ID] = stag.ProductID
- UPDATE stag
- SET Method = 'UPDATE'
- FROM #PR_Import_Staging stag
- INNER JOIN dbo.IV_Item ivi
- ON stag.Method = NULL
- AND ivi.Item_ID LIKE(' %') OR ivi.Item_ID LIKE('% ')
- AND dbo.ufn_Import_Trim(ivi.[Item_ID]) = stag.ProductID
- UPDATE stag
- SET Method = 'INSERT'
- FROM #PR_Import_Staging stag
- WHERE Method IS NULL
- -- If there are multiple 'Insert' rows with the same Product_ID, set the first to 'INSERT' and subsequent to 'UPDATE'
- ;WITH DupRows AS
- (
- SELECT stag.ProductID
- FROM #PR_Import_Staging stag
- GROUP BY stag.ProductID
- HAVING COUNT(*) > 1
- )
- UPDATE stag2
- SET stag2.Method = 'UPDATE'
- FROM #PR_Import_Staging stag1
- INNER JOIN DupRows dr
- ON stag1.ProductID = dr.ProductID
- INNER JOIN #PR_Import_Staging stag2
- ON stag1.ProductID = stag2.ProductID
- AND stag1.ExcelRowNumber > stag2.ExcelRowNumber
- -- Perform Updates to IV_Item
- UPDATE ivi
- SET ivi.[Description] = stag.[Description],
- ivi.IV_Type_RecID = stag.IV_Type_RecID,
- ivi.IV_SubCat_RecID = stag.IV_Subcategory_RecID,
- ivi.IV_UOM_RecID = stag.IV_UOM_RecID,
- ivi.Current_Cost = stag.UnitCost,
- ivi.List_Price = stag.UnitPrice,
- ivi.Taxable_Flag = stag.Taxable,
- ivi.Long_Description = stag.LongDesc,
- ivi.Manufacturer_RecID = stag.Manufacturer_RecID,
- ivi.Mfg_Item_ID = stag.PartNumber,
- ivi.Updated_By = @ImportBatchUser,
- 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
- ivi.IV_Price_Attribute_ID = stag.IV_Price_Attribute_ID,
- ivi.Vendor_RecID = stag.Vendor_Company_RecID,
- --ivi.Vendor_SKU = stag.Vendor_SKU,
- ivi.Notes = stag.Product_Notes,
- ivi.SerializedCost_Flag = stag.Serialized_Cost
- FROM IV_Item ivi
- INNER JOIN #PR_Import_Staging stag
- ON stag.ProductID = ivi.Item_ID
- WHERE stag.Method = 'UPDATE'
- -- Get expected rowcount for insert to IV_Item
- SELECT @ExpRowCount = COUNT(*) FROM #PR_Import_Staging WHERE Method = 'INSERT'
- -- Perform insert to IV_Item
- -- Temporarily repurpose Owner_ID to catch identity from source table
- INSERT INTO IV_Item
- (
- Owner_ID,
- Item_ID,
- [Description],
- IV_Type_RecID,
- IV_SubCat_RecID,
- IV_UOM_RecID,
- Current_Cost,
- List_Price,
- Taxable_Flag,
- Inactive_Flag,
- Updated_By,
- Last_Update,
- Long_Description,
- Serialized_Flag,
- IV_Class_ID,
- Manufacturer_RecID,
- Mfg_Item_ID,
- Short_Name,
- Minimum_Stock,
- IV_Price_Attribute_ID,
- Vendor_RecID,
- Vendor_SKU,
- Notes,
- SerializedCost_Flag,
- Entered_By
- )
- SELECT
- stag.ExcelRowNumber,
- stag.ProductID,
- stag.[Description],
- stag.IV_Type_RecID,
- stag.IV_Subcategory_RecID,
- stag.IV_UOM_RecID,
- ISNULL(stag.UnitCost, 0),
- ISNULL(stag.UnitPrice, 0),
- stag.Taxable,
- 0,
- @ImportBatchUser,
- GETDATE(),
- stag.LongDesc,
- ISNULL(stag.Serialized, 0),
- stag.IV_Class_ID,
- stag.Manufacturer_RecID,
- stag.PartNumber,
- '',
- 0,
- IV_Price_Attribute_ID,
- Vendor_Company_RecID,
- Vendor_SKU,
- Product_Notes,
- Serialized_Cost,
- @ImportBatchUser
- FROM #PR_Import_Staging stag
- WHERE stag.Method = 'INSERT'
- -- If inserted rowcount does not match expected, raise error
- IF @@RowCount <> @ExpRowCount
- BEGIN
- 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.'
- RAISERROR(@ErrorMsg, 16, 2)
- END
- -- Join final table back to staging to capture identity of newly inserted rows
- UPDATE stag
- SET stag.IV_Item_RecID_New = ivi.IV_Item_RecID
- FROM #PR_Import_Staging stag
- INNER JOIN dbo.IV_Item ivi
- ON ivi.Owner_ID = stag.ExcelRowNumber
- AND ivi.Updated_By = @ImportBatchUser
- -- Update Owner_ID in IV_Item to 1
- UPDATE dbo.IV_Item
- SET Owner_ID = 1
- WHERE Updated_By = @ImportBatchUser
- -- 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
- UPDATE stag
- SET stag.IV_Item_RecID = ivi.IV_Item_RecID
- FROM #PR_Import_Staging stag
- INNER JOIN dbo.IV_Item ivi
- ON stag.ProductID = dbo.ufn_Import_Trim(ivi.Item_ID)
- -- No rows should have NULL IV_Item_RecID now - if so, throw error
- IF EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE IV_Item_RecID IS NULL)
- BEGIN
- 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) + '"'
- RAISERROR(@ErrorMsg, 16, 2)
- END
- -- Determine which rows require a new record in dbo.Inventory_By_Warehouse
- UPDATE stag
- SET New_Inventory_Record = 1
- FROM #PR_Import_Staging stag
- LEFT OUTER JOIN dbo.Inventory_By_Warehouse ibw
- ON ibw.IV_Item_RecID = stag.IV_Item_RecID
- AND ibw.Warehouse_RecID = stag.Warehouse_RecID
- AND ibw.Warehouse_Bin_RecID = stag.Warehouse_Bin_RecID
- AND stag.intSOH IS NOT NULL
- WHERE ibw.Inventory_By_Warehouse_RecID IS NULL
- AND stag.intSOH > 0
- -- Insert new records to dbo.Inventory_By_Warehouse
- -- Initial count = 0, will update the entire batch at once
- INSERT INTO Inventory_By_Warehouse
- (
- IV_Item_RecID,
- Warehouse_RecID,
- Warehouse_Bin_RecID,
- Qty_On_Hand,
- Last_Update,
- Updated_By
- )
- SELECT DISTINCT
- IV_Item_RecID,
- Warehouse_RecID,
- Warehouse_Bin_RecID,
- 0,
- GETDATE(),
- @ImportBatchUser
- FROM #PR_Import_Staging stag
- WHERE stag.New_Inventory_Record = 1
- -- Join back and grab Inventory_By_Warehouse RecID for all rows with SOH
- UPDATE stag
- SET stag.Inventory_By_Warehouse_RecID = ibw.Inventory_By_Warehouse_RecID
- FROM #PR_Import_Staging stag
- INNER JOIN dbo.Inventory_By_Warehouse ibw
- ON ibw.IV_Item_RecID = stag.IV_Item_RecID
- AND ibw.Warehouse_RecID = stag.Warehouse_RecID
- AND ibw.Warehouse_Bin_RecID = stag.Warehouse_Bin_RecID
- AND stag.intSOH > 0
- -- Error if any rows with SOH are missing Inventory_By_Warehouse_RecID
- IF EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE intSOH > 0 AND Inventory_By_Warehouse_RecID IS NULL)
- BEGIN
- 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) + '"'
- RAISERROR(@ErrorMsg, 16, 2)
- END
- -- Create adjustment detail record for all inventory records
- -- Temporarily repurpose Updated_By to capture identity
- INSERT INTO dbo.IV_Adjustment_Detail
- (
- IV_Adjustment_RecID,
- IV_Item_RecID,
- [Description],
- Adjusted_Qty,
- Updated_By,
- Last_Update,
- Warehouse_RecID,
- Warehouse_Bin_RecID,
- Unit_Cost
- )
- SELECT
- @IV_Adjustment_RecID,
- stag.IV_Item_RecID,
- stag.[Description],
- stag.intSOH,
- ExcelRowNumber,
- GETDATE(),
- stag.Warehouse_RecID,
- stag.Warehouse_Bin_RecID,
- stag.UnitCost
- FROM #PR_Import_Staging stag
- WHERE stag.intSOH > 0
- -- Join dbo.IV_Adjustment_Detail back to staging table to capture IV_Adjustment_Detail_RecID
- UPDATE stag
- SET stag.IV_Adjustment_Detail_RecID = ivad.IV_Adjustment_Detail_RecID
- FROM #PR_Import_Staging stag
- INNER JOIN IV_Adjustment_Detail ivad
- ON ivad.IV_Adjustment_RecID = @IV_Adjustment_RecID
- AND ivad.IV_Item_RecID = stag.IV_Item_RecID
- AND ivad.Warehouse_Bin_RecID = stag.Warehouse_Bin_RecID
- AND ivad.Warehouse_RecID = stag.Warehouse_RecID
- AND ivad.Updated_By = stag.ExcelRowNumber
- -- Set Updated_By to import batch user in IV_Adjustment_Detail
- UPDATE ivad
- SET ivad.Updated_By = @ImportBatchUser
- FROM IV_Adjustment_Detail ivad
- INNER JOIN #PR_Import_Staging stag
- ON stag.IV_Adjustment_Detail_RecID = ivad.IV_Adjustment_Detail_RecID
- -- Error if any rows with SOH are missing IV_Adjustment_Detail_RecID
- IF EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE intSOH > 0 AND IV_Adjustment_Detail_RecID IS NULL)
- BEGIN
- 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) + '"'
- RAISERROR(@ErrorMsg, 16, 2)
- END
- -- Create Item Audit record - Use loop because we need the insert trigger to run
- WHILE EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE IntSOH > 0 AND IV_Audit_RecID IS NULL)
- BEGIN
- -- Grab next row to process
- 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)
- 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 =
- @Curr_Audit_Row)
- -- Update Inventory_By_Warehouse to increment count
- UPDATE ibw
- SET ibw.Qty_On_Hand = ISNULL(Qty_On_Hand, 0) + IntSOH
- FROM #PR_Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Inventory_By_Warehouse ibw WHERE ibw.Inventory_By_Warehouse_RecID = stag.Inventory_By_Warehouse_RecID)ibw
- WHERE stag.ExcelRowNumber = @Curr_Audit_Row
- -- Perform insert
- INSERT INTO IV_Audit
- (
- IV_Item_RecID,
- Warehouse_RecID,
- Warehouse_Bin_RecID,
- Updated_By,
- Transaction_Date,
- Transaction_Type,
- Quantity_Change,
- Unit_Cost,
- IV_Adjustment_Detail_RecID,
- Quantity_On_Hand,
- Avg_Cost,
- Serial_Numbers
- )
- SELECT
- stag.IV_Item_RecID,
- stag.Warehouse_RecID,
- stag.Warehouse_Bin_RecID,
- @ImportBatchUser,
- DATEADD(Second, ExcelRowNumber, GETDATE()),
- 'Adjustment - Import Utility',
- stag.intSOH,
- stag.UnitCost,
- stag.IV_Adjustment_Detail_RecID,
- ISNULL(@Prev_Quantity, 0) + intSoh,
- NULL,
- SerialNumbers
- FROM #PR_Import_Staging stag
- CROSS APPLY(SELECT TOP 1 * FROM dbo.Inventory_By_Warehouse ibw WHERE ibw.Inventory_By_Warehouse_RecID = stag.Inventory_By_Warehouse_RecID)ibw
- WHERE ExcelRowNumber = @Curr_Audit_Row
- SELECT @IV_Audit_RecID = SCOPE_IDENTITY()
- -- Capture identity
- UPDATE #PR_Import_Staging SET IV_Audit_RecID = @IV_Audit_RecID WHERE ExcelRowNumber = @Curr_Audit_Row
- END
- -- Determine expected total number of serial numbers to insert
- SELECT @ExpRowCount = SUM(intSOH) FROM #PR_Import_Staging WHERE Serialized = 1
- -- Insert records to IV_Serial_Numbers
- INSERT INTO IV_Serial_Number
- (
- Serial_Number,
- IV_Item_RecID,
- Warehouse_Bin_RecID,
- Updated_By,
- Last_Update,
- Date_Received,
- IV_Adjustment_Detail_RecID,
- Unit_Cost
- )
- SELECT
- sn.SerialNum,
- stag.IV_Item_RecID,
- stag.Warehouse_Bin_RecID,
- @ImportBatchUser,
- GETDATE(),
- GETDATE(),
- stag.IV_Adjustment_Detail_RecID,
- stag.UnitCost
- FROM #PR_Import_Staging stag
- INNER JOIN @SerNums sn
- ON stag.ExcelRowNumber = sn.ExcelRowNumber
- -- Determine which records require GL records
- UPDATE stag
- SET GL_Inserted = 0
- FROM #PR_Import_Staging stag
- WHERE stag.IV_Adjustment_Detail_RecID IS NOT NULL
- -- Loop through staging table and insert GL records
- WHILE EXISTS(SELECT TOP 1 * FROM #PR_Import_Staging WHERE GL_Inserted = 0)
- BEGIN
- -- Grab current RecID for processing
- SET @Curr_Detail_RecID = (SELECT TOP 1 IV_Adjustment_Detail_RecID FROM #PR_Import_Staging WHERE GL_Inserted = 0 ORDER BY ExcelRowNumber ASC)
- SELECT
- @taxable = iv_item.taxable_flag,
- @typeRecid = a.iv_adjustment_type_recid,
- @billAmount = ISNULL(ROUND(ISNULL(iv_item.current_cost, 0) * ISNULL(ad.adjusted_qty, 0),2), 0),
- @glCost = ISNULL(ROUND(ISNULL(iv_item.current_cost, 0) * ISNULL(ad.adjusted_qty, 0),2), 0),
- @subCatRecid = subcat.iv_subcat_recid,
- @catRecid = subcat.iv_cat_recid,
- @olRecid = ISNULL(b.owner_level_recid, w.owner_level_recid),
- @buRecid = ISNULL(b.billing_unit_recid, w.billing_unit_recid)
- FROM dbo.IV_Adjustment_Detail ad
- LEFT JOIN dbo.IV_Adjustment a on ad.iv_adjustment_recid = a.iv_adjustment_recid
- LEFT JOIN dbo.IV_Item on iv_item.iv_item_recid = ad.iv_item_recid
- LEFT JOIN dbo.IV_SubCategory subcat on subcat.iv_subcat_recid = iv_item.iv_subcat_recid
- LEFT JOIN dbo.Warehouse_Bin b on b.warehouse_bin_recid = ad.warehouse_bin_recid
- LEFT JOIN dbo.Warehouse w on w.warehouse_recid = b.warehouse_recid
- WHERE ad.IV_Adjustment_Detail_RecID = @Curr_Detail_RecID
- -- Clear table variable
- DELETE FROM @GLAccounts
- /*Insert GL Account information into table for the roll-up*/
- INSERT INTO @GLAccounts
- SELECT
- ga.GL_Item,
- ga.GL_SalesCode,
- ga.GL_Cogs,
- ga.GL_Inventory,
- ga.segment1,
- ga.segment2,
- ga.segment3,
- ga.segment4,
- ga.segment5,
- ga.segment6,
- ga.segment7,
- ga.segment8,
- ga.segment9,
- ga.segment10,
- sort = CASE Table_Name
- WHEN 'iv_adjustment_type' THEN 1
- WHEN 'iv_subcategory' THEN 2
- WHEN 'iv_category' THEN 3
- WHEN 'billing_unit' THEN 4
- WHEN 'owner_level' THEN 5
- WHEN 'owner' THEN 6
- END
- FROM GL_Setup gs
- LEFT JOIN GL_Account ga on ga.segment_nbr = 1 and ga.GL_Setup_RecID = gs.GL_Setup_RecID
- WHERE gl_type_id = 'IA'
- AND ((RecID = @typeRecid AND Table_Name = 'iv_adjustment_type')
- OR (RecID = @subCatRecid AND Table_Name = 'iv_subcategory')
- OR (RecID = @catRecid AND Table_Name = 'iv_category')
- OR (RecID = @buRecid AND Table_Name = 'billing_unit')
- OR (RecID = @olRecid AND Table_Name = 'owner_level')
- OR (RecID = 1 AND Table_Name = 'owner'))
- /*Insert into gl entries, the subqueries do the roll-up of the accounts : it starts from the top, looks down each row,
- and pulls from the first non-null value to fill out the row for inserting.*/
- SET @glCogs = (SELECT TOP 1 GL_Cogs FROM @GLAccounts WHERE ISNULL(GL_Cogs, '') != '' ORDER BY sort);
- SET @glInventory = (SELECT TOP 1 GL_Inventory FROM @GLAccounts WHERE ISNULL(GL_Inventory, '') != '' ORDER BY sort);
- SET @glItem = (SELECT TOP 1 GL_Item FROM @GLAccounts WHERE ISNULL(GL_Item, '') != '' ORDER BY sort);
- SET @glSalesCode = (SELECT TOP 1 GL_SalesCode FROM @GLAccounts WHERE ISNULL(GL_SalesCode, '') != '' ORDER BY sort);
- SET @seg1 = (SELECT TOP 1 CASE WHEN @segmentNbr > 0 THEN segment1 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment1, '') != '' ORDER BY sort);
- SET @seg2 = (SELECT TOP 1 CASE WHEN @segmentNbr > 1 THEN segment2 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment2, '') != '' ORDER BY sort);
- SET @seg3 = (SELECT TOP 1 CASE WHEN @segmentNbr > 2 THEN segment3 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment3, '') != '' ORDER BY sort);
- SET @seg4 = (SELECT TOP 1 CASE WHEN @segmentNbr > 3 THEN segment4 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment4, '') != '' ORDER BY sort);
- SET @seg5 = (SELECT TOP 1 CASE WHEN @segmentNbr > 4 THEN segment5 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment5, '') != '' ORDER BY sort);
- SET @seg6 = (SELECT TOP 1 CASE WHEN @segmentNbr > 5 THEN segment6 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment6, '') != '' ORDER BY sort);
- SET @seg7 = (SELECT TOP 1 CASE WHEN @segmentNbr > 6 THEN segment7 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment7, '') != '' ORDER BY sort);
- SET @seg8 = (SELECT TOP 1 CASE WHEN @segmentNbr > 7 THEN segment8 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment8, '') != '' ORDER BY sort);
- SET @seg9 = (SELECT TOP 1 CASE WHEN @segmentNbr > 8 THEN segment9 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment9, '') != '' ORDER BY sort);
- SET @seg10 = (SELECT TOP 1 CASE WHEN @segmentNbr > 9 THEN segment10 ELSE NULL END FROM @GLAccounts WHERE ISNULL(segment10, '') != '' ORDER BY sort);
- INSERT INTO gl_entry
- (table_reference, recid, gl_type_id, gl_amount, gl_description, taxable_flag, item_taxable_flag, taxable2_flag,
- taxable3_flag, taxable4_flag, taxable5_flag, iv_product_recid, updated_by, gl_cost, gl_cogs, gl_inventory, gl_item,
- gl_salescode, segment1, segment2, segment3, segment4, segment5, segment6, segment7, segment8, segment9, segment10)
- VALUES ('iv_adjustment_detail', @Curr_Detail_RecID, 'IA', @billAmount, 'Inventory Adjustment', @taxable, @taxable, @taxable,
- @taxable, @taxable, @taxable, NULL, @ImportBatchUser, @glCost, @glCogs, @glInventory, @glItem, @glSalesCode, @seg1, @seg2, @seg3,
- @seg4, @seg5, @seg6, @seg7, @seg8, @seg9, @seg10)
- INSERT INTO gl_entry
- (table_reference, recid, gl_type_id, gl_amount, gl_description, taxable_flag, item_taxable_flag, taxable2_flag,
- taxable3_flag, taxable4_flag, taxable5_flag, iv_product_recid, updated_by, gl_cost, gl_cogs, gl_inventory, gl_item,
- gl_salescode, segment1, segment2, segment3, segment4, segment5, segment6, segment7, segment8, segment9, segment10)
- VALUES ('iv_adjustment_detail', @Curr_Detail_RecID, 'IO', @billAmount, 'Inventory Adjustment', @taxable, @taxable, @taxable,
- @taxable, @taxable, @taxable, NULL, @ImportBatchUser, @glCost, @glCogs, @glInventory, @glItem, @glSalesCode, @seg1, @seg2, @seg3,
- @seg4, @seg5, @seg6, @seg7, @seg8, @seg9, @seg10)
- UPDATE #PR_Import_Staging SET GL_Inserted = 1 WHERE IV_Adjustment_Detail_RecID = @Curr_Detail_RecID
- END
- -- If debug mode and successful, select the rows that were inserted
- -- and rollback transaction
- IF @DebugMode = 1 AND @@ERROR = 0
- BEGIN
- SELECT * FROM dbo.IV_Item WHERE Updated_By = @ImportBatchUser
- SELECT * FROM IV_Adjustment WHERE Updated_By = @ImportBatchUser
- SELECT * FROM IV_Adjustment_Detail WHERE Updated_By = @ImportBatchUser
- SELECT * FROM Inventory_By_Warehouse WHERE Updated_By = @ImportBatchUser
- SELECT * FROM IV_Audit WHERE Updated_By = @ImportBatchUser
- SELECT * FROM IV_Serial_Number WHERE Updated_By = @ImportBatchUser
- SELECT * FROM GL_Entry WHERE Updated_By = @ImportBatchUser
- ROLLBACK TRANSACTION PR_Import
- END
- IF @DebugMode = 2 AND @@ERROR = 0
- BEGIN
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- ROLLBACK TRANSACTION PR_Import
- END
- IF @DebugMode = 0 AND @@Error = 0
- BEGIN
- -- Import successful - commit and return results
- COMMIT TRANSACTION PR_Import
- SELECT
- 1 AS Success,
- NULL AS ExcelRowNumber,
- NULL AS ErrorDetails
- END
- END TRY
- BEGIN CATCH
- -- An error has occured - return SQL error message encountered
- SELECT
- 0 AS Success,
- 'Unknown' AS ExcelRowNumber,
- ERROR_MESSAGE() + 'Line: ' + CONVERT(VARCHAR(20),ERROR_LINE()) AS ErrorDetails
- -- Rollback transaction
- IF @@TRANCOUNT > 0
- ROLLBACK TRANSACTION PR_Import
- END CATCH
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_AGR_ImportValidate')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_AGR_ImportValidate] AS SELECT 1')
- END
- GO
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.procedures WHERE name = 'usp_AGR_ImportPush')
- BEGIN
- EXEC('CREATE PROCEDURE [dbo].[usp_AGR_ImportPush] AS SELECT 1')
- END
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 10/04/2013
- -- Description: Validates data for Agreements import
- -- Sample call: EXEC usp_AGR_ImportValidate 'TMP_Import_4992de3f325c4a2d8f575608b7dc2801', 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_AGR_ImportValidate]
- @TableName VARCHAR(255),
- @ForceMode BIT = 0
- AS
- BEGIN TRY
- BEGIN TRANSACTION AGR_Import
- SET NOCOUNT ON
- -- Variable declaration
- -- To keep validation/push logic consistent, validation/insert procs are identical - Final insert runs only on usp_AGR_ImportPush
- -- Capture proc name to drive validate vs. commit logic
- DECLARE @ProcName NVARCHAR(50)
- SELECT @ProcName = OBJECT_NAME(@@ProcID)
- -- Row counters for summary results
- DECLARE @start INT
- DECLARE @end INT
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- DECLARE
- @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
- BEGIN
- DROP TABLE #tblResults
- END
- -- Table to hold results of procedure
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750),
- InvalidReason VARCHAR(MAX),
- ReferenceType VARCHAR(MAX),
- Warning_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- -- Table to hold source data for this batch from temp table
- IF OBJECT_ID('tempdb.dbo.#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT,
- -- Fields appearing on spreadsheet
- Agreement_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Company_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- [Start_Date] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Billing_Start_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- End_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Site_Name NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Contact_First_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Contact_Last_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Purchase_Order nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Location nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- [Group] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- SLA nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Internal_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- Application_Unit nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Application_Limit nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Available_Per nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Covers_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Covers_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Covers_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Covers_Sales_Tax nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Carryover_Days nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Overruns_Percent nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Charge_adjustments_to_the_firm nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Billing_Cycle nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Cycle_Based_On nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Billing_Amount nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Taxable nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Prorate_first_bill nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Tax_Code nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Restrict_downpayment nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Terms nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Override_Bill_To_Company_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Override_Billing_Site_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Description nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Default_Work_Role nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Default_Work_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Project_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Template nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Bill_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Bill_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Bill_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- -- Fields derived from others on spreadsheet
- No_Ending_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- [Unlimited] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- -- Fields always defaulted from Agreement Type
- TopComment_Flag NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- BottomComment_Flag NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Prepay_Flag BIT NULL,
- Comp_Rate_Option NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Comp_Limit_Option NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Comp_Rate_Amount NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Comp_Limit_Amount NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- -- Reference RecID's/Fields used for final inserts
- AGR_Type_RecID INT NULL,
- AGR_Detail_Type_RecID INT NULL,
- Company_RecID INT NULL,
- Company_Address_RecID INT NULL,
- Contact_RecID INT NULL,
- Owner_Level_RecID INT NULL,
- Billing_Unit_RecID INT NULL,
- SR_SLA_RecID INT NULL,
- Tax_Code_RecID INT NULL,
- Billing_Terms_RecID INT NULL,
- Billing_Company_RecID INT NULL,
- Billing_Address_RecID INT NULL,
- Activity_Type_RecID INT NULL, -- Work type
- Activity_Class_RecID INT NULL, -- Work role
- PM_Type_RecID INT,
- AGR_Billing_Cycle_RecID INT NULL,
- bl_invTemplate_Setup_RecID INT NULL, -- Invoice template
- DT_Start_Date DATETIME NULL,
- DT_End_Date DATETIME NULL,
- DT_Billing_Start_Date DATETIME NULL,
- INT_Carryover_Days INT NULL,
- INT_Overruns_Percent INT NULL,
- OL_Restrict_Flag BIT NULL,
- BU_Restrict_Flag BIT NULL,
- PP_Amount DECIMAL(18, 2) NULL,
- PP_Unlimited_Flag BIT NULL,
- AppCycle_ID CHAR(1) COLLATE DATABASE_DEFAULT NULL,
- AGR_OneTime_Flag BIT NULL,
- PP_Time_Flag BIT NULL,
- PP_Products_Flag BIT NULL,
- PP_Carryover_Flag BIT NULL,
- Overrun_Flag BIT NULL,
- Overrun_Limit INT NULL,
- Charge_Firm_Flag BIT NULL,
- PP_One_Time_Flag BIT NULL,
- PP_Tax_Flag BIT NULL,
- CycleBasis_ID CHAR(1) COLLATE DATABASE_DEFAULT NULL,
- PP_Expire_Flag BIT NULL,
- PP_Expenses_Flag BIT NULL,
- Taxable_Flag BIT NULL,
- Restrict_DP_Flag BIT NULL,
- TE_Invoice_Flag BIT NULL,
- TE_Billable_Flag BIT NULL,
- EX_Invoice_Flag BIT NULL,
- EX_Billable_Flag BIT NULL,
- IV_Invoice_Flag BIT NULL,
- IV_Billable_Flag BIT NULL,
- AGR_Date_Start DATETIME,
- AGR_Date_End DATETIME,
- Bill_Start_Date DATETIME,
- AGR_Detail_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT NULL,
- AGR_PONbr NVARCHAR(30) COLLATE DATABASE_DEFAULT NULL,
- AGR_InvDesc NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- AGR_Name NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- AGR_Amount DECIMAL(18,2) NULL,
- AGR_ProRate DECIMAL(18,2) NULL,
- AGR_Notes VARCHAR(5000) COLLATE DATABASE_DEFAULT NULL,
- TE_InvCust_Flag BIT NULL,
- EX_InvCust_Flag BIT NULL,
- IV_InvCust_Flag BIT NULL,
- AGR_NoEnd_Flag BIT NULL,
- AGR_Header_RecID INT NULL,
- ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy NVARCHAR(61),
- Company_Match_Val NVARCHAR(3),
- Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Diff_Exclude_Flag BIT,
- Duplicate_Flag BIT
- )
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'Agreement Type' UNION ALL
- SELECT 'Agreement Name' UNION ALL
- SELECT 'Company Name' UNION ALL
- SELECT 'Start Date' UNION ALL
- SELECT 'Billing Start Date'
- -- Create & populate table variable with list of optional columns
- DECLARE @OptionalColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @OptionalColumns
- (
- ColumnName
- )
- SELECT 'Contact First Name' UNION ALL
- SELECT 'Contact Last Name' UNION ALL
- SELECT 'Purchase Order' UNION ALL
- SELECT 'Location' UNION ALL
- SELECT 'Group' UNION ALL
- SELECT 'End Date' UNION ALL
- SELECT 'SLA' UNION ALL
- SELECT 'Internal Notes' UNION ALL
- SELECT 'Application Unit' UNION ALL
- SELECT 'Application Limit' UNION ALL
- SELECT 'Available Per' UNION ALL
- SELECT 'Agreement Covers Time' UNION ALL
- SELECT 'Agreement Covers Expenses' UNION ALL
- SELECT 'Agreement Covers Products' UNION ALL
- SELECT 'Agreement Covers Sales Tax' UNION ALL
- SELECT 'Carryover Days' UNION ALL
- SELECT 'Overruns Percent' UNION ALL
- SELECT 'Charge adjustments to the firm' UNION ALL
- SELECT 'Billing Cycle' UNION ALL
- SELECT 'Cycle Based On' UNION ALL
- SELECT 'Billing Amount' UNION ALL
- SELECT 'Taxable' UNION ALL
- SELECT 'Prorate first bill' UNION ALL
- SELECT 'Tax Code' UNION ALL
- SELECT 'Restrict Downpayment' UNION ALL
- SELECT 'Billing Terms' UNION ALL
- SELECT 'Override Bill To Company Name' UNION ALL
- SELECT 'Override Billing Site Name' UNION ALL
- SELECT 'Invoice Description' UNION ALL
- SELECT 'Default Work Role' UNION ALL
- SELECT 'Default Work Type' UNION ALL
- SELECT 'Project Type' UNION ALL
- SELECT 'Invoice Template' UNION ALL
- SELECT 'Bill Time' UNION ALL
- SELECT 'Bill Expenses' UNION ALL
- SELECT 'Bill Products' UNION ALL
- SELECT 'Invoice Time' UNION ALL
- SELECT 'Invoice Expenses' UNION ALL
- SELECT 'Invoice Products' UNION ALL
- SELECT 'Site Name'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- -- If a required column is missing, stop here and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 0 AS ValPassed,
- RowNumber,
- ValMsg
- FROM #tblResults
- ORDER BY RowNumber, ValMsg
- ROLLBACK TRANSACTION AGR_Import
- RETURN
- END
- -- Pull sys columns information for tempdb into temp table
- -- This is necessary to join to sys columns data without experiencing collation errors in the event that tempdb collation differs from database_default
- IF OBJECT_ID('tempdb..#sysColumns') IS NOT NULL
- BEGIN
- DROP TABLE #sysColumns
- END
- SELECT *
- INTO #sysColumns
- FROM tempdb.sys.columns
- -- Add any optional spreadsheet columns to source table to sidestep table structure errors later on
- -- Use dynamic SQL to only add columns that are missing
- 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)
- BEGIN
- SELECT @DSQL = 'ALTER TABLE ' + @SourceTable + '
- ADD '
- SELECT @DSQL = @DSQL + QUOTENAME(ColumnName) + ' NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- '
- 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
- END
- -- Remove last comma from @DSQL to correct syntax
- SET @DSQL = LEFT(@DSQL, LEN(@DSQL) - 3)
- -- Add optional columns to source table
- EXEC(@DSQL)
- -- Build statement to populate validation temp table
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- [ExcelRowNumber],
- [Agreement_Type],
- [Agreement_Name],
- [Company_Name],
- [Site_Name],
- [Contact_First_Name],
- [Contact_Last_Name],
- [Purchase_Order],
- [Location],
- [Group],
- [Start_Date],
- [End_Date],
- [SLA],
- [Internal_Notes],
- [Application_Unit],
- [Application_Limit],
- [Available_Per],
- [Agreement_Covers_Time],
- [Agreement_Covers_Expenses],
- [Agreement_Covers_Products],
- [Agreement_Covers_Sales_Tax],
- [Carryover_Days],
- [Overruns_Percent],
- [Charge_adjustments_to_the_firm],
- [Billing_Cycle],
- [Cycle_Based_On],
- [Billing_Amount],
- [Taxable],
- [Prorate_first_bill],
- [Billing_Start_date],
- [Tax_Code],
- [Restrict_downpayment],
- [Terms],
- [Override_Bill_To_Company_Name],
- [Override_Billing_Site_Name],
- [Invoice_Description],
- [Default_Work_Role],
- [Default_Work_Type],
- [Project_Type],
- [Invoice_Template],
- [Bill_Time],
- [Bill_Expenses],
- [Bill_Products],
- [Invoice_Time],
- [Invoice_Expenses],
- [Invoice_Products],
- Company_Match_Val
- )
- SELECT
- [Excel Row Number],
- [Agreement Type],
- [Agreement Name],
- [Company Name],
- [Site Name],
- [Contact First Name],
- [Contact Last Name],
- [Purchase Order],
- [Location],
- [Group],
- [Start Date],
- [End Date],
- [SLA],
- [Internal Notes ],
- [Application Unit],
- [Application Limit],
- [Available Per],
- [Agreement Covers Time],
- [Agreement Covers Expenses],
- [Agreement Covers Products],
- [Agreement Covers Sales Tax],
- [Carryover Days],
- [Overruns Percent],
- [Charge adjustments to the firm],
- [Billing Cycle],
- [Cycle Based On],
- [Billing Amount],
- [Taxable],
- [Prorate first bill],
- [Billing Start date],
- [Tax Code],
- [Restrict downpayment],
- [Billing Terms],
- [Override Bill To Company Name],
- [Override Billing Site Name],
- [Invoice Description],
- [Default Work Role],
- [Default Work Type],
- [Project Type],
- [Invoice Template],
- [Bill Time],
- [Bill Expenses],
- [Bill Products],
- [Invoice Time],
- [Invoice Expenses],
- [Invoice Products],
- SUBSTRING([Company Name], 1, 3)
- FROM ' + @SourceTable
- -- Pull data into validation temp table
- EXEC(@DSQL)
- -- Convert empty string and single space to null in temp table
- -- So that nulls may be properly handled throughout procedure
- UPDATE #Import_Staging
- SET [Agreement_Type] = CASE WHEN [Agreement_Type] IN('', ' ') THEN NULL ELSE [Agreement_Type] END,
- [Agreement_Name] = CASE WHEN [Agreement_Name] IN('', ' ') THEN NULL ELSE [Agreement_Name] END,
- [Company_Name] = CASE WHEN [Company_Name] IN('', ' ') THEN NULL ELSE [Company_Name] END,
- [Site_Name] = CASE WHEN [Site_Name] IN('', ' ') THEN NULL ELSE [Site_Name] END,
- [Contact_First_Name] = CASE WHEN [Contact_First_Name] IN('', ' ') THEN NULL ELSE [Contact_First_Name] END,
- [Contact_Last_Name] = CASE WHEN [Contact_Last_Name] IN('', ' ') THEN NULL ELSE [Contact_Last_Name] END,
- [Purchase_Order] = CASE WHEN [Purchase_Order] IN('', ' ') THEN NULL ELSE [Purchase_Order] END,
- [Location] = CASE WHEN [Location] IN('', ' ') THEN NULL ELSE [Location] END,
- [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
- [Start_Date] = CASE WHEN [Start_Date] IN('', ' ') THEN NULL ELSE [Start_Date] END,
- [End_Date] = CASE WHEN [End_Date] IN('', ' ') THEN NULL ELSE [End_Date] END,
- [No_Ending_Date] = CASE WHEN [No_Ending_Date] IN('', ' ') THEN NULL ELSE [No_Ending_Date] END,
- [SLA] = CASE WHEN [SLA] IN('', ' ') THEN NULL ELSE [SLA] END,
- [Internal_Notes] = CASE WHEN [Internal_Notes] IN('', ' ') THEN NULL ELSE [Internal_Notes] END,
- [Application_Unit] = CASE WHEN [Application_Unit] IN('', ' ') THEN NULL ELSE [Application_Unit] END,
- [Application_Limit] = CASE WHEN [Application_Limit] IN('', ' ') THEN NULL ELSE [Application_Limit] END,
- [Unlimited] = CASE WHEN [Unlimited] IN('', ' ') THEN NULL ELSE [Unlimited] END,
- [Available_Per] = CASE WHEN [Available_Per] IN('', ' ') THEN NULL ELSE [Available_Per] END,
- [Agreement_Covers_Time] = CASE WHEN [Agreement_Covers_Time] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Time] END,
- [Agreement_Covers_Expenses] = CASE WHEN [Agreement_Covers_Expenses] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Expenses] END,
- [Agreement_Covers_Products] = CASE WHEN [Agreement_Covers_Products] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Products] END,
- [Agreement_Covers_Sales_Tax] = CASE WHEN [Agreement_Covers_Sales_Tax] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Sales_Tax] END,
- [Carryover_Days] = CASE WHEN [Carryover_Days] IN('', ' ') THEN NULL ELSE [Carryover_Days] END,
- [Overruns_Percent] = CASE WHEN [Overruns_Percent] IN('', ' ') THEN NULL ELSE [Overruns_Percent] END,
- [Charge_adjustments_to_the_firm] = CASE WHEN [Charge_adjustments_to_the_firm] IN('', ' ') THEN NULL ELSE [Charge_adjustments_to_the_firm] END,
- [Billing_Cycle] = CASE WHEN [Billing_Cycle] IN('', ' ') THEN NULL ELSE [Billing_Cycle] END,
- [Cycle_Based_On] = CASE WHEN [Cycle_Based_On] IN('', ' ') THEN NULL ELSE [Cycle_Based_On] END,
- [Billing_Amount] = CASE WHEN [Billing_Amount] IN('', ' ') THEN NULL ELSE [Billing_Amount] END,
- [Taxable] = CASE WHEN [Taxable] IN('', ' ') THEN NULL ELSE [Taxable] END,
- [Prorate_first_bill] = CASE WHEN [Prorate_first_bill] IN('', ' ') THEN NULL ELSE [Prorate_first_bill] END,
- [Billing_Start_date] = CASE WHEN [Billing_Start_date] IN('', ' ') THEN NULL ELSE [Billing_Start_date] END,
- [Tax_Code] = CASE WHEN [Tax_Code] IN('', ' ') THEN NULL ELSE [Tax_Code] END,
- [Restrict_downpayment] = CASE WHEN [Restrict_downpayment] IN('', ' ') THEN NULL ELSE [Restrict_downpayment] END,
- [Terms] = CASE WHEN [Terms] IN('', ' ') THEN NULL ELSE [Terms] END,
- [Override_Bill_To_Company_Name] = CASE WHEN [Override_Bill_To_Company_Name] IN('', ' ') THEN NULL ELSE [Override_Bill_To_Company_Name] END,
- [Override_Billing_Site_Name] = CASE WHEN [Override_Billing_Site_Name] IN('', ' ') THEN NULL ELSE [Override_Billing_Site_Name] END,
- [Invoice_Description] = CASE WHEN [Invoice_Description] IN('', ' ') THEN NULL ELSE [Invoice_Description] END,
- [Default_Work_Role] = CASE WHEN [Default_Work_Role] IN('', ' ') THEN NULL ELSE [Default_Work_Role] END,
- [Default_Work_Type] = CASE WHEN [Default_Work_Type] IN('', ' ') THEN NULL ELSE [Default_Work_Type] END,
- [Project_Type] = CASE WHEN [Project_Type] IN('', ' ') THEN NULL ELSE [Project_Type] END,
- [Invoice_Template] = CASE WHEN [Invoice_Template] IN('', ' ') THEN NULL ELSE [Invoice_Template] END,
- [Bill_Time] = CASE WHEN [Bill_Time] IN('', ' ') THEN NULL ELSE [Bill_Time] END,
- [Bill_Expenses] = CASE WHEN [Bill_Expenses] IN('', ' ') THEN NULL ELSE [Bill_Expenses] END,
- [Bill_Products] = CASE WHEN [Bill_Products] IN('', ' ') THEN NULL ELSE [Bill_Products] END,
- [Invoice_Time] = CASE WHEN [Invoice_Time] IN('', ' ') THEN NULL ELSE [Invoice_Time] END,
- [Invoice_Expenses] = CASE WHEN [Invoice_Expenses] IN('', ' ') THEN NULL ELSE [Invoice_Expenses] END,
- [Invoice_Products] = CASE WHEN [Invoice_Products] IN('', ' ') THEN NULL ELSE [Invoice_Products] END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Condense contact first and last names to ContactName
- UPDATE tmp
- SET ContactName = LTRIM(ISNULL(tmp.Contact_First_Name + ' ', '') + ISNULL(tmp.Contact_Last_Name, ''))
- FROM #Import_Staging tmp
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(comp.Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE Delete_Flag = 0
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- INNER JOIN #Company comp
- ON comp.Company_RecID = cont.Company_RecID
- -- Match companies and contacts
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- -- Table to hold duplicate sites
- IF OBJECT_ID('tempdb..#Duplicate_Sites') IS NOT NULL
- BEGIN
- DROP TABLE #Duplicate_Sites
- END
- SELECT
- cad.Company_RecID,
- dbo.ufn_Import_Trim(comp.Company_Name) AS Company_Name,
- dbo.ufn_Import_Trim(cad.[Description]) AS Site_Name
- INTO #Duplicate_Sites
- FROM #Company comp
- INNER JOIN Company_Address cad
- ON cad.Company_RecID = comp.Company_RecID
- GROUP BY comp.Company_Name, cad.[Description], cad.Company_RecID
- HAVING COUNT(*) > 1
- -- Strip commas and dollar signs from dollar amounts to resolve common partner error
- UPDATE #Import_Staging
- SET Billing_Amount = REPLACE(Billing_Amount, '$', ''),
- Prorate_first_bill = REPLACE(Prorate_first_bill, '$', '')
- UPDATE #Import_Staging
- SET Billing_Amount = REPLACE(Billing_Amount, ',', ''),
- Prorate_first_bill = REPLACE(Prorate_first_bill, '$', '')
- -- Pull valid numeric values into final fields
- UPDATE stag
- SET stag.PP_Amount = stag.Application_Limit
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Application_Limit + 'e0') = 1
- UPDATE stag
- SET stag.INT_Carryover_Days = stag.Carryover_Days
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Carryover_Days + '.e0') = 1
- UPDATE stag
- SET stag.INT_Overruns_Percent = stag.Overruns_Percent
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Overruns_Percent + '.e0') = 1
- UPDATE stag
- SET stag.AGR_Amount = stag.Billing_Amount
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Billing_Amount + 'e0') = 1
- UPDATE stag
- SET stag.AGR_ProRate = stag.Prorate_First_Bill
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Prorate_first_bill + 'e0') = 1
- -- Gather reference recid's needed for agreement import
- -- Get RecID's from reference tables
- UPDATE stag
- SET stag.AGR_Type_RecID = agrt.AGR_Type_RecID,
- stag.Owner_Level_RecID = loc.Owner_Level_RecID,
- stag.Billing_Unit_RecID = bu.Billing_Unit_RecID,
- stag.SR_SLA_RecID = sla.SR_SLA_RecID,
- stag.AGR_Billing_Cycle_RecID = bc.Bill_Cycle_RecID,
- stag.Tax_Code_RecID = tc.Tax_Code_RecID,
- stag.Billing_Terms_RecID = bterms.Billing_Terms_RecID,
- stag.Billing_Company_RecID = billcomp.Company_RecID,
- stag.Activity_Type_RecID = wt.Activity_Type_RecID, -- Work type/dbo.Activity_Type
- stag.Activity_Class_RecID = wr.Activity_Class_RecID, -- Work role/dbo.Activity_Class
- stag.PM_Type_RecID = pt.PM_Type_RecID,
- --stag.bl_invTemplate_Setup_RecID = invt.bl_invTemplate_RecID,
- CycleBasis_ID = CASE WHEN Cycle_Based_On = 'Contract Year' THEN 'C' WHEN Cycle_Based_On = 'Calendar Year' THEN 'Y' ELSE NULL END,
- stag.[PP_Unlimited_Flag] = CASE WHEN stag.PP_Amount = 0 THEN 1 WHEN stag.PP_Amount > 0 THEN 0 ELSE NULL END,
- stag.[PP_One_Time_Flag] = CASE WHEN [Available_Per] = 'Once' THEN 1 WHEN [Available_Per] IS NULL THEN NULL ELSE 0 END,
- 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,
- 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,
- 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,
- 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,
- stag.[PP_Carryover_Flag] = CASE WHEN INT_Carryover_Days > 0 THEN 1 WHEN INT_Carryover_Days = 0 THEN 0 ELSE NULL END,
- stag.[Overrun_Flag] = CASE WHEN INT_Overruns_Percent >= 0 THEN 1 WHEN INT_Overruns_Percent = 0 THEN 0 ELSE NULL END,
- 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,
- stag.[AGR_OneTime_Flag] = CASE WHEN Billing_Cycle = 'Once' THEN 1 WHEN Billing_Cycle IS NULL THEN NULL ELSE 0 END,
- 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,
- 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,
- stag.AGR_Detail_Type_ID = adt.AGR_Detail_Type_ID,
- stag.AGR_PONbr = CASE WHEN LEN([Purchase_Order]) < 30 THEN [Purchase_Order] ELSE NULL END,
- stag.AGR_InvDesc = [Invoice_Description],
- stag.AGR_Name = CASE WHEN LEN([Agreement_Name]) < 100 THEN [Agreement_Name] ELSE NULL END,
- stag.AppCycle_ID = acy.AppCycle_ID,
- stag.AGR_Notes = CASE WHEN LEN([Internal_Notes]) < 5000 THEN [Internal_Notes] ELSE NULL END,
- 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,
- 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,
- 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,
- 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,
- 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,
- 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,
- 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,
- 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,
- 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,
- stag.AGR_NoEnd_Flag = CASE WHEN stag.End_Date IS NULL THEN 1 ELSE 0 END
- FROM #Import_Staging stag
- LEFT OUTER JOIN dbo.AGR_Type agrt
- ON agrt.AGR_Type_Desc = stag.Agreement_Type
- LEFT OUTER JOIN #Company comp
- ON comp.Company_RecID = stag.Company_RecID
- LEFT OUTER JOIN dbo.Owner_Level loc
- ON loc.[Description] = stag.Location
- AND loc.Location_Flag = 1
- LEFT OUTER JOIN dbo.Billing_Unit bu
- ON bu.[Description] = stag.[Group]
- OR bu.Billing_Unit_ID = stag.[Group]
- LEFT OUTER JOIN SR_SLA sla
- ON sla.SLA_Name = stag.SLA
- LEFT OUTER JOIN Billing_Cycle bc
- ON bc.[Description] = stag.Billing_Cycle
- LEFT OUTER JOIN Tax_Code tc
- ON tc.Tax_Code_ID = stag.Tax_Code
- OR tc.[Description] = stag.Tax_Code
- LEFT OUTER JOIN Billing_Terms bterms
- ON bterms.[Description] = stag.Terms
- LEFT OUTER JOIN #Company billcomp
- ON billcomp.Company_Name = stag.Override_Bill_To_Company_Name
- LEFT OUTER JOIN Activity_Type wt
- ON wt.[Description] = stag.Default_Work_Type
- LEFT OUTER JOIN Activity_Class wr
- ON wr.[Description] = stag.Default_Work_Role
- LEFT OUTER JOIN PM_Type pt
- ON stag.Project_Type = pt.[Description]
- --LEFT OUTER JOIN bl_invTemplate invt
- --ON invt.Template_Name = stag.Invoice_Template
- LEFT OUTER JOIN AGR_Detail_Type adt
- ON adt.AGR_Detail_Type_Desc = stag.[Application_Unit]
- OR adt.AGR_Detail_Type_ID = stag.[Application_Limit]
- LEFT OUTER JOIN AGR_AppCycle acy
- ON acy.AppCycle_Name = stag.Available_Per
- OR acy.AppCycle_ID = stag.Available_Per
- -- Now that we have Company_RecID, get addresses & contact
- UPDATE stag
- SET stag.Company_Address_RecID = cad.Company_Address_RecID,
- stag.Billing_Address_RecID = billcad.Company_Address_RecID
- FROM #Import_Staging stag
- LEFT OUTER JOIN Company_Address cad
- ON cad.Company_RecID = stag.Company_RecID
- AND cad.[Description] = stag.Site_Name
- LEFT OUTER JOIN Company_Address billcad
- ON billcad.Company_RecID = stag.Billing_Company_RecID
- AND billcad.[Description] = stag.Override_Billing_Site_Name
- -- Default site for override billing if not specified
- UPDATE stag
- SET stag.Billing_Address_RecID = cad.Company_Address_RecID
- FROM #Import_Staging stag
- INNER JOIN Company_Address cad
- ON cad.Company_RecID = stag.Billing_Company_RecID
- AND cad.Default_Flag = 1
- WHERE stag.Override_Billing_Site_Name IS NULL
- AND stag.Billing_Company_RecID IS NOT NULL
- -- Use primary contact if not otherwise specified in spreadsheet
- UPDATE stag
- SET stag.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging stag
- INNER JOIN #Contact cont
- ON cont.Company_RecID = stag.Company_RecID
- AND cont.Default_Flag = 1
- AND stag.Contact_RecID IS NULL
- AND COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NULL
- -- Blank out application unit if 'None'
- UPDATE stag
- SET stag.AGR_Detail_Type_ID = ''
- FROM #Import_Staging stag
- WHERE stag.Application_Unit = 'None'
- -- Format dates as mm/dd/yyyy and pull into datetime columns
- UPDATE stag
- SET stag.AGR_Date_Start = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[Start_Date]), 101)
- FROM #Import_Staging stag
- WHERE ISDATE([Start_Date]) = 1
- AND ([Start_Date] LIKE('%/%/%') OR [Start_Date] LIKE('%-%-%'))
- UPDATE stag
- SET stag.AGR_Date_End = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[End_Date]), 101)
- FROM #Import_Staging stag
- WHERE ISDATE([End_Date]) = 1
- AND ([End_Date] LIKE('%/%/%') OR [End_Date] LIKE('%-%-%'))
- UPDATE stag
- SET stag.Bill_Start_Date = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[Billing_Start_Date]), 101)
- FROM #Import_Staging stag
- WHERE ISDATE([Billing_Start_Date]) = 1
- AND ([Billing_Start_Date] LIKE('%/%/%') OR [Billing_Start_Date] LIKE('%-%-%'))
- -- AGR_Billing_Cycle_RecID should be 0 if billing cycle = 'Once' (mirror PSA logic)
- UPDATE stag
- SET stag.AGR_Billing_Cycle_RecID = 0
- FROM #Import_Staging stag
- WHERE Billing_Cycle = 'Once'
- -- Validate that all required spreadsheet fields are entered
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Agreement type
- SELECT
- ExcelRowNumber,
- 'Agreement type cannot be blank'
- FROM #Import_Staging
- WHERE Agreement_Type IS NULL
- UNION ALL
- -- Agreement Name
- SELECT
- ExcelRowNumber,
- 'Agreement Name cannot be blank'
- FROM #Import_Staging
- WHERE Agreement_Name IS NULL
- UNION ALL
- -- Agreement Name Duplicate
- SELECT
- ExcelRowNumber,
- 'An agreement with this name already exists in ConnectWise for this company'
- FROM #Import_Staging stag
- INNER JOIN dbo.AGR_Header ah
- ON ah.AGR_Name = stag.AGR_Name
- AND ah.Company_RecID = stag.Company_RecID
- WHERE stag.AGR_Name IS NOT NULL
- AND stag.Company_RecID IS NOT NULL
- UNION ALL
- -- Agreement Name Duplicate
- SELECT
- MIN(stag.ExcelRowNumber),
- 'Cannot have multiple agreements with the same name for a single company'
- FROM #Import_Staging stag
- WHERE Company_RecID IS NOT NULL
- AND AGR_Name IS NOT NULL
- GROUP BY Company_RecID, AGR_Name
- HAVING COUNT(*) > 1
- UNION ALL
- -- Company Name
- SELECT
- ExcelRowNumber,
- 'Company name cannot be blank'
- FROM #Import_Staging
- WHERE Company_Name IS NULL
- UNION ALL
- -- Start Date
- SELECT
- ExcelRowNumber,
- 'Start Date cannot be blank'
- FROM #Import_Staging
- WHERE [Start_Date] IS NULL
- UNION ALL
- -- Validate that all spreadsheet cells that contain a value are valid
- -- Single field validations
- -- Agreement_Type
- SELECT
- stag.ExcelRowNumber,
- 'Agreement_Type "' + stag.Agreement_Type + '" is invalid'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Type IS NOT NULL
- AND stag.AGR_Type_RecID IS NULL
- UNION ALL
- -- Agreement_Name
- SELECT
- stag.ExcelRowNumber,
- 'Agreement_Name cannot exceed 100 characters'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Name IS NOT NULL
- AND LEN(stag.Agreement_Name) > 100
- UNION ALL
- -- Company_Name must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Company "' + stag.Company_Name + '" is invalid'
- FROM #Import_Staging stag
- WHERE stag.Company_Name IS NOT NULL
- AND stag.Company_RecID IS NULL
- UNION ALL
- -- Company_Name cannot be duplicate
- SELECT
- stag.ExcelRowNumber,
- 'There are more than one companies named "' + stag.Company_Name + '"'
- FROM #Import_Staging stag
- WHERE Company_Duplicate_Flag = 1
- UNION ALL
- -- Site_Name must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Site_Name "' + stag.Site_Name + '" is invalid for company: "' + stag.Company_Name + '"'
- FROM #Import_Staging stag
- WHERE stag.Site_Name IS NOT NULL
- AND stag.Company_Address_RecID IS NULL
- AND stag.Company_RecID IS NOT NULL
- UNION ALL
- -- Site_Name cannot be duplicate
- SELECT
- stag.ExcelRowNumber,
- 'There are more than one sites named "' + stag.Site_Name +'" for Company: "' + stag.Company_Name
- FROM #Import_Staging stag
- INNER JOIN #Duplicate_Sites dups
- ON dups.Company_RecID = stag.Company_RecID
- AND dups.Site_Name = stag.Site_Name
- WHERE stag.Company_Address_RecID IS NOT NULL
- UNION ALL
- -- Contact must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Invalid contact: "' + ISNULL(stag.Contact_First_Name + ' ', '') + ISNULL(stag.Contact_Last_Name, '') + '" for company "' + stag.Company_Name + '"'
- FROM #Import_Staging stag
- WHERE COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NOT NULL
- AND Contact_RecID IS NULL
- AND Company_RecID IS NOT NULL
- UNION ALL
- -- Contact cannot be null in spreadsheet unless a primary exists for company
- SELECT
- stag.ExcelRowNumber,
- 'A contact name must be specified because no primary contact exists for company "' + stag.Company_Name + '"'
- FROM #Import_Staging stag
- WHERE COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NULL
- AND stag.Company_RecID IS NOT NULL
- AND stag.Contact_RecID IS NULL
- UNION ALL
- -- Contact cannot be duplicate
- SELECT
- stag.ExcelRowNumber,
- 'There are more than one contacts named "' + ISNULL(stag.Contact_First_Name + ' ', '') + ISNULL(stag.Contact_Last_Name, '') +'" for Company: "' + stag.Company_Name
- FROM #Import_Staging stag
- WHERE stag.Contact_Duplicate_Flag = 1
- UNION ALL
- -- Purchase_Order
- SELECT
- stag.ExcelRowNumber,
- 'Purchase Order cannot exceed 30 characters'
- FROM #Import_Staging stag
- WHERE stag.Purchase_Order IS NOT NULL
- AND (LEN(stag.Purchase_Order) > 30 OR stag.AGR_PONbr IS NULL)
- UNION ALL
- -- Location
- SELECT
- stag.ExcelRowNumber,
- 'Invalid location: "' + stag.Location + '"'
- FROM #Import_Staging stag
- WHERE stag.Location IS NOT NULL
- AND stag.Owner_Level_RecID IS NULL
- UNION ALL
- -- Group
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Group: "' + stag.[Group]
- FROM #Import_Staging stag
- WHERE stag.[Group] IS NOT NULL
- AND stag.Billing_Unit_RecID IS NULL
- UNION ALL
- -- [Start_Date]
- SELECT
- stag.ExcelRowNumber,
- 'Start Date must be a valid date in MM/DD/YYYY format'
- FROM #Import_Staging stag
- WHERE stag.[Start_Date] IS NOT NULL
- AND stag.AGR_Date_Start IS NULL
- UNION ALL
- -- End_Date
- SELECT
- stag.ExcelRowNumber,
- 'End Date must be a valid date in MM/DD/YYYY format'
- FROM #Import_Staging stag
- WHERE stag.End_Date IS NOT NULL
- AND stag.AGR_Date_End IS NULL
- UNION ALL
- -- SLA
- SELECT
- stag.ExcelRowNumber,
- 'Invalid SLA: "' + stag.SLA + '"'
- FROM #Import_Staging stag
- WHERE stag.SLA IS NOT NULL
- AND stag.SR_SLA_RecID IS NULL
- UNION ALL
- -- Internal_Notes
- SELECT
- stag.ExcelRowNumber,
- 'Internal Notes cannot exceed 5000 characters'
- FROM #Import_Staging stag
- WHERE stag.Internal_Notes IS NOT NULL
- AND (LEN(stag.Internal_Notes) > 5000 OR AGR_Notes IS NULL)
- UNION ALL
- -- Application_Unit
- SELECT
- stag.ExcelRowNumber,
- 'Application Unit must be "Amount", "Hours", "Incidents" or "None"'
- FROM #Import_Staging stag
- WHERE stag.Application_Unit IS NOT NULL
- AND stag.AGR_Detail_Type_ID IS NULL
- UNION ALL
- -- Application_Limit
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Application Limit - field must be numeric.'
- FROM #Import_Staging stag
- WHERE stag.Application_Limit IS NOT NULL
- AND stag.PP_Amount IS NULL
- UNION ALL
- -- Available_Per
- SELECT
- stag.ExcelRowNumber,
- 'Available per must be "Once", "Contract 2 weeks", "Contract 4 weeks", "Contract Year", "Calendar Month", "Calendar Quarter","Calendar Week", "Contract Quarter", or "Calendar Year"'
- FROM #Import_Staging stag
- WHERE stag.Available_Per IS NOT NULL
- AND stag.AppCycle_ID IS NULL
- AND stag.PP_One_Time_Flag <> 1
- UNION ALL
- -- Agreement_Covers_Time
- SELECT
- stag.ExcelRowNumber,
- 'Agreement Covers Time must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Covers_Time IS NOT NULL
- AND stag.PP_Time_Flag IS NULL
- UNION ALL
- -- Agreement_Covers_Expenses
- SELECT
- stag.ExcelRowNumber,
- 'Agreement Covers Expenses must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Covers_Expenses IS NOT NULL
- AND stag.PP_Expenses_Flag IS NULL
- UNION ALL
- -- Agreement_Covers_Products
- SELECT
- stag.ExcelRowNumber,
- 'Agreement Covers Products must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Covers_Products IS NOT NULL
- AND stag.PP_Products_Flag IS NULL
- UNION ALL
- -- Agreement_Covers_Sales_Tax
- SELECT
- stag.ExcelRowNumber,
- 'Agreement Covers Sales Tax must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Covers_Sales_Tax IS NOT NULL
- AND PP_Tax_Flag IS NULL
- UNION ALL
- -- Carryover_Days
- SELECT
- stag.ExcelRowNumber,
- 'Carryover Days must be a whole number, and cannot be negative'
- FROM #Import_Staging stag
- WHERE stag.Carryover_Days IS NOT NULL
- AND (stag.INT_Carryover_Days IS NULL OR stag.INT_Carryover_Days < 0)
- UNION ALL
- -- Carryover_Days
- SELECT
- stag.ExcelRowNumber,
- 'Carryover Days cannot exceed 999999'
- FROM #Import_Staging stag
- WHERE stag.Carryover_Days IS NOT NULL
- AND stag.INT_Carryover_Days > 999999
- UNION ALL
- -- Overruns_Percent
- SELECT
- stag.ExcelRowNumber,
- 'Overruns_Percent must be a whole number between 0 and 999999'
- FROM #Import_Staging stag
- WHERE stag.Overruns_Percent IS NOT NULL
- AND (INT_Overruns_Percent IS NULL OR INT_Overruns_Percent NOT BETWEEN 0 AND 999999)
- UNION ALL
- -- Charge_adjustments_to_the_firm
- SELECT
- stag.ExcelRowNumber,
- 'Charge adjustments to the firm must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Charge_adjustments_to_the_firm IS NOT NULL
- AND stag.Charge_Firm_Flag IS NULL
- UNION ALL
- -- Billing_Cycle
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Billing Cycle: "' + stag.Billing_Cycle + '"'
- FROM #Import_Staging stag
- WHERE stag.Billing_Cycle IS NOT NULL
- AND stag.AGR_Billing_Cycle_RecID IS NULL
- UNION ALL
- -- Cycle_Based_On
- SELECT
- stag.ExcelRowNumber,
- 'Cycle Based On must be "Calendar" or "Contract"'
- FROM #Import_Staging stag
- WHERE stag.Cycle_Based_On IS NOT NULL
- AND CycleBasis_ID IS NULL
- UNION ALL
- -- Billing_Amount
- SELECT
- stag.ExcelRowNumber,
- 'Billing_Amount must be numeric'
- FROM #Import_Staging stag
- WHERE stag.Billing_Amount IS NOT NULL
- AND AGR_Amount IS NULL
- UNION ALL
- -- Taxable
- SELECT
- stag.ExcelRowNumber,
- 'Taxable must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Taxable IS NOT NULL
- AND Taxable_Flag IS NULL
- UNION ALL
- -- Prorate_first_bill
- SELECT
- stag.ExcelRowNumber,
- 'Prorate first bill amount must be numeric'
- FROM #Import_Staging stag
- WHERE stag.Prorate_first_bill IS NOT NULL
- AND AGR_ProRate IS NULL
- UNION ALL
- -- Billing_Start_date
- SELECT
- stag.ExcelRowNumber,
- 'Billing Start Date must be a valid date - Please use MM/DD/YYYY format'
- FROM #Import_Staging stag
- WHERE stag.Bill_Start_Date IS NULL
- AND stag.Billing_Start_Date IS NOT NULL
- UNION ALL
- -- Tax_Code
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Tax Code: "' + stag.Tax_Code + '"'
- FROM #Import_Staging stag
- WHERE stag.Tax_Code IS NOT NULL
- AND stag.Tax_Code_RecID IS NULL
- UNION ALL
- -- Restrict_downpayment
- SELECT
- stag.ExcelRowNumber,
- 'Restrict_downpayment must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Restrict_downpayment IS NOT NULL
- AND stag.Restrict_DP_Flag IS NULL
- UNION ALL
- -- Terms
- SELECT
- stag.ExcelRowNumber,
- 'Invalid billing terms: "' + stag.Terms + '"'
- FROM #Import_Staging stag
- WHERE stag.Terms IS NOT NULL
- AND stag.Billing_Terms_RecID IS NULL
- UNION ALL
- -- Override_Bill_To must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Override Bill To company: "' + stag.Override_Bill_To_Company_Name + '" is invalid'
- FROM #Import_Staging stag
- WHERE stag.Override_Bill_To_Company_Name IS NOT NULL
- AND stag.Billing_Company_RecID IS NULL
- UNION ALL
- -- Override_Billing_Site_Name must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Override_Billing_Site_Name: "' + stag.Override_Billing_Site_Name + '" is invalid'
- FROM #Import_Staging stag
- WHERE stag.Override_Billing_Site_Name IS NOT NULL
- AND Billing_Address_RecID IS NULL
- UNION ALL
- -- Override_Billing_Site_Name cannot be duplicate
- SELECT
- stag.ExcelRowNumber,
- 'There are more than one sites named "' + stag.Site_Name +'" for override billing company: "' + stag.Override_Bill_To_Company_Name
- FROM #Import_Staging stag
- INNER JOIN #Duplicate_Sites dups
- ON dups.Company_RecID = stag.Billing_Company_RecID
- AND dups.Site_Name = stag.Override_Billing_Site_Name
- WHERE stag.Billing_Address_RecID IS NOT NULL
- UNION ALL
- -- Invoice_Description (check that it carried across if not null)
- SELECT
- stag.ExcelRowNumber,
- 'Invoice description invalid'
- FROM #Import_Staging stag
- WHERE stag.Invoice_Description IS NOT NULL
- AND AGR_InvDesc IS NULL
- UNION ALL
- -- Default_Work_Role
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Default_Work_Role: "' + Default_Work_Role + '"'
- FROM #Import_Staging stag
- WHERE stag.Default_Work_Role IS NOT NULL
- AND stag.Activity_Class_RecID IS NULL
- UNION ALL
- -- Default_Work_Type
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Default_Work_Type: "' + Default_Work_Type + '"'
- FROM #Import_Staging stag
- WHERE stag.Default_Work_Type IS NOT NULL
- AND stag.Activity_Type_RecID IS NULL
- UNION ALL
- -- Project_Type must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Project_Type: "' + stag.Project_Type + '"'
- FROM #Import_Staging stag
- WHERE stag.Project_Type IS NOT NULL
- AND stag.PM_Type_RecID IS NULL
- --UNION ALL
- ---- Invoice_Template must be valid
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Invalid Invoice_Template: "' + stag.Invoice_Template + '"'
- --FROM #Import_Staging stag
- --WHERE stag.Invoice_Template IS NOT NULL
- -- AND stag.bl_invTemplate_RecID IS NULL
- UNION ALL
- -- Bill_Time must be B, NB, NC
- SELECT
- stag.ExcelRowNumber,
- 'Bill_Time must be "B", "NB" or "NC"'
- FROM #Import_Staging stag
- WHERE stag.Bill_Time IS NOT NULL
- AND (TE_Billable_Flag IS NULL OR TE_Invoice_Flag IS NULL)
- UNION ALL
- -- Bill_Expenses
- SELECT
- stag.ExcelRowNumber,
- 'Bill_Expenses must be "B", "NB" or "NC"'
- FROM #Import_Staging stag
- WHERE stag.Bill_Expenses IS NOT NULL
- AND (EX_Billable_Flag IS NULL OR EX_Invoice_Flag IS NULL)
- UNION ALL
- -- Bill_Products
- SELECT
- stag.ExcelRowNumber,
- 'Bill_Products must be "B", "NB" or "NC"'
- FROM #Import_Staging stag
- WHERE stag.Bill_Products IS NOT NULL
- AND (IV_Billable_Flag IS NULL OR IV_Invoice_Flag IS NULL)
- UNION ALL
- -- Invoice_Time must evaluate to Y/N
- SELECT
- stag.ExcelRowNumber,
- 'Invoice_Time must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Invoice_Time IS NOT NULL
- AND TE_InvCust_Flag IS NULL
- UNION ALL
- -- Invoice_Expenses must evaluate to Y/N
- SELECT
- stag.ExcelRowNumber,
- 'Invoice Customer Expenses must be Y or N '
- FROM #Import_Staging stag
- WHERE stag.Invoice_Expenses IS NOT NULL
- AND EX_InvCust_Flag IS NULL
- UNION ALL
- -- Invoice_Products must evaluate to Y/N
- SELECT
- stag.ExcelRowNumber,
- 'Invoice Customer Products must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Invoice_Products IS NOT NULL
- AND IV_InvCust_Flag IS NULL
- UNION ALL
- -- Cross-field validations
- -- End date cannot be before start date
- SELECT
- stag.ExcelRowNumber,
- 'End date cannot be prior to start date'
- FROM #Import_Staging stag
- WHERE AGR_Date_End IS NOT NULL
- AND AGR_Date_Start IS NOT NULL
- AND AGR_Date_End < AGR_Date_Start
- UNION ALL
- -- Group & Location must be associated
- SELECT
- stag.ExcelRowNumber,
- 'Group: "' + stag.[Group] + '" does not belong to location: "' + stag.Location + '"'
- FROM #Import_Staging stag
- LEFT OUTER JOIN dbo.Billing_Unit_Loc bul
- ON bul.Owner_Level_RecID = stag.Owner_Level_RecID
- AND bul.Billing_Unit_RecID = stag.Billing_Unit_RecID
- WHERE stag.Billing_Unit_RecID IS NOT NULL
- AND stag.Owner_Level_RecID IS NOT NULL
- AND bul.Billing_Unit_Loc_RecID IS NULL
- -- UNION ALL
- ---- Application limit required if application unit specified -- Default limit from AGR_Type???
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Application limit is required if application unit is specified - enter "0" for unlimited"'
- --FROM #Import_Staging stag
- --WHERE Application_Unit IS NOT NULL
- -- AND Application_Limit IS NULL
- -- Set up row count table to summarize results
- SELECT @start = 1
- SELECT @end = MAX(ExcelRowNumber)+1 FROM #Import_Staging
- -- If there are errors in spreadsheet, stop processing now and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- IF @ProcName = 'usp_AGR_ImportValidate'
- BEGIN
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- t.ValMsg
- FROM #ResultsCondensed t
- END
- IF @ProcName = 'usp_AGR_ImportPush'
- BEGIN
- SELECT
- 0 AS Success,
- 0 AS RowNumber,
- t.ValMsg
- FROM #ResultsCondensed t
- END
- ROLLBACK TRANSACTION AGR_Import
- RETURN
- END
- -- Set default values for fields that are only available in spreadsheet, but were not specified
- -- Prorate first bill defaults to 0 if null
- UPDATE stag
- SET stag.AGR_Prorate = 0
- FROM #Import_Staging stag
- WHERE Prorate_first_bill IS NULL
- -- Tax code defaults to company default if not specified in spreadsheet
- UPDATE stag
- SET stag.Tax_Code_RecID = comp.Tax_Code_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company comp
- ON stag.Company_RecID = comp.Company_RecID
- WHERE stag.Tax_Code_RecID IS NULL
- -- Any tax codes that are still null should use overall default from dbo.Tax_Code
- UPDATE stag
- SET stag.Tax_Code_RecID = tc.Tax_Code_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Tax_Code tc
- ON tc.Default_Flag = 1
- WHERE stag.Tax_Code_RecID IS NULL
- -- Fold in fields from Agreement Type that are not *-available-* in spreadsheet (pre-pay, employee compensation, invoice comment preferences etc.)
- UPDATE stag
- SET stag.Prepay_Flag = atype.Prepay_Flag,
- stag.Comp_Rate_Option = atype.Comp_Rate_Option,
- stag.Comp_Limit_Option = atype.Comp_Limit_Option,
- stag.Comp_Rate_Amount = atype.Comp_Rate_Amount,
- stag.Comp_Limit_Amount = atype.Comp_Limit_Amount,
- stag.TopComment_Flag = atype.TopComment_Flag,
- stag.BottomComment_Flag = atype.BottomComment_Flag,
- stag.BU_Restrict_Flag = atype.BU_Restrict_Flag,
- stag.OL_Restrict_Flag = atype.OL_Restrict_Flag
- FROM #Import_Staging stag
- INNER JOIN AGR_Type atype
- ON stag.AGR_Type_RecID = atype.AGR_Type_RecID
- -- Pull in fields from Agreement Type that are not *-specified-* in spreadsheet
- UPDATE stag
- SET stag.Owner_Level_RecID = CASE WHEN stag.Location IS NULL THEN atype.Owner_Level_RecID ELSE stag.Owner_Level_RecID END,
- stag.Billing_Unit_RecID = CASE WHEN stag.[Group] IS NULL THEN atype.Billing_Unit_RecID ELSE stag.Billing_Unit_RecID END,
- stag.SR_SLA_RecID = CASE WHEN stag.SLA IS NULL THEN atype.SR_SLA_RecID ELSE stag.SR_SLA_RecID END,
- 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,
- stag.PP_Amount = CASE WHEN stag.Application_Limit IS NULL THEN atype.PP_Amount ELSE stag.PP_Amount END,
- stag.PP_Unlimited_Flag = CASE WHEN stag.Application_Limit IS NULL THEN atype.PP_Unlimited_Flag ELSE stag.PP_Unlimited_Flag END,
- stag.AppCycle_ID = CASE WHEN stag.Available_Per IS NULL THEN atype.AppCycle_ID ELSE stag.AppCycle_ID END,
- stag.AGR_Billing_Cycle_RecID = CASE WHEN stag.Billing_Cycle IS NULL THEN atype.Bill_Cycle_RecID ELSE stag.AGR_Billing_Cycle_RecID END,
- stag.AGR_OneTime_Flag = CASE WHEN stag.AGR_OneTime_Flag IS NULL THEN atype.OneTime_Flag ELSE stag.AGR_OneTime_Flag END,
- stag.PP_Time_Flag = CASE WHEN stag.Agreement_Covers_Time IS NULL THEN atype.PP_Time_Flag ELSE stag.PP_Time_Flag END,
- stag.PP_Products_Flag = CASE WHEN stag.Agreement_Covers_Products IS NULL THEN atype.PP_Products_Flag ELSE stag.PP_Products_Flag END,
- stag.PP_Expenses_Flag = CASE WHEN stag.Agreement_Covers_Expenses IS NULL THEN atype.PP_Expenses_Flag ELSE stag.PP_Expenses_Flag END,
- stag.PP_Tax_Flag = CASE WHEN stag.Agreement_Covers_Sales_Tax IS NULL THEN atype.PP_Tax_Flag ELSE stag.PP_Tax_Flag END,
- stag.PP_Carryover_Flag = CASE WHEN stag.PP_Carryover_Flag IS NULL THEN atype.PP_Carryover_Flag ELSE stag.PP_Carryover_Flag END,
- stag.INT_Carryover_Days = CASE WHEN stag.Carryover_Days IS NULL THEN atype.Carryover_Days ELSE stag.Carryover_Days END,
- stag.Overrun_Flag = CASE WHEN stag.Overruns_Percent IS NULL THEN atype.Overrun_Flag ELSE stag.Overrun_Flag END,
- stag.INT_Overruns_Percent = CASE WHEN stag.Overruns_Percent IS NULL THEN atype.Overrun_Limit ELSE stag.INT_Overruns_Percent END, ------- verify
- 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,
- 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,
- stag.CycleBasis_ID = CASE WHEN stag.Cycle_Based_On IS NULL THEN atype.CycleBasis_ID ELSE stag.CycleBasis_ID END,
- stag.AGR_Amount = CASE WHEN stag.AGR_Amount IS NULL THEN atype.Bill_Amount ELSE stag.AGR_Amount END,
- stag.Taxable_Flag = CASE WHEN stag.Taxable_Flag IS NULL THEN atype.Taxable_Flag ELSE stag.Taxable_Flag END,
- stag.Restrict_DP_Flag = CASE WHEN stag.Restrict_downpayment IS NULL THEN atype.Restrict_DP_Flag ELSE stag.Restrict_DP_Flag END,
- stag.Billing_Terms_RecID = CASE WHEN stag.Billing_Terms_RecID IS NULL THEN atype.Billing_Terms_RecID ELSE stag.Billing_Terms_RecID END,
- stag.AGR_InvDesc = CASE WHEN stag.AGR_InvDesc IS NULL THEN atype.Invoice_Desc ELSE stag.AGR_InvDesc END,
- stag.Activity_Class_RecID = CASE WHEN stag.Activity_Class_RecID IS NULL THEN atype.Activity_Class_RecID ELSE stag.Activity_Class_RecID END,
- stag.Activity_Type_RecID = CASE WHEN stag.Activity_Type_RecID IS NULL THEN atype.Activity_Type_RecID ELSE stag.Activity_Type_RecID END,
- stag.PM_Type_RecID = CASE WHEN stag.PM_Type_RecID IS NULL THEN atype.PM_Type_RecID ELSE stag.PM_Type_RecID END,
- 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,
- stag.TE_Billable_Flag = CASE WHEN stag.TE_Billable_Flag IS NULL THEN atype.TE_Billable_Flag ELSE stag.TE_Billable_Flag END,
- stag.EX_Billable_Flag = CASE WHEN stag.EX_Billable_Flag IS NULL THEN atype.EX_Billable_Flag ELSE stag.EX_Billable_Flag END,
- stag.IV_Billable_Flag = CASE WHEN stag.IV_Billable_Flag IS NULL THEN atype.IV_Billable_Flag ELSE stag.IV_Billable_Flag END,
- stag.TE_Invoice_Flag = CASE WHEN stag.TE_Invoice_Flag IS NULL THEN atype.TE_Invoice_Flag ELSE stag.TE_Invoice_Flag END,
- stag.EX_Invoice_Flag = CASE WHEN stag.EX_Invoice_Flag IS NULL THEN atype.EX_Invoice_Flag ELSE stag.EX_Invoice_Flag END,
- stag.IV_Invoice_Flag = CASE WHEN stag.IV_Invoice_Flag IS NULL THEN atype.IV_Invoice_Flag ELSE stag.IV_Invoice_Flag END,
- stag.TE_InvCust_Flag = CASE WHEN stag.TE_InvCust_Flag IS NULL THEN atype.TE_InvCust_Flag ELSE stag.TE_InvCust_Flag END,
- stag.EX_InvCust_Flag = CASE WHEN stag.EX_InvCust_Flag IS NULL THEN atype.EX_InvCust_Flag ELSE stag.EX_InvCust_Flag END,
- stag.IV_InvCust_Flag = CASE WHEN stag.IV_InvCust_Flag IS NULL THEN atype.IV_InvCust_Flag ELSE stag.IV_InvCust_Flag END
- FROM #Import_Staging stag
- INNER JOIN AGR_Type atype
- ON stag.AGR_Type_RecID = atype.AGR_Type_RecID
- LEFT OUTER JOIN AGR_Detail_Type adtype
- ON adtype.AGR_Detail_Type_RecID = atype.AGR_Detail_Type_RecID
- UPDATE stag
- SET stag.PM_Type_RecID = pmt.PM_Type_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 PM_Type_RecID FROM PM_Type pmt WHERE pmt.Default_Flag = 1)pmt
- WHERE stag.PM_Type_RecID IS NULL
- -- Handle instance where PP_Unlimited_Flag is never set (i.e. no application unit)
- UPDATE #Import_Staging
- SET PP_Unlimited_Flag = 0
- WHERE PP_Unlimited_Flag IS NULL
- -- If application unit is hours, agreement should cover time
- UPDATE #Import_Staging
- SET PP_Time_Flag = 1
- WHERE AGR_Detail_Type_ID = 'H'
- -- Final validations to make sure that combined values from spreadsheet and agreement type create a valid agreement
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Agreement must have a valid location
- SELECT
- stag.ExcelRowNumber,
- 'A location must be specified in either the spreadsheet or the agreement type'
- FROM #Import_Staging stag
- WHERE stag.Owner_Level_RecID IS NULL
- OR stag.Owner_Level_RecID = 0
- UNION ALL
- -- Agreement must have a valid group/billing unit
- SELECT
- stag.ExcelRowNumber,
- 'A group must be specified in either the spreadsheet or the agreement type'
- FROM #Import_Staging stag
- WHERE stag.Billing_Unit_RecID IS NULL
- OR stag.Billing_Unit_RecID = 0
- UNION ALL
- -- If agreement has an application unit (Amount, Hours, Incidents) - it must have an application limit
- SELECT
- stag.ExcelRowNumber,
- 'Application limit must be specified unless application unit is "None"'
- FROM #Import_Staging stag
- WHERE stag.PP_Amount IS NULL
- AND stag.AGR_Detail_Type_ID <> ''
- UNION ALL
- -- If agreement has an application unit (Amount, Hours, Incidents) - it must have an application cycle
- SELECT
- stag.ExcelRowNumber,
- 'If the agreement has an application unit, "Available Per" must be specified in either the Agreement Type or Spreadsheet'
- FROM #Import_Staging stag
- WHERE (stag.AppCycle_ID IS NULL OR stag.AppCycle_ID = '')
- AND stag.AGR_Detail_Type_ID <> ''
- AND stag.PP_One_Time_Flag <> '1'
- UNION ALL
- SELECT
- stag.ExcelRowNumber,
- 'If agreement covers sales tax, application units must be set to "Amount"'
- FROM #Import_Staging stag
- WHERE PP_Tax_Flag = 1
- AND AGR_Detail_Type_ID <> 'A'
- --UNION ALL
- ---- Default Work role must belong to location
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Default work role "' + ac.[Description] + '" does not belong to location: "' + loc.[Description] + '"'
- --FROM #Import_Staging stag
- -- INNER JOIN dbo.Activity_Class ac
- -- ON ac.Activity_Class_RecID = stag.Activity_Class_RecID
- -- INNER JOIN dbo.Owner_Level loc
- -- ON loc.Owner_Level_RecID = stag.Owner_Level_RecID
- -- LEFT OUTER JOIN dbo.Activity_Class_Loc acl
- -- ON acl.Activity_Class_RecID = ac.Activity_Class_RecID
- -- AND acl.Owner_Level_RecID = stag.Owner_Level_RecID
- --WHERE acl.Activity_Class_Loc_RecID IS NULL
- --UNION ALL
- ---- Copied work roles must belong to location
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Unable to copy work role "' + ac.[Description] + '" from agreement type "' + stag.Agreement_Type + '" because the work role is not assigned to location: "' + loc.[Description] + '"'
- --FROM #Import_Staging stag
- -- INNER JOIN AGR_Type aty
- -- ON aty.AGR_Type_RecID = stag.AGR_Type_RecID
- -- INNER JOIN AGR_Type_WRole atw
- -- ON atw.AGR_Type_RecID = aty.AGR_Type_RecID
- -- INNER JOIN dbo.Activity_Class ac
- -- ON ac.Activity_Class_RecID = atw.Activity_Class_RecID
- -- INNER JOIN dbo.Owner_Level loc
- -- ON loc.Owner_Level_RecID = stag.Owner_Level_RecID
- -- LEFT OUTER JOIN dbo.Activity_Class_Loc acl
- -- ON acl.Activity_Class_RecID = ac.Activity_Class_RecID
- -- AND acl.Owner_Level_RecID = stag.Owner_Level_RecID
- --WHERE acl.Activity_Class_Loc_RecID IS NULL
- -- If running push procedure, perform final inserts
- IF @ProcName = 'usp_AGR_ImportPUsh' AND NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- -- AGR_Header insert
- -- Temporarily repurpose PP_Billing_Cycle_RecID to store excel row number
- INSERT INTO dbo.AGR_Header
- (
- AGR_Type_RecID,
- AGR_Name,
- AGR_Date_Start,
- AGR_Date_End,
- AGR_NoEnd_Flag,
- AGR_Billing_Cycle_RecID,
- AGR_OneTime_Flag,
- AGR_Amount,
- AGR_Calc_Flag,
- AGR_Prorate,
- AGR_InvDesc,
- Company_RecID,
- Contact_RecID,
- AGR_PONbr,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- OL_Restrict_Flag,
- BU_Restrict_Flag,
- SubCompany_RecID,
- SubContact_RecID,
- Sub_WONbr,
- AGR_Cancel_Flag,
- AGR_Date_Cancel,
- AGR_Reason_Cancel,
- AGR_Cancel_By,
- PP_Billing_Cycle_RecID,
- PP_One_Time_Flag,
- AGR_Detail_Type_ID,
- PP_Amount,
- PP_Carryover_Flag,
- PP_Time_Flag,
- PP_Expenses_Flag,
- PP_Products_Flag,
- AGR_Notes,
- AGR_Default_Flag,
- Activity_Class_RecID,
- Activity_Type_RecID,
- SR_Urgency_RecID,
- PM_Type_RecID,
- TE_Billable_Flag,
- TE_Invoice_Flag,
- EX_Billable_Flag,
- EX_Invoice_Flag,
- IV_Billable_Flag,
- IV_Invoice_Flag,
- PP_Adjustment,
- Last_Update,
- Updated_By,
- SR_Type_RecID,
- TopComment_Flag,
- BottomComment_Flag,
- Carryover_ID,
- AppCycle_ID,
- Overrun_Flag,
- BillPeriod_ID,
- CycleBasis_ID,
- Taxable_Flag,
- Tax_Code_RecID,
- TE_Amount,
- TE_UseBill_Flag,
- TE_InvCust_Flag,
- EX_InvCust_Flag,
- IV_InvCust_Flag,
- PP_Unlimited_Flag,
- BR_Option,
- Bill_Start_Date,
- CarryOver_Days,
- Overrun_Limit,
- PP_Expire_Flag,
- Notification_History,
- Charge_Firm_Flag,
- SR_SLA_RecID,
- PP_Tax_Flag,
- NetBalance,
- Overrun,
- Billing_Company_RecID,
- Billing_Address_RecID,
- Restrict_DP_Flag,
- Billing_Terms_RecID,
- TE_AmtOption,
- TE_UseRate_Flag,
- TE_UseAmt_Flag,
- bl_invTemplate_Setup_RecID,
- Avail_Balance,
- parent_recid,
- Comp_Rate_Option,
- Comp_Limit_Option,
- Comp_Rate_Amount,
- Comp_Limit_Amount
- )
- SELECT
- AGR_Type_RecID,
- AGR_Name,
- AGR_Date_Start,
- AGR_Date_End,
- AGR_NoEnd_Flag,
- AGR_Billing_Cycle_RecID,
- AGR_OneTime_Flag,
- AGR_Amount,
- 0 AS AGR_Calc_Flag,
- AGR_Prorate,
- AGR_InvDesc,
- Company_RecID,
- Contact_RecID,
- AGR_PONbr,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- OL_Restrict_Flag,
- BU_Restrict_Flag,
- 0 AS SubCompany_RecID,
- 0 AS SubContact_RecID,
- NULL AS Sub_WONbr,
- 0 AS AGR_Cancel_Flag,
- NULL AS AGR_Date_Cancel,
- NULL AS AGR_Reason_Cancel,
- 0 AS AGR_Cancel_By,
- [ExcelRowNumber] AS PP_Billing_Cycle_RecID,
- PP_One_Time_Flag,
- AGR_Detail_Type_ID,
- PP_Amount,
- PP_Carryover_Flag,
- PP_Time_Flag,
- PP_Expenses_Flag,
- PP_Products_Flag,
- AGR_Notes,
- 0 AS AGR_Default_Flag,
- Activity_Class_RecID,
- Activity_Type_RecID,
- NULL AS SR_Urgency_RecID,
- NULL,
- TE_Billable_Flag,
- TE_Invoice_Flag,
- EX_Billable_Flag,
- EX_Invoice_Flag,
- IV_Billable_Flag,
- IV_Invoice_Flag,
- '0.00' AS PP_Adjustment,
- GETDATE() AS Last_Update,
- @ImportBatchUser AS Updated_By,
- 0 AS SR_Type_RecID,
- TopComment_Flag,
- BottomComment_Flag,
- '' AS Carryover_ID,
- AppCycle_ID,
- Overrun_Flag,
- '' AS BillPeriod_ID,
- CycleBasis_ID,
- Taxable_Flag,
- Tax_Code_RecID,
- NULL AS TE_Amount,
- 0 AS TE_UseBill_Flag,
- TE_InvCust_Flag,
- EX_InvCust_Flag,
- IV_InvCust_Flag,
- PP_Unlimited_Flag,
- 'W' AS BR_Option,
- Bill_Start_Date,
- CarryOver_Days,
- INT_Overruns_Percent,
- ISNULL(PP_Expire_Flag, 0),
- ',' AS Notification_History,
- Charge_Firm_Flag,
- SR_SLA_RecID,
- PP_Tax_Flag,
- '0.00' AS NetBalance,
- '0.00' AS Overrun,
- Billing_Company_RecID,
- Billing_Address_RecID,
- Restrict_DP_Flag,
- Billing_Terms_RecID,
- NULL AS TE_AmtOption,
- '0' AS TE_UseRate_Flag,
- '0' AS TE_UseAmt_Flag,
- bl_invTemplate_Setup_RecID,
- NULL AS Avail_Balance,
- NULL AS parent_recid,
- Comp_Rate_Option,
- Comp_Limit_Option,
- Comp_Rate_Amount,
- Comp_Limit_Amount
- FROM #Import_Staging
- -- Join AGR_Header back to staging table to capture identity for new rows
- UPDATE stag
- SET stag.AGR_Header_RecID = agr.AGR_Header_RecID
- FROM #Import_Staging stag
- INNER JOIN AGR_Header agr
- ON stag.ExcelRowNumber = agr.PP_Billing_Cycle_RecID
- AND agr.Updated_By = @ImportBatchUser
- -- Set PP_Billing_Cycle_RecID to 0
- UPDATE agr
- SET agr.PP_Billing_Cycle_RecID = 0
- FROM AGR_Header agr
- WHERE Updated_By = @ImportBatchUser
- -- Error if any row was not inserted (identity not populated)
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE AGR_Header_RecID IS NULL)
- BEGIN
- 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)
- SELECT * FROM #Import_Staging
- END
- -- AGR_Site Insert
- INSERT INTO AGR_Site
- (
- AGR_Header_RecID,
- Company_Address_Recid,
- Last_Update,
- Updated_By,
- Company_RecID
- )
- SELECT
- AGR_Header_RecID,
- Company_Address_RecID,
- GETDATE(),
- @ImportBatchUser,
- Company_RecID
- FROM #Import_Staging stag
- WHERE stag.Company_Address_RecID IS NOT NULL
- -- Copy exclusions from AGR_Type_Exclusion to AGR_Exclusion
- INSERT INTO AGR_Exclusion
- (
- AGR_Header_RecID,
- Activity_Type_RecID,
- Activity_Class_RecID,
- Updated_By,
- Last_Update
- )
- SELECT
- stag.AGR_Header_RecID,
- ate.Activity_Type_RecID,
- ate.Activity_Class_RecID,
- @ImportBatchUser,
- GETDATE()
- FROM #Import_Staging stag
- INNER JOIN dbo.AGR_Type_Exclusion ate
- ON ate.AGR_Type_RecID = stag.AGR_Type_RecID
- -- Copy defaults from AGR_Type_Default to AGR_Default
- INSERT INTO AGR_Default
- (
- AGR_Header_RecID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- SR_Board_RecID,
- SR_Type_RecID,
- Default_Flag,
- Last_Update,
- Updated_By
- )
- SELECT
- stag.AGR_Header_RecID,
- atd.Owner_Level_RecID,
- atd.Billing_Unit_RecID,
- atd.SR_Board_RecID,
- atd.SR_Type_RecID,
- atd.Default_Flag,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging stag
- INNER JOIN AGR_Type_Default atd
- ON atd.AGR_Type_RecID = stag.AGR_Type_RecID
- -- Copy work roles to dbo.Company_Billing_Rate from dbo.AGR_Type_WRole
- -- For agreement types where Copy_Work_Roles_Flag = 1
- INSERT INTO dbo.Company_Billing_Rate
- (
- Owner_ID,
- Company_RecID,
- Date_Effective,
- Last_Update,
- Updated_By,
- Date_Ending,
- Rate_Type,
- Activity_Class_RecID,
- BR_Option,
- Owner_Level_RecID
- )
- SELECT
- 1,
- stag.Company_RecID,
- wrl.Date_Effective,
- GETDATE(),
- @ImportBatchUser,
- wrl.Date_Ending,
- wrl.Rate_Type,
- wrl.Activity_Class_RecID,
- 'W',
- NULL
- FROM #Import_Staging stag
- INNER JOIN AGR_Type aty
- ON stag.AGR_Type_RecID = aty.AGR_Type_RecID
- INNER JOIN AGR_Type_WRole wrl
- ON wrl.AGR_Type_RecID = aty.AGR_Type_RecID
- WHERE aty.Copy_Work_Roles_Flag = 1
- -- Copy work types to dbo.Company_Activity_Type from dbo.AGR_Type_WType
- -- For agreement types where Copy_Work_Types_Flag = 1
- INSERT INTO dbo.Company_Activity_Type
- (
- Owner_ID,
- Company_RecID,
- Hours_Min,
- Rate_Type,
- Rate,
- Inactive_Flag,
- Last_Update,
- Updated_By,
- Hours_Max,
- Billable_Flag,
- Activity_Type_RecID,
- AGR_Header_RecID,
- Owner_Level_RecID,
- Date_Effective,
- Date_Ending,
- Company_Address_RecID,
- Entered_By
- )
- SELECT
- 1,
- stag.Company_RecID,
- atw.Hours_Min,
- atw.Rate_Type,
- atw.Rate,
- 0,
- GETDATE(),
- @ImportBatchUser,
- atw.Hours_Max,
- 1,
- atw.Activity_Type_RecID,
- stag.AGR_Header_RecID,
- NULL,
- atw.Date_Effective,
- atw.Date_Ending,
- NULL,
- 'Import'
- FROM #Import_Staging stag
- INNER JOIN AGR_Type aty
- ON aty.AGR_Type_RecID = stag.AGR_Type_RecID
- INNER JOIN AGR_Type_WType atw
- ON atw.AGR_Type_RecID = aty.AGR_Type_RecID
- WHERE aty.Copy_Work_Types_Flag = 1
- COMMIT TRANSACTION AGR_Import
- SELECT
- 1 AS Success,
- NULL AS RowNumber,
- NULL AS ValMsg
- RETURN
- END
- -- Condense row numbers to return one line per unique validation message
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- IF @ProcName = 'usp_AGR_ImportValidate'
- BEGIN
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- t.ValMsg + ' on row(s): ' + STUFF((SELECT ', ' + CONVERT(NVARCHAR(50), RowNumber) AS ValMsg
- FROM #ResultsCondensed
- WHERE ValMsg = t.ValMsg
- FOR XML PATH(''), TYPE
- ).value('.', 'varchar(max)'), 1, 2, '') AS ValMsg
- FROM #ResultsCondensed t
- GROUP BY t.ValMsg
- END
- IF @ProcName = 'usp_AGR_ImportPush'
- BEGIN
- SELECT
- 0 AS Success,
- 0 AS RowNumber,
- t.ValMsg + ' on row(s): ' + STUFF((SELECT ', ' + CONVERT(NVARCHAR(50), RowNumber) AS ValMsg
- FROM #ResultsCondensed
- WHERE ValMsg = t.ValMsg
- FOR XML PATH(''), TYPE
- ).value('.', 'varchar(max)'), 1, 2, '') AS ValMsg
- FROM #ResultsCondensed t
- GROUP BY t.ValMsg
- END
- END
- ELSE
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
- BEGIN
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- 'The following ' + ReferenceType + ' will be created: '+
- STUFF(
- (SELECT ', ' + ValMsg
- FROM #tblResults
- WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
- FOR XML PATH (''))
- , 1, 1, '') AS ValMsg
- FROM #tblResults res
- GROUP BY ReferenceType
- END
- ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS ValMsg
- END
- ROLLBACK TRANSACTION AGR_Import
- END TRY
- BEGIN CATCH
- -- Return error information and rollback transaction
- SELECT
- 0 AS Success,
- ERROR_LINE() AS ExcelRowNumber,
- ERROR_MESSAGE() AS ErrorDetails
- ROLLBACK TRANSACTION AGR_Import
- END CATCH
- GO
- -- =============================================
- -- Author: m.gray
- -- Create date: 10/04/2013
- -- Description: Validates data for Agreements import
- -- Sample call: EXEC usp_AGR_ImportPush 'TMP_Import_4992de3f325c4a2d8f575608b7dc2801', 1
- -- =============================================
- ALTER PROCEDURE [dbo].[usp_AGR_ImportPush]
- @TableName VARCHAR(255),
- @ForceMode BIT = 0
- AS
- BEGIN TRY
- BEGIN TRANSACTION AGR_Import
- SET NOCOUNT ON
- -- Variable declaration
- -- To keep validation/push logic consistent, validation/insert procs are identical - Final insert runs only on usp_AGR_ImportPush
- -- Capture proc name to drive validate vs. commit logic
- DECLARE @ProcName NVARCHAR(50)
- SELECT @ProcName = OBJECT_NAME(@@ProcID)
- -- Row counters for summary results
- DECLARE @start INT
- DECLARE @end INT
- -- Dynamic statement to insert to staging table
- DECLARE @DSQL VARCHAR(MAX)
- -- Fully qualified name of source table
- DECLARE @SourceTable VARCHAR(300)
- SELECT @SourceTable = 'tempdb.dbo.' + @TableName
- -- Object_ID of source table
- DECLARE @Source_Object_ID INT
- SELECT @Source_Object_ID = OBJECT_ID FROM tempdb.sys.tables WHERE Name = @TableName
- DECLARE
- @ImportBatchUser VARCHAR(15) -- Unique value to identify records created by this import
- -- Populate @ImportBatchUser with a value according to the current time - used for Entered_By/Updated_By fields
- SELECT @ImportBatchUser =
- 'CONV_'
- + CONVERT(VARCHAR(2), DATEPART(Month, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(Day, GETDATE()))
- + '-' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE()))
- + CONVERT(VARCHAR(2), DATEPART(MINUTE, GETDATE()))
- IF OBJECT_ID('tempdb..#tblResults') IS NOT NULL
- BEGIN
- DROP TABLE #tblResults
- END
- -- Table to hold results of procedure
- CREATE TABLE #tblResults
- (
- RowNumber INT,
- ValMsg VARCHAR(750),
- InvalidReason VARCHAR(MAX),
- ReferenceType VARCHAR(MAX),
- Warning_Flag BIT DEFAULT 0
- )
- CREATE INDEX IX_Results_Cover ON #tblResults(RowNumber, ValMsg)
- -- Table to hold condensed summary results
- IF OBJECT_ID('tempdb..#ResultsCondensed') IS NOT NULL
- BEGIN
- DROP TABLE #ResultsCondensed
- END
- CREATE TABLE #ResultsCondensed
- (
- RowNumber NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- ValMsg NVARCHAR(MAX) COLLATE DATABASE_DEFAULT
- )
- -- Table to hold source data for this batch from temp table
- IF OBJECT_ID('tempdb.dbo.#Import_Staging') IS NOT NULL
- BEGIN
- DROP TABLE #Import_Staging
- END
- CREATE TABLE #Import_Staging
- (
- ExcelRowNumber INT,
- -- Fields appearing on spreadsheet
- Agreement_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Company_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- [Start_Date] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Billing_Start_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- End_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Site_Name NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Contact_First_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Contact_Last_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Purchase_Order nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Location nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- [Group] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- SLA nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Internal_Notes nvarchar(max) COLLATE DATABASE_DEFAULT NULL,
- Application_Unit nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Application_Limit nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Available_Per nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Covers_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Covers_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Covers_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Agreement_Covers_Sales_Tax nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Carryover_Days nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Overruns_Percent nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Charge_adjustments_to_the_firm nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Billing_Cycle nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Cycle_Based_On nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Billing_Amount nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Taxable nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Prorate_first_bill nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Tax_Code nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Restrict_downpayment nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Terms nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Override_Bill_To_Company_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Override_Billing_Site_Name nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Description nvarchar(MAX) COLLATE DATABASE_DEFAULT NULL,
- Default_Work_Role nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Default_Work_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Project_Type nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Template nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Bill_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Bill_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Bill_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Time nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Expenses nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- Invoice_Products nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- -- Fields derived from others on spreadsheet
- No_Ending_Date nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- [Unlimited] nvarchar(255) COLLATE DATABASE_DEFAULT NULL,
- -- Fields always defaulted from Agreement Type
- TopComment_Flag NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- BottomComment_Flag NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Prepay_Flag BIT NULL,
- Comp_Rate_Option NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Comp_Limit_Option NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Comp_Rate_Amount NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- Comp_Limit_Amount NVARCHAR(255) COLLATE DATABASE_DEFAULT NULL,
- -- Reference RecID's/Fields used for final inserts
- AGR_Type_RecID INT NULL,
- AGR_Detail_Type_RecID INT NULL,
- Company_RecID INT NULL,
- Company_Address_RecID INT NULL,
- Contact_RecID INT NULL,
- Owner_Level_RecID INT NULL,
- Billing_Unit_RecID INT NULL,
- SR_SLA_RecID INT NULL,
- Tax_Code_RecID INT NULL,
- Billing_Terms_RecID INT NULL,
- Billing_Company_RecID INT NULL,
- Billing_Address_RecID INT NULL,
- Activity_Type_RecID INT NULL, -- Work type
- Activity_Class_RecID INT NULL, -- Work role
- PM_Type_RecID INT,
- AGR_Billing_Cycle_RecID INT NULL,
- bl_invTemplate_Setup_RecID INT NULL, -- Invoice template
- DT_Start_Date DATETIME NULL,
- DT_End_Date DATETIME NULL,
- DT_Billing_Start_Date DATETIME NULL,
- INT_Carryover_Days INT NULL,
- INT_Overruns_Percent INT NULL,
- OL_Restrict_Flag BIT NULL,
- BU_Restrict_Flag BIT NULL,
- PP_Amount DECIMAL(18, 2) NULL,
- PP_Unlimited_Flag BIT NULL,
- AppCycle_ID CHAR(1) COLLATE DATABASE_DEFAULT NULL,
- AGR_OneTime_Flag BIT NULL,
- PP_Time_Flag BIT NULL,
- PP_Products_Flag BIT NULL,
- PP_Carryover_Flag BIT NULL,
- Overrun_Flag BIT NULL,
- Overrun_Limit INT NULL,
- Charge_Firm_Flag BIT NULL,
- PP_One_Time_Flag BIT NULL,
- PP_Tax_Flag BIT NULL,
- CycleBasis_ID CHAR(1) COLLATE DATABASE_DEFAULT NULL,
- PP_Expire_Flag BIT NULL,
- PP_Expenses_Flag BIT NULL,
- Taxable_Flag BIT NULL,
- Restrict_DP_Flag BIT NULL,
- TE_Invoice_Flag BIT NULL,
- TE_Billable_Flag BIT NULL,
- EX_Invoice_Flag BIT NULL,
- EX_Billable_Flag BIT NULL,
- IV_Invoice_Flag BIT NULL,
- IV_Billable_Flag BIT NULL,
- AGR_Date_Start DATETIME,
- AGR_Date_End DATETIME,
- Bill_Start_Date DATETIME,
- AGR_Detail_Type_ID VARCHAR(1) COLLATE DATABASE_DEFAULT NULL,
- AGR_PONbr NVARCHAR(30) COLLATE DATABASE_DEFAULT NULL,
- AGR_InvDesc NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- AGR_Name NVARCHAR(100) COLLATE DATABASE_DEFAULT NULL,
- AGR_Amount DECIMAL(18,2) NULL,
- AGR_ProRate DECIMAL(18,2) NULL,
- AGR_Notes VARCHAR(5000) COLLATE DATABASE_DEFAULT NULL,
- TE_InvCust_Flag BIT NULL,
- EX_InvCust_Flag BIT NULL,
- IV_InvCust_Flag BIT NULL,
- AGR_NoEnd_Flag BIT NULL,
- AGR_Header_RecID INT NULL,
- ContactName NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Stripped NVARCHAR(MAX) COLLATE DATABASE_DEFAULT NULL,
- Company_Name_Fuzzy NVARCHAR(50) COLLATE DATABASE_DEFAULT NULL,
- Company_Duplicate_Flag BIT NULL,
- Contact_Duplicate_Flag BIT NULL,
- Contact_Name_Fuzzy NVARCHAR(61),
- Company_Match_Val NVARCHAR(3),
- Legacy_Company_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Legacy_Contact_ID NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- Diff_Exclude_Flag BIT,
- Duplicate_Flag BIT,
- Currency_RecID INT
- )
- -- Create & populate table variable with list of required columns
- DECLARE @RequiredColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @RequiredColumns
- (
- ColumnName
- )
- SELECT 'Agreement Type' UNION ALL
- SELECT 'Agreement Name' UNION ALL
- SELECT 'Company Name' UNION ALL
- SELECT 'Start Date' UNION ALL
- SELECT 'Billing Start Date'
- -- Create & populate table variable with list of optional columns
- DECLARE @OptionalColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- INSERT INTO @OptionalColumns
- (
- ColumnName
- )
- SELECT 'Contact First Name' UNION ALL
- SELECT 'Contact Last Name' UNION ALL
- SELECT 'Purchase Order' UNION ALL
- SELECT 'Location' UNION ALL
- SELECT 'Group' UNION ALL
- SELECT 'End Date' UNION ALL
- SELECT 'SLA' UNION ALL
- SELECT 'Internal Notes' UNION ALL
- SELECT 'Application Unit' UNION ALL
- SELECT 'Application Limit' UNION ALL
- SELECT 'Available Per' UNION ALL
- SELECT 'Agreement Covers Time' UNION ALL
- SELECT 'Agreement Covers Expenses' UNION ALL
- SELECT 'Agreement Covers Products' UNION ALL
- SELECT 'Agreement Covers Sales Tax' UNION ALL
- SELECT 'Carryover Days' UNION ALL
- SELECT 'Overruns Percent' UNION ALL
- SELECT 'Charge adjustments to the firm' UNION ALL
- SELECT 'Billing Cycle' UNION ALL
- SELECT 'Cycle Based On' UNION ALL
- SELECT 'Billing Amount' UNION ALL
- SELECT 'Taxable' UNION ALL
- SELECT 'Prorate first bill' UNION ALL
- SELECT 'Tax Code' UNION ALL
- SELECT 'Restrict Downpayment' UNION ALL
- SELECT 'Billing Terms' UNION ALL
- SELECT 'Override Bill To Company Name' UNION ALL
- SELECT 'Override Billing Site Name' UNION ALL
- SELECT 'Invoice Description' UNION ALL
- SELECT 'Default Work Role' UNION ALL
- SELECT 'Default Work Type' UNION ALL
- SELECT 'Project Type' UNION ALL
- SELECT 'Invoice Template' UNION ALL
- SELECT 'Bill Time' UNION ALL
- SELECT 'Bill Expenses' UNION ALL
- SELECT 'Bill Products' UNION ALL
- SELECT 'Invoice Time' UNION ALL
- SELECT 'Invoice Expenses' UNION ALL
- SELECT 'Invoice Products' UNION ALL
- SELECT 'Site Name'
- -- Table variable to hold column names from source table
- DECLARE @SourceColumns TABLE
- (
- ColumnName VARCHAR(255)
- )
- -- Populate @SourceColumns
- INSERT INTO @SourceColumns
- (
- ColumnName
- )
- SELECT
- name
- FROM tempdb.sys.Columns WHERE object_ID = @Source_Object_ID
- -- Check that all required columns exist in @SourceColumns
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- SELECT
- 0,
- 'Column: "' + rq.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @RequiredColumns rq
- EXCEPT
- SELECT
- 0,
- 'Column: "' + sc.ColumnName + '" does not exist. Cannot proceed with import'
- FROM @SourceColumns sc
- -- If a required column is missing, stop here and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 0 AS ValPassed,
- RowNumber,
- ValMsg
- FROM #tblResults
- ORDER BY RowNumber, ValMsg
- ROLLBACK TRANSACTION AGR_Import
- RETURN
- END
- -- Pull sys columns information for tempdb into temp table
- -- This is necessary to join to sys columns data without experiencing collation errors in the event that tempdb collation differs from database_default
- IF OBJECT_ID('tempdb..#sysColumns') IS NOT NULL
- BEGIN
- DROP TABLE #sysColumns
- END
- SELECT *
- INTO #sysColumns
- FROM tempdb.sys.columns
- -- Add any optional spreadsheet columns to source table to sidestep table structure errors later on
- -- Use dynamic SQL to only add columns that are missing
- 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)
- BEGIN
- SELECT @DSQL = 'ALTER TABLE ' + @SourceTable + '
- ADD '
- SELECT @DSQL = @DSQL + QUOTENAME(ColumnName) + ' NVARCHAR(MAX) COLLATE DATABASE_DEFAULT,
- '
- 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
- END
- -- Remove last comma from @DSQL to correct syntax
- SET @DSQL = LEFT(@DSQL, LEN(@DSQL) - 3)
- -- Add optional columns to source table
- EXEC(@DSQL)
- -- Build statement to populate validation temp table
- SELECT @DSQL = '
- INSERT INTO #Import_Staging
- (
- [ExcelRowNumber],
- [Agreement_Type],
- [Agreement_Name],
- [Company_Name],
- [Site_Name],
- [Contact_First_Name],
- [Contact_Last_Name],
- [Purchase_Order],
- [Location],
- [Group],
- [Start_Date],
- [End_Date],
- [SLA],
- [Internal_Notes],
- [Application_Unit],
- [Application_Limit],
- [Available_Per],
- [Agreement_Covers_Time],
- [Agreement_Covers_Expenses],
- [Agreement_Covers_Products],
- [Agreement_Covers_Sales_Tax],
- [Carryover_Days],
- [Overruns_Percent],
- [Charge_adjustments_to_the_firm],
- [Billing_Cycle],
- [Cycle_Based_On],
- [Billing_Amount],
- [Taxable],
- [Prorate_first_bill],
- [Billing_Start_date],
- [Tax_Code],
- [Restrict_downpayment],
- [Terms],
- [Override_Bill_To_Company_Name],
- [Override_Billing_Site_Name],
- [Invoice_Description],
- [Default_Work_Role],
- [Default_Work_Type],
- [Project_Type],
- [Invoice_Template],
- [Bill_Time],
- [Bill_Expenses],
- [Bill_Products],
- [Invoice_Time],
- [Invoice_Expenses],
- [Invoice_Products],
- Company_Match_Val
- )
- SELECT
- [Excel Row Number],
- [Agreement Type],
- [Agreement Name],
- [Company Name],
- [Site Name],
- [Contact First Name],
- [Contact Last Name],
- [Purchase Order],
- [Location],
- [Group],
- [Start Date],
- [End Date],
- [SLA],
- [Internal Notes ],
- [Application Unit],
- [Application Limit],
- [Available Per],
- [Agreement Covers Time],
- [Agreement Covers Expenses],
- [Agreement Covers Products],
- [Agreement Covers Sales Tax],
- [Carryover Days],
- [Overruns Percent],
- [Charge adjustments to the firm],
- [Billing Cycle],
- [Cycle Based On],
- [Billing Amount],
- [Taxable],
- [Prorate first bill],
- [Billing Start date],
- [Tax Code],
- [Restrict downpayment],
- [Billing Terms],
- [Override Bill To Company Name],
- [Override Billing Site Name],
- [Invoice Description],
- [Default Work Role],
- [Default Work Type],
- [Project Type],
- [Invoice Template],
- [Bill Time],
- [Bill Expenses],
- [Bill Products],
- [Invoice Time],
- [Invoice Expenses],
- [Invoice Products],
- SUBSTRING([Company Name], 1, 3)
- FROM ' + @SourceTable
- -- Pull data into validation temp table
- EXEC(@DSQL)
- -- Convert empty string and single space to null in temp table
- -- So that nulls may be properly handled throughout procedure
- UPDATE #Import_Staging
- SET [Agreement_Type] = CASE WHEN [Agreement_Type] IN('', ' ') THEN NULL ELSE [Agreement_Type] END,
- [Agreement_Name] = CASE WHEN [Agreement_Name] IN('', ' ') THEN NULL ELSE [Agreement_Name] END,
- [Company_Name] = CASE WHEN [Company_Name] IN('', ' ') THEN NULL ELSE [Company_Name] END,
- [Site_Name] = CASE WHEN [Site_Name] IN('', ' ') THEN NULL ELSE [Site_Name] END,
- [Contact_First_Name] = CASE WHEN [Contact_First_Name] IN('', ' ') THEN NULL ELSE [Contact_First_Name] END,
- [Contact_Last_Name] = CASE WHEN [Contact_Last_Name] IN('', ' ') THEN NULL ELSE [Contact_Last_Name] END,
- [Purchase_Order] = CASE WHEN [Purchase_Order] IN('', ' ') THEN NULL ELSE [Purchase_Order] END,
- [Location] = CASE WHEN [Location] IN('', ' ') THEN NULL ELSE [Location] END,
- [Group] = CASE WHEN [Group] IN('', ' ') THEN NULL ELSE [Group] END,
- [Start_Date] = CASE WHEN [Start_Date] IN('', ' ') THEN NULL ELSE [Start_Date] END,
- [End_Date] = CASE WHEN [End_Date] IN('', ' ') THEN NULL ELSE [End_Date] END,
- [No_Ending_Date] = CASE WHEN [No_Ending_Date] IN('', ' ') THEN NULL ELSE [No_Ending_Date] END,
- [SLA] = CASE WHEN [SLA] IN('', ' ') THEN NULL ELSE [SLA] END,
- [Internal_Notes] = CASE WHEN [Internal_Notes] IN('', ' ') THEN NULL ELSE [Internal_Notes] END,
- [Application_Unit] = CASE WHEN [Application_Unit] IN('', ' ') THEN NULL ELSE [Application_Unit] END,
- [Application_Limit] = CASE WHEN [Application_Limit] IN('', ' ') THEN NULL ELSE [Application_Limit] END,
- [Unlimited] = CASE WHEN [Unlimited] IN('', ' ') THEN NULL ELSE [Unlimited] END,
- [Available_Per] = CASE WHEN [Available_Per] IN('', ' ') THEN NULL ELSE [Available_Per] END,
- [Agreement_Covers_Time] = CASE WHEN [Agreement_Covers_Time] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Time] END,
- [Agreement_Covers_Expenses] = CASE WHEN [Agreement_Covers_Expenses] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Expenses] END,
- [Agreement_Covers_Products] = CASE WHEN [Agreement_Covers_Products] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Products] END,
- [Agreement_Covers_Sales_Tax] = CASE WHEN [Agreement_Covers_Sales_Tax] IN('', ' ') THEN NULL ELSE [Agreement_Covers_Sales_Tax] END,
- [Carryover_Days] = CASE WHEN [Carryover_Days] IN('', ' ') THEN NULL ELSE [Carryover_Days] END,
- [Overruns_Percent] = CASE WHEN [Overruns_Percent] IN('', ' ') THEN NULL ELSE [Overruns_Percent] END,
- [Charge_adjustments_to_the_firm] = CASE WHEN [Charge_adjustments_to_the_firm] IN('', ' ') THEN NULL ELSE [Charge_adjustments_to_the_firm] END,
- [Billing_Cycle] = CASE WHEN [Billing_Cycle] IN('', ' ') THEN NULL ELSE [Billing_Cycle] END,
- [Cycle_Based_On] = CASE WHEN [Cycle_Based_On] IN('', ' ') THEN NULL ELSE [Cycle_Based_On] END,
- [Billing_Amount] = CASE WHEN [Billing_Amount] IN('', ' ') THEN NULL ELSE [Billing_Amount] END,
- [Taxable] = CASE WHEN [Taxable] IN('', ' ') THEN NULL ELSE [Taxable] END,
- [Prorate_first_bill] = CASE WHEN [Prorate_first_bill] IN('', ' ') THEN NULL ELSE [Prorate_first_bill] END,
- [Billing_Start_date] = CASE WHEN [Billing_Start_date] IN('', ' ') THEN NULL ELSE [Billing_Start_date] END,
- [Tax_Code] = CASE WHEN [Tax_Code] IN('', ' ') THEN NULL ELSE [Tax_Code] END,
- [Restrict_downpayment] = CASE WHEN [Restrict_downpayment] IN('', ' ') THEN NULL ELSE [Restrict_downpayment] END,
- [Terms] = CASE WHEN [Terms] IN('', ' ') THEN NULL ELSE [Terms] END,
- [Override_Bill_To_Company_Name] = CASE WHEN [Override_Bill_To_Company_Name] IN('', ' ') THEN NULL ELSE [Override_Bill_To_Company_Name] END,
- [Override_Billing_Site_Name] = CASE WHEN [Override_Billing_Site_Name] IN('', ' ') THEN NULL ELSE [Override_Billing_Site_Name] END,
- [Invoice_Description] = CASE WHEN [Invoice_Description] IN('', ' ') THEN NULL ELSE [Invoice_Description] END,
- [Default_Work_Role] = CASE WHEN [Default_Work_Role] IN('', ' ') THEN NULL ELSE [Default_Work_Role] END,
- [Default_Work_Type] = CASE WHEN [Default_Work_Type] IN('', ' ') THEN NULL ELSE [Default_Work_Type] END,
- [Project_Type] = CASE WHEN [Project_Type] IN('', ' ') THEN NULL ELSE [Project_Type] END,
- [Invoice_Template] = CASE WHEN [Invoice_Template] IN('', ' ') THEN NULL ELSE [Invoice_Template] END,
- [Bill_Time] = CASE WHEN [Bill_Time] IN('', ' ') THEN NULL ELSE [Bill_Time] END,
- [Bill_Expenses] = CASE WHEN [Bill_Expenses] IN('', ' ') THEN NULL ELSE [Bill_Expenses] END,
- [Bill_Products] = CASE WHEN [Bill_Products] IN('', ' ') THEN NULL ELSE [Bill_Products] END,
- [Invoice_Time] = CASE WHEN [Invoice_Time] IN('', ' ') THEN NULL ELSE [Invoice_Time] END,
- [Invoice_Expenses] = CASE WHEN [Invoice_Expenses] IN('', ' ') THEN NULL ELSE [Invoice_Expenses] END,
- [Invoice_Products] = CASE WHEN [Invoice_Products] IN('', ' ') THEN NULL ELSE [Invoice_Products] END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Company_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Company_ID = src.Legacy_Company_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- IF EXISTS(SELECT TOP 1 * FROM @SourceColumns WHERE ColumnName = 'Legacy_Contact_ID')
- BEGIN
- SELECT @DSQL = '
- UPDATE tmp
- SET tmp.Legacy_Contact_ID = src.Legacy_Contact_ID
- FROM #Import_Staging tmp
- INNER JOIN ' + @SourceTable + ' src
- ON src.[Excel Row Number] = tmp.ExcelRowNumber'
- EXEC(@DSQL)
- END
- -- Condense contact first and last names to ContactName
- UPDATE tmp
- SET ContactName = LTRIM(ISNULL(tmp.Contact_First_Name + ' ', '') + ISNULL(tmp.Contact_Last_Name, ''))
- FROM #Import_Staging tmp
- -- Table to hold Company Name, Company_RecID, Company_ID, and stripped company name for fuzzy comparison
- IF Object_ID('tempdb..#Company') IS NOT NULL
- BEGIN
- DROP TABLE #Company
- END
- SELECT
- CONVERT(INT, comp.Company_RecID) AS Company_RecID,
- comp.Company_ID,
- comp.Company_Name,
- Delete_Flag,
- LEFT(comp.Company_Name, 3) AS Company_Match_Val,
- CONVERT(VARCHAR(50), '') AS Company_Name_Stripped,
- 0 AS Duplicate_Flag
- INTO #Company
- FROM dbo.Company comp
- WHERE comp.Delete_Flag = 0
- -- Table to hold contact information
- IF Object_ID('tempdb..#Contact') IS NOT NULL
- BEGIN
- DROP TABLE #Contact
- END
- SELECT
- CONVERT(INT, cont.Contact_RecID) AS Contact_RecID,
- RTRIM(ISNULL(cont.First_Name + ' ', '') + ISNULL(cont.Last_Name, '')) AS ContactName,
- First_Name,
- Last_Name,
- cont.Company_RecID,
- Default_Flag
- INTO #Contact
- FROM dbo.Contact cont
- INNER JOIN #Company comp
- ON comp.Company_RecID = cont.Company_RecID
- -- Match companies and contacts
- EXEC dbo.usp_Import_Match_Companies @ForceMode, @ImportBatchUser
- -- Table to hold duplicate sites
- IF OBJECT_ID('tempdb..#Duplicate_Sites') IS NOT NULL
- BEGIN
- DROP TABLE #Duplicate_Sites
- END
- SELECT
- cad.Company_RecID,
- dbo.ufn_Import_Trim(comp.Company_Name) AS Company_Name,
- dbo.ufn_Import_Trim(cad.[Description]) AS Site_Name
- INTO #Duplicate_Sites
- FROM #Company comp
- INNER JOIN Company_Address cad
- ON cad.Company_RecID = comp.Company_RecID
- GROUP BY comp.Company_Name, cad.[Description], cad.Company_RecID
- HAVING COUNT(*) > 1
- -- Strip commas and dollar signs from dollar amounts to resolve common partner error
- UPDATE #Import_Staging
- SET Billing_Amount = REPLACE(Billing_Amount, '$', ''),
- Prorate_first_bill = REPLACE(Prorate_first_bill, '$', '')
- UPDATE #Import_Staging
- SET Billing_Amount = REPLACE(Billing_Amount, ',', ''),
- Prorate_first_bill = REPLACE(Prorate_first_bill, '$', '')
- -- Pull valid numeric values into final fields
- UPDATE stag
- SET stag.PP_Amount = stag.Application_Limit
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Application_Limit + 'e0') = 1
- UPDATE stag
- SET stag.INT_Carryover_Days = stag.Carryover_Days
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Carryover_Days + '.e0') = 1
- UPDATE stag
- SET stag.INT_Overruns_Percent = stag.Overruns_Percent
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Overruns_Percent + '.e0') = 1
- UPDATE stag
- SET stag.AGR_Amount = stag.Billing_Amount
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Billing_Amount + 'e0') = 1
- UPDATE stag
- SET stag.AGR_ProRate = stag.Prorate_First_Bill
- FROM #Import_Staging stag
- WHERE ISNUMERIC(stag.Prorate_first_bill + 'e0') = 1
- -- Gather reference recid's needed for agreement import
- -- Get RecID's from reference tables
- UPDATE stag
- SET stag.AGR_Type_RecID = agrt.AGR_Type_RecID,
- stag.Owner_Level_RecID = loc.Owner_Level_RecID,
- stag.Billing_Unit_RecID = bu.Billing_Unit_RecID,
- stag.SR_SLA_RecID = sla.SR_SLA_RecID,
- stag.AGR_Billing_Cycle_RecID = bc.Bill_Cycle_RecID,
- stag.Tax_Code_RecID = tc.Tax_Code_RecID,
- stag.Billing_Terms_RecID = bterms.Billing_Terms_RecID,
- stag.Billing_Company_RecID = billcomp.Company_RecID,
- stag.Activity_Type_RecID = wt.Activity_Type_RecID, -- Work type/dbo.Activity_Type
- stag.Activity_Class_RecID = wr.Activity_Class_RecID, -- Work role/dbo.Activity_Class
- stag.PM_Type_RecID = pt.PM_Type_RecID,
- --stag.bl_invTemplate_Setup_RecID = invt.bl_invTemplate_Setup_RecID,
- CycleBasis_ID = CASE WHEN Cycle_Based_On = 'Contract Year' THEN 'C' WHEN Cycle_Based_On = 'Calendar Year' THEN 'Y' ELSE NULL END,
- stag.[PP_Unlimited_Flag] = CASE WHEN stag.PP_Amount = 0 THEN 1 WHEN stag.PP_Amount > 0 THEN 0 ELSE NULL END,
- stag.[PP_One_Time_Flag] = CASE WHEN [Available_Per] = 'Once' THEN 1 WHEN [Available_Per] IS NULL THEN NULL ELSE 0 END,
- 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,
- 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,
- 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,
- 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,
- stag.[PP_Carryover_Flag] = CASE WHEN INT_Carryover_Days > 0 THEN 1 WHEN INT_Carryover_Days = 0 THEN 0 ELSE NULL END,
- stag.[Overrun_Flag] = CASE WHEN INT_Overruns_Percent >= 0 THEN 1 WHEN INT_Overruns_Percent = 0 THEN 0 ELSE NULL END,
- 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,
- stag.[AGR_OneTime_Flag] = CASE WHEN Billing_Cycle = 'Once' THEN 1 WHEN Billing_Cycle IS NULL THEN NULL ELSE 0 END,
- 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,
- 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,
- stag.AGR_Detail_Type_ID = adt.AGR_Detail_Type_ID,
- stag.AGR_PONbr = CASE WHEN LEN([Purchase_Order]) < 30 THEN [Purchase_Order] ELSE NULL END,
- stag.AGR_InvDesc = [Invoice_Description],
- stag.AGR_Name = CASE WHEN LEN([Agreement_Name]) < 100 THEN [Agreement_Name] ELSE NULL END,
- stag.AppCycle_ID = acy.AppCycle_ID,
- stag.AGR_Notes = CASE WHEN LEN([Internal_Notes]) < 5000 THEN [Internal_Notes] ELSE NULL END,
- 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,
- 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,
- 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,
- 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,
- 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,
- 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,
- 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,
- 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,
- 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,
- stag.AGR_NoEnd_Flag = CASE WHEN stag.End_Date IS NULL THEN 1 ELSE 0 END
- FROM #Import_Staging stag
- LEFT OUTER JOIN dbo.AGR_Type agrt
- ON agrt.AGR_Type_Desc = stag.Agreement_Type
- LEFT OUTER JOIN #Company comp
- ON comp.Company_RecID = stag.Company_RecID
- LEFT OUTER JOIN dbo.Owner_Level loc
- ON loc.[Description] = stag.Location
- AND loc.Location_Flag = 1
- LEFT OUTER JOIN dbo.Billing_Unit bu
- ON bu.[Description] = stag.[Group]
- OR bu.Billing_Unit_ID = stag.[Group]
- LEFT OUTER JOIN SR_SLA sla
- ON sla.SLA_Name = stag.SLA
- LEFT OUTER JOIN Billing_Cycle bc
- ON bc.[Description] = stag.Billing_Cycle
- LEFT OUTER JOIN Tax_Code tc
- ON tc.Tax_Code_ID = stag.Tax_Code
- OR tc.[Description] = stag.Tax_Code
- LEFT OUTER JOIN Billing_Terms bterms
- ON bterms.[Description] = stag.Terms
- LEFT OUTER JOIN #Company billcomp
- ON billcomp.Company_Name = stag.Override_Bill_To_Company_Name
- LEFT OUTER JOIN Activity_Type wt
- ON wt.[Description] = stag.Default_Work_Type
- LEFT OUTER JOIN Activity_Class wr
- ON wr.[Description] = stag.Default_Work_Role
- LEFT OUTER JOIN PM_Type pt
- ON stag.Project_Type = pt.[Description]
- --LEFT OUTER JOIN bl_invTemplate invt
- --ON invt.Template_Name = stag.Invoice_Template
- LEFT OUTER JOIN AGR_Detail_Type adt
- ON adt.AGR_Detail_Type_Desc = stag.[Application_Unit]
- OR adt.AGR_Detail_Type_ID = stag.[Application_Limit]
- LEFT OUTER JOIN AGR_AppCycle acy
- ON acy.AppCycle_Name = stag.Available_Per
- OR acy.AppCycle_ID = stag.Available_Per
- -- Now that we have Company_RecID, get addresses & contact
- UPDATE stag
- SET stag.Company_Address_RecID = cad.Company_Address_RecID,
- stag.Billing_Address_RecID = billcad.Company_Address_RecID
- FROM #Import_Staging stag
- LEFT OUTER JOIN Company_Address cad
- ON cad.Company_RecID = stag.Company_RecID
- AND cad.[Description] = stag.Site_Name
- LEFT OUTER JOIN Company_Address billcad
- ON billcad.Company_RecID = stag.Billing_Company_RecID
- AND billcad.[Description] = stag.Override_Billing_Site_Name
- -- Default site for override billing if not specified
- UPDATE stag
- SET stag.Billing_Address_RecID = cad.Company_Address_RecID
- FROM #Import_Staging stag
- INNER JOIN Company_Address cad
- ON cad.Company_RecID = stag.Billing_Company_RecID
- AND cad.Default_Flag = 1
- WHERE stag.Override_Billing_Site_Name IS NULL
- AND stag.Billing_Company_RecID IS NOT NULL
- -- Use primary contact if not otherwise specified in spreadsheet
- UPDATE stag
- SET stag.Contact_RecID = cont.Contact_RecID
- FROM #Import_Staging stag
- INNER JOIN #Contact cont
- ON cont.Company_RecID = stag.Company_RecID
- AND cont.Default_Flag = 1
- AND stag.Contact_RecID IS NULL
- AND COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NULL
- -- Get Currency_RecID
- -- From Company
- UPDATE stag
- SET stag.Currency_RecID = comp.Currency_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Company comp WHERE comp.Company_RecID = stag.Company_RecID)comp
- -- If still null, get from Company Country
- UPDATE stag
- SET stag.Currency_RecID = curr.Currency_RecID
- FROM #Import_Staging stag
- 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
- CROSS APPLY(SELECT TOP 1 Currency_ID FROM dbo.Country cn WHERE cn.Country_RecID = comp.Country_RecID)cn
- CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Currency curr WHERE curr.Currency_ID = cn.Currency_ID)curr
- WHERE stag.Currency_RecID IS NULL
- -- If still null, get default
- UPDATE stag
- SET stag.Currency_RecID = curr.Currency_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 Currency_ID FROM dbo.Country ORDER BY Default_Flag DESC)cn
- CROSS APPLY(SELECT TOP 1 Currency_RecID FROM dbo.Currency curr WHERE curr.Currency_ID = cn.Currency_ID)curr
- WHERE stag.Currency_RecID IS NULL
- -- Blank out application unit if 'None'
- UPDATE stag
- SET stag.AGR_Detail_Type_ID = ''
- FROM #Import_Staging stag
- WHERE stag.Application_Unit = 'None'
- -- Format dates as mm/dd/yyyy and pull into datetime columns
- UPDATE stag
- SET stag.AGR_Date_Start = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[Start_Date]), 101)
- FROM #Import_Staging stag
- WHERE ISDATE([Start_Date]) = 1
- AND ([Start_Date] LIKE('%/%/%') OR [Start_Date] LIKE('%-%-%'))
- UPDATE stag
- SET stag.AGR_Date_End = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[End_Date]), 101)
- FROM #Import_Staging stag
- WHERE ISDATE([End_Date]) = 1
- AND ([End_Date] LIKE('%/%/%') OR [End_Date] LIKE('%-%-%'))
- UPDATE stag
- SET stag.Bill_Start_Date = CONVERT(NVARCHAR(50), CONVERT(DATETIME,[Billing_Start_Date]), 101)
- FROM #Import_Staging stag
- WHERE ISDATE([Billing_Start_Date]) = 1
- AND ([Billing_Start_Date] LIKE('%/%/%') OR [Billing_Start_Date] LIKE('%-%-%'))
- -- AGR_Billing_Cycle_RecID should be 0 if billing cycle = 'Once' (mirror PSA logic)
- UPDATE stag
- SET stag.AGR_Billing_Cycle_RecID = 0
- FROM #Import_Staging stag
- WHERE Billing_Cycle = 'Once'
- -- Validate that all required spreadsheet fields are entered
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Agreement type
- SELECT
- ExcelRowNumber,
- 'Agreement type cannot be blank'
- FROM #Import_Staging
- WHERE Agreement_Type IS NULL
- UNION ALL
- -- Agreement Name
- SELECT
- ExcelRowNumber,
- 'Agreement Name cannot be blank'
- FROM #Import_Staging
- WHERE Agreement_Name IS NULL
- UNION ALL
- -- Agreement Name Duplicate
- SELECT
- ExcelRowNumber,
- 'Cannot have multiple agreements with the same name for a single company'
- FROM #Import_Staging stag
- INNER JOIN dbo.AGR_Header ah
- ON ah.AGR_Name = stag.AGR_Name
- AND ah.Company_RecID = stag.Company_RecID
- UNION ALL
- -- Agreement Name Duplicate
- SELECT
- MIN(stag.ExcelRowNumber),
- 'Cannot have multiple agreements with the same name for a single company'
- FROM #Import_Staging stag
- WHERE Company_RecID IS NOT NULL
- GROUP BY Company_RecID, AGR_Name
- HAVING COUNT(*) > 1
- UNION ALL
- -- Company Name
- SELECT
- ExcelRowNumber,
- 'Company name cannot be blank'
- FROM #Import_Staging
- WHERE Company_Name IS NULL
- UNION ALL
- -- Start Date
- SELECT
- ExcelRowNumber,
- 'Start Date cannot be blank'
- FROM #Import_Staging
- WHERE [Start_Date] IS NULL
- UNION ALL
- -- Validate that all spreadsheet cells that contain a value are valid
- -- Single field validations
- -- Agreement_Type
- SELECT
- stag.ExcelRowNumber,
- 'Agreement_Type "' + stag.Agreement_Type + '" is invalid'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Type IS NOT NULL
- AND stag.AGR_Type_RecID IS NULL
- UNION ALL
- -- Agreement_Name
- SELECT
- stag.ExcelRowNumber,
- 'Agreement_Name cannot exceed 100 characters'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Name IS NOT NULL
- AND LEN(stag.Agreement_Name) > 100
- UNION ALL
- -- Company_Name must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Company "' + stag.Company_Name + '" is invalid'
- FROM #Import_Staging stag
- WHERE stag.Company_Name IS NOT NULL
- AND stag.Company_RecID IS NULL
- UNION ALL
- -- Company_Name cannot be duplicate
- SELECT
- stag.ExcelRowNumber,
- 'There are more than one companies named "' + stag.Company_Name + '"'
- FROM #Import_Staging stag
- WHERE Company_Duplicate_Flag = 1
- UNION ALL
- -- Site_Name must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Site_Name "' + stag.Site_Name + '" is invalid for company: "' + stag.Company_Name + '"'
- FROM #Import_Staging stag
- WHERE stag.Site_Name IS NOT NULL
- AND stag.Company_Address_RecID IS NULL
- AND stag.Company_RecID IS NOT NULL
- UNION ALL
- -- Site_Name cannot be duplicate
- SELECT
- stag.ExcelRowNumber,
- 'There are more than one sites named "' + stag.Site_Name +'" for Company: "' + stag.Company_Name
- FROM #Import_Staging stag
- INNER JOIN #Duplicate_Sites dups
- ON dups.Company_RecID = stag.Company_RecID
- AND dups.Site_Name = stag.Site_Name
- WHERE stag.Company_Address_RecID IS NOT NULL
- UNION ALL
- -- Contact must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Invalid contact: "' + ISNULL(stag.Contact_First_Name + ' ', '') + ISNULL(stag.Contact_Last_Name, '') + '" for company "' + stag.Company_Name + '"'
- FROM #Import_Staging stag
- WHERE COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NOT NULL
- AND Contact_RecID IS NULL
- AND Company_RecID IS NOT NULL
- UNION ALL
- -- Contact cannot be null in spreadsheet unless a primary exists for company
- SELECT
- stag.ExcelRowNumber,
- 'A contact name must be specified because no primary contact exists for company "' + stag.Company_Name + '"'
- FROM #Import_Staging stag
- WHERE COALESCE(stag.Contact_First_Name, stag.Contact_Last_Name) IS NULL
- AND stag.Company_RecID IS NOT NULL
- AND stag.Contact_RecID IS NULL
- UNION ALL
- -- Contact cannot be duplicate
- SELECT
- stag.ExcelRowNumber,
- 'There are more than one contacts named "' + ISNULL(stag.Contact_First_Name + ' ', '') + ISNULL(stag.Contact_Last_Name, '') +'" for Company: "' + stag.Company_Name
- FROM #Import_Staging stag
- WHERE stag.Contact_Duplicate_Flag = 1
- UNION ALL
- -- Purchase_Order
- SELECT
- stag.ExcelRowNumber,
- 'Purchase Order cannot exceed 30 characters'
- FROM #Import_Staging stag
- WHERE stag.Purchase_Order IS NOT NULL
- AND (LEN(stag.Purchase_Order) > 30 OR stag.AGR_PONbr IS NULL)
- UNION ALL
- -- Location
- SELECT
- stag.ExcelRowNumber,
- 'Invalid location: "' + stag.Location + '"'
- FROM #Import_Staging stag
- WHERE stag.Location IS NOT NULL
- AND stag.Owner_Level_RecID IS NULL
- UNION ALL
- -- Group
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Group: "' + stag.[Group]
- FROM #Import_Staging stag
- WHERE stag.[Group] IS NOT NULL
- AND stag.Billing_Unit_RecID IS NULL
- UNION ALL
- -- [Start_Date]
- SELECT
- stag.ExcelRowNumber,
- 'Start Date must be a valid date in MM/DD/YYYY format'
- FROM #Import_Staging stag
- WHERE stag.[Start_Date] IS NOT NULL
- AND stag.AGR_Date_Start IS NULL
- UNION ALL
- -- End_Date
- SELECT
- stag.ExcelRowNumber,
- 'End Date must be a valid date in MM/DD/YYYY format'
- FROM #Import_Staging stag
- WHERE stag.End_Date IS NOT NULL
- AND stag.AGR_Date_End IS NULL
- UNION ALL
- -- SLA
- SELECT
- stag.ExcelRowNumber,
- 'Invalid SLA: "' + stag.SLA + '"'
- FROM #Import_Staging stag
- WHERE stag.SLA IS NOT NULL
- AND stag.SR_SLA_RecID IS NULL
- UNION ALL
- -- Internal_Notes
- SELECT
- stag.ExcelRowNumber,
- 'Internal Notes cannot exceed 5000 characters'
- FROM #Import_Staging stag
- WHERE stag.Internal_Notes IS NOT NULL
- AND (LEN(stag.Internal_Notes) > 5000 OR AGR_Notes IS NULL)
- UNION ALL
- -- Application_Unit
- SELECT
- stag.ExcelRowNumber,
- 'Application Unit must be "Amount", "Hours", "Incidents" or "None"'
- FROM #Import_Staging stag
- WHERE stag.Application_Unit IS NOT NULL
- AND stag.AGR_Detail_Type_ID IS NULL
- UNION ALL
- -- Application_Limit
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Application Limit - field must be numeric.'
- FROM #Import_Staging stag
- WHERE stag.Application_Limit IS NOT NULL
- AND stag.PP_Amount IS NULL
- UNION ALL
- -- Available_Per
- SELECT
- stag.ExcelRowNumber,
- 'Available per must be "Once", "Contract 2 weeks", "Contract 4 weeks", "Contract Year", "Calendar Month", "Calendar Quarter","Calendar Week", "Contract Quarter", or "Calendar Year"'
- FROM #Import_Staging stag
- WHERE stag.Available_Per IS NOT NULL
- AND stag.AppCycle_ID IS NULL
- AND stag.PP_One_Time_Flag <> 1
- UNION ALL
- -- Agreement_Covers_Time
- SELECT
- stag.ExcelRowNumber,
- 'Agreement Covers Time must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Covers_Time IS NOT NULL
- AND stag.PP_Time_Flag IS NULL
- UNION ALL
- -- Agreement_Covers_Expenses
- SELECT
- stag.ExcelRowNumber,
- 'Agreement Covers Expenses must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Covers_Expenses IS NOT NULL
- AND stag.PP_Expenses_Flag IS NULL
- UNION ALL
- -- Agreement_Covers_Products
- SELECT
- stag.ExcelRowNumber,
- 'Agreement Covers Products must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Covers_Products IS NOT NULL
- AND stag.PP_Products_Flag IS NULL
- UNION ALL
- -- Agreement_Covers_Sales_Tax
- SELECT
- stag.ExcelRowNumber,
- 'Agreement Covers Sales Tax must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Agreement_Covers_Sales_Tax IS NOT NULL
- AND PP_Tax_Flag IS NULL
- UNION ALL
- -- Carryover_Days
- SELECT
- stag.ExcelRowNumber,
- 'Carryover Days must be a whole number, and cannot be negative'
- FROM #Import_Staging stag
- WHERE stag.Carryover_Days IS NOT NULL
- AND (stag.INT_Carryover_Days IS NULL OR stag.INT_Carryover_Days < 0)
- UNION ALL
- -- Carryover_Days
- SELECT
- stag.ExcelRowNumber,
- 'Carryover Days cannot exceed 999999'
- FROM #Import_Staging stag
- WHERE stag.Carryover_Days IS NOT NULL
- AND stag.INT_Carryover_Days > 999999
- UNION ALL
- -- Overruns_Percent
- SELECT
- stag.ExcelRowNumber,
- 'Overruns_Percent must be a whole number between 0 and 999999'
- FROM #Import_Staging stag
- WHERE stag.Overruns_Percent IS NOT NULL
- AND (INT_Overruns_Percent IS NULL OR INT_Overruns_Percent NOT BETWEEN 0 AND 999999)
- UNION ALL
- -- Charge_adjustments_to_the_firm
- SELECT
- stag.ExcelRowNumber,
- 'Charge adjustments to the firm must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Charge_adjustments_to_the_firm IS NOT NULL
- AND stag.Charge_Firm_Flag IS NULL
- UNION ALL
- -- Billing_Cycle
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Billing Cycle: "' + stag.Billing_Cycle + '"'
- FROM #Import_Staging stag
- WHERE stag.Billing_Cycle IS NOT NULL
- AND stag.AGR_Billing_Cycle_RecID IS NULL
- UNION ALL
- -- Cycle_Based_On
- SELECT
- stag.ExcelRowNumber,
- 'Cycle Based On must be "Calendar" or "Contract"'
- FROM #Import_Staging stag
- WHERE stag.Cycle_Based_On IS NOT NULL
- AND CycleBasis_ID IS NULL
- UNION ALL
- -- Billing_Amount
- SELECT
- stag.ExcelRowNumber,
- 'Billing_Amount must be numeric'
- FROM #Import_Staging stag
- WHERE stag.Billing_Amount IS NOT NULL
- AND AGR_Amount IS NULL
- UNION ALL
- -- Taxable
- SELECT
- stag.ExcelRowNumber,
- 'Taxable must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Taxable IS NOT NULL
- AND Taxable_Flag IS NULL
- UNION ALL
- -- Prorate_first_bill
- SELECT
- stag.ExcelRowNumber,
- 'Prorate first bill amount must be numeric'
- FROM #Import_Staging stag
- WHERE stag.Prorate_first_bill IS NOT NULL
- AND AGR_ProRate IS NULL
- UNION ALL
- -- Billing_Start_date
- SELECT
- stag.ExcelRowNumber,
- 'Billing Start Date must be a valid date - Please use MM/DD/YYYY format'
- FROM #Import_Staging stag
- WHERE stag.Bill_Start_Date IS NULL
- AND stag.Billing_Start_Date IS NOT NULL
- UNION ALL
- -- Tax_Code
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Tax Code: "' + stag.Tax_Code + '"'
- FROM #Import_Staging stag
- WHERE stag.Tax_Code IS NOT NULL
- AND stag.Tax_Code_RecID IS NULL
- UNION ALL
- -- Restrict_downpayment
- SELECT
- stag.ExcelRowNumber,
- 'Restrict_downpayment must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Restrict_downpayment IS NOT NULL
- AND stag.Restrict_DP_Flag IS NULL
- UNION ALL
- -- Terms
- SELECT
- stag.ExcelRowNumber,
- 'Invalid billing terms: "' + stag.Terms + '"'
- FROM #Import_Staging stag
- WHERE stag.Terms IS NOT NULL
- AND stag.Billing_Terms_RecID IS NULL
- UNION ALL
- -- Override_Bill_To must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Override Bill To company: "' + stag.Override_Bill_To_Company_Name + '" is invalid'
- FROM #Import_Staging stag
- WHERE stag.Override_Bill_To_Company_Name IS NOT NULL
- AND stag.Billing_Company_RecID IS NULL
- UNION ALL
- -- Override_Billing_Site_Name must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Override_Billing_Site_Name: "' + stag.Override_Billing_Site_Name + '" is invalid'
- FROM #Import_Staging stag
- WHERE stag.Override_Billing_Site_Name IS NOT NULL
- AND Billing_Address_RecID IS NULL
- UNION ALL
- -- Override_Billing_Site_Name cannot be duplicate
- SELECT
- stag.ExcelRowNumber,
- 'There are more than one sites named "' + stag.Site_Name +'" for override billing company: "' + stag.Override_Bill_To_Company_Name
- FROM #Import_Staging stag
- INNER JOIN #Duplicate_Sites dups
- ON dups.Company_RecID = stag.Billing_Company_RecID
- AND dups.Site_Name = stag.Override_Billing_Site_Name
- WHERE stag.Billing_Address_RecID IS NOT NULL
- UNION ALL
- -- Invoice_Description (check that it carried across if not null)
- SELECT
- stag.ExcelRowNumber,
- 'Invoice description invalid'
- FROM #Import_Staging stag
- WHERE stag.Invoice_Description IS NOT NULL
- AND AGR_InvDesc IS NULL
- UNION ALL
- -- Default_Work_Role
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Default_Work_Role: "' + Default_Work_Role + '"'
- FROM #Import_Staging stag
- WHERE stag.Default_Work_Role IS NOT NULL
- AND stag.Activity_Class_RecID IS NULL
- UNION ALL
- -- Default_Work_Type
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Default_Work_Type: "' + Default_Work_Type + '"'
- FROM #Import_Staging stag
- WHERE stag.Default_Work_Type IS NOT NULL
- AND stag.Activity_Type_RecID IS NULL
- UNION ALL
- -- Project_Type must be valid
- SELECT
- stag.ExcelRowNumber,
- 'Invalid Project_Type: "' + stag.Project_Type + '"'
- FROM #Import_Staging stag
- WHERE stag.Project_Type IS NOT NULL
- AND stag.PM_Type_RecID IS NULL
- --UNION ALL
- ---- Invoice_Template must be valid
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Invalid Invoice_Template: "' + stag.Invoice_Template + '"'
- --FROM #Import_Staging stag
- --WHERE stag.Invoice_Template IS NOT NULL
- -- AND stag.bl_invTemplate_RecID IS NULL
- UNION ALL
- -- Bill_Time must be B, NB, NC
- SELECT
- stag.ExcelRowNumber,
- 'Bill_Time must be "B", "NB" or "NC"'
- FROM #Import_Staging stag
- WHERE stag.Bill_Time IS NOT NULL
- AND (TE_Billable_Flag IS NULL OR TE_Invoice_Flag IS NULL)
- UNION ALL
- -- Bill_Expenses
- SELECT
- stag.ExcelRowNumber,
- 'Bill_Expenses must be "B", "NB" or "NC"'
- FROM #Import_Staging stag
- WHERE stag.Bill_Expenses IS NOT NULL
- AND (EX_Billable_Flag IS NULL OR EX_Invoice_Flag IS NULL)
- UNION ALL
- -- Bill_Products
- SELECT
- stag.ExcelRowNumber,
- 'Bill_Products must be "B", "NB" or "NC"'
- FROM #Import_Staging stag
- WHERE stag.Bill_Products IS NOT NULL
- AND (IV_Billable_Flag IS NULL OR IV_Invoice_Flag IS NULL)
- UNION ALL
- -- Invoice_Time must evaluate to Y/N
- SELECT
- stag.ExcelRowNumber,
- 'Invoice_Time must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Invoice_Time IS NOT NULL
- AND TE_InvCust_Flag IS NULL
- UNION ALL
- -- Invoice_Expenses must evaluate to Y/N
- SELECT
- stag.ExcelRowNumber,
- 'Invoice Customer Expenses must be Y or N '
- FROM #Import_Staging stag
- WHERE stag.Invoice_Expenses IS NOT NULL
- AND EX_InvCust_Flag IS NULL
- UNION ALL
- -- Invoice_Products must evaluate to Y/N
- SELECT
- stag.ExcelRowNumber,
- 'Invoice Customer Products must be Y or N'
- FROM #Import_Staging stag
- WHERE stag.Invoice_Products IS NOT NULL
- AND IV_InvCust_Flag IS NULL
- UNION ALL
- -- Cross-field validations
- -- End date cannot be before start date
- SELECT
- stag.ExcelRowNumber,
- 'End date cannot be prior to start date'
- FROM #Import_Staging stag
- WHERE AGR_Date_End IS NOT NULL
- AND AGR_Date_Start IS NOT NULL
- AND AGR_Date_End < AGR_Date_Start
- UNION ALL
- -- Group & Location must be associated
- SELECT
- stag.ExcelRowNumber,
- 'Group: "' + stag.[Group] + '" does not belong to location: "' + stag.Location + '"'
- FROM #Import_Staging stag
- LEFT OUTER JOIN dbo.Billing_Unit_Loc bul
- ON bul.Owner_Level_RecID = stag.Owner_Level_RecID
- AND bul.Billing_Unit_RecID = stag.Billing_Unit_RecID
- WHERE stag.Billing_Unit_RecID IS NOT NULL
- AND stag.Owner_Level_RecID IS NOT NULL
- AND bul.Billing_Unit_Loc_RecID IS NULL
- -- UNION ALL
- ---- Application limit required if application unit specified -- Default limit from AGR_Type???
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Application limit is required if application unit is specified - enter "0" for unlimited"'
- --FROM #Import_Staging stag
- --WHERE Application_Unit IS NOT NULL
- -- AND Application_Limit IS NULL
- -- Set up row count table to summarize results
- SELECT @start = 1
- SELECT @end = MAX(ExcelRowNumber)+1 FROM #Import_Staging
- -- If there are errors in spreadsheet, stop processing now and return results
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- IF @ProcName = 'usp_AGR_ImportValidate'
- BEGIN
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- t.ValMsg
- FROM #ResultsCondensed t
- END
- IF @ProcName = 'usp_AGR_ImportPush'
- BEGIN
- SELECT
- 0 AS Success,
- 0 AS RowNumber,
- t.ValMsg
- FROM #ResultsCondensed t
- END
- ROLLBACK TRANSACTION AGR_Import
- RETURN
- END
- -- Set default values for fields that are only available in spreadsheet, but were not specified
- -- Prorate first bill defaults to 0 if null
- UPDATE stag
- SET stag.AGR_Prorate = 0
- FROM #Import_Staging stag
- WHERE Prorate_first_bill IS NULL
- -- Tax code defaults to company default if not specified in spreadsheet
- UPDATE stag
- SET stag.Tax_Code_RecID = comp.Tax_Code_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Company comp
- ON stag.Company_RecID = comp.Company_RecID
- WHERE stag.Tax_Code_RecID IS NULL
- -- Any tax codes that are still null should use overall default from dbo.Tax_Code
- UPDATE stag
- SET stag.Tax_Code_RecID = tc.Tax_Code_RecID
- FROM #Import_Staging stag
- INNER JOIN dbo.Tax_Code tc
- ON tc.Default_Flag = 1
- WHERE stag.Tax_Code_RecID IS NULL
- -- Fold in fields from Agreement Type that are not *-available-* in spreadsheet (pre-pay, employee compensation, invoice comment preferences etc.)
- UPDATE stag
- SET stag.Prepay_Flag = atype.Prepay_Flag,
- stag.Comp_Rate_Option = atype.Comp_Rate_Option,
- stag.Comp_Limit_Option = atype.Comp_Limit_Option,
- stag.Comp_Rate_Amount = atype.Comp_Rate_Amount,
- stag.Comp_Limit_Amount = atype.Comp_Limit_Amount,
- stag.TopComment_Flag = atype.TopComment_Flag,
- stag.BottomComment_Flag = atype.BottomComment_Flag,
- stag.BU_Restrict_Flag = atype.BU_Restrict_Flag,
- stag.OL_Restrict_Flag = atype.OL_Restrict_Flag
- FROM #Import_Staging stag
- INNER JOIN AGR_Type atype
- ON stag.AGR_Type_RecID = atype.AGR_Type_RecID
- -- Pull in fields from Agreement Type that are not *-specified-* in spreadsheet
- UPDATE stag
- SET stag.Owner_Level_RecID = CASE WHEN stag.Location IS NULL THEN atype.Owner_Level_RecID ELSE stag.Owner_Level_RecID END,
- stag.Billing_Unit_RecID = CASE WHEN stag.[Group] IS NULL THEN atype.Billing_Unit_RecID ELSE stag.Billing_Unit_RecID END,
- stag.SR_SLA_RecID = CASE WHEN stag.SLA IS NULL THEN atype.SR_SLA_RecID ELSE stag.SR_SLA_RecID END,
- 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,
- stag.PP_Amount = CASE WHEN stag.Application_Limit IS NULL THEN atype.PP_Amount ELSE stag.PP_Amount END,
- stag.PP_Unlimited_Flag = CASE WHEN stag.Application_Limit IS NULL THEN atype.PP_Unlimited_Flag ELSE stag.PP_Unlimited_Flag END,
- stag.AppCycle_ID = CASE WHEN stag.Available_Per IS NULL THEN atype.AppCycle_ID ELSE stag.AppCycle_ID END,
- stag.AGR_Billing_Cycle_RecID = CASE WHEN stag.Billing_Cycle IS NULL THEN atype.Bill_Cycle_RecID ELSE stag.AGR_Billing_Cycle_RecID END,
- stag.AGR_OneTime_Flag = CASE WHEN stag.AGR_OneTime_Flag IS NULL THEN atype.OneTime_Flag ELSE stag.AGR_OneTime_Flag END,
- stag.PP_Time_Flag = CASE WHEN stag.Agreement_Covers_Time IS NULL THEN atype.PP_Time_Flag ELSE stag.PP_Time_Flag END,
- stag.PP_Products_Flag = CASE WHEN stag.Agreement_Covers_Products IS NULL THEN atype.PP_Products_Flag ELSE stag.PP_Products_Flag END,
- stag.PP_Expenses_Flag = CASE WHEN stag.Agreement_Covers_Expenses IS NULL THEN atype.PP_Expenses_Flag ELSE stag.PP_Expenses_Flag END,
- stag.PP_Tax_Flag = CASE WHEN stag.Agreement_Covers_Sales_Tax IS NULL THEN atype.PP_Tax_Flag ELSE stag.PP_Tax_Flag END,
- stag.PP_Carryover_Flag = CASE WHEN stag.PP_Carryover_Flag IS NULL THEN atype.PP_Carryover_Flag ELSE stag.PP_Carryover_Flag END,
- stag.INT_Carryover_Days = CASE WHEN stag.Carryover_Days IS NULL THEN atype.Carryover_Days ELSE stag.Carryover_Days END,
- stag.Overrun_Flag = CASE WHEN stag.Overruns_Percent IS NULL THEN atype.Overrun_Flag ELSE stag.Overrun_Flag END,
- stag.INT_Overruns_Percent = CASE WHEN stag.Overruns_Percent IS NULL THEN atype.Overrun_Limit ELSE stag.INT_Overruns_Percent END, ------- verify
- 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,
- 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,
- stag.CycleBasis_ID = CASE WHEN stag.Cycle_Based_On IS NULL THEN atype.CycleBasis_ID ELSE stag.CycleBasis_ID END,
- stag.AGR_Amount = CASE WHEN stag.AGR_Amount IS NULL THEN atype.Bill_Amount ELSE stag.AGR_Amount END,
- stag.Taxable_Flag = CASE WHEN stag.Taxable_Flag IS NULL THEN atype.Taxable_Flag ELSE stag.Taxable_Flag END,
- stag.Restrict_DP_Flag = CASE WHEN stag.Restrict_downpayment IS NULL THEN atype.Restrict_DP_Flag ELSE stag.Restrict_DP_Flag END,
- stag.Billing_Terms_RecID = CASE WHEN stag.Billing_Terms_RecID IS NULL THEN atype.Billing_Terms_RecID ELSE stag.Billing_Terms_RecID END,
- stag.AGR_InvDesc = CASE WHEN stag.AGR_InvDesc IS NULL THEN atype.Invoice_Desc ELSE stag.AGR_InvDesc END,
- stag.Activity_Class_RecID = CASE WHEN stag.Activity_Class_RecID IS NULL THEN atype.Activity_Class_RecID ELSE stag.Activity_Class_RecID END,
- stag.Activity_Type_RecID = CASE WHEN stag.Activity_Type_RecID IS NULL THEN atype.Activity_Type_RecID ELSE stag.Activity_Type_RecID END,
- stag.PM_Type_RecID = CASE WHEN stag.PM_Type_RecID IS NULL THEN atype.PM_Type_RecID ELSE stag.PM_Type_RecID END,
- 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,
- stag.TE_Billable_Flag = CASE WHEN stag.TE_Billable_Flag IS NULL THEN atype.TE_Billable_Flag ELSE stag.TE_Billable_Flag END,
- stag.EX_Billable_Flag = CASE WHEN stag.EX_Billable_Flag IS NULL THEN atype.EX_Billable_Flag ELSE stag.EX_Billable_Flag END,
- stag.IV_Billable_Flag = CASE WHEN stag.IV_Billable_Flag IS NULL THEN atype.IV_Billable_Flag ELSE stag.IV_Billable_Flag END,
- stag.TE_Invoice_Flag = CASE WHEN stag.TE_Invoice_Flag IS NULL THEN atype.TE_Invoice_Flag ELSE stag.TE_Invoice_Flag END,
- stag.EX_Invoice_Flag = CASE WHEN stag.EX_Invoice_Flag IS NULL THEN atype.EX_Invoice_Flag ELSE stag.EX_Invoice_Flag END,
- stag.IV_Invoice_Flag = CASE WHEN stag.IV_Invoice_Flag IS NULL THEN atype.IV_Invoice_Flag ELSE stag.IV_Invoice_Flag END,
- stag.TE_InvCust_Flag = CASE WHEN stag.TE_InvCust_Flag IS NULL THEN atype.TE_InvCust_Flag ELSE stag.TE_InvCust_Flag END,
- stag.EX_InvCust_Flag = CASE WHEN stag.EX_InvCust_Flag IS NULL THEN atype.EX_InvCust_Flag ELSE stag.EX_InvCust_Flag END,
- stag.IV_InvCust_Flag = CASE WHEN stag.IV_InvCust_Flag IS NULL THEN atype.IV_InvCust_Flag ELSE stag.IV_InvCust_Flag END
- FROM #Import_Staging stag
- INNER JOIN AGR_Type atype
- ON stag.AGR_Type_RecID = atype.AGR_Type_RecID
- LEFT OUTER JOIN AGR_Detail_Type adtype
- ON adtype.AGR_Detail_Type_RecID = atype.AGR_Detail_Type_RecID
- -- Set defaults as-necessary
- UPDATE stag
- SET stag.PM_Type_RecID = pmt.PM_Type_RecID
- FROM #Import_Staging stag
- CROSS APPLY(SELECT TOP 1 PM_Type_RecID FROM PM_Type pmt WHERE pmt.Default_Flag = 1)pmt
- WHERE NOT EXISTS(SELECT 1 FROM PM_Type pmt2 WHERE pmt2.PM_Type_RecID = stag.PM_Type_RecID)
- UPDATE stag
- SET stag.Activity_Class_RecID = NULL
- FROM #Import_Staging stag
- WHERE NOT EXISTS(SELECT 1 FROM Activity_Class ac WHERE ac.Activity_Class_RecID = stag.Activity_Class_RecID)
- UPDATE stag
- SET stag.Activity_Type_RecID = def.Activity_Type_RecID
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 * FROM Activity_Type at WHERE at.Default_Flag = 1)def
- WHERE NOT EXISTS(SELECT 1 FROM Activity_Type at WHERE at.Activity_Type_RecID = stag.Activity_Type_RecID)
- UPDATE stag
- SET stag.Billing_Terms_RecID = def.Billing_Terms_RecID
- FROM #Import_Staging stag
- OUTER APPLY(SELECT TOP 1 * FROM Billing_Terms def WHERE def.Default_Flag = 1)def
- WHERE NOT EXISTS(SELECT 1 FROM Billing_Terms bt WHERE bt.Billing_Terms_RecID = stag.Billing_Terms_RecID)
- -- Handle instance where PP_Unlimited_Flag is never set (i.e. no application unit)
- UPDATE #Import_Staging
- SET PP_Unlimited_Flag = 0
- WHERE PP_Unlimited_Flag IS NULL
- -- If application unit is hours, agreement should cover time
- UPDATE #Import_Staging
- SET PP_Time_Flag = 1
- WHERE AGR_Detail_Type_ID = 'H'
- -- Final validations to make sure that combined values from spreadsheet and agreement type create a valid agreement
- INSERT INTO #tblResults
- (
- RowNumber,
- ValMsg
- )
- -- Agreement must have a valid location
- SELECT
- stag.ExcelRowNumber,
- 'A location must be specified in either the spreadsheet or the agreement type'
- FROM #Import_Staging stag
- WHERE stag.Owner_Level_RecID IS NULL
- OR stag.Owner_Level_RecID = 0
- UNION ALL
- -- Agreement must have a valid group/billing unit
- SELECT
- stag.ExcelRowNumber,
- 'A group must be specified in either the spreadsheet or the agreement type'
- FROM #Import_Staging stag
- WHERE stag.Billing_Unit_RecID IS NULL
- OR stag.Billing_Unit_RecID = 0
- UNION ALL
- -- If agreement has an application unit (Amount, Hours, Incidents) - it must have an application limit
- SELECT
- stag.ExcelRowNumber,
- 'Application limit must be specified unless application unit is "None"'
- FROM #Import_Staging stag
- WHERE stag.PP_Amount IS NULL
- AND stag.AGR_Detail_Type_ID <> ''
- UNION ALL
- -- If agreement has an application unit (Amount, Hours, Incidents) - it must have an application cycle
- SELECT
- stag.ExcelRowNumber,
- 'If the agreement has an application unit, "Available Per" must be specified in either the Agreement Type or Spreadsheet'
- FROM #Import_Staging stag
- WHERE (stag.AppCycle_ID IS NULL OR stag.AppCycle_ID = '')
- AND stag.AGR_Detail_Type_ID <> ''
- AND stag.PP_One_Time_Flag <> '1'
- UNION ALL
- SELECT
- stag.ExcelRowNumber,
- 'If agreement covers sales tax, application units must be set to "Amount"'
- FROM #Import_Staging stag
- WHERE PP_Tax_Flag = 1
- AND AGR_Detail_Type_ID <> 'A'
- --UNION ALL
- ---- Default Work role must belong to location
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Default work role "' + ac.[Description] + '" does not belong to location: "' + loc.[Description] + '"'
- --FROM #Import_Staging stag
- -- INNER JOIN dbo.Activity_Class ac
- -- ON ac.Activity_Class_RecID = stag.Activity_Class_RecID
- -- INNER JOIN dbo.Owner_Level loc
- -- ON loc.Owner_Level_RecID = stag.Owner_Level_RecID
- -- LEFT OUTER JOIN dbo.Activity_Class_Loc acl
- -- ON acl.Activity_Class_RecID = ac.Activity_Class_RecID
- -- AND acl.Owner_Level_RecID = stag.Owner_Level_RecID
- --WHERE acl.Activity_Class_Loc_RecID IS NULL
- --UNION ALL
- ---- Copied work roles must belong to location
- --SELECT
- -- stag.ExcelRowNumber,
- -- 'Unable to copy work role "' + ac.[Description] + '" from agreement type "' + stag.Agreement_Type + '" because the work role is not assigned to location: "' + loc.[Description] + '"'
- --FROM #Import_Staging stag
- -- INNER JOIN AGR_Type aty
- -- ON aty.AGR_Type_RecID = stag.AGR_Type_RecID
- -- INNER JOIN AGR_Type_WRole atw
- -- ON atw.AGR_Type_RecID = aty.AGR_Type_RecID
- -- INNER JOIN dbo.Activity_Class ac
- -- ON ac.Activity_Class_RecID = atw.Activity_Class_RecID
- -- INNER JOIN dbo.Owner_Level loc
- -- ON loc.Owner_Level_RecID = stag.Owner_Level_RecID
- -- LEFT OUTER JOIN dbo.Activity_Class_Loc acl
- -- ON acl.Activity_Class_RecID = ac.Activity_Class_RecID
- -- AND acl.Owner_Level_RecID = stag.Owner_Level_RecID
- --WHERE acl.Activity_Class_Loc_RecID IS NULL
- -- Handle issue where PM_Type_RecID may be 0 in AGR_Type and cause error on FK during insert
- UPDATE stag
- SET stag.PM_Type_RecID = NULL
- FROM #Import_Staging stag
- WHERE stag.PM_Type_RecID = 0
- -- table to Force compilation regardless of structure
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- CREATE TABLE #Force_Compile
- (
- Column_Name VARCHAR(20)
- )
- -- If running push procedure, perform final inserts
- -- Pre-2017.6 (No Currency_RecID column)
- IF @ProcName = 'usp_AGR_ImportPUsh' AND NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- -- AGR_Header insert
- -- Pre-2017.6 (No Currency_RecID column)
- IF NOT EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'AGR_Header')
- BEGIN
- -- Temporarily repurpose PP_Billing_Cycle_RecID to store excel row number
- INSERT INTO dbo.AGR_Header
- (
- AGR_Type_RecID,
- AGR_Name,
- AGR_Date_Start,
- AGR_Date_End,
- AGR_NoEnd_Flag,
- AGR_Billing_Cycle_RecID,
- AGR_OneTime_Flag,
- AGR_Amount,
- AGR_Calc_Flag,
- AGR_Prorate,
- AGR_InvDesc,
- Company_RecID,
- Contact_RecID,
- AGR_PONbr,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- OL_Restrict_Flag,
- BU_Restrict_Flag,
- SubCompany_RecID,
- SubContact_RecID,
- Sub_WONbr,
- AGR_Cancel_Flag,
- AGR_Date_Cancel,
- AGR_Reason_Cancel,
- AGR_Cancel_By,
- PP_Billing_Cycle_RecID,
- PP_One_Time_Flag,
- AGR_Detail_Type_ID,
- PP_Amount,
- PP_Carryover_Flag,
- PP_Time_Flag,
- PP_Expenses_Flag,
- PP_Products_Flag,
- AGR_Notes,
- AGR_Default_Flag,
- Activity_Class_RecID,
- Activity_Type_RecID,
- SR_Urgency_RecID,
- PM_Type_RecID,
- TE_Billable_Flag,
- TE_Invoice_Flag,
- EX_Billable_Flag,
- EX_Invoice_Flag,
- IV_Billable_Flag,
- IV_Invoice_Flag,
- PP_Adjustment,
- Last_Update,
- Updated_By,
- SR_Type_RecID,
- TopComment_Flag,
- BottomComment_Flag,
- Carryover_ID,
- AppCycle_ID,
- Overrun_Flag,
- BillPeriod_ID,
- CycleBasis_ID,
- Taxable_Flag,
- Tax_Code_RecID,
- TE_Amount,
- TE_UseBill_Flag,
- TE_InvCust_Flag,
- EX_InvCust_Flag,
- IV_InvCust_Flag,
- PP_Unlimited_Flag,
- BR_Option,
- Bill_Start_Date,
- CarryOver_Days,
- Overrun_Limit,
- PP_Expire_Flag,
- Notification_History,
- Charge_Firm_Flag,
- SR_SLA_RecID,
- PP_Tax_Flag,
- NetBalance,
- Overrun,
- Billing_Company_RecID,
- Billing_Address_RecID,
- Restrict_DP_Flag,
- Billing_Terms_RecID,
- TE_AmtOption,
- TE_UseRate_Flag,
- TE_UseAmt_Flag,
- bl_invTemplate_Setup_RecID,
- Avail_Balance,
- parent_recid,
- Comp_Rate_Option,
- Comp_Limit_Option,
- Comp_Rate_Amount,
- Comp_Limit_Amount,
- Entered_By
- )
- SELECT
- AGR_Type_RecID,
- AGR_Name,
- AGR_Date_Start,
- AGR_Date_End,
- AGR_NoEnd_Flag,
- AGR_Billing_Cycle_RecID,
- AGR_OneTime_Flag,
- AGR_Amount,
- 0 AS AGR_Calc_Flag,
- AGR_Prorate,
- AGR_InvDesc,
- Company_RecID,
- Contact_RecID,
- AGR_PONbr,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- OL_Restrict_Flag,
- BU_Restrict_Flag,
- NULL AS SubCompany_RecID,
- NULL AS SubContact_RecID,
- NULL AS Sub_WONbr,
- 0 AS AGR_Cancel_Flag,
- NULL AS AGR_Date_Cancel,
- NULL AS AGR_Reason_Cancel,
- 0 AS AGR_Cancel_By,
- [ExcelRowNumber] AS PP_Billing_Cycle_RecID,
- PP_One_Time_Flag,
- AGR_Detail_Type_ID,
- PP_Amount,
- PP_Carryover_Flag,
- PP_Time_Flag,
- PP_Expenses_Flag,
- PP_Products_Flag,
- AGR_Notes,
- 0 AS AGR_Default_Flag,
- Activity_Class_RecID,
- Activity_Type_RecID,
- NULL AS SR_Urgency_RecID,
- PM_Type_RecID,
- TE_Billable_Flag,
- TE_Invoice_Flag,
- EX_Billable_Flag,
- EX_Invoice_Flag,
- IV_Billable_Flag,
- IV_Invoice_Flag,
- '0.00' AS PP_Adjustment,
- GETDATE() AS Last_Update,
- @ImportBatchUser AS Updated_By,
- NULL AS SR_Type_RecID,
- TopComment_Flag,
- BottomComment_Flag,
- '' AS Carryover_ID,
- AppCycle_ID,
- Overrun_Flag,
- '' AS BillPeriod_ID,
- CycleBasis_ID,
- Taxable_Flag,
- Tax_Code_RecID,
- NULL AS TE_Amount,
- 0 AS TE_UseBill_Flag,
- TE_InvCust_Flag,
- EX_InvCust_Flag,
- IV_InvCust_Flag,
- PP_Unlimited_Flag,
- 'W' AS BR_Option,
- Bill_Start_Date,
- CarryOver_Days,
- INT_Overruns_Percent,
- ISNULL(PP_Expire_Flag, 0),
- ',' AS Notification_History,
- Charge_Firm_Flag,
- SR_SLA_RecID,
- PP_Tax_Flag,
- '0.00' AS NetBalance,
- '0.00' AS Overrun,
- Billing_Company_RecID,
- Billing_Address_RecID,
- Restrict_DP_Flag,
- Billing_Terms_RecID,
- NULL AS TE_AmtOption,
- '0' AS TE_UseRate_Flag,
- '0' AS TE_UseAmt_Flag,
- bl_invTemplate_Setup_RecID,
- NULL AS Avail_Balance,
- NULL AS parent_recid,
- Comp_Rate_Option,
- Comp_Limit_Option,
- Comp_Rate_Amount,
- Comp_Limit_Amount,
- 'zAdmin'
- FROM #Import_Staging
- END
- -- AGR_Header insert
- -- Post-2017.6 (Currency_RecID column added + NOT NULL)
- IF EXISTS(SELECT TOP 1 * FROM sys.columns WHERE name = 'Currency_RecID' AND OBJECT_NAME(OBJECT_ID) = 'AGR_Header')
- BEGIN
- -- Temporarily repurpose PP_Billing_Cycle_RecID to store excel row number
- INSERT INTO dbo.AGR_Header
- (
- AGR_Type_RecID,
- AGR_Name,
- AGR_Date_Start,
- AGR_Date_End,
- AGR_NoEnd_Flag,
- AGR_Billing_Cycle_RecID,
- AGR_OneTime_Flag,
- AGR_Amount,
- AGR_Calc_Flag,
- AGR_Prorate,
- AGR_InvDesc,
- Company_RecID,
- Contact_RecID,
- AGR_PONbr,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- OL_Restrict_Flag,
- BU_Restrict_Flag,
- SubCompany_RecID,
- SubContact_RecID,
- Sub_WONbr,
- AGR_Cancel_Flag,
- AGR_Date_Cancel,
- AGR_Reason_Cancel,
- AGR_Cancel_By,
- PP_Billing_Cycle_RecID,
- PP_One_Time_Flag,
- AGR_Detail_Type_ID,
- PP_Amount,
- PP_Carryover_Flag,
- PP_Time_Flag,
- PP_Expenses_Flag,
- PP_Products_Flag,
- AGR_Notes,
- AGR_Default_Flag,
- Activity_Class_RecID,
- Activity_Type_RecID,
- SR_Urgency_RecID,
- PM_Type_RecID,
- TE_Billable_Flag,
- TE_Invoice_Flag,
- EX_Billable_Flag,
- EX_Invoice_Flag,
- IV_Billable_Flag,
- IV_Invoice_Flag,
- PP_Adjustment,
- Last_Update,
- Updated_By,
- SR_Type_RecID,
- TopComment_Flag,
- BottomComment_Flag,
- Carryover_ID,
- AppCycle_ID,
- Overrun_Flag,
- BillPeriod_ID,
- CycleBasis_ID,
- Taxable_Flag,
- Tax_Code_RecID,
- TE_Amount,
- TE_UseBill_Flag,
- TE_InvCust_Flag,
- EX_InvCust_Flag,
- IV_InvCust_Flag,
- PP_Unlimited_Flag,
- BR_Option,
- Bill_Start_Date,
- CarryOver_Days,
- Overrun_Limit,
- PP_Expire_Flag,
- Notification_History,
- Charge_Firm_Flag,
- SR_SLA_RecID,
- PP_Tax_Flag,
- NetBalance,
- Overrun,
- Billing_Company_RecID,
- Billing_Address_RecID,
- Restrict_DP_Flag,
- Billing_Terms_RecID,
- TE_AmtOption,
- TE_UseRate_Flag,
- TE_UseAmt_Flag,
- bl_invTemplate_Setup_RecID,
- Avail_Balance,
- parent_recid,
- Comp_Rate_Option,
- Comp_Limit_Option,
- Comp_Rate_Amount,
- Comp_Limit_Amount,
- Entered_By,
- Currency_RecID
- )
- SELECT
- AGR_Type_RecID,
- AGR_Name,
- AGR_Date_Start,
- AGR_Date_End,
- AGR_NoEnd_Flag,
- AGR_Billing_Cycle_RecID,
- AGR_OneTime_Flag,
- AGR_Amount,
- 0 AS AGR_Calc_Flag,
- AGR_Prorate,
- AGR_InvDesc,
- Company_RecID,
- Contact_RecID,
- AGR_PONbr,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- OL_Restrict_Flag,
- BU_Restrict_Flag,
- NULL AS SubCompany_RecID,
- NULL AS SubContact_RecID,
- NULL AS Sub_WONbr,
- 0 AS AGR_Cancel_Flag,
- NULL AS AGR_Date_Cancel,
- NULL AS AGR_Reason_Cancel,
- 0 AS AGR_Cancel_By,
- [ExcelRowNumber] AS PP_Billing_Cycle_RecID,
- PP_One_Time_Flag,
- AGR_Detail_Type_ID,
- PP_Amount,
- PP_Carryover_Flag,
- PP_Time_Flag,
- PP_Expenses_Flag,
- PP_Products_Flag,
- AGR_Notes,
- 0 AS AGR_Default_Flag,
- Activity_Class_RecID,
- Activity_Type_RecID,
- NULL AS SR_Urgency_RecID,
- PM_Type_RecID,
- TE_Billable_Flag,
- TE_Invoice_Flag,
- EX_Billable_Flag,
- EX_Invoice_Flag,
- IV_Billable_Flag,
- IV_Invoice_Flag,
- '0.00' AS PP_Adjustment,
- GETDATE() AS Last_Update,
- @ImportBatchUser AS Updated_By,
- NULL AS SR_Type_RecID,
- TopComment_Flag,
- BottomComment_Flag,
- '' AS Carryover_ID,
- AppCycle_ID,
- Overrun_Flag,
- '' AS BillPeriod_ID,
- CycleBasis_ID,
- Taxable_Flag,
- Tax_Code_RecID,
- NULL AS TE_Amount,
- 0 AS TE_UseBill_Flag,
- TE_InvCust_Flag,
- EX_InvCust_Flag,
- IV_InvCust_Flag,
- PP_Unlimited_Flag,
- 'W' AS BR_Option,
- Bill_Start_Date,
- CarryOver_Days,
- INT_Overruns_Percent,
- ISNULL(PP_Expire_Flag, 0),
- ',' AS Notification_History,
- Charge_Firm_Flag,
- SR_SLA_RecID,
- PP_Tax_Flag,
- '0.00' AS NetBalance,
- '0.00' AS Overrun,
- Billing_Company_RecID,
- Billing_Address_RecID,
- Restrict_DP_Flag,
- Billing_Terms_RecID,
- NULL AS TE_AmtOption,
- '0' AS TE_UseRate_Flag,
- '0' AS TE_UseAmt_Flag,
- bl_invTemplate_Setup_RecID,
- NULL AS Avail_Balance,
- NULL AS parent_recid,
- Comp_Rate_Option,
- Comp_Limit_Option,
- Comp_Rate_Amount,
- Comp_Limit_Amount,
- 'zAdmin',
- Currency_RecID
- FROM #Import_Staging
- OUTER APPLY(SELECT 1 AS hack FROM #Force_Compile)hack
- END
- -- Clean up #Force_Compile
- IF OBJECT_ID('tempdb..#Force_Compile') IS NOT NULL
- DROP TABLE #Force_Compile
- -- Join AGR_Header back to staging table to capture identity for new rows
- UPDATE stag
- SET stag.AGR_Header_RecID = agr.AGR_Header_RecID
- FROM #Import_Staging stag
- INNER JOIN AGR_Header agr
- ON stag.ExcelRowNumber = agr.PP_Billing_Cycle_RecID
- AND agr.Updated_By = @ImportBatchUser
- -- Set PP_Billing_Cycle_RecID to 0
- UPDATE agr
- SET agr.PP_Billing_Cycle_RecID = 0
- FROM AGR_Header agr
- WHERE Updated_By = @ImportBatchUser
- -- Error if any row was not inserted (identity not populated)
- IF EXISTS(SELECT TOP 1 * FROM #Import_Staging WHERE AGR_Header_RecID IS NULL)
- BEGIN
- 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)
- SELECT * FROM #Import_Staging
- END
- -- AGR_Site Insert
- INSERT INTO AGR_Site
- (
- AGR_Header_RecID,
- Company_Address_Recid,
- Last_Update,
- Updated_By,
- Company_RecID
- )
- SELECT
- AGR_Header_RecID,
- Company_Address_RecID,
- GETDATE(),
- @ImportBatchUser,
- Company_RecID
- FROM #Import_Staging stag
- WHERE stag.Company_Address_RecID IS NOT NULL
- -- Copy exclusions from AGR_Type_Exclusion to AGR_Exclusion
- INSERT INTO AGR_Exclusion
- (
- AGR_Header_RecID,
- Activity_Type_RecID,
- Activity_Class_RecID,
- Updated_By,
- Last_Update
- )
- SELECT
- stag.AGR_Header_RecID,
- ate.Activity_Type_RecID,
- ate.Activity_Class_RecID,
- @ImportBatchUser,
- GETDATE()
- FROM #Import_Staging stag
- INNER JOIN dbo.AGR_Type_Exclusion ate
- ON ate.AGR_Type_RecID = stag.AGR_Type_RecID
- -- Copy defaults from AGR_Type_Default to AGR_Default
- INSERT INTO AGR_Default
- (
- AGR_Header_RecID,
- Owner_Level_RecID,
- Billing_Unit_RecID,
- SR_Board_RecID,
- SR_Type_RecID,
- Default_Flag,
- Last_Update,
- Updated_By
- )
- SELECT
- stag.AGR_Header_RecID,
- atd.Owner_Level_RecID,
- atd.Billing_Unit_RecID,
- atd.SR_Board_RecID,
- atd.SR_Type_RecID,
- atd.Default_Flag,
- GETDATE(),
- @ImportBatchUser
- FROM #Import_Staging stag
- INNER JOIN AGR_Type_Default atd
- ON atd.AGR_Type_RecID = stag.AGR_Type_RecID
- -- Copy work roles to dbo.Company_Billing_Rate from dbo.AGR_Type_WRole
- -- For agreement types where Copy_Work_Roles_Flag = 1
- INSERT INTO dbo.Company_Billing_Rate
- (
- Owner_ID,
- Company_RecID,
- Date_Effective,
- Last_Update,
- Updated_By,
- Date_Ending,
- Rate_Type,
- Activity_Class_RecID,
- BR_Option,
- Owner_Level_RecID
- )
- SELECT
- 1,
- stag.Company_RecID,
- wrl.Date_Effective,
- GETDATE(),
- @ImportBatchUser,
- wrl.Date_Ending,
- wrl.Rate_Type,
- wrl.Activity_Class_RecID,
- 'W',
- NULL
- FROM #Import_Staging stag
- INNER JOIN AGR_Type aty
- ON stag.AGR_Type_RecID = aty.AGR_Type_RecID
- INNER JOIN AGR_Type_WRole wrl
- ON wrl.AGR_Type_RecID = aty.AGR_Type_RecID
- WHERE aty.Copy_Work_Roles_Flag = 1
- -- Copy work types to dbo.Company_Activity_Type from dbo.AGR_Type_WType
- -- For agreement types where Copy_Work_Types_Flag = 1
- INSERT INTO dbo.Company_Activity_Type
- (
- Owner_ID,
- Company_RecID,
- Hours_Min,
- Rate_Type,
- Rate,
- Inactive_Flag,
- Last_Update,
- Updated_By,
- Hours_Max,
- Billable_Flag,
- Activity_Type_RecID,
- AGR_Header_RecID,
- Owner_Level_RecID,
- Date_Effective,
- Date_Ending,
- Company_Address_RecID,
- Entered_By
- )
- SELECT
- 1,
- stag.Company_RecID,
- atw.Hours_Min,
- atw.Rate_Type,
- atw.Rate,
- 0,
- GETDATE(),
- @ImportBatchUser,
- atw.Hours_Max,
- 1,
- atw.Activity_Type_RecID,
- stag.AGR_Header_RecID,
- NULL,
- atw.Date_Effective,
- atw.Date_Ending,
- NULL,
- 'Import'
- FROM #Import_Staging stag
- INNER JOIN AGR_Type aty
- ON aty.AGR_Type_RecID = stag.AGR_Type_RecID
- INNER JOIN AGR_Type_WType atw
- ON atw.AGR_Type_RecID = aty.AGR_Type_RecID
- WHERE aty.Copy_Work_Types_Flag = 1
- COMMIT TRANSACTION AGR_Import
- SELECT
- 1 AS Success,
- NULL AS RowNumber,
- NULL AS ValMsg
- RETURN
- END
- -- Condense row numbers to return one line per unique validation message
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 0)
- BEGIN
- exec dbo.usp_Condense_Validation_Results
- IF @ProcName = 'usp_AGR_ImportValidate'
- BEGIN
- SELECT
- 0 AS ValPassed,
- 0 AS RowNumber,
- t.ValMsg + ' on row(s): ' + STUFF((SELECT ', ' + CONVERT(NVARCHAR(50), RowNumber) AS ValMsg
- FROM #ResultsCondensed
- WHERE ValMsg = t.ValMsg
- FOR XML PATH(''), TYPE
- ).value('.', 'varchar(max)'), 1, 2, '') AS ValMsg
- FROM #ResultsCondensed t
- GROUP BY t.ValMsg
- END
- IF @ProcName = 'usp_AGR_ImportPush'
- BEGIN
- SELECT
- 0 AS Success,
- 0 AS RowNumber,
- t.ValMsg + ' on row(s): ' + STUFF((SELECT ', ' + CONVERT(NVARCHAR(50), RowNumber) AS ValMsg
- FROM #ResultsCondensed
- WHERE ValMsg = t.ValMsg
- FOR XML PATH(''), TYPE
- ).value('.', 'varchar(max)'), 1, 2, '') AS ValMsg
- FROM #ResultsCondensed t
- GROUP BY t.ValMsg
- END
- END
- ELSE
- IF EXISTS(SELECT TOP 1 * FROM #tblResults WHERE Warning_Flag = 1)
- BEGIN
- SELECT
- 2 AS ValPassed,
- 0 AS RowNumber,
- 'The following ' + ReferenceType + ' will be created: '+
- STUFF(
- (SELECT ', ' + ValMsg
- FROM #tblResults
- WHERE [ReferenceType] = res.[ReferenceType] AND res.ReferenceType IS NOT NULL
- FOR XML PATH (''))
- , 1, 1, '') AS ValMsg
- FROM #tblResults res
- GROUP BY ReferenceType
- END
- ELSE IF NOT EXISTS(SELECT TOP 1 * FROM #tblResults)
- BEGIN
- SELECT
- 1 AS ValPassed,
- NULL AS RowNumber,
- NULL AS ValMsg
- END
- ROLLBACK TRANSACTION AGR_Import
- END TRY
- BEGIN CATCH
- -- Return error information and rollback transaction
- SELECT
- 0 AS Success,
- ERROR_LINE() AS ExcelRowNumber,
- ERROR_MESSAGE() AS ErrorDetails
- ROLLBACK TRANSACTION AGR_Import
- END CATCH
- GO
- SELECT 'Import procedures created - Ready to proceed'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement