diff --git a/grails-app/assets/javascripts/organisation.js b/grails-app/assets/javascripts/organisation.js index d0826b8fc..b34198c78 100644 --- a/grails-app/assets/javascripts/organisation.js +++ b/grails-app/assets/javascripts/organisation.js @@ -548,7 +548,7 @@ OrganisationPageViewModel = function (props, options) { } }; var organisationService = new OrganisationService(options); - self.periods = organisationService.getBudgetHeaders(); + self.periods = options.targetPeriods || []; self.initialise = function() { $.fn.dataTable.moment( 'dd-MM-yyyy' ); diff --git a/grails-app/assets/javascripts/services.js b/grails-app/assets/javascripts/services.js index 34b867392..20c5b271d 100644 --- a/grails-app/assets/javascripts/services.js +++ b/grails-app/assets/javascripts/services.js @@ -75,7 +75,7 @@ function ServicesViewModel(serviceIds, allServices, outputTargets, periods) { target.targetDate = ko.observable().extend({simpleDate:false}); target.periodTargets = _.map(periods, function (period) { - return {period: period, target: ko.observable(0)}; + return {period: period.value, target: ko.observable(0)}; }); function evaluateAndAssignAverage() { @@ -196,6 +196,10 @@ function ServicesViewModel(serviceIds, allServices, outputTargets, periods) { }; self.periods = periods; + self.periodLabel = function (period) { + + return period; + }; self.services = ko.observableArray(); self.addService = function () { diff --git a/grails-app/controllers/au/org/ala/merit/OrganisationController.groovy b/grails-app/controllers/au/org/ala/merit/OrganisationController.groovy index 5c08c82e0..0109f6935 100644 --- a/grails-app/controllers/au/org/ala/merit/OrganisationController.groovy +++ b/grails-app/controllers/au/org/ala/merit/OrganisationController.groovy @@ -26,7 +26,7 @@ class OrganisationController { def list() {} def index(String id) { - def organisation = organisationService.get(id, 'all') + Map organisation = organisationService.get(id, 'all') if (!organisation || organisation.error) { organisationNotFound(id, organisation) @@ -60,7 +60,7 @@ class OrganisationController { - protected Map content(organisation) { + protected Map content(Map organisation) { def user = userService.getUser() def members = userService.getMembersOfOrganisation(organisation.organisationId) @@ -102,12 +102,13 @@ class OrganisationController { List projects = organisation.projects ?: [] List programGroups = organisation.config?.programGroups ?: [] Map projectGroups = projectGroupingHelper.groupProjectsByProgram(projects, programGroups, ["organisationId:"+organisation.organisationId], true) + List targetPeriods = organisationService.generateTargetPeriods(organisation) [about : [label: 'About', visible: true, stopBinding: false, type:'tab', default:!reportingVisible, displayedPrograms:projectGroups.displayedPrograms, servicesDashboard:[visible:true]], projects : [label: 'Reporting', template:"/shared/projectListByProgram", visible: reportingVisible, stopBinding:true, default:reportingVisible, type: 'tab', reports:organisation.reports, adHocReportTypes:adHocReportTypes, reportOrder:reportOrder, hideDueDate:true, displayedPrograms:projectGroups.displayedPrograms, reportsFirst:true, declarationType:SettingPageType.RDP_REPORT_DECLARATION], sites : [label: 'Sites', visible: reportingVisible, type: 'tab', stopBinding:true, projectCount:organisation.projects?.size()?:0, showShapefileDownload:adminVisible], dashboard : [label: 'Dashboard', visible: reportingVisible, stopBinding:true, type: 'tab', template:'/shared/dashboard', reports:dashboardReports], - admin : [label: 'Admin', visible: adminVisible, type: 'tab', template:'admin', showEditAnnoucements:showEditAnnoucements, availableReportCategories:availableReportCategories]] + admin : [label: 'Admin', visible: adminVisible, type: 'tab', template:'admin', showEditAnnoucements:showEditAnnoucements, availableReportCategories:availableReportCategories, targetPeriods:targetPeriods]] } @@ -689,4 +690,10 @@ class OrganisationController { render result as JSON } + + @PreAuthorise(accessLevel = 'admin') + def generateTargetPeriods(String id) { + List result = organisationService.generateTargetPeriods(id) + render result as JSON + } } diff --git a/grails-app/services/au/org/ala/merit/OrganisationService.groovy b/grails-app/services/au/org/ala/merit/OrganisationService.groovy index bd8b67e93..3cb455599 100644 --- a/grails-app/services/au/org/ala/merit/OrganisationService.groovy +++ b/grails-app/services/au/org/ala/merit/OrganisationService.groovy @@ -127,6 +127,26 @@ class OrganisationService { regenerateOrganisationReports(organisation, organisationReportCategories) } + List generateTargetPeriods(String id) { + Map organisation = get(id) + generateTargetPeriods(organisation) + } + + List generateTargetPeriods(Map organisation) { + Map targetsConfig = organisation.config?.targets + if (!targetsConfig) { + log.info("No target configuration defined for organisation ${organisation.organisationId}") + return null + } + ReportConfig targetsReportConfig = new ReportConfig(targetsConfig.periodGenerationConfig) + ReportOwner owner = new ReportOwner( + id:[organisationId:organisation.organisationId], + name:organisation.name + ) + reportService.generateTargetPeriods(targetsReportConfig, owner, targetsConfig.periodLabelFormat) + } + + private void regenerateOrganisationReports(Map organisation, List reportCategories = null) { ReportOwner owner = new ReportOwner( diff --git a/grails-app/services/au/org/ala/merit/ReportService.groovy b/grails-app/services/au/org/ala/merit/ReportService.groovy index ba8fafc32..25b5c5f79 100644 --- a/grails-app/services/au/org/ala/merit/ReportService.groovy +++ b/grails-app/services/au/org/ala/merit/ReportService.groovy @@ -143,6 +143,21 @@ class ReportService { } + /** + * This is to support progress targets using the same + * configuration as we use to generate reports such that + * the targets can be aligned to reports if required. + * (Previously MERIT only supported targets per financial year) + */ + List generateTargetPeriods(ReportConfig reportConfig, ReportOwner reportOwner, String formatString = null) { + List reports = new ReportGenerator().generateReports( + reportConfig, reportOwner, 0, null) + Closure dateFormatter = { + formatString ? DateUtils.format(DateUtils.parse(it), formatString) : it + } + reports.collect{[label:dateFormatter(it.toDate), value:it.toDate]} + } + boolean needsRegeneration(Map report1, Map report2) { return report1.fromDate != report2.fromDate || report1.toDate != report2.toDate || diff --git a/grails-app/views/organisation/_serviceTargets.gsp b/grails-app/views/organisation/_serviceTargets.gsp index d593e65ac..b2b540a81 100644 --- a/grails-app/views/organisation/_serviceTargets.gsp +++ b/grails-app/views/organisation/_serviceTargets.gsp @@ -21,7 +21,7 @@ -
+
diff --git a/grails-app/views/organisation/index.gsp b/grails-app/views/organisation/index.gsp index 6d31d8426..2f57cbd25 100644 --- a/grails-app/views/organisation/index.gsp +++ b/grails-app/views/organisation/index.gsp @@ -41,6 +41,7 @@ cancelReportUrl: "${createLink(action:'ajaxCancelReport', id:organisation.organisationId)}/", unCancelReportUrl: "${createLink(action:'ajaxUnCancelReport', id:organisation.organisationId)}/", reportsHistoryUrl:"${createLink(controller: 'report', action:'reportingHistory')}", + targetPeriodsUrl:"${createLink(controller: 'organisation', action:'getTargetPeriods', id:organisation.organisationId)}", returnTo: '${g.createLink(action:'index', id:"${organisation.organisationId}")}', dashboardCategoryUrl: "${g.createLink(controller: 'report', action: 'activityOutputs', params: [fq:'organisationFacet:'+organisation.name])}", reportOwner: {organisationId:'${organisation.organisationId}'}, @@ -84,6 +85,7 @@ var config = _.extend({ reportingConfigSelector:'#reporting-config form', availableReportCategories:availableReportCategories, + targetPeriods: }, fcConfig); var organisationViewModel = new OrganisationPageViewModel(organisation, config);