Skip to main content
Book your demo
Example scripts
To homepage
Jira
Cloud icon
Cloud

Clone a Work item on transition with new due date and update date attribute of associated Assets.

Created 2 year(s) ago, Updated 7 day(s) ago
App in script
ScriptRunner For Jira
ScriptRunner For Jira
by Adaptavist
Compatibility
compatibility bullet
Jira
Language |
groovy
import java.time.format.DateTimeFormatter
import java.time.LocalDate
import java.sql.Timestamp

// To find the Assets Attribute ID: Navigate to Scheme > Object Type > Attributes
def assetCustomFieldName = "customfield_12834"
final lastMaintenanceDateAssetAttributeId = 153

def sourceWorkItem = WorkItems.getByKey(issue.key) // Get the work item
def dueDate = sourceWorkItem.getDueDate()

if (!dueDate) {
    logger.error "No original due date"
    return
}

def assetFieldValue = sourceWorkItem.getCustomFieldValue(assetCustomFieldName)

if (!assetFieldValue) {
    logger.error "No value in Assets field: $assetCustomFieldName"
    return
}

final dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")

def newDueDate = dueDate.toLocalDate().plusMonths(3)
def workItemKey = sourceWorkItem.getSpaceObject().key
def workTypeName = sourceWorkItem.getWorkType().name

WorkItems.create(workItemKey, workTypeName) {
    setSummary(sourceWorkItem.getSummary())
    setDescription(sourceWorkItem.getDescription())
    setDueDate(newDueDate.format(dateFormatter))
    setCustomFieldValue(assetCustomFieldName, assetFieldValue)
}.link("clones", sourceWorkItem)

assetFieldValue.each { asset ->
    def assetWorkspaceId = asset.workspaceId
    def assetObjectId = asset.objectId
    def updatedAssetResponse = put("https://api.atlassian.com/jsm/assets/workspace/" + assetWorkspaceId + "/v1/object/" + assetObjectId)
            .header("Content-Type", "application/json")
            .basicAuth("email@example.com", "<api_token>")
            .body([
                    attributes: [
                            [
                                    objectTypeAttributeId: lastMaintenanceDateAssetAttributeId,
                                    objectAttributeValues: [
                                            [
                                                    value: dueDate.toLocalDate().format(dateFormatter).toString(),
                                            ]
                                    ]
                            ]
                    ]
            ])
            .asObject(Map)

    assert updatedAssetResponse.status >= 200 && updatedAssetResponse.status < 300
}
Having an issue with this script?
Report it here