Hi Ashar,
Please find the requested details.
Outgoing Script
replica.key = issue.key
replica.assignee = issue.assignee
replica.reporter = issue.reporter
replica.summary = issue.summary //ok
replica.description = issue.description //ok
replica.comments = issue.comments.findAll {it.internal}
replica.resolution = issue.resolution
replica.status = issue.status //ok
replica.parentId = issue.parentId
replica.priority = issue.priority //ok
replica.attachments = issue.attachments //ok
replica.project = issue.project //ok
def MASK_LIST = ["AMRI"]
def MASK_LABEL = "ROOMED"
if (issue.project?.key in MASK_LIST) {
replica.project.key = MASK_LABEL
replica.project.name = MASK_LABEL
}
replica.customFields."Service type" = issue.customFields."Service type"
replica.created = issue.created
// Outgoing sync script
def priorityName = replica.priority?.name
// Outgoing sync script for components
replica.components = issue.components
// Outgoing sync script for affected versions
replica.affectedVersions = issue.affectedVersions
// Outgoing sync script for fix versions
replica.fixVersions = issue.fixVersions
// Outgoing sync script for Requested Resolution Date
replica.customFields."Requested Resolution Date" = issue.customFields."Requested Resolution Date"
Incoming Script
import java.sql.Timestamp
import java.time.LocalDate
import java.time.LocalDateTime
def getDefaultUser() {
return nodeHelper.getUserByEmail("sys_dejsm@intel.com")
}
def getComponentLeadUser(componentName, projectKey) {
def project = nodeHelper.getProject(projectKey)
def component = nodeHelper.getComponent(componentName, project)
if (component?.lead) {
// Prefer email if available
if (component.lead.email) {
return nodeHelper.getUserByEmail(component.lead.email)
}
// Fallback to username/accountId
if (component.lead.name) {
return nodeHelper.getUser(component.lead.name)
}
}
return null
}
def setIssueTypeBasedOnServiceType(issue, replica) {
def serviceTypeValue = replica.customFields."Service type"?.value?.value
if (serviceTypeValue == "Defect") {
issue.typeName = "Bug"
} else if (["Enhancement", "Documentation", "Request"].contains(serviceTypeValue)) {
issue.typeName = "Request"
} else {
throw new Exception("Invalid Service type value: ${serviceTypeValue}")
}
}
def setChangeTypeBasedOnServiceType(issue, replica) {
def serviceTypeValue = replica.customFields."Service type"?.value?.value
if (issue.issueType?.name != "Bug") {
if (serviceTypeValue == "Enhancement") {
issue.customFields."Change Type".value = "Enhancement"
} else if (["Request", "Documentation"]?.contains(serviceTypeValue)) {
issue.customFields."Change Type".value = "Consultation"
} else {
issue.customFields."Change Type".value = null
}
}
}
def setAssigneeFromComponentLead(issue, replica) {
def leadUser = null
if (replica.components && replica.components.size() > 0) {
def componentName = replica.components[0]?.name
leadUser = getComponentLeadUser(componentName, issue.projectKey)
}
issue.assignee = leadUser ?: getDefaultUser()
}
def syncBasicFields(issue, replica) {
issue.summary = replica.summary
issue.attachments = attachmentHelper.mergeAttachments(issue, replica)
}
def syncComments(issue, replica) {
issue.comments = commentHelper.mergeComments(issue, replica, { it.internal = false; it })
}
def syncVersions(issue, replica) {
def project = nodeHelper.getProject(issue.projectKey)
// Handle Fix Versions
issue.fixVersions = replica.fixVersions.collect { v ->
def existingVersion = nodeHelper.getVersion(v.name, project)
return existingVersion ?: nodeHelper.createVersion(issue, v.name, v.description)
}
// Handle Affected Versions
issue.affectedVersions = replica.affectedVersions.collect { v ->
def existingVersion = nodeHelper.getVersion(v.name, project)
return existingVersion ?: nodeHelper.createVersion(issue, v.name, v.description)
}
}
def syncComponents(issue, replica) {
def targetProject = issue.project ?: nodeHelper.getProject(issue.projectKey)
issue.components = replica.components.collect { remoteComponent ->
def existingComponent = nodeHelper.getComponent(remoteComponent.name, targetProject)
if (existingComponent) {
return existingComponent
}
return nodeHelper.createComponent(
issue,
remoteComponent.name,
remoteComponent.description,
null,
"UNASSIGNED"
)
}.findAll { it != null }
}
def syncPriorityToUrgency(issue, replica) {
def urgencyMapping = [
"P1-Stopper" : "Critical",
"P2-High" : "High",
"P3-Medium" : "Medium",
"P4-Low" : "Low"
]
def priorityName = replica.priority?.name
def urgencyValue = urgencyMapping[priorityName] ?: "Medium"
def urgencyField = issue.customFields."Urgency"
if (urgencyField) {
urgencyField.value = urgencyValue
}
}
def syncPriorityToImpact(issue, replica) {
def impactMapping = [
"P1-Stopper" : "Extensive / Widespread",
"P2-High" : "Significant / Large",
"P3-Medium" : "Moderate / Limited",
"P4-Low" : "Minor / Localized"
]
def priorityName = replica.priority?.name
def impactValue = impactMapping[priorityName] ?: "Moderate / Limited"
def impactField = issue.customFields."Impact"
if (impactField) {
impactField.value = impactValue
}
}
def syncL1CreateDate(issue, replica) {
if (replica.created) {
LocalDate localDate = replica.created.toLocalDateTime().toLocalDate()
LocalDateTime startOfDay = localDate.atStartOfDay()
Timestamp truncatedTimestamp = Timestamp.valueOf(startOfDay)
issue.customFields."L1 Create Date".value = truncatedTimestamp
}
}
def syncL1Status(issue, replica) {
issue.customFields."L1 Status".value = replica.status.name
}
def syncReporter(issue, replica) {
def localUser = replica.assignee?.email ? nodeHelper.getUserByEmail(replica.assignee.email) : null
issue.reporter = localUser ?: getDefaultUser()
}
def syncSource(issue, replica) {
def sourceValue
if (replica.project?.key == "ROOMED" || replica.project?.name == "ROOMED") {
sourceValue = "ROOMED"
} else {
sourceValue = replica.project?.name ?: replica.project?.key
}
if (sourceValue) {
def option = nodeHelper.getOption(issue, "Source", sourceValue)
if (option) {
issue.customFields."Source".value = option
log.debug("Set 'Source' field to '${sourceValue}'")
} else {
log.warn("Could not find option '${sourceValue}' for 'Source'")
}
}
}
def syncRequestedResolutionDate(issue, replica) {
issue.customFields."Requested Resolution Date".value = replica.customFields."Requested Resolution Date"?.value
}
// =====================
// MAIN SYNC EXECUTION FUNCTION
// =====================
def executeSync(projectKey) {
// First sync specific logic
if (firstSync) {
issue.projectKey = projectKey
issue.description = replica.description
setIssueTypeBasedOnServiceType(issue, replica)
setAssigneeFromComponentLead(issue, replica)
}
// Set Change Type based on Service Type (only for non-Bug issues)
setChangeTypeBasedOnServiceType(issue, replica)
// Execute common synchronization
syncBasicFields(issue, replica)
syncComments(issue, replica)
syncVersions(issue, replica)
syncComponents(issue, replica)
syncPriorityToUrgency(issue, replica)
syncPriorityToImpact(issue, replica)
syncL1CreateDate(issue, replica)
syncL1Status(issue, replica)
syncReporter(issue, replica)
syncSource(issue, replica)
syncRequestedResolutionDate(issue, replica)
}
getting this error.
com.exalate.api.exception.IssueTrackerException: Exalate has problems while trying to create an issue in this Jira. Details: [InvalidInputException: [Error map: [{customfield_11804=This field is required}]] [Error list: [[]]] at com.exalate.node.compatibility.CompatibilityService.createIssueObject(CompatibilityService.java:652) at com.exalate.node.hubobject.v1_4.NodeHubIssueHelper.createIssue(NodeHubIssueHelper.java:630) at com.exalate.node.hubobject.v1_4.NodeHubIssueHelper.createIssueWith(NodeHubIssueHelper.java:527) at com.exalate.compatibility.HubObjectHelperAdapter.createNodeIssueWith(HubObjectHelperAdapter.java:37) at com.exalate.hubobject.v1_2.HubObjectHelper.createNodeIssueWith(HubObjectHelper.java:327) at com.exalate.processor.jira.JiraCreateIssueProcessor.applyProcessorResult(JiraCreateIssueProcessor.java:412) at com.exalate.processor.jira.JiraCreateIssueProcessor.applyProcessorResult(JiraCreateIssueProcessor.java:388) at com.exalate.processor.jira.JiraCreateIssueProcessor.createIssue(JiraCreateIssueProcessor.java:204) at com.exalate.replication.request.CreateIssueSyncRequestState.transition(CreateIssueSyncRequestState.java:81) at com.exalate.replication.request.CreateIssueSyncRequestState.transition(CreateIssueSyncRequestState.java:28) at com.exalate.replication.in.RequestProcessorService.processSyncRequest(RequestProcessorService.java:400) at com.exalate.replication.in.RequestProcessorService.processSyncRequestsForIssue(RequestProcessorService.java:273) at com.exalate.replication.in.RequestProcessorService.processRequestsByTwinTraceInternal(RequestProcessorService.java:217) at com.exalate.replication.in.RequestProcessorService.processRequestsByTwinTrace(RequestProcessorService.java:181) at com.exalate.replication.SyncWorkerService.processInQueueForAssignment(SyncWorkerService.java:149) at com.exalate.replication.SyncWorkerService.processInQueueIfAssigned(SyncWorkerService.java:86) at com.exalate.replication.SyncWorkerService.doSyncWork(SyncWorkerService.java:50) at com.exalate.replication.akka.SyncWorkerActor.processAllAssignmentsForWorker(SyncWorkerActor.java:150) at com.exalate.replication.akka.SyncWorkerActor.onReceive(SyncWorkerActor.java:106) at akka.actor.UntypedAbstractActor$$anonfun$receive$1.applyOrElse(AbstractActor.scala:332) at akka.actor.Actor.aroundReceive(Actor.scala:537) at akka.actor.Actor.aroundReceive$(Actor.scala:535) at akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:220) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:579) at akka.actor.ActorCell.invoke(ActorCell.scala:547) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270) at akka.dispatch.Mailbox.run(Mailbox.scala:231) at akka.dispatch.Mailbox.exec(Mailbox.scala:243) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) Caused by: com.atlassian.jira.exception.CreateException: Error occurred while creating issue through workflow: at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:503) at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssueObject(DefaultIssueManager.java:600) at com.atlassian.jira.issue.managers.RequestCachingIssueManager.createIssueObject(RequestCachingIssueManager.java:212) at jdk.internal.reflect.GeneratedMethodAccessor10095.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at com.atlassian.plugin.util.ContextClassLoaderSettingInvocationHandler.invoke(ContextClassLoaderSettingInvocationHandler.java:26) at jdk.proxy3/jdk.proxy3.$Proxy470.createIssueObject(Unknown Source) at jdk.internal.reflect.GeneratedMethodAccessor10095.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at com.atlassian.plugin.osgi.bridge.external.HostComponentFactoryBean$DynamicServiceInvocationHandler.invoke(HostComponentFactoryBean.java:134) at jdk.proxy3/jdk.proxy3.$Proxy470.createIssueObject(Unknown Source) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at com.exalate.util.reflection.ReflectionUtils.invokeMethod(ReflectionUtils.java:102) at com.exalate.node.compatibility.CompatibilityService.createIssueObject(CompatibilityService.java:637) … 32 more Caused by: [InvalidInputException: [Error map: [{customfield_11804=This field is required}]] [Error list: [[]]] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73) at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:268) at com.onresolve.scriptrunner.canned.jira.utils.ScopeAwareExceptionMapper.convertException(ScopeAwareExceptionMapper.groovy:26) at com.onresolve.scriptrunner.canned.jira.utils.ScopeAwareExceptionMapper$convertException.call(Unknown Source) at com.onresolve.jira.groovy.GroovyValidator.validate(GroovyValidator.groovy:59) at com.atlassian.jira.workflow.SkippableValidator.validate(SkippableValidator.java:45) at com.opensymphony.workflow.AbstractWorkflow.verifyInputs(AbstractWorkflow.java:1466) at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1167) at com.opensymphony.workflow.AbstractWorkflow.initialize(AbstractWorkflow.java:606) at com.atlassian.jira.workflow.OSWorkflowManager.createIssue(OSWorkflowManager.java:753) at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:497) … 50 more