Avoid updating issue with older changes Salesforce <> Jira

A continuity from: Avoid updating issue with older changes ADO <> Jira, Jira <> Jira, ServiceNow <> Jira, ZenDesk <> Jira

For the use case we will sync Salesforce Case “Assignee” <> Jira Assignee and Salesforce Status <> Jira Status fields.

Salesforce Outgoing Script:

replica.status = entity.Status
if (entity.Assignee__c)
    replica.assigneeUsername = nodeHelper.getReference('Case', 'Assignee__c', entity.Assignee__c)?.Username__c

request = "/services/data/v54.0/query?q=" +
"SELECT Field,OldValue,NewValue,CreatedDate FROM CaseHistory " +
"WHERE CaseId='${entity.Id}' " +
"ORDER BY CreatedDate DESC"

records = httpClient.get(request).records

def dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")

def history = []

records.eachWithIndex { r, i ->
    if(r.Field && !(r.OldValue == null && r.NewValue == null)){
    def author = new com.exalate.basic.domain.hubobject.v1.BasicHubUser()
    author.key = "salesforce"
    author.displayName = "salesforce"
    author.active = true

    def date = dateFormat.parse(r.CreatedDate)
    def timestamp = new java.sql.Timestamp(date.time)

    def changeItem =
        new com.exalate.basic.domain.hubobject.v1.BasicHubChangeItem(
            r.OldValue as String,
            r.OldValue as String,
            r.NewValue as String,
            r.NewValue as String,
            r.Field,
            "system"
        )

    history << new com.exalate.basic.domain.hubobject.v1.BasicHubChangeHistory(
        i as Long,
        author,
        timestamp,
        [changeItem]
    )
  }
}
replica.changeHistory = history

Salesforce Incoming Script:

def fieldToLastUpdateDateFn = { exalateUserKey ->
        { history ->
            history
                .sort { c -> c.created.time }
                .reverse()
                .findAll { c -> c.author.key != exalateUserKey && c.author.key != "salesforce"}
                .inject([:]) { result, c ->
                    c.changeItems.inject(result) { r, i ->
                        if(r[i.field] == null){
                            r[i.field] = c.created
                        }
                        r
                    }
                }
        }
    }

    def remoteFieldToLastUpdateDate =
        fieldToLastUpdateDateFn("exalate")(replica.changeHistory)

    def localFieldToLastUpdateDate =
        fieldToLastUpdateDateFn("exalate")(entity.changeHistory)

    if(remoteFieldToLastUpdateDate."assignee" > localFieldToLastUpdateDate."Assignee" && replica.assignee){

        def rContact = httpClient.get("/services/data/v61.0/query?q=SELECT Id, Username__c FROM R_Contact__c where Username__c = '${replica.assignee.username}' and Active__c = true")?.records?[0]?.Id
    if (!rContact) rContact = httpClient.post("/services/data/v61.0/sobjects/R_Contact__c", """
        {
            "Name": "${replica.assignee.displayName}",
            "Username__c": "${replica.assignee.username}",
            "Email__c": "${replica.assignee.email}",
            "Active__c": ${replica.assignee.active}
        }
    """)?.id
    entity.Assignee__c = rContact
    }

    if(remoteFieldToLastUpdateDate."status" > localFieldToLastUpdateDate."Status"){

        entity.Status = (replica.status?.value != "Closed") ? replica.status?.value : 'Closed'
    }

Jira Outgoing Script:

replica.assignee = issue.assignee
replica.status = issue.status
replica.changeHistory = issue.changeHistory

Jira Incoming Script:

 def fieldToLastUpdateDateFn = { exalateUserKey ->
        { history ->
            history
                .sort { c -> c.created.time }
                .reverse()
                .findAll { c -> c.author.key != exalateUserKey }
                .inject([:]) { result, c ->
                    c.changeItems.inject(result) { r, i ->
                        if(r[i.field] == null){
                            r[i.field] = c.created
                        }
                        r
                    }
                }
        }
    }

    def remoteFieldToLastUpdateDate =
        fieldToLastUpdateDateFn("exalate")(replica.changeHistory ?: [])

    def localFieldToLastUpdateDate =
        fieldToLastUpdateDateFn("exalate")(issue.changeHistory ?: [])

    def remoteStatusTime = remoteFieldToLastUpdateDate["Status"]
    def localStatusTime  = localFieldToLastUpdateDate["status"]

    if(remoteStatusTime && (!localStatusTime || remoteStatusTime > localStatusTime)){
        issue.setStatus(replica.status?.name)
    }
    def remoteAssigneeTime = remoteFieldToLastUpdateDate["Assignee"]
    def localAssigneeTime  = localFieldToLastUpdateDate["assignee"]

    if(remoteAssigneeTime && (!localAssigneeTime || remoteAssigneeTime > localAssigneeTime)){
        if(replica.assigneeUsername){
            def jiraUser = nodeHelper.getUserByUsername(replica.assigneeUsername)
            if(jiraUser){
                issue.assignee = jiraUser
            }
        }
    }

Tested and working!