diff --git a/grails-app/conf/spring/resources.groovy b/grails-app/conf/spring/resources.groovy index 1c368eb98..21b145a08 100644 --- a/grails-app/conf/spring/resources.groovy +++ b/grails-app/conf/spring/resources.groovy @@ -3,6 +3,7 @@ import au.org.ala.merit.MeritServletContextConfig import au.org.ala.merit.StatisticsFactory import au.org.ala.merit.hub.HubAwareLinkGenerator import au.org.ala.merit.reports.NHTOutputReportLifecycleListener +import au.org.ala.merit.reports.RegionalCapacityServicesReportLifecycleListener import au.org.ala.merit.util.ProjectGroupingHelper // Place your Spring DSL code here @@ -23,6 +24,7 @@ beans = { NHTOutputReport(NHTOutputReportLifecycleListener) GrantsandOthersProgressReport(NHTOutputReportLifecycleListener) ProcurementOutputReport(NHTOutputReportLifecycleListener) + RegionalCapacityServicesReport(RegionalCapacityServicesReportLifecycleListener) meritServletContextConfig(MeritServletContextConfig) } diff --git a/src/main/groovy/au/org/ala/merit/command/EditOrViewReportCommand.groovy b/src/main/groovy/au/org/ala/merit/command/EditOrViewReportCommand.groovy index 2e777a494..4efd62cca 100644 --- a/src/main/groovy/au/org/ala/merit/command/EditOrViewReportCommand.groovy +++ b/src/main/groovy/au/org/ala/merit/command/EditOrViewReportCommand.groovy @@ -1,6 +1,7 @@ package au.org.ala.merit.command import au.org.ala.merit.ReportService +import au.org.ala.merit.reports.ReportLifecycleListener import grails.artefact.Controller import grails.core.GrailsApplication import grails.validation.Validateable @@ -40,6 +41,9 @@ abstract class EditOrViewReportCommand implements Validateable { model.saveReportUrl = linkGenerator.link(controller:entityType, action:'saveReport', id:id) model.documentOwner = [activityId:model.activity?.activityId, reportId:reportId] model.documentOwner[getEntityIdField()] = id + + ReportLifecycleListener listener = reportService.reportLifeCycleListener(model.report) + model.putAll(listener.getContextData(entity, model.report)) } } diff --git a/src/main/groovy/au/org/ala/merit/reports/RegionalCapacityServicesReportLifecycleListener.groovy b/src/main/groovy/au/org/ala/merit/reports/RegionalCapacityServicesReportLifecycleListener.groovy new file mode 100644 index 000000000..17bee091c --- /dev/null +++ b/src/main/groovy/au/org/ala/merit/reports/RegionalCapacityServicesReportLifecycleListener.groovy @@ -0,0 +1,19 @@ +package au.org.ala.merit.reports + +import au.org.ala.merit.OrganisationService +import groovy.util.logging.Slf4j +import org.springframework.beans.factory.annotation.Autowired + +@Slf4j +class RegionalCapacityServicesReportLifecycleListener extends ReportLifecycleListener { + + @Autowired + OrganisationService organisationService + + Map getContextData(Map organisation, Map report) { + List outputTargets = organisation.custom?.details?.services?.targets + Map periodTargets = getTargetsForReportPeriod(report, outputTargets) + BigDecimal budget = new BigDecimal(0) // TODO get budget from the correct period of the budget table + [periodTargets:periodTargets, budget:budget] + } +} diff --git a/src/main/groovy/au/org/ala/merit/reports/ReportLifecycleListener.groovy b/src/main/groovy/au/org/ala/merit/reports/ReportLifecycleListener.groovy index 20f29f82f..0e2662e5c 100644 --- a/src/main/groovy/au/org/ala/merit/reports/ReportLifecycleListener.groovy +++ b/src/main/groovy/au/org/ala/merit/reports/ReportLifecycleListener.groovy @@ -91,5 +91,18 @@ class ReportLifecycleListener { result } + static Map getTargetsForReportPeriod(Map report, List outputTargets) { + String endDate = report.toDate + + outputTargets?.collectEntries { Map outputTarget -> + String scoreId = outputTarget.scoreId + String previousPeriod = '' + Map matchingPeriodTarget = outputTarget?.periodTargets?.find { Map periodTarget -> + previousPeriod < endDate && periodTarget.period >= endDate + } + [(scoreId): matchingPeriodTarget?.target] + } + } + } diff --git a/src/test/groovy/au/org/ala/merit/reports/ReportLifecycleListenerSpec.groovy b/src/test/groovy/au/org/ala/merit/reports/ReportLifecycleListenerSpec.groovy index 53b8d4734..0529d0819 100644 --- a/src/test/groovy/au/org/ala/merit/reports/ReportLifecycleListenerSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/reports/ReportLifecycleListenerSpec.groovy @@ -59,6 +59,29 @@ class ReportLifecycleListenerSpec extends Specification { [entityType:"au.org.ala.ecodata.DataSetSummary", entityIds:["5b1255a4-3b91-4fae-a243-02bd4d163898"]]] } + def "getTargetForReportPeriod should return the correct target for the report period"() { + setup: + Map report = [toDate: '2023-12-31'] + String scoreId = 'score1' + List values = [ + [scoreId: 'score1', periodTargets: [ + [period: '2023-01-01', target: 10], + [period: '2023-12-31', target: 20], + [period: '2024-01-01', target: 30] + ]], + [scoreId: 'score2', periodTargets: [ + [period: '2023-01-01', target: 5], + [period: '2023-12-31', target: 15] + ]] + ] + + when: + def result = ReportLifecycleListener.getTargetForReportPeriod(report, scoreId, values) + + then: + result == [period: '2023-12-31', target: 20] + } + private static Map nhtActivityForm() { File file = new File('forms/nht/nhtOutputReport.json')