Advanced configuration - Follow up contracted hours by month
Layout
This is an example of what the layout might look like where you can follow up contracted hours by month:
Fields
Field | Type | Details |
---|---|---|
Contracted hours / month | Duration | Hours contracted for the service per month |
Work logged - [MONTH] | Script | Total hours logged in a specific month Create 12 fields and replace the variable MONTH to specify every month Create 12 fields and replace the variable YEAR to specify the year import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.jql.builder.JqlQueryBuilder
import com.atlassian.jira.project.Project
import com.atlassian.jira.web.bean.PagerFilter
// CONFIGURATION -------------------------
def MONTH = 1
def YEAR = 2021
// ---------------------------------------
def searchService = ComponentAccessor.getOSGiComponentInstanceOfType(SearchService)
def jiraAuthenticationContext = ComponentAccessor.jiraAuthenticationContext
def worklogManager = ComponentAccessor.worklogManager
def jiraDurationUtils = ComponentAccessor.jiraDurationUtils
def loggedInUser = jiraAuthenticationContext.getLoggedInUser()
def query = JqlQueryBuilder.newBuilder().where().project(((Project) project).id).buildQuery()
def worklog = searchService.search(loggedInUser, query, PagerFilter.unlimitedFilter).results
.collect { issue ->
worklogManager.getByIssue(issue)
.findAll { worklog -> worklog != null }
.findAll { worklog -> worklog.startDate[Calendar.YEAR] == YEAR }
.findAll { worklog -> worklog.startDate[Calendar.MONTH] + 1 == MONTH }
.collect { worklog -> worklog.timeSpent }
.sum()
}
.findAll { time -> time != null }
.sum()
jiraDurationUtils.getShortFormattedDuration(!worklog ? 0 : worklog as Long)
|
Remaining - [MONTH] | Script | Calculates Contracted hours / Work logged - [MONTH] Replace ESTIMATION_FIELD_ID with the ID of "Contracted hours / month" field import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.project.Project
import com.deiser.jira.profields.api.field.FieldService
import com.deiser.jira.profields.api.field.duration.DurationField
import com.deiser.jira.profields.api.field.script.ScriptField
import com.deiser.jira.profields.api.value.ValueService
// CONFIGURATION -------------------------
def ESTIMATION_FIELD_ID = 168
def WORKLOG_FIELD_ID = 164
// ---------------------------------------
def jiraAuthenticationContext = ComponentAccessor.jiraAuthenticationContext
def jiraDurationUtils = ComponentAccessor.jiraDurationUtils
def fieldService = ComponentAccessor.getOSGiComponentInstanceOfType(FieldService)
def valueService = ComponentAccessor.getOSGiComponentInstanceOfType(ValueService)
def worklogString = valueService.getValue((Project) project, (ScriptField) fieldService.get(WORKLOG_FIELD_ID))
def estimated = valueService.getValue((Project) project, (DurationField) fieldService.get(ESTIMATION_FIELD_ID))
def worklog = jiraDurationUtils.parseDuration(worklogString, jiraAuthenticationContext.locale)
def difference = (!estimated ? 0L : estimated as Long) - (!worklog ? 0L : worklog as Long)
return jiraDurationUtils.getShortFormattedDuration(difference < 0 ? 0 : difference)
|