Wednesday, April 3, 2013

Powershell To Attach workflow on Content Type and create Retention Policy on it - SharePoint 2013

Hi Friends,

I got a requirement to create retention policy on Content type and action is to start workflow. as well attach workflow to the content type.

I choose to go with powershell.

save the following code into file called SetupRetentionPolicy.ps1

call like:

 c:\>.\SetupRetentionPolicy.ps1 -url <weburl> -ContentTypeName <Contenttype>  



 param(  
 $url=$null,  
 $ContentTypeName=$null)  
 $site = get-spsite $url  
 $web = $site.openweb()  
 Enable-SPFeature –identity "LocationBasedPolicy" -URL $url -ErrorAction SilentlyContinue  
 $Property = "Modified"  
 $Period = 1;  
 $PeriodType = "years"  
 function AddWorkflowToContentType($site, $ctName, $WfName, $WfAssociationName, $TaxTaskList)  
   {  
   [void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SharePoint')   
   [void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.Office.Policy')  
   [Guid]$wfTemplateId = New-Object Guid  
     $web = $site.RootWeb  
     $ct = $web.ContentTypes[$ctName]  
     $culture = New-Object System.Globalization.CultureInfo("en-US")  
     $template = $site.RootWeb.WorkflowTemplates.GetTemplateByName($WfName, $culture)  
     if($template -ne $null)  
     {              
     $tasklist = $TaxTaskList  
     $historylist = "IP Workflow History"  
   # Workflow Association with Content Type  
       $association = [Microsoft.SharePoint.Workflow.SPWorkflowAssociation]::CreateSiteContentTypeAssociation($template, $WfAssociationName, $web.Lists[$tasklist], $web.Lists[$historylist])   
       $association.AllowManual = $false  
       $association.AutoStartCreate = $true  
       $ct.AddWorkflowAssociation($association)  
       $ct.UpdateWorkflowAssociationsOnChildren($true, $true, $true, $false)  
       $association.Enabled=$true  
       $ct.Update()  
       $web.Update()  
     }  
     else  
     {  
     Write-Error "Workflow Template not found"  
           Add-Content $logFileName "Workflow Template not found."  
     }  
   }  
 function StartWorkflow($site, $wfAssociationName, $listName, $contentType, $WfStartColumn)  
 {  
   $contentType = $web.ContentTypes[$contentType]  
   if($contentType)  
   {  
     [Microsoft.Office.RecordsManagement.InformationPolicy.Policy]::CreatePolicy($contentType, $null);  
     $newPolicy = [Microsoft.Office.RecordsManagement.InformationPolicy.Policy]::GetPolicy($contentType);  
      $wfAssociationId = $contentType.WorkflowAssociations.GetAssociationByName($wfAssociationName, 1033).ParentAssociationId.ToString()  
     $newPolicy.Items.Add("Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration",  
      "<Schedules nextStageId='3'>"+  
      "<Schedule type='Default'>"+  
      "<stages>"+  
      "<data stageId='1' stageDeleted='true'></data>"+  
      "<data stageId='2'>"+  
      "<formula id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn'>"+  
      "<number>"+$Period+"</number>"+"<property>"+$Property+"</property>"+  
      "<period>"+$PeriodType+"</period>"+  
      "</formula>"+  
      "<action type='workflow' id='"+ $wfAssociationId +"' />"+  
      "</data>"+  
      "</stages>"+  
      "</Schedule>"+  
      "</Schedules>");  
     $newPolicy.Items.Add("Microsoft.Office.RecordsManagement.PolicyFeatures.PolicyAudit",  
      "<Audit>"+  
      "<Update />"+  
      "<View />"+  
      "<CheckInOut />"+  
      "<MoveCopy />"+  
      "<DeleteRestore />"+  
      "</Audit>");  
     $newPolicy.Update();  
   }  
   }  
 $web.Dispose()  
 $site.Dispose()  
 echo "Finished!!!"  
  AddWorkflowToContentType -site $site -ctName $ContentTypeName -wfName "DocumentApprovalWorkflow" -WfAssociationName "DocumentApproval" -TaxTaskList "Improvement Tasks";  
  StartWorkflow -site $site -contentType $ContentTypeName -wfAssociationName "DocumentApproval" -listName "Documents" -WfStartColumn "Modified";  

Workflow should be availble on web when you run this script.
workflow is of sharepoint 2010 reusable type.

Happy Coding!!