Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Note

Remember to take a back backup first, and test of with Test before you touch Prod!

...

  • The script takes the stage assignee from the current asset status “owner”. If no “owner” is specified, then the task is left unassigned.

  • The title of the tasks is assigned to the English title for the asset. If the asset doesn’t have a title, then no task will be created.

  • The script is safe to run multiple times since it will skip assets that already have a task for the specified business workflow.

  • If something fails when the script runs, all changes are undone, and the system is left as it was before the script was run.

Note

Remember to take a back backup first, and test of with Test before you touch Prod!

Code Block
languagesql
declare @statusMapping table(statusValue nvarchar(max), stageUniqueId nvarchar(max), retired bit);

----- Set these parameters ------

declare @instanceOwnerId int = 10000;
declare @businessWorkflowId int = 2;


insert into @statusMapping(statusValue, stageUniqueId, retired)
values ('#54a0ff;creative', 'creative', 0),
       ('#1dd1a1;approved', 'approved', 0),
       ('#ee5253;expired', 'expired', 1);


----- Script, do not touch ------

declare @assetStatusLabelId int;
select @assetStatusLabelId = iml.item_metafield_labelid from item_metafield_label iml
join item_metafield im on iml.item_metafieldid = im.item_metafieldid
join item_item_metafield iim on im.item_metafieldid = iim.item_metafieldid
join item i on i.itemid = iim.itemid
where ItemGuid = '6fe35f10-c810-497b-af9c-e52c3d583593'
and iml.languageid = 3

declare @assetTitleLabelId int;
select @assetTitleLabelId = iml.item_metafield_labelid from item_metafield_label iml
join item_metafield im on iml.item_metafieldid = im.item_metafieldid
join item_item_metafield iim on im.item_metafieldid = iim.item_metafieldid
join item i on i.itemid = iim.itemid
where ItemGuid = '5eb3eefc-a043-410f-89b0-29ed3ef37078'
and iml.languageid = 3

declare @assetStatusOwnerLabelId int;
select @assetStatusOwnerLabelId = iml.item_metafield_labelid from item_metafield_label iml
join item_metafield im on iml.item_metafieldid = im.item_metafieldid
join item_item_metafield iim on im.item_metafieldid = iim.item_metafieldid
join item i on i.itemid = iim.itemid
where ItemGuid = 'fc948200-c103-41fb-8dae-bd1c5c6ce281'
and iml.languageid = 3

declare @workflowVersionId int;
select @workflowVersionId = versions.Id from BusinessWorkflowService_WorkflowDefinitionVersions versions
where versions.WorkflowDefinitionId = @businessWorkflowId;

declare @existingTasks table(itemId int INDEX IX1 CLUSTERED);
insert into @existingTasks(itemId)
select items.ItemId from BusinessWorkflowService_WorkflowInstanceItems items
join BusinessWorkflowService_WorkflowProjectInstances instances on instances.Id = items.WorkflowInstanceId
    where instances.WorkflowDefinitionVersionId = @workflowVersionId;

declare @assets table (assetId int, itemId int, uniqueStageId nvarchar(max), title nvarchar(max), retired bit, createdAt datetime, statusUpdatedAt datetime, stageOwnerId int)

insert into @assets(assetId, itemId, uniqueStageId, title, retired, createdAt, statusUpdatedAt, stageOwnerId)
select a.assetid, ia.itemid, map.stageUniqueId, imv_title.value, map.retired, a.upload_date, imv_status.DateModified, im.memberid from asset a
join item_asset ia on a.assetid = ia.assetid
join item i on ia.itemid = i.itemid
join item_metafield_value imv_status on i.itemid = imv_status.itemid
join item_combo_value icv on imv_status.item_metafield_labelid = icv.item_metafield_labelid and imv_status.item_combo_valueid = icv.item_combo_valueid
join @statusMapping map on map.statusValue = icv.optionvalue
join item_metafield_value imv_title on i.itemid = imv_title.itemid
left join item_metafield_value imv_owner on i.itemid = imv_owner.itemid and imv_owner.item_metafield_labelid = @assetStatusOwnerLabelId
left join item_member im on im.itemid = imv_owner.ref_itemid
where imv_status.item_metafield_labelid = @assetStatusLabelId
  and imv_title.item_metafield_labelid = @assetTitleLabelId
and not exists(select t.itemid from @existingTasks t where t.itemId = ia.itemid)


begin transaction;

declare @createdOwners table(memberId int, ownerId int);

insert into BusinessWorkflowService_Owners(Discriminator, MemberOwner_MemberId)
output inserted.MemberOwner_MemberId, inserted.Id into @createdOwners
select distinct 'MemberOwner', a.stageOwnerId from @assets a
where a.stageOwnerId is not null

insert into BusinessWorkflowService_Owners(Discriminator, MemberOwner_MemberId)
values ('MemberOwner', @instanceOwnerId)

declare @instanceOwnerOwnerId int = scope_identity();

declare @createdTasks table(assetId int, itemId int, taskId int);
merge BusinessWorkflowService_WorkflowProjectInstances as target
using @assets as src
    left join @createdOwners owner on src.stageOwnerId = owner.memberId
on (1 = 0)
when not matched then
    insert (WorkflowDefinitionVersionId, CurrentStageName, CreatedAt, Guid, InstanceOwnerId, LastModified, StageOwnerId, Retired, Name, CurrentStageEnteredAt)
    values (@workflowVersionId, src.uniqueStageId, src.createdAt, newid(), @instanceOwnerOwnerId, src.statusUpdatedAt, owner.ownerId, src.retired, src.title, src.statusUpdatedAt)
output src.assetId, src.itemId, inserted.Id into @createdTasks(assetId, itemId, taskId);

insert into BusinessWorkflowService_WorkflowInstanceItems(WorkflowInstanceId, ItemType, ItemBaseId, ItemId)
select t.taskId, 'asset', t.assetId, t.itemId from @createdTasks t;

commit transaction;
Note

Remember to take a back backup first, and test of with Test before you touch Prod!