DataGen/Initialize-ChangeRequest.ps1

param ( $count = 1, [switch]$whatif, [switch]$verbose )
BEGIN
{
    . ./Common.ps1
    $global:IDD = new-object Microsoft.EnterpriseManagement.ConnectorFramework.IncrementalDiscoveryData
    $EMG = @(get-scsmsession)[0]
    # A USER
    $user = get-scsmobject (get-scsmclass ^System.User$) -filter "DisplayName -like 'asttest%'"
    $userList = get-scsmobject (get-scsmclass System.User$) -filter 'LastName -like "%"'
    $computerList = get-scsmobject (get-scsmclass Microsoft.Windows.computer$)
    $incidentList = get-scsmobject (get-scsmclass System.WorkItem.Incident$) -max 60

    $areaList = Get-SCSMChildEnumeration -enumeration (get-scsmenumeration ^ChangeAreaEnum$)

    $statusList = Get-SCSMChildEnumeration -enumeration (get-scsmenumeration ^ChangeStatusEnum$)
    $categoryList = Get-SCSMChildEnumeration -enumeration (get-scsmenumeration ^ChangeCategoryEnum$)
    $riskList = Get-SCSMChildEnumeration -enumeration (Get-SCSMEnumeration ^ChangeRiskEnum$)
    $impactList = Get-SCSMChildEnumeration -enumeration (Get-SCSMEnumeration ^ChangeImpactEnum$)
    $priorityList = Get-SCSMChildEnumeration -enumeration (Get-SCSMEnumeration ^ChangePriorityEnum$)

    trap { write-host "some error"; $error[0]; exit }

    # A function to add a Review and multiple Manual activities
    function Add-RAMA
    {
        param ( $currentActivity, [int]$manualActivityCount ) 
        # Review activity
        $ArgHash = Get-InstanceHash -id "RA{0}" -seq 1 -status "In Progress" -Stage "ValidateAndReview"
        $ReviewActivity = new-scsmobject (get-scsmclass System.WorkItem.Activity.ReviewActivity) -PropertyHashtable $ArgHash -nocommit
        $currentActivity.Add($ReviewActivity,$workItemContainsActivityRelationship.Target)

        # Create multiple Reviewer Objects, Add Reviewer Relationship and add user
        $currentReviewer = 0
        foreach($user in Get-RandomListFromList -list $UserList -count 4)
        {
            $reviewerHash = @{ ReviewerId = "{0}" } 
            if ( $RANDOM.Next(0,2))
            {
                $reviewerHash.Veto = $true
                $reviewerHash.MustVote = $true
            }
            $Reviewer = new-scsmobject (get-scsmclass System.Reviewer) -PropertyHashtable $reviewerHash -nocommit
            $CurrentActivity.Item("Activity")[0].Add($reviewer,$activityHasReviewerRelationship.Target)
            $CurrentActivity.Item("Activity")[0].Item("Reviewer")[$currentReviewer].Add($user,$reviewerIsUserRelationship.Target)
            $currentReviewer++
        }
        # Manual Activities
        $stages = "","", "Approve", "Initiate", "Test", "Develop", "Release"

        for($i = 2; $i -lt (2+$manualActivityCount); $i++)
        {
            $ArgHash = Get-InstanceHash -id "MA{0}" -seq $i -status "Pending" -Stage $stages[$i]
            $MA = new-scsmobject (get-scsmclass System.WorkItem.Activity.ManualActivity) -PropertyHashtable $ArgHash -nocommit
            $currentActivity.Add($MA,$workItemContainsActivityRelationship.Target)
            $assignedToRelationship = get-scsmrelationshipclass System.WorkItemAssignedToUser
            $currentActivity.Item("Activity")[$i-2].Add((get-randomitemfromlist $userList),$assignedToRelationship.Target)

            $aboutConfigItem        = get-scsmrelationshipclass System.WorkItemAboutConfigItem
            $global:foo = $currentactivity
            get-randomlistfromlist $computerlist 5 | %{
                $currentActivity.Item("Activity")[$i-1].Add($_, $aboutConfigItem.Target)
                }
        }
    }

}

END
{
    for ( $ChangeCount = 0; $ChangeCount -lt $count; $ChangeCount++ )
    {
        Write-Progress -Activity "Creating Projection" -Status "Creating Seed" -perc (($ChangeCount/$count)*100)
        $CreatedDate = [datetime]::Now.AddDays($RANDOM.Next(-90,-30))
        $RequiredBy = $CreatedDate.AddDays($RANDOM.Next(30,90))
        $ChangeProjection = new-scsmobjectprojection -nocommit System.WorkItem.ChangeRequestProjection @{ 
            __CLASS = "System.WorkItem.ChangeRequest"; 
            __OBJECT = @{ 
                Id                 = "customCR{0}" 
                Title              = get-lorem 6
                Description        = get-lorem 24
                Reason             = get-lorem 48
                ContactMethod      = "Telegraph"
                RequiredBy         = $RequiredBy
                ScheduledEndDate   = $RequiredBy.AddDays($RANDOM.Next(-7,-2))
                ScheduledStartDate = $CreatedDate.AddDays($RANDOM.Next(7,14))
                PlannedCost        = $Random.Next(10000,999999)/100
                Notes              = get-lorem 60
                CreatedDate        = $CreatedDate
                Category           = Get-RandomItemFromList $categoryList
                Impact             = Get-RandomItemFromList $impactList
                Priority           = Get-RandomItemFromList $priorityList
                Risk               = Get-RandomItemFromList $riskList
                Status             = Get-RandomItemFromList $statusList
                Area               = Get-RandomItemFromList $areaList
                ImplementationPlan = get-lorem 60
                RiskAssessmentPlan = get-lorem 60
                TestPlan           = get-lorem 60
                BackoutPlan        = get-lorem 60
                PostImplementationPlan = get-lorem 120
                }
            } 

        $ChangeProjection.Add( (get-randomitemfromlist $userlist), $workItemCreatedByUserRelationship.Target)
        $ChangeProjection.Add( (get-randomitemfromlist $userlist), $assignedToUserRelationship.Target)

        $relatesToRelationship = get-scsmrelationshipclass System.WorkItemRelatesToConfigItem
        get-randomlistfromlist $computerList 4 | %{ $ChangeProjection.Add($_,$relatesToRelationship.Target) }

        $relatesToWIRelationship = get-scsmrelationshipclass System.WorkItemRelatesToWorkItem
        $ChangeProjection.Add((Get-RandomItemFromList $incidentList),$relatesToWIRelationship.Target)

        $aboutConfigItemRelationship = get-scsmrelationshipclass System.WorkItemAboutConfigItem
        get-randomlistfromlist $computerList 3 | %{ $ChangeProjection.Add($_,$aboutConfigItemRelationship.Target) }
        # $ChangeProjection.Add( (get-randomlistfromlist $computerList 4), $relatesToRelationship.Target))

        #Write-Progress -Activity "Creating Projection" -Status "Creating Parallel Activity" -perc (($ChangeCount/$count)*100)
        # THE PARALLEL ACTIVITY - ONLY ONE OF THESE PER Change
        #$ArgHash = Get-InstanceHash -id "PA{0}" -seq 1 -status "In Progress" -Stage "Change"
        #$pa = new-scsmobject System.WorkITem.Activity.ParallelActivity -PropertyHashtable $ArgHash -nocommit
        $workItemContainsActivityRelationship = Get-SCSMRelationshipClass WorkItemContainsActivity
        #$ChangeProjection.Add($pa,$workItemContainsActivityRelationship.Target)

        Write-Progress -Activity "Creating Projection" -Status "Creating Sequential Activities" -perc (($ChangeCount/$count)*100)
        # CREATE THE SEQUENTIAL ACTIVITIES
        #for($i = 0; $i -lt 3; $i++)
        #{
        # $ArgHash = Get-InstanceHash -id "SA{0}" -seq $i -status "In Progress" -Stage "Change"
        # $sa = new-scsmobject System.WorkItem.Activity.SequentialActivity -PropertyHashtable $ArgHash -nocommit
        # $ChangeProjection.Item("Activity")[0].Add($sa,$workItemContainsActivityRelationship.Target)
        # $currentActivity = $ChangeProjection.Item("Activity")[0].Item("Activity")[$i]
            $currentActivity = $ChangeProjection
            Write-Progress -Activity "Creating Projection" -Status "Creating RA/MA Activities" -perc (($ChangeCount/$count)*100)
            Add-RAMA $currentActivity ($Random.Next(3,6))
        #}
        # add the projection to the IncrementalDiscoveryDataPacket
        if ( $whatif )
        {
            "What if: Performing operation 'Intialize-ChangeRequest' on Target $changeProjection"
        }
        else
        {
            Write-Verbose -verbose:$verbose $changeProjection 
            # $IDD.Add($changeProjection)
            $changeProjection.Commit()
        }
    }
    # commit the projections via IncrementalDiscoveryData
    Write-Progress -Activity "Creating Projection" -Status "Committing Projections" -perc (($ChangeCount/$count)*100)

    if ( ! $whatif )
    {
        Write-Verbose -verbose:$verbose "Committing $count ChangeRequest"
        #$EMG.Reconnect()
        #$IDD.Commit($EMG)
    }
}