How to migrate Asset Status to Business Workflow tasks
Remember to take a backup first, and test with Test before you touch Prod!
The below SQL script can be configured to migrate asset status to business workflow. The script is intelligent enough not to touch assets that already have an asset status, so you will not end up with duplicate tasks from trying out the system.
To configure the script, look at the parameters under “Set these parameters”:
“instanceOwnerId” should be the id of the user that will end up owning these tasks, usually something like “System” since this is asset lifecycle.
“businessWorkflowId” should be the id of the business workflow to migrate to.
Lastly, the values being inserted table should map from the
optionValue
of the given asset status to the unique id of the stage in the business workflow. The stage names will NOT be validated, so make sure they are correct, or you risk breaking the entire system. The last flag is if this task should be considered “retired”. The value should probably correspond to the value you defined for the stage in the business workflow, otherwise, it might lead to confusion.
Once that is done, you simply run the script. When it is done running, you should be able to see the new tasks in the MM UI.
Some notes:
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 assetcode (original file name) will be used.
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.
Remember to take a backup first, and test with Test before you touch Prod!
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 @missingAssets table(itemId int, assetId int);
insert into @missingAssets(itemId, assetId)
select ia.itemid, ia.assetid
from item_asset ia
join asset a on a.assetid = ia.assetid
join asset_damcatalog_folder adf on adf.assetid = ia.assetid
where a.deleted = 0 and
not exists (
select items.ItemId from BusinessWorkflowService_WorkflowInstanceItems items
join BusinessWorkflowService_WorkflowProjectInstances instances on instances.Id = items.WorkflowInstanceId
where instances.WorkflowDefinitionVersionId = @workflowVersionId
and items.ItemId = ia.itemid
);
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, a.assetcode, map.retired, a.upload_date, imv_status.DateModified, im.memberid
from @missingAssets missingAsset
join asset a on a.assetid = missingAsset.assetId
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
left join item_metafield_value imv_title on i.itemid = imv_title.itemid and imv_title.item_metafield_labelid = @assetTitleLabelId
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;
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;
Remember to take a backup first, and test with Test before you touch Prod!