diff --git a/api/sql/schema/350-rule.condition.sql b/api/sql/schema/350-rule.condition.sql index 8c8376f8..42f6df81 100644 --- a/api/sql/schema/350-rule.condition.sql +++ b/api/sql/schema/350-rule.condition.sql @@ -17,5 +17,5 @@ CREATE TABLE [rule].[condition] ( updatedOn DATETIME2 (0) NULL, -- date of the rule updated [status] VARCHAR(20) NULL DEFAULT('pending'), CONSTRAINT [pkRuleCondition] PRIMARY KEY CLUSTERED ([conditionId] ASC), - CONSTRAINT [ukRuleConditionName] UNIQUE ([name]) + CONSTRAINT [ukRuleConditionName] UNIQUE ([name], [isDeleted]) ) diff --git a/api/sql/schema/380-rule.alterTable.sql b/api/sql/schema/380-rule.alterTable.sql index 95a6bba1..26217fdc 100644 --- a/api/sql/schema/380-rule.alterTable.sql +++ b/api/sql/schema/380-rule.alterTable.sql @@ -160,12 +160,49 @@ BEGIN END END -IF NOT EXISTS( SELECT 1 FROM sys.objects WHERE Name = N'ukRuleConditionName' ) -BEGIN - DECLARE @updateName NVARCHAR(MAX) = 'UPDATE [rule].[condition] SET [name] = ''Rule '' + CAST(conditionId AS VARCHAR(20)) WHERE [name] IS NULL' - EXEC(@updateName) - ALTER TABLE [rule].[condition] ALTER COLUMN [name] NVARCHAR(100) NOT NULL - ALTER TABLE [rule].[condition] ADD CONSTRAINT [ukRuleConditionName] UNIQUE ([name]) +-- Check if isDeleted already part of the index/constraint +IF NOT EXISTS ( + SELECT 1 + FROM sys.indexes i + JOIN sys.index_columns ic + ON i.object_id = ic.object_id + AND i.index_id = ic.index_id + JOIN sys.columns c + ON ic.object_id = c.object_id + AND ic.column_id = c.column_id + WHERE i.name = 'ukRuleConditionName' + AND OBJECT_NAME(i.object_id) = 'condition' + AND c.name = 'isDeleted' +) +BEGIN + + -- Drop UNIQUE constraint if exists + IF EXISTS ( + SELECT 1 + FROM sys.key_constraints + WHERE name = 'ukRuleConditionName' + AND parent_object_id = OBJECT_ID('rule.condition') + ) + BEGIN + ALTER TABLE [rule].[condition] + DROP CONSTRAINT ukRuleConditionName; + END + + -- Drop index if exists (only if it was manually created) + IF EXISTS ( + SELECT 1 + FROM sys.indexes + WHERE name = 'ukRuleConditionName' + AND object_id = OBJECT_ID('rule.condition') + ) + BEGIN + DROP INDEX ukRuleConditionName ON [rule].[condition]; + END + + -- Recreate unique index including isDeleted + CREATE UNIQUE INDEX ukRuleConditionName + ON [rule].[condition] ([name], isDeleted); + END IF NOT EXISTS( SELECT 1 FROM sys.columns WHERE Name = N'description' AND OBJECT_ID = OBJECT_ID(N'rule.condition') ) diff --git a/api/sql/schema/750-rule.rule.add.sql b/api/sql/schema/750-rule.rule.add.sql index 676d9fcb..0dcfea29 100644 --- a/api/sql/schema/750-rule.rule.add.sql +++ b/api/sql/schema/750-rule.rule.add.sql @@ -32,10 +32,22 @@ BEGIN TRY SELECT [name] FROM [rule].condition WHERE [name] = (SELECT [name] FROM @condition) + AND isDeleted = 0 ) - BEGIN - RAISERROR ('rule.duplicatedName', 16, 1) - END + BEGIN + RAISERROR ('rule.duplicatedName', 16, 1) + END + + IF EXISTS + ( + SELECT [name] + FROM [rule].condition + WHERE [priority] = (SELECT [priority] FROM @condition) + AND isDeleted = 0 + ) + BEGIN + RAISERROR ('rule.duplicatedPriority', 16, 1) + END BEGIN TRANSACTION DECLARE @DisableRuleMC TINYINT = (SELECT [value] FROM core.configuration WHERE [key] = 'DisableRuleM/C') diff --git a/api/sql/schema/750-rule.rule.addUnapproved.sql b/api/sql/schema/750-rule.rule.addUnapproved.sql index bbd1d2e2..42049182 100644 --- a/api/sql/schema/750-rule.rule.addUnapproved.sql +++ b/api/sql/schema/750-rule.rule.addUnapproved.sql @@ -18,6 +18,7 @@ BEGIN TRY SELECT [name] FROM [rule].condition WHERE [name] = (SELECT [name] FROM @condition) + AND isDeleted = 0 ) OR EXISTS @@ -30,23 +31,24 @@ BEGIN TRY RAISERROR ('rule.duplicatedName', 16, 1) END - -- IF EXISTS - -- ( - -- SELECT [priority] - -- FROM [rule].condition - -- WHERE [priority] = (SELECT [priority] FROM @condition) - -- AND isDeleted = 0 - -- ) - -- OR - -- EXISTS - -- ( - -- SELECT [priority] - -- FROM [rule].conditionUnapproved - -- WHERE [priority] = (SELECT [priority] FROM @condition) - -- ) - -- BEGIN - -- RAISERROR ('rule.duplicatedPriority', 16, 1) - -- END + IF EXISTS + ( + SELECT [priority] + FROM [rule].condition + WHERE [priority] = (SELECT [priority] FROM @condition) + AND isDeleted = 0 + ) + OR + EXISTS + ( + SELECT [priority] + FROM [rule].conditionUnapproved + WHERE [priority] = (SELECT [priority] FROM @condition) + AND isDeleted = 0 + ) + BEGIN + RAISERROR ('rule.duplicatedPriority', 16, 1) + END BEGIN TRANSACTION diff --git a/api/sql/schema/750-rule.rule.approve.sql b/api/sql/schema/750-rule.rule.approve.sql index 371314c5..3dd22333 100644 --- a/api/sql/schema/750-rule.rule.approve.sql +++ b/api/sql/schema/750-rule.rule.approve.sql @@ -34,19 +34,19 @@ BEGIN TRY WHEN EXISTS ( SELECT 1 FROM [rule].[conditionUnapproved] - WHERE conditionId = @conditionId AND isEnabled = 1 + WHERE conditionId = @conditionId AND isEnabled = 1 AND isDeleted = 0 ) AND EXISTS ( SELECT 1 FROM [rule].[condition] - WHERE conditionId = @conditionId AND isEnabled = 0 + WHERE conditionId = @conditionId AND isEnabled = 0 AND isDeleted = 0 ) THEN 1 -- Both conditions are true ELSE 0 -- At least one condition is false END; BEGIN TRANSACTION - IF EXISTS(SELECT 1 FROM [rule].[conditionUnapproved] WHERE conditionId = @conditionId AND isEnabled = 0) + IF EXISTS(SELECT 1 FROM [rule].[conditionUnapproved] WHERE conditionId = @conditionId AND isEnabled = 0 AND isDeleted = 0) BEGIN UPDATE c SET isEnabled = 0, diff --git a/api/sql/schema/750-rule.rule.edit.sql b/api/sql/schema/750-rule.rule.edit.sql index 5b892fc9..16697b93 100644 --- a/api/sql/schema/750-rule.rule.edit.sql +++ b/api/sql/schema/750-rule.rule.edit.sql @@ -29,7 +29,8 @@ BEGIN TRY SELECT [name] FROM [rule].condition WHERE [name] = (SELECT [name] FROM @condition) - AND conditionId != @conditionId + AND isDeleted = 0 + AND conditionId != @conditionId ) BEGIN RAISERROR ('rule.duplicatedName', 16, 1) diff --git a/test/jobs/test.rule.js b/test/jobs/test.rule.js index 610df96e..a26bd4cb 100644 --- a/test/jobs/test.rule.js +++ b/test/jobs/test.rule.js @@ -133,56 +133,56 @@ module.exports = function test() { name: 'get Rule 1', params: ({rule1: {condition: [{conditionId}]}}) => ({conditionId}) }), - // same priority different name - ruleRuleAdd({ - name: 'rule 2', - params: { - condition: { - name: ruleName, - operationEndDate: '2020-01-01T00:00:00.000Z', - priority: 122300 - } - } - }), - ruleConditionGet({ - name: 'get Rule 2', - params: ({'rule 2': {condition: [{conditionId}]}}) => ({conditionId}) - }), - ruleConditionFetch({ - name: 'fetch rule 2', - params: { - name: ruleName - } - }), - { - name: 'rule 2 to be duplicated - expected error', - method: 'rule.rule.add', - params: { - condition: { - name: ruleName, - priority: 145600 - } - }, - error: function(error, assert) { - assert.equal(error.type, 'rule.duplicatedName', 'Rule with this name already exists'); - } - }, - { - name: 'rule 2 to be duplicated but created in another BU - expected error', - method: 'rule.rule.add', - params: ({businessUnitId}) => ({ - condition: { - name: ruleName, - priority: 145600 - }, - conditionActor: [{ - actorId: businessUnitId - }] - }), - error: function(error, assert) { - assert.equal(error.type, 'rule.duplicatedName', 'Rule with this name already exists'); - } - }, + // // same priority different name + // ruleRuleAdd({ + // name: 'rule 2', + // params: { + // condition: { + // name: ruleName, + // operationEndDate: '2020-01-01T00:00:00.000Z', + // priority: 122300 + // } + // } + // }), + // ruleConditionGet({ + // name: 'get Rule 2', + // params: ({'rule 2': {condition: [{conditionId}]}}) => ({conditionId}) + // }), + // ruleConditionFetch({ + // name: 'fetch rule 2', + // params: { + // name: ruleName + // } + // }), + // { + // name: 'rule 2 to be duplicated - expected error', + // method: 'rule.rule.add', + // params: { + // condition: { + // name: ruleName, + // priority: 145600 + // } + // }, + // error: function(error, assert) { + // assert.equal(error.type, 'rule.duplicatedName', 'Rule with this name already exists'); + // } + // }, + // { + // name: 'rule 2 to be duplicated but created in another BU - expected error', + // method: 'rule.rule.add', + // params: ({businessUnitId}) => ({ + // condition: { + // name: ruleName, + // priority: 145600 + // }, + // conditionActor: [{ + // actorId: businessUnitId + // }] + // }), + // error: function(error, assert) { + // assert.equal(error.type, 'rule.duplicatedName', 'Rule with this name already exists'); + // } + // }, ruleRuleAdd({ name: 'rule 3 success general fields', params: ({ diff --git a/ui/react/pages/RuleProfile/Tabs/style.css b/ui/react/pages/RuleProfile/Tabs/style.css index 9ea7781e..a5284fd2 100644 --- a/ui/react/pages/RuleProfile/Tabs/style.css +++ b/ui/react/pages/RuleProfile/Tabs/style.css @@ -112,7 +112,7 @@ color: #595959; } .labelWrap { - width: 30%; + width: 30% !important; } .outerWrap .labelWrap { width: 25%;