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
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]
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) |