From 957458cae1fccea3ad3005d51ae144823aa1e2f6 Mon Sep 17 00:00:00 2001 From: temi Date: Tue, 7 Nov 2023 11:21:56 +1100 Subject: [PATCH 01/95] - fetch records of finished datasets only --- .../services/au/org/ala/merit/ProjectService.groovy | 11 +++++------ .../org/ala/merit/reports/NHTOutputReportData.groovy | 6 ++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index f02dcada8..96af901f9 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -1,7 +1,6 @@ package au.org.ala.merit import au.org.ala.merit.config.EmailTemplate -import au.org.ala.merit.PublicationStatus import au.org.ala.merit.config.ProgramConfig import au.org.ala.merit.config.ReportConfig import au.org.ala.merit.reports.ReportGenerationOptions @@ -14,11 +13,7 @@ import org.apache.commons.lang.CharUtils import org.apache.http.HttpStatus import org.grails.web.json.JSONArray import org.grails.web.json.JSONObject -import org.joda.time.DateTime -import org.joda.time.DateTimeZone -import org.joda.time.Days -import org.joda.time.Interval -import org.joda.time.Period +import org.joda.time.* import java.text.SimpleDateFormat @@ -2097,4 +2092,8 @@ class ProjectService { return project.reports.size() > 0 } + List fetchDataSetRecords (String projectId, String dataSetId) { + webService.getJson(grailsApplication.config.getProperty('ecodata.baseUrl') + "project/$projectId/dataSet/$dataSetId/records") + } + } diff --git a/src/main/groovy/au/org/ala/merit/reports/NHTOutputReportData.groovy b/src/main/groovy/au/org/ala/merit/reports/NHTOutputReportData.groovy index 6302a0410..25ac6f72d 100644 --- a/src/main/groovy/au/org/ala/merit/reports/NHTOutputReportData.groovy +++ b/src/main/groovy/au/org/ala/merit/reports/NHTOutputReportData.groovy @@ -9,11 +9,17 @@ import org.springframework.beans.factory.annotation.Autowired * Custom data for the NHT Output Report. */ class NHTOutputReportData extends ReportData { + static final String STAGE_TO_FETCH_RECORDS = 'finished' @Autowired ProjectService projectService Map getContextData(Map project) { + project?.custom?.dataSets?.each { dataSet -> + if ((dataSet.progress == STAGE_TO_FETCH_RECORDS) && dataSet.dataSetId) { + dataSet.records = projectService.fetchDataSetRecords(project.projectId, dataSet.dataSetId) + } + } return [ protocols:projectService.listProjectProtocols(project).collect { [label: it.name, value: it.externalId] From 886c588c477865bd7dfa9821cd7760fa37af077a Mon Sep 17 00:00:00 2001 From: temi Date: Fri, 15 Dec 2023 16:49:28 +1100 Subject: [PATCH 02/95] #3049 - added ala harvest on off button - added pre-pop of species records --- build.gradle | 2 +- forms/nht/nhtOutputReport.json | 53 ++++++++++++++++- .../assets/javascripts/projectService.js | 57 ++++++++++--------- grails-app/assets/javascripts/projects.js | 19 +++++++ .../au/org/ala/merit/ProjectController.groovy | 15 +++++ .../au/org/ala/merit/ProjectService.groovy | 1 - grails-app/views/project/_editProject.gsp | 10 ++++ 7 files changed, 126 insertions(+), 31 deletions(-) diff --git a/build.gradle b/build.gradle index 47f7f0886..c88944518 100644 --- a/build.gradle +++ b/build.gradle @@ -98,7 +98,7 @@ dependencies { implementation 'dk.glasius:external-config:3.0.0' implementation "org.grails.plugins:ala-auth:$alaSecurityLibsVersion" // Needs to be left at 2.0 until we finish replacing pdfgen HTML report generation - implementation "org.grails.plugins:ala-ws-security-plugin:2.0" + implementation "org.grails.plugins:ala-ws-security-plugin:$alaSecurityLibsVersion" implementation "org.grails.plugins:ala-ws-plugin:$alaSecurityLibsVersion" implementation "au.org.ala:userdetails-service-client:$alaSecurityLibsVersion" implementation "com.github.ben-manes.caffeine:caffeine:3.1.6" diff --git a/forms/nht/nhtOutputReport.json b/forms/nht/nhtOutputReport.json index d580cd84e..17a0a9ee8 100644 --- a/forms/nht/nhtOutputReport.json +++ b/forms/nht/nhtOutputReport.json @@ -8401,7 +8401,11 @@ { "columns": [ { - "dataType": "species", + "dataType": "text", + "name": "occurrenceID" + }, + { + "dataType": "text", "name": "species", "validate": "required" }, @@ -8423,6 +8427,51 @@ "dataType": "list", "name": "faunaSurveySpeciesTable" }, + { + "dataType": "text", + "name": "faunaSurveySpeciesTablePrePopulator", + "behaviour": [ + { + "type": "pre_populate", + "config": { + "mapping": [ + { + "source-path": "occurrenceID", + "target": "occurrenceID" + }, + { + "source-path": "scientificName", + "target": "species" + }, + { + "source-path": "individualsOrGroups", + "target": "individualsOrGroups" + }, + { + "source-path": "individualCount", + "target": "numberOfIndividualsOrGroups" + } + ], + "source": { + "params": [ + { + "expression": "dataSetId", + "name": "dataSetId", + "type": "computed" + }, + { + "expression": "owner.projectId", + "name": "projectId", + "type": "computed" + } + ], + "url": "/project/dataSetSpeciesRecords" + }, + "target": "faunaSurveySpeciesTable" + } + } + ] + }, { "dataType": "text", "name": "baselineOrIndicatorSurvey", @@ -9286,7 +9335,7 @@ "width": "55%", "source": "species", "title": "Target species recorded", - "type": "speciesSelect" + "type": "text" }, { "width": "25%", diff --git a/grails-app/assets/javascripts/projectService.js b/grails-app/assets/javascripts/projectService.js index ca0fb932e..6ce319af2 100644 --- a/grails-app/assets/javascripts/projectService.js +++ b/grails-app/assets/javascripts/projectService.js @@ -70,35 +70,38 @@ function ProjectService(project, options) { } }; - self.saveProjectData = function (jsData) { - if ($('#settings-validation').validationEngine('validate')) { - - // this call to stringify will make sure that undefined values are propagated to - // the update call - otherwise it is impossible to erase fields - var json = JSON.stringify(jsData, function (key, value) { - return value === undefined ? "" : value; - }); + self.saveProjectDataWithoutValidation = function (jsData) { + // this call to stringify will make sure that undefined values are propagated to + // the update call - otherwise it is impossible to erase fields + var json = JSON.stringify(jsData, function (key, value) { + return value === undefined ? "" : value; + }); - blockUIWithMessage("Saving...."); - $.ajax({ - url: config.projectUpdateUrl, - type: 'POST', - data: json, - contentType: 'application/json' - }).done(function(data) { - if (data.error) { - $.unblockUI(); - showAlert("Failed to save settings: " + data.detail + ' \n' + data.error, - "alert-error","save-result-placeholder"); - } else { - blockUIWithMessage("Refreshing page..."); - showAlert("Project settings saved","alert-success","save-result-placeholder"); - window.location.reload(); - } - }).fail(function(data) { + blockUIWithMessage("Saving...."); + $.ajax({ + url: config.projectUpdateUrl, + type: 'POST', + data: json, + contentType: 'application/json' + }).done(function (data) { + if (data.error) { $.unblockUI(); - alert('An unhandled error occurred: ' + data.status + " Please refresh the page and try again"); - }); + showAlert("Failed to save settings: " + data.detail + ' \n' + data.error, + "alert-error", "save-result-placeholder"); + } else { + blockUIWithMessage("Refreshing page..."); + showAlert("Project settings saved", "alert-success", "save-result-placeholder"); + window.location.reload(); + } + }).fail(function (data) { + $.unblockUI(); + alert('An unhandled error occurred: ' + data.status + " Please refresh the page and try again"); + }); + } + + self.saveProjectData = function (jsData) { + if ($('#settings-validation').validationEngine('validate')) { + self.saveProjectDataWithoutValidation(jsData); } }; diff --git a/grails-app/assets/javascripts/projects.js b/grails-app/assets/javascripts/projects.js index 00f4f41ac..ede6d3b11 100644 --- a/grails-app/assets/javascripts/projects.js +++ b/grails-app/assets/javascripts/projects.js @@ -816,6 +816,25 @@ function ProjectPageViewModel(project, sites, activities, organisations, userRol self.planStatus = ko.observable(project.planStatus); self.mapLoaded = ko.observable(false); self.transients.variation = ko.observable(); + self.alaHarvest = ko.observable(project.alaHarvest ? true : false); + self.alaHarvest.subscribe(function(newValue) { + var data = {alaHarvest: newValue}; + self.saveProjectDataWithoutValidation(data); + }); + self.transients.yesNoOptions = ["Yes","No"]; + self.transients.alaHarvest = ko.computed({ + read: function () { + return self.alaHarvest() ? 'Yes' : 'No'; + }, + write: function (newValue) { + if (newValue === 'Yes') { + self.alaHarvest(true); + } else if (newValue === 'No') { + self.alaHarvest(false); + } + } + }); + self.transients.startDateInvalid = ko.observable(false); self.transients.disableSave = ko.pureComputed(function() { diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index 05b91ff4f..69091cc71 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -641,6 +641,21 @@ class ProjectController { projectSummaryReportCommand() } + @PreAuthorise(accessLevel = 'readOnly') + def dataSetSpeciesRecords(String projectId, String dataSetId) { + if (!projectId || !dataSetId) { + render status: 400, text: 'Required params not provided: projectId, dataSetId' + } + else { + def result = projectService.fetchDataSetRecords(projectId, dataSetId) + if (result instanceof Map) { + render status: 500, text: result.error + } else { + render text: result as JSON, contentType: 'application/json' + } + } + } + /** * Accepts a MERI Plan as an attached file and attempts to convert it into a format compatible with * MERIT. diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index 96af901f9..516702143 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -2095,5 +2095,4 @@ class ProjectService { List fetchDataSetRecords (String projectId, String dataSetId) { webService.getJson(grailsApplication.config.getProperty('ecodata.baseUrl') + "project/$projectId/dataSet/$dataSetId/records") } - } diff --git a/grails-app/views/project/_editProject.gsp b/grails-app/views/project/_editProject.gsp index cc362aceb..b3fc44911 100644 --- a/grails-app/views/project/_editProject.gsp +++ b/grails-app/views/project/_editProject.gsp @@ -8,6 +8,16 @@ +
+
+ +
+
+ +
+
+
+
From 3819147970c4d229cb408afd4ab9b11cf2dc906a Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 15 Mar 2024 14:13:00 +1100 Subject: [PATCH 03/95] Work in progress for #3119 --- grails-app/assets/javascripts/dataSets.js | 16 +++++++++++- .../au/org/ala/merit/DataSetController.groovy | 25 ++++++++++++++++--- grails-app/views/dataSet/_editDataSet.gsp | 4 +-- grails-app/views/dataSet/create.gsp | 1 + grails-app/views/dataSet/edit.gsp | 1 + 5 files changed, 40 insertions(+), 7 deletions(-) diff --git a/grails-app/assets/javascripts/dataSets.js b/grails-app/assets/javascripts/dataSets.js index 194d6e3ec..8e79e125f 100644 --- a/grails-app/assets/javascripts/dataSets.js +++ b/grails-app/assets/javascripts/dataSets.js @@ -116,6 +116,7 @@ var DataSetViewModel = function(dataSet, projectService, options) { }); self.serviceAndOutcomes = ko.observable(selectedServiceAndOutcome && selectedServiceAndOutcome.label); self.projectProtocols = config.projectProtocols; + self.protocol = ko.observable(dataSet.protocol); self.projectOutcomeList = ko.observableArray(options.projectOutcomes); self.serviceId = ko.computed(function() { @@ -124,6 +125,15 @@ var DataSetViewModel = function(dataSet, projectService, options) { }); return selectedOutcome && selectedOutcome.serviceId; }); + + self.disableBaseline = function(e) { + var serviceConfig = config.serviceBaselineIndicatorOptions[self.serviceId()]; + return serviceConfig ? serviceConfig.disableBaseline : false; + }; + self.disableIndicator = function() { + var serviceConfig = config.serviceBaselineIndicatorOptions[self.serviceId()]; + return serviceConfig ? serviceConfig.disableIndicator : false; + }; self.projectOutcomes = ko.computed(function() { var selectedOutcome = _.find(options.projectOutcomes || [], function(serviceAndOutcome) { return serviceAndOutcome.label == self.serviceAndOutcomes(); @@ -228,7 +238,11 @@ var DataSetViewModel = function(dataSet, projectService, options) { if (valid) { var dataSet = ko.mapping.toJS(self, - {ignore: ['grantId', 'projectName', 'programName', 'validate', 'save', 'cancel', 'investmentOtherSelected', 'siteUrl', 'isAutoCreated', 'serviceAndOutcomes', 'projectOutcomeList', 'projectBaselines', 'projectProtocols']}); + {ignore: [ + 'grantId', 'projectName', 'programName', 'validate', 'save', 'cancel', + 'investmentOtherSelected', 'siteUrl', 'isAutoCreated', 'serviceAndOutcomes', + 'projectOutcomeList', 'projectBaselines', 'projectProtocols', 'disableBaseline', + 'disableIndicator']}); projectService.saveDataSet(dataSet).done(function() { // return to project window.location.href = config.returnToUrl; diff --git a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy index 3dc6b3c84..6b74d4a33 100644 --- a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy +++ b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy @@ -54,23 +54,39 @@ class DataSetController { List projectServices = projectService.getProjectServices(project) project.outputTargets?.each { Map outputTarget -> if (outputTarget.outcomeTargets) { + Map service = projectServices.find{it.scores?.find{score -> score.scoreId == outputTarget.scoreId}} if (service) { + Map score = service.scores.find{it.scoreId == outputTarget.scoreId} outputTarget.outcomeTargets.each { outcomeGroups << [ serviceId: service.id, service: service.name, outcomes:it.relatedOutcomes, - label:service.name+" "+it.relatedOutcomes + label:service.name+" "+it.relatedOutcomes, + tags:score.tags ] } } else { log.warn("No service found for scoreId ${outputTarget.scoreId} in project ${project.projectId}") - } + } + } + } + + Map outcomeGroupsByServiceId = outcomeGroups.groupBy{it.serviceId} + outcomeGroups = outcomeGroups.unique{it.label}.sort{it.label} + Map serviceBaselineIndicatorOptions = [:] + outcomeGroupsByServiceId.each { int serviceId, List groups -> + List tags = groups.collect{it.tags}.flatten().unique() + serviceBaselineIndicatorOptions[serviceId] = [:] + if (!tags?.contains('Baseline')) { + serviceBaselineIndicatorOptions[serviceId].disableBaseline = true + } + if (!tags?.contains('Indicator')) { + serviceBaselineIndicatorOptions[serviceId].disableIndicator = true } } - outcomeGroups = outcomeGroups.findAll{it.outcomes}.unique{it.label}.sort{it.label} List projectBaselines = projectService.listProjectBaselines(project) projectBaselines = projectBaselines?.collect{ @@ -89,7 +105,8 @@ class DataSetController { [projectId:projectId, programName:programName, supportsOutcomeTargets:config.supportsOutcomeTargets(), priorities:priorities, outcomes: outcomes, project:project, projectOutcomes:outcomeGroups, - projectBaselines:projectBaselines, projectProtocols:projectProtocols, dataSetNames:dataSetNames] + projectBaselines:projectBaselines, projectProtocols:projectProtocols, dataSetNames:dataSetNames, + serviceBaselineIndicatorOptions: serviceBaselineIndicatorOptions] } // Note that authorization is done against a project, so the project id must be supplied to the method. diff --git a/grails-app/views/dataSet/_editDataSet.gsp b/grails-app/views/dataSet/_editDataSet.gsp index ff19b9a41..502d8a5fa 100644 --- a/grails-app/views/dataSet/_editDataSet.gsp +++ b/grails-app/views/dataSet/_editDataSet.gsp @@ -77,8 +77,8 @@
diff --git a/grails-app/views/dataSet/create.gsp b/grails-app/views/dataSet/create.gsp index 93a6553cd..1b75006da 100644 --- a/grails-app/views/dataSet/create.gsp +++ b/grails-app/views/dataSet/create.gsp @@ -55,6 +55,7 @@ config.projectBaselines = ; config.projectProtocols = ; config.invalidNames = ; + config.serviceBaselineIndicatorOptions = ; var viewModel = new DataSetViewModel({}, projectService, config); $.fn.select2.defaults.set( "theme", "bootstrap" ); ko.applyBindings(viewModel); diff --git a/grails-app/views/dataSet/edit.gsp b/grails-app/views/dataSet/edit.gsp index 240f5cd75..a10311659 100644 --- a/grails-app/views/dataSet/edit.gsp +++ b/grails-app/views/dataSet/edit.gsp @@ -56,6 +56,7 @@ config.projectBaselines = ; config.projectProtocols = ; config.invalidNames = ; + config.serviceBaselineIndicatorOptions = ; var viewModel = new DataSetViewModel(dataSet, projectService, config); $.fn.select2.defaults.set( "theme", "bootstrap" ); ko.applyBindings(viewModel); From 2cd51cee6a156a88f6f623fb98b61d6470aa93de Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 15 Mar 2024 15:28:26 +1100 Subject: [PATCH 04/95] Prototyping for #3119, #3120, #3121 --- .../project/meriPlan/_additionalOutcomes.gsp | 15 ++++++++++----- .../meriPlan/_extendedBaselineMonitoring.gsp | 2 +- .../views/project/meriPlan/_outcomeStatements.gsp | 7 +++++++ .../views/project/meriPlan/_programOutcome.gsp | 6 +++++- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/grails-app/views/project/meriPlan/_additionalOutcomes.gsp b/grails-app/views/project/meriPlan/_additionalOutcomes.gsp index 783000a2f..71280213d 100644 --- a/grails-app/views/project/meriPlan/_additionalOutcomes.gsp +++ b/grails-app/views/project/meriPlan/_additionalOutcomes.gsp @@ -19,11 +19,16 @@ -
    -
  • - -
  • -
+ + + + +
    +
  • + +
  • +
+
diff --git a/grails-app/views/project/meriPlan/_extendedBaselineMonitoring.gsp b/grails-app/views/project/meriPlan/_extendedBaselineMonitoring.gsp index c7c04be9c..bbcd6a902 100644 --- a/grails-app/views/project/meriPlan/_extendedBaselineMonitoring.gsp +++ b/grails-app/views/project/meriPlan/_extendedBaselineMonitoring.gsp @@ -70,7 +70,7 @@ data-validation-engine="validate[required,maxSize:4000]"> - diff --git a/grails-app/views/project/meriPlan/_outcomeStatements.gsp b/grails-app/views/project/meriPlan/_outcomeStatements.gsp index e7e2d88a8..aa4bc39c4 100644 --- a/grails-app/views/project/meriPlan/_outcomeStatements.gsp +++ b/grails-app/views/project/meriPlan/_outcomeStatements.gsp @@ -36,9 +36,16 @@ + + + + + + + diff --git a/grails-app/views/project/meriPlan/_programOutcome.gsp b/grails-app/views/project/meriPlan/_programOutcome.gsp index ffeb47483..2da10562d 100644 --- a/grails-app/views/project/meriPlan/_programOutcome.gsp +++ b/grails-app/views/project/meriPlan/_programOutcome.gsp @@ -23,12 +23,16 @@ + + + +
- +
From d5226ff936b189bb95169efc241a98f9b22895af Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 22 Mar 2024 12:26:14 +1100 Subject: [PATCH 05/95] First cut of #3126 --- grails-app/assets/javascripts/projects.js | 13 +++++ grails-app/conf/application.groovy | 1 + .../au/org/ala/merit/ProjectController.groovy | 8 +++ .../au/org/ala/merit/MonitorService.groovy | 41 +++++++++++++ .../au/org/ala/merit/WebService.groovy | 58 +++++++++++++------ grails-app/views/project/_projectAdmin.gsp | 5 +- grails-app/views/project/_requestLabels.gsp | 25 ++++++++ grails-app/views/project/index.gsp | 3 +- .../au/org/ala/merit/SettingPageType.groovy | 3 +- .../releases/3.1/adhoc/compareTwoAuditBits.js | 8 +++ .../3.1/adhoc/restoreMeriPlanFromAudit.js | 20 +++++++ 11 files changed, 163 insertions(+), 22 deletions(-) create mode 100644 grails-app/services/au/org/ala/merit/MonitorService.groovy create mode 100644 grails-app/views/project/_requestLabels.gsp create mode 100644 src/main/scripts/releases/3.1/adhoc/compareTwoAuditBits.js create mode 100644 src/main/scripts/releases/3.1/adhoc/restoreMeriPlanFromAudit.js diff --git a/grails-app/assets/javascripts/projects.js b/grails-app/assets/javascripts/projects.js index abbf05790..b1ade1ca8 100644 --- a/grails-app/assets/javascripts/projects.js +++ b/grails-app/assets/javascripts/projects.js @@ -1213,6 +1213,19 @@ function ProjectPageViewModel(project, sites, activities, organisations, userRol ko.applyBindings(risksReportViewModel, risksChangesReport); } + var requestLabelsConfig = { + requestLabelUrl: fcConfig.requestLabelUrl + }; + + var RequestLabelsViewModel = function(options) { + var self = this; + self.pageCount = ko.observable(1); + self.requestLabelUrl = ko.computed(function() { + return options.requestLabelUrl + '?pageCount=' + self.pageCount(); + }); + }; + ko.applyBindings(new RequestLabelsViewModel(requestLabelsConfig), document.getElementById('request-label-form')); + }; self.initialiseMeriPlan = function() { diff --git a/grails-app/conf/application.groovy b/grails-app/conf/application.groovy index e4572a068..73d2ac621 100644 --- a/grails-app/conf/application.groovy +++ b/grails-app/conf/application.groovy @@ -223,6 +223,7 @@ auth.baseUrl = 'https://auth-test.ala.org.au' userDetails.web.url = "${auth.baseUrl}/userdetails/" userDetails.api.url = "${auth.baseUrl}/userdetails/userDetails/" user.registration.url = "${auth.baseUrl}/userdetails/registration/createAccount" +monitor.core.baseUrl = "https://dev.core-api.monitor.tern.org.au/api" security { cas { enabled = false diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index 9f3709853..b8617b35d 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -36,6 +36,7 @@ class ProjectController { def siteService, documentService, reportService, blogService GrailsApplication grailsApplication LockService lockService + MonitorService monitorService private def espOverview(Map project, Map user, ProgramConfig config) { @@ -1139,6 +1140,13 @@ class ProjectController { render result as JSON } + @PreAuthorise(accessLevel = 'admin') + def requestVoucherBarcodeLabels(String id, Integer pageCount) { + pageCount = pageCount ?: 1 + monitorService.requestVoucherBarcodeLabels(id, pageCount, response) + null + } + private def error(String message, String projectId) { flash.message = message if (projectId) { diff --git a/grails-app/services/au/org/ala/merit/MonitorService.groovy b/grails-app/services/au/org/ala/merit/MonitorService.groovy new file mode 100644 index 000000000..e3fe80bfe --- /dev/null +++ b/grails-app/services/au/org/ala/merit/MonitorService.groovy @@ -0,0 +1,41 @@ +package au.org.ala.merit + +import grails.core.GrailsApplication + +import javax.servlet.http.HttpServletResponse + +/** + * Responsible for the interface to the Monitor system + */ +class MonitorService { + + static final String MONITOR_PLANT_LABEL_PATH = "/generate-barcode" + /** Code for the MERIT program in Monitor */ + static final String MERIT_PROGRAM_CODE = "M" + + WebService webService + GrailsApplication grailsApplication + CommonService commonService + + + /** + * Sends a request to the Monitor core API to request plant labels for a project and proxies the response + * (as it is a PDF file) + * @param response the HTTP response to write the PDF to + * @param numberOfPages The number of pages of labels the user has requested + */ + def requestVoucherBarcodeLabels(String projectId, int numberOfPages, HttpServletResponse response) { + + String url = grailsApplication.config.getProperty("monitor.core.baseUrl") + MONITOR_PLANT_LABEL_PATH + + Map params = [ + project_code: projectId, + num_pages: numberOfPages, + program: MERIT_PROGRAM_CODE + ] + + url += commonService.buildUrlParamsFromMap(params) + println url + webService.proxyGetRequest(response, url, WebService.AUTHORIZATION_HEADER_TYPE_USER_BEARER_TOKEN) + } +} diff --git a/grails-app/services/au/org/ala/merit/WebService.groovy b/grails-app/services/au/org/ala/merit/WebService.groovy index 9fb6855f4..73828315b 100644 --- a/grails-app/services/au/org/ala/merit/WebService.groovy +++ b/grails-app/services/au/org/ala/merit/WebService.groovy @@ -41,6 +41,19 @@ import javax.servlet.http.HttpServletResponse @Slf4j class WebService { + /** Use legacy ALA authorization header */ + static String AUTHORIZATION_HEADER_TYPE_API_KEY = 'apiKey' + + /** Use a bearer token obtained from the user login */ + static String AUTHORIZATION_HEADER_TYPE_USER_BEARER_TOKEN = 'userToken' + + /** Use the MERIT bearer token. Do not use with non ALA systems */ + static String AUTHORIZATION_HEADER_TYPE_SYSTEM_BEAREN_TOKEN = 'systemToken' + + /** A bearer token issued by an external system. E.g. the BDR */ + static String AUTHORIZATION_HEADER_TYPE_EXTERNAL_TOKEN = 'externalToken' + + TokenService tokenService // Used to avoid a circular dependency during initialisation @@ -103,24 +116,32 @@ class WebService { } private URLConnection configureConnection(String url, boolean includeUserId, Integer timeout = null, boolean useToken = false) { + String authHeaderType = useToken ? AUTHORIZATION_HEADER_TYPE_SYSTEM_BEAREN_TOKEN : AUTHORIZATION_HEADER_TYPE_API_KEY + configureConnection(url, authHeaderType, timeout) + } + + private URLConnection configureConnection(String url, String authorizationHeaderType, Integer timeout = null) { URLConnection conn = createAndConfigureConnection(url, timeout) - if (!useToken) { - conn.setRequestProperty("Authorization", grailsApplication.config.getProperty('api_key')) + if (authorizationHeaderType == AUTHORIZATION_HEADER_TYPE_API_KEY) { + conn.setRequestProperty(HttpHeaders.AUTHORIZATION, grailsApplication.config.getProperty('api_key')) + def user = getUserService().getUser() + if (user) { + conn.setRequestProperty(grailsApplication.config.getProperty('app.http.header.userId'), user.userId) + } + } - else { - conn.setRequestProperty("Authorization", getToken()) + else if (authorizationHeaderType == AUTHORIZATION_HEADER_TYPE_USER_BEARER_TOKEN) { + conn.setRequestProperty(HttpHeaders.AUTHORIZATION, getToken(true)) } - - - def user = getUserService().getUser() - if (user) { - conn.setRequestProperty(grailsApplication.config.getProperty('app.http.header.userId'), user.userId) + else if (authorizationHeaderType == AUTHORIZATION_HEADER_TYPE_SYSTEM_BEAREN_TOKEN) { + conn.setRequestProperty(HttpHeaders.AUTHORIZATION, getToken(false)) } + conn } - private String getToken() { - tokenService.getAuthToken(false)?.toAuthorizationHeader() + private String getToken(boolean requireUser = false) { + tokenService.getAuthToken(requireUser)?.toAuthorizationHeader() } private URLConnection createAndConfigureConnection(String url, Integer timeout = null) { @@ -133,20 +154,19 @@ class WebService { conn } + def proxyGetRequest(HttpServletResponse response, String url, boolean includeUserId = true, boolean includeApiKey = false, Integer timeout = null) { + String authHeaderType = useToken ? AUTHORIZATION_HEADER_TYPE_SYSTEM_BEAREN_TOKEN : AUTHORIZATION_HEADER_TYPE_API_KEY + proxyGetRequest(response, url, authHeaderType, timeout) + } + /** * Proxies a request URL but doesn't assume the response is text based. (Used for proxying requests to * ecodata for excel-based reports) */ - def proxyGetRequest(HttpServletResponse response, String url, boolean includeUserId = true, boolean includeApiKey = false, Integer timeout = null) { + def proxyGetRequest(HttpServletResponse response, String url, String authHeaderType, Integer timeout = null) { - HttpURLConnection conn = configureConnection(url, includeUserId) def readTimeout = timeout?:defaultTimeout() - conn.setConnectTimeout(connectTimeout()) - conn.setReadTimeout(readTimeout) - - if (includeApiKey) { - conn.setRequestProperty("Authorization", grailsApplication.config.getProperty('api_key')) - } + HttpURLConnection conn = configureConnection(url, authHeaderType, readTimeout) def headers = [HttpHeaders.CONTENT_DISPOSITION, HttpHeaders.CACHE_CONTROL, HttpHeaders.EXPIRES, HttpHeaders.LAST_MODIFIED, HttpHeaders.ETAG] def resp = [status:conn.responseCode] diff --git a/grails-app/views/project/_projectAdmin.gsp b/grails-app/views/project/_projectAdmin.gsp index ce1ddf948..55dda349c 100644 --- a/grails-app/views/project/_projectAdmin.gsp +++ b/grails-app/views/project/_projectAdmin.gsp @@ -33,6 +33,7 @@ Species of interest
Documents + Request voucher barcode labels Project access @@ -125,7 +126,6 @@
- %{--
 
--}%
%{----}% @@ -133,6 +133,9 @@ +
+ +
diff --git a/grails-app/views/project/_requestLabels.gsp b/grails-app/views/project/_requestLabels.gsp new file mode 100644 index 000000000..b5470cfe2 --- /dev/null +++ b/grails-app/views/project/_requestLabels.gsp @@ -0,0 +1,25 @@ + +<%@ page import="au.org.ala.merit.SettingPageType" expressionCodec="none"%> +
+
+

Request voucher barcode labels

+
+
+
+
+ +
+
+
+
+
+
+ + + + Request labels +
+
+
+
+ diff --git a/grails-app/views/project/index.gsp b/grails-app/views/project/index.gsp index 62a682cfd..18e94c76e 100644 --- a/grails-app/views/project/index.gsp +++ b/grails-app/views/project/index.gsp @@ -99,7 +99,8 @@ i18nURL: "${g.createLink(controller: 'home', action: 'i18n')}", returnTo: "${createLink(controller: 'project', action: 'index', id: project.projectId)}", reportsHistoryUrl:"${createLink(controller: 'report', action:'reportingHistory')}", - monitoringProtocolsUrl:"${createLink(action:'monitoringProtocolFormCategories', id: project.projectId)}" + monitoringProtocolsUrl:"${createLink(action:'monitoringProtocolFormCategories', id: project.projectId)}", + requestLabelUrl:"${createLink(action:'requestVoucherBarcodeLabels', id: project.projectId)}", }, here = "${createLink(action:'index', id: project.projectId)}"; diff --git a/src/main/groovy/au/org/ala/merit/SettingPageType.groovy b/src/main/groovy/au/org/ala/merit/SettingPageType.groovy index e7d28c9b5..476ef7dfc 100644 --- a/src/main/groovy/au/org/ala/merit/SettingPageType.groovy +++ b/src/main/groovy/au/org/ala/merit/SettingPageType.groovy @@ -108,7 +108,8 @@ enum SettingPageType { ORGANISATION_REPORT_APPROVED_EMAIL_BODY('organisationReportApprovedEmailBody', 'Organisation Report approved email body text', 'organisation_report.approved.emailBody'), ORGANISATION_REPORT_RETURNED_EMAIL_SUBJECT('organisationReportReturnedEmailSubject', 'Organisation Report returned email subject line text', 'organisation_report.returned.emailSubject'), ORGANISATION_REPORT_RETURNED_EMAIL_BODY('organisationReportReturnedEmailBody', 'Organisation Report returned email body text', 'organisation_report.returned.emailBody'), - ORGANISATION_REPORT_CONFIG('organisationReportConfig', 'Report configuration options for organisations', 'organisation.availableReportsConfig') + ORGANISATION_REPORT_CONFIG('organisationReportConfig', 'Report configuration options for organisations', 'organisation.availableReportsConfig'), + PLANT_LABEL_INSTRUCTIONS('plantLabelInstructions', 'Instructions for printing plant labels', 'plantLabelInstructions') String name String title String key diff --git a/src/main/scripts/releases/3.1/adhoc/compareTwoAuditBits.js b/src/main/scripts/releases/3.1/adhoc/compareTwoAuditBits.js new file mode 100644 index 000000000..57b6ac76a --- /dev/null +++ b/src/main/scripts/releases/3.1/adhoc/compareTwoAuditBits.js @@ -0,0 +1,8 @@ +let id2 = ObjectId('65f137f7d687b746afe0a7f6'); +let id1 = ObjectId('65e984f3d687b746afe07f91'); + +let auditMessage2 = db.auditMessage.findOne({_id:id2}); +let auditMessage1 = db.auditMessage.findOne({_id:id1}); + +printjson(auditMessage1); +printjson(auditMessage2); \ No newline at end of file diff --git a/src/main/scripts/releases/3.1/adhoc/restoreMeriPlanFromAudit.js b/src/main/scripts/releases/3.1/adhoc/restoreMeriPlanFromAudit.js new file mode 100644 index 000000000..6deac38e7 --- /dev/null +++ b/src/main/scripts/releases/3.1/adhoc/restoreMeriPlanFromAudit.js @@ -0,0 +1,20 @@ +load('../../../utils/audit.js'); +let adminUserId = '1493'; +let auditMessageId = ObjectId('65f110e2d687b746afe0a71f'); +let auditMessage = db.auditMessage.findOne({_id:auditMessageId}); + +print(auditMessage); + +let projectId = auditMessage.entityId; + +let project = db.project.findOne({projectId:projectId}); + +project.custom.details = auditMessage.entity.custom.details; +project.outputTargets = auditMessage.entity.outputTargets; +project.custom.details.lastUpdated = '2024-03-14T11:13:09+11:00' + +printjson(project); +db.project.replaceOne({projectId:projectId}, project); + +audit(project, projectId, 'au.org.ala.ecodata.Project', adminUserId); + From 158529af3f40e7c389117aea2da954f9d4c07c03 Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 22 Mar 2024 12:49:14 +1100 Subject: [PATCH 06/95] 3.2-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 215b631cd..7781a9e4f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -meritVersion=3.1 +meritVersion=3.2-SNAPSHOT grailsVersion=5.3.5 grailsGradlePluginVersion=5.3.0 groovyVersion=3.0.11 From 84721987bd4c7d63df679e1ec7288d90f9877e1f Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 22 Mar 2024 14:34:59 +1100 Subject: [PATCH 07/95] Fixed functional tests #3126 --- package-lock.json | 750 +++++++++++++++++- package.json | 2 +- .../fieldcapture/ProjectPermissionSpec.groovy | 10 +- 3 files changed, 727 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 44af52801..aa01f94ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ }, "devDependencies": { "@metahub/karma-jasmine-jquery": "^2.0.1", - "chromedriver": "121.0.0", + "chromedriver": "123.0.0", "jasmine-core": "^3.5.0", "jasmine-jquery": "^2.0.0", "jquery": "3.6.2", @@ -459,6 +459,12 @@ "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", "dev": true }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -533,15 +539,15 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/agent-base/node_modules/debug": { @@ -639,6 +645,18 @@ "inherits": "2.0.1" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -689,6 +707,15 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1060,17 +1087,17 @@ } }, "node_modules/chromedriver": { - "version": "121.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-121.0.0.tgz", - "integrity": "sha512-ZIKEdZrQAfuzT/RRofjl8/EZR99ghbdBXNTOcgJMKGP6N/UL6lHUX4n6ONWBV18pDvDFfQJ0x58h5AdOaXIOMw==", + "version": "123.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.0.tgz", + "integrity": "sha512-OE9mpxXwbFy5LncAisqXm1aEzuLPtEMORIxyYIn9uT7N8rquJWyoip6w9Rytub3o2gnynW9+PFOTPVTldaYrtw==", "dev": true, "hasInstallScript": true, "dependencies": { "@testim/chrome-version": "^1.1.4", - "axios": "^1.6.5", + "axios": "^1.6.7", "compare-versions": "^6.1.0", "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.1", + "proxy-agent": "^6.4.0", "proxy-from-env": "^1.1.0", "tcp-port-used": "^1.0.2" }, @@ -1318,6 +1345,15 @@ "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/date-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", @@ -1350,6 +1386,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1599,6 +1649,58 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eventemitter3": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", @@ -1848,6 +1950,58 @@ "node": ">=8" } }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -2042,22 +2196,58 @@ "node": ">=8.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent/node_modules/debug": { @@ -2164,6 +2354,19 @@ "insert-module-globals": "bin/cmd.js" } }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/ip-regex": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", @@ -2435,6 +2638,12 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -2664,6 +2873,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", @@ -2852,6 +3070,15 @@ "node": ">= 0.6" } }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2911,6 +3138,61 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -3028,6 +3310,48 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -3345,6 +3669,16 @@ "jquery-ui": ">=1.8.0" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/socket.io": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", @@ -3430,6 +3764,57 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3439,6 +3824,12 @@ "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -3728,6 +4119,12 @@ "node": ">=0.6" } }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -4362,6 +4759,12 @@ "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", "dev": true }, + "@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -4424,12 +4827,12 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "requires": { - "debug": "4" + "debug": "^4.3.4" }, "dependencies": { "debug": { @@ -4516,6 +4919,15 @@ } } }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4549,6 +4961,12 @@ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, + "basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -4858,16 +5276,16 @@ } }, "chromedriver": { - "version": "121.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-121.0.0.tgz", - "integrity": "sha512-ZIKEdZrQAfuzT/RRofjl8/EZR99ghbdBXNTOcgJMKGP6N/UL6lHUX4n6ONWBV18pDvDFfQJ0x58h5AdOaXIOMw==", + "version": "123.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-123.0.0.tgz", + "integrity": "sha512-OE9mpxXwbFy5LncAisqXm1aEzuLPtEMORIxyYIn9uT7N8rquJWyoip6w9Rytub3o2gnynW9+PFOTPVTldaYrtw==", "dev": true, "requires": { "@testim/chrome-version": "^1.1.4", - "axios": "^1.6.5", + "axios": "^1.6.7", "compare-versions": "^6.1.0", "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.1", + "proxy-agent": "^6.4.0", "proxy-from-env": "^1.1.0", "tcp-port-used": "^1.0.2" } @@ -5089,6 +5507,12 @@ "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" }, + "data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true + }, "date-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", @@ -5115,6 +5539,17 @@ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" }, + "degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "requires": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5324,6 +5759,36 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "eventemitter3": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", @@ -5513,6 +5978,46 @@ "pump": "^3.0.0" } }, + "get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, + "requires": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -5655,18 +6160,45 @@ "requires-port": "^1.0.0" } }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "dependencies": { @@ -5747,6 +6279,16 @@ "xtend": "^4.0.0" } }, + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + } + }, "ip-regex": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", @@ -5960,6 +6502,12 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6142,6 +6690,12 @@ } } }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, "make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", @@ -6290,6 +6844,12 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6334,6 +6894,49 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, + "pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dev": true, + "requires": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "requires": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + } + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -6425,6 +7028,39 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -6684,6 +7320,12 @@ "jquery-ui": ">=1.8.0" } }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, "socket.io": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", @@ -6751,12 +7393,56 @@ } } }, + "socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "dev": true, + "requires": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -6985,6 +7671,12 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", diff --git a/package.json b/package.json index 9bb537fc8..9dd57586d 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "devDependencies": { "@metahub/karma-jasmine-jquery": "^2.0.1", - "chromedriver": "121.0.0", + "chromedriver": "123.0.0", "jasmine-core": "^3.5.0", "jasmine-jquery": "^2.0.0", "jquery": "3.6.2", diff --git a/src/integration-test/groovy/au/org/ala/fieldcapture/ProjectPermissionSpec.groovy b/src/integration-test/groovy/au/org/ala/fieldcapture/ProjectPermissionSpec.groovy index 6b9609bf5..4784765de 100644 --- a/src/integration-test/groovy/au/org/ala/fieldcapture/ProjectPermissionSpec.groovy +++ b/src/integration-test/groovy/au/org/ala/fieldcapture/ProjectPermissionSpec.groovy @@ -60,11 +60,11 @@ class ProjectPermissionSpec extends StubbedCasSpec { } - def "an admin cannot add a user as a grant manager, but change change an editor to an admin"() { + def "an admin cannot add a user as a grant manager, but can change an editor to an admin"() { setup: String projectId = '1' - loginAsMeritAdmin(browser) + loginAsUser('1', browser) when: to RlpProjectPage, projectId @@ -78,15 +78,15 @@ class ProjectPermissionSpec extends StubbedCasSpec { adminContent.projectAccess.addPermission("user1001@user.com", "caseManager") then: "we cannot because the 'Grant Manager' option is disabled" - thrown(ElementNotInteractableException) + thrown(Exception) // The type of exception thrown has changed when: "We change user 10 to an admin" - adminContent.projectAccess.findPermissionForUser('10').updateRole('admin') + adminContent.projectAccess.findPermissionForDisplayName('test10 user10').updateRole('admin') okBootbox() then: waitFor { - adminContent.projectAccess.findPermissionForUser('10').roleText == "Admin" + adminContent.projectAccess.findPermissionForDisplayName('test10 user10').roleText == "Admin" } } From adb5f8df6876537aa63382412bff2120416d3647 Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 22 Mar 2024 14:37:03 +1100 Subject: [PATCH 08/95] Fixed functional tests #3126 --- grails-app/assets/javascripts/projects.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/grails-app/assets/javascripts/projects.js b/grails-app/assets/javascripts/projects.js index b1ade1ca8..fa5821d63 100644 --- a/grails-app/assets/javascripts/projects.js +++ b/grails-app/assets/javascripts/projects.js @@ -1217,14 +1217,19 @@ function ProjectPageViewModel(project, sites, activities, organisations, userRol requestLabelUrl: fcConfig.requestLabelUrl }; - var RequestLabelsViewModel = function(options) { - var self = this; - self.pageCount = ko.observable(1); - self.requestLabelUrl = ko.computed(function() { - return options.requestLabelUrl + '?pageCount=' + self.pageCount(); - }); - }; - ko.applyBindings(new RequestLabelsViewModel(requestLabelsConfig), document.getElementById('request-label-form')); + var requestLabelsSection = document.getElementById('request-label-form'); + + if (requestLabelsSection) { + var RequestLabelsViewModel = function(options) { + var self = this; + self.pageCount = ko.observable(1); + self.requestLabelUrl = ko.computed(function() { + return options.requestLabelUrl + '?pageCount=' + self.pageCount(); + }); + }; + + ko.applyBindings(new RequestLabelsViewModel(requestLabelsConfig), document.getElementById('request-label-form')); + } }; From de0cb778940687ad15d26bf5791d8a5997655c8e Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 22 Mar 2024 15:12:10 +1100 Subject: [PATCH 09/95] Restore original proxyGetRequest behaviour #3126 --- grails-app/services/au/org/ala/merit/WebService.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/grails-app/services/au/org/ala/merit/WebService.groovy b/grails-app/services/au/org/ala/merit/WebService.groovy index 73828315b..14e65037e 100644 --- a/grails-app/services/au/org/ala/merit/WebService.groovy +++ b/grails-app/services/au/org/ala/merit/WebService.groovy @@ -53,6 +53,8 @@ class WebService { /** A bearer token issued by an external system. E.g. the BDR */ static String AUTHORIZATION_HEADER_TYPE_EXTERNAL_TOKEN = 'externalToken' + static String AUTHORIZATION_HEADER_TYPE_NONE = 'none' + TokenService tokenService @@ -155,7 +157,7 @@ class WebService { } def proxyGetRequest(HttpServletResponse response, String url, boolean includeUserId = true, boolean includeApiKey = false, Integer timeout = null) { - String authHeaderType = useToken ? AUTHORIZATION_HEADER_TYPE_SYSTEM_BEAREN_TOKEN : AUTHORIZATION_HEADER_TYPE_API_KEY + String authHeaderType = includeApiKey ? AUTHORIZATION_HEADER_TYPE_API_KEY : AUTHORIZATION_HEADER_TYPE_NONE proxyGetRequest(response, url, authHeaderType, timeout) } From a2f4811bf6fef03be2784b944779927b42354b9c Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 22 Mar 2024 15:39:12 +1100 Subject: [PATCH 10/95] Updated read only view #3118 --- grails-app/views/project/meriPlan/_programOutcome.gsp | 2 +- .../views/project/meriPlanReadOnly/_outcomeStatements.gsp | 8 ++++++++ package.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/grails-app/views/project/meriPlan/_programOutcome.gsp b/grails-app/views/project/meriPlan/_programOutcome.gsp index 2da10562d..184812d20 100644 --- a/grails-app/views/project/meriPlan/_programOutcome.gsp +++ b/grails-app/views/project/meriPlan/_programOutcome.gsp @@ -24,7 +24,7 @@ - +
    diff --git a/grails-app/views/project/meriPlanReadOnly/_outcomeStatements.gsp b/grails-app/views/project/meriPlanReadOnly/_outcomeStatements.gsp index a9ee35d72..7fff87454 100644 --- a/grails-app/views/project/meriPlanReadOnly/_outcomeStatements.gsp +++ b/grails-app/views/project/meriPlanReadOnly/_outcomeStatements.gsp @@ -31,7 +31,15 @@ + + +
      +
    • +
    +
    + + diff --git a/package.json b/package.json index 9bb537fc8..9dd57586d 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "devDependencies": { "@metahub/karma-jasmine-jquery": "^2.0.1", - "chromedriver": "121.0.0", + "chromedriver": "123.0.0", "jasmine-core": "^3.5.0", "jasmine-jquery": "^2.0.0", "jquery": "3.6.2", From 57776076cf73c0f8f9ece9c5ba54cbea80c5da24 Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 22 Mar 2024 16:38:19 +1100 Subject: [PATCH 11/95] Disable request labels when required #3126 --- .../au/org/ala/merit/ProjectController.groovy | 2 +- grails-app/views/project/_projectAdmin.gsp | 6 +++++- grails-app/views/project/_requestLabels.gsp | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index b8617b35d..3ef8c4e6c 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -203,7 +203,7 @@ class ProjectController { site : [label: 'Sites', visible: config.includesContent(ProgramConfig.ProjectContent.SITES), disabled: !user?.hasViewAccess, editable:user?.isEditor, type: 'tab', template:'projectSites'], dashboard : [label: 'Dashboard', visible: config.includesContent(ProgramConfig.ProjectContent.DASHBOARD), disabled: !user?.hasViewAccess, type: 'tab'], datasets : [label: 'Data set summary', visible: datasetsVisible, template: '/project/dataset/dataSets', type:'tab'], - admin : [label: 'Admin', visible: adminTabVisible, user:user, type: 'tab', template:'projectAdmin', project:project, canChangeProjectDates: canChangeProjectDates, minimumProjectEndDate:minimumProjectEndDate, showMERIActivityWarning:true, showAnnouncementsTab: showAnnouncementsTab, showSpecies:true, meriPlanTemplate:MERI_PLAN_TEMPLATE, showMeriPlanHistory:showMeriPlanHistory, requireMeriPlanApprovalReason:Boolean.valueOf(config.supportsMeriPlanHistory), config:config, activityPeriodDescriptor:config.activityPeriodDescriptor ?: 'Stage', canRegenerateReports: canRegenerateReports, canModifyMeriPlan: canModifyMeriPlan]] + admin : [label: 'Admin', visible: adminTabVisible, user:user, type: 'tab', template:'projectAdmin', project:project, canChangeProjectDates: canChangeProjectDates, minimumProjectEndDate:minimumProjectEndDate, showMERIActivityWarning:true, showAnnouncementsTab: showAnnouncementsTab, showSpecies:true, meriPlanTemplate:MERI_PLAN_TEMPLATE, showMeriPlanHistory:showMeriPlanHistory, requireMeriPlanApprovalReason:Boolean.valueOf(config.supportsMeriPlanHistory), config:config, activityPeriodDescriptor:config.activityPeriodDescriptor ?: 'Stage', canRegenerateReports: canRegenerateReports, canModifyMeriPlan: canModifyMeriPlan, showRequestLabels:config.supportsParatoo]] if (template == MERI_ONLY_TEMPLATE) { model = [details:model.details] diff --git a/grails-app/views/project/_projectAdmin.gsp b/grails-app/views/project/_projectAdmin.gsp index 55dda349c..a55bdf254 100644 --- a/grails-app/views/project/_projectAdmin.gsp +++ b/grails-app/views/project/_projectAdmin.gsp @@ -33,7 +33,9 @@ Species of interest
    Documents - Request voucher barcode labels + + Request voucher barcode labels + Project access @@ -133,9 +135,11 @@ +
    +
    diff --git a/grails-app/views/project/_requestLabels.gsp b/grails-app/views/project/_requestLabels.gsp index b5470cfe2..c16ae8f88 100644 --- a/grails-app/views/project/_requestLabels.gsp +++ b/grails-app/views/project/_requestLabels.gsp @@ -1,5 +1,13 @@ <%@ page import="au.org.ala.merit.SettingPageType" expressionCodec="none"%> + + + +
    + If you need to request barcode labels for this project, you must first add yourself to the project as a Grant Manager +
    +
    +

    Request voucher barcode labels

    @@ -17,7 +25,12 @@ - Request labels + + + + + Request labels +
    From 6c2c1cea87e5757627172364cf83a507230c8848 Mon Sep 17 00:00:00 2001 From: sal153 Date: Fri, 22 Mar 2024 20:03:04 +1100 Subject: [PATCH 12/95] commit label updates participation information --- forms/nht/nhtOutputReport.json | 136 ++++++++++++++++----------------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/forms/nht/nhtOutputReport.json b/forms/nht/nhtOutputReport.json index 15cbb1f9a..364d7468c 100644 --- a/forms/nht/nhtOutputReport.json +++ b/forms/nht/nhtOutputReport.json @@ -1319,7 +1319,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -1335,7 +1335,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -2182,7 +2182,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -2198,7 +2198,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -2809,7 +2809,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -2825,7 +2825,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -3618,7 +3618,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -3634,7 +3634,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -4641,7 +4641,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -4657,7 +4657,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -5648,7 +5648,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -5664,7 +5664,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -6728,7 +6728,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -6744,7 +6744,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -7773,7 +7773,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -7789,7 +7789,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -8716,7 +8716,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -8732,7 +8732,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -9744,7 +9744,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -9760,7 +9760,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -10828,7 +10828,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -10844,7 +10844,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -11998,7 +11998,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -12014,7 +12014,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -13175,7 +13175,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -13191,7 +13191,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -14239,7 +14239,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -14255,7 +14255,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -15326,7 +15326,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -15342,7 +15342,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -16376,7 +16376,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -16392,7 +16392,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -17307,7 +17307,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -17323,7 +17323,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -18172,7 +18172,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -18188,7 +18188,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -19102,7 +19102,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -19118,7 +19118,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -20056,7 +20056,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -20072,7 +20072,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -21129,7 +21129,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -21145,7 +21145,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -22367,7 +22367,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -22383,7 +22383,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -23552,7 +23552,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -23568,7 +23568,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -24559,7 +24559,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -24575,7 +24575,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -25580,7 +25580,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -25596,7 +25596,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -26737,7 +26737,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -26753,7 +26753,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -27771,7 +27771,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -27787,7 +27787,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -28798,7 +28798,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -28814,7 +28814,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -29816,7 +29816,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -29832,7 +29832,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -30745,7 +30745,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -30761,7 +30761,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -31433,7 +31433,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -31449,7 +31449,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -32260,7 +32260,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -32276,7 +32276,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -33368,7 +33368,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -33384,7 +33384,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -34518,7 +34518,7 @@ { "width": "20%", "type": "col", - "title": "Total number of people delivering this service
    (including First Nations people)*", + "title": "Total number of people participating in the delivery of this service
    (including First Nations people, paid employees, unpaid employees, and volunteers)*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { @@ -34534,7 +34534,7 @@ { "type": "col", "width": "20%", - "title": "Total number of First Nations people delivering this service*", + "title": "Total number of First Nations people participating in the delivery of this service, including paid employees, unpaid employees and volunteers*", "helpText": "Please record either the total number of individuals or the number of individuals in the group that delivered this service. If you have a mix of Individuals and groups, you should report them separately by adding a row.", "items": [ { From 285251e51118abc8f6ee77690dd4f17763730ab1 Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 25 Mar 2024 08:36:16 +1100 Subject: [PATCH 13/95] Added tests #3126 --- .../org/ala/merit/MonitorServiceSpec.groovy | 29 +++++++++++++++++++ .../ala/merit/ProgramControllerSpec.groovy | 11 +++++++ 2 files changed, 40 insertions(+) create mode 100644 src/test/groovy/au/org/ala/merit/MonitorServiceSpec.groovy diff --git a/src/test/groovy/au/org/ala/merit/MonitorServiceSpec.groovy b/src/test/groovy/au/org/ala/merit/MonitorServiceSpec.groovy new file mode 100644 index 000000000..2a41a2112 --- /dev/null +++ b/src/test/groovy/au/org/ala/merit/MonitorServiceSpec.groovy @@ -0,0 +1,29 @@ +package au.org.ala.merit + +import grails.testing.services.ServiceUnitTest +import spock.lang.Specification + +import javax.servlet.http.HttpServletResponse + +class MonitorServiceSpec extends Specification implements ServiceUnitTest { + + WebService webService = Mock(WebService) + HttpServletResponse response = Mock(HttpServletResponse) + CommonService commonService = new CommonService() + def setup() { + service.webService = webService + service.commonService = commonService + } + + void "the requestVoucherBarcodeLabels method delegates to the WebService"() { + setup: + String projectId = 'p1' + int numPages = 1 + + when: + service.requestVoucherBarcodeLabels(projectId, numPages, response) + + then: + 1 * webService.proxyGetRequest(response, { it.contains(MonitorService.MONITOR_PLANT_LABEL_PATH)} , WebService.AUTHORIZATION_HEADER_TYPE_USER_BEARER_TOKEN) + } +} diff --git a/src/test/groovy/au/org/ala/merit/ProgramControllerSpec.groovy b/src/test/groovy/au/org/ala/merit/ProgramControllerSpec.groovy index a2c61de67..3942ce897 100644 --- a/src/test/groovy/au/org/ala/merit/ProgramControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/ProgramControllerSpec.groovy @@ -15,6 +15,7 @@ class ProgramControllerSpec extends Specification implements ControllerUnitTest< ActivityService activityService = Mock(ActivityService) RoleService roleService = Mock(RoleService) BlogService blogService = Mock(BlogService) + MonitorService monitorService = Mock(MonitorService) String adminUserId = 'admin' @@ -29,6 +30,7 @@ class ProgramControllerSpec extends Specification implements ControllerUnitTest< controller.userService = userService controller.blogService = blogService controller.managementUnitService = managementUnitService + controller.monitorService = monitorService roleService.getRoles() >> [] } @@ -275,6 +277,15 @@ class ProgramControllerSpec extends Specification implements ControllerUnitTest< expected == actual } + def "The requestVoucherBarcodeLabels method delegates to the MonitorService and returns null as the response is streamed from Monitor"() { + when: + def result = controller.requestVoucherBarcodeLabels('p1', 'r1') + + then: + 1 * monitorService.requestVoucherBarcodeLabels('p1', 'r1', response) + result == null + } + private Map testProgram(String id, boolean includeReports) { Map program = [programId:id, name:'name', config:[:], inheritedConfig:[:]] if (includeReports) { From 6d599a0dff0b6576c766bec8b4838db517cdb45c Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 25 Mar 2024 09:12:06 +1100 Subject: [PATCH 14/95] Fixed tests #3126 --- .../au/org/ala/merit/ProgramControllerSpec.groovy | 11 ----------- .../au/org/ala/merit/ProjectControllerSpec.groovy | 12 +++++++++++- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/test/groovy/au/org/ala/merit/ProgramControllerSpec.groovy b/src/test/groovy/au/org/ala/merit/ProgramControllerSpec.groovy index 3942ce897..a2c61de67 100644 --- a/src/test/groovy/au/org/ala/merit/ProgramControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/ProgramControllerSpec.groovy @@ -15,7 +15,6 @@ class ProgramControllerSpec extends Specification implements ControllerUnitTest< ActivityService activityService = Mock(ActivityService) RoleService roleService = Mock(RoleService) BlogService blogService = Mock(BlogService) - MonitorService monitorService = Mock(MonitorService) String adminUserId = 'admin' @@ -30,7 +29,6 @@ class ProgramControllerSpec extends Specification implements ControllerUnitTest< controller.userService = userService controller.blogService = blogService controller.managementUnitService = managementUnitService - controller.monitorService = monitorService roleService.getRoles() >> [] } @@ -277,15 +275,6 @@ class ProgramControllerSpec extends Specification implements ControllerUnitTest< expected == actual } - def "The requestVoucherBarcodeLabels method delegates to the MonitorService and returns null as the response is streamed from Monitor"() { - when: - def result = controller.requestVoucherBarcodeLabels('p1', 'r1') - - then: - 1 * monitorService.requestVoucherBarcodeLabels('p1', 'r1', response) - result == null - } - private Map testProgram(String id, boolean includeReports) { Map program = [programId:id, name:'name', config:[:], inheritedConfig:[:]] if (includeReports) { diff --git a/src/test/groovy/au/org/ala/merit/ProjectControllerSpec.groovy b/src/test/groovy/au/org/ala/merit/ProjectControllerSpec.groovy index ae156db71..d51f5afa4 100644 --- a/src/test/groovy/au/org/ala/merit/ProjectControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/ProjectControllerSpec.groovy @@ -27,7 +27,7 @@ class ProjectControllerSpec extends Specification implements ControllerUnitTest< def siteService = Mock(SiteService) WebService webService = Mock(WebService) - + MonitorService monitorService = Mock(MonitorService) ProjectService realProjectService @@ -49,6 +49,7 @@ class ProjectControllerSpec extends Specification implements ControllerUnitTest< controller.activityService = activityService controller.grailsApplication = grailsApplication controller.webService = webService + controller.monitorService = monitorService projectService.getMembersForProjectId(_) >> [] projectService.getProgramConfiguration(_) >> new ProgramConfig([requiresActivityLocking: true]) @@ -937,6 +938,15 @@ class ProjectControllerSpec extends Specification implements ControllerUnitTest< controller.hasTarget("abc") == true // this is accepted for legacy reasons } + def "The requestVoucherBarcodeLabels method delegates to the MonitorService and returns null as the response is streamed from Monitor"() { + when: + def result = controller.requestVoucherBarcodeLabels('p1', 1) + + then: + 1 * monitorService.requestVoucherBarcodeLabels('p1', 1, response) + result == null + } + private Map stubPublicUser() { userServiceStub.getUser() >> null null From 82e874d5d6eb98f3f1d996948234171d103d371c Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 25 Mar 2024 10:13:03 +1100 Subject: [PATCH 15/95] Fixed tests #3126 --- grails-app/assets/javascripts/meriplan.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/assets/javascripts/meriplan.js b/grails-app/assets/javascripts/meriplan.js index c296723ca..ffed53e80 100644 --- a/grails-app/assets/javascripts/meriplan.js +++ b/grails-app/assets/javascripts/meriplan.js @@ -1761,7 +1761,7 @@ function OutcomesViewModel(outcomes, config) { } - return priorities; + return _.uniq(priorities); }).extend({ rateLimit: 50 }); self.toJSON = function () { From 1e00f54b7deff1649c2cce22ccf5526c83f02058 Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 25 Mar 2024 14:53:32 +1100 Subject: [PATCH 16/95] Fixed tests #3119 --- .../au/org/ala/merit/DataSetController.groovy | 19 +++++++++++-------- .../ala/merit/DataSetControllerSpec.groovy | 6 +++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy index 6b74d4a33..75f6d7ac0 100644 --- a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy +++ b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy @@ -64,7 +64,8 @@ class DataSetController { service: service.name, outcomes:it.relatedOutcomes, label:service.name+" "+it.relatedOutcomes, - tags:score.tags + projectTags:score.tags, + allTags: service.scores?.collect{it.tags}?.flatten()?.unique() ] } } @@ -78,13 +79,15 @@ class DataSetController { outcomeGroups = outcomeGroups.unique{it.label}.sort{it.label} Map serviceBaselineIndicatorOptions = [:] outcomeGroupsByServiceId.each { int serviceId, List groups -> - List tags = groups.collect{it.tags}.flatten().unique() - serviceBaselineIndicatorOptions[serviceId] = [:] - if (!tags?.contains('Baseline')) { - serviceBaselineIndicatorOptions[serviceId].disableBaseline = true - } - if (!tags?.contains('Indicator')) { - serviceBaselineIndicatorOptions[serviceId].disableIndicator = true + List tags = groups.collect{it.allTags}.flatten().unique() + if (tags?.contains('Survey')) { + serviceBaselineIndicatorOptions[serviceId] = [:] + if (!tags?.contains('Baseline')) { + serviceBaselineIndicatorOptions[serviceId].disableBaseline = true + } + if (!tags?.contains('Indicator')) { + serviceBaselineIndicatorOptions[serviceId].disableIndicator = true + } } } diff --git a/src/test/groovy/au/org/ala/merit/DataSetControllerSpec.groovy b/src/test/groovy/au/org/ala/merit/DataSetControllerSpec.groovy index 3d3f3e6fa..b0315e93b 100644 --- a/src/test/groovy/au/org/ala/merit/DataSetControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/DataSetControllerSpec.groovy @@ -45,7 +45,7 @@ class DataSetControllerSpec extends Specification implements ControllerUnitTest< model == [project:project, projectId:'p1', programName:"program 1", supportsOutcomeTargets:false, priorities:["p1"], outcomes:["1", "2"], projectOutcomes:[], projectBaselines:[[label:"b1 - a baseline", value:"b1"]], - projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames:['d1', 'd2']] + projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames:['d1', 'd2'], serviceBaselineIndicatorOptions:[:]] } @@ -90,7 +90,7 @@ class DataSetControllerSpec extends Specification implements ControllerUnitTest< model == [project:project, projectId:'p1', programName:"program 1", priorities:["p1"], supportsOutcomeTargets: true, outcomes:["1", "2"], projectOutcomes:[], dataSet:existingDataSets[1], projectBaselines:[[label:"b1 - a baseline", value:"b1"]], - projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames: ['data set 1', 'data set 3']] + projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames: ['data set 1', 'data set 3'], serviceBaselineIndicatorOptions:[:]] } void "The save method delegates to the projectService"() { @@ -155,6 +155,6 @@ class DataSetControllerSpec extends Specification implements ControllerUnitTest< model == [project:project, projectId:'p1', programName:"program 1", priorities:["p1"], supportsOutcomeTargets: false, outcomes:["1", "2"], projectOutcomes:[], dataSet:existingDataSets[1], projectBaselines:[[label:"b1 - a baseline", value:"b1"]], - projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames: ['data set 1', 'data set 2', 'data set 3']] + projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames: ['data set 1', 'data set 2', 'data set 3'], serviceBaselineIndicatorOptions:[:]] } } From 333d191190bf881854bbd56585be9c47cd5975ed Mon Sep 17 00:00:00 2001 From: chrisala Date: Tue, 26 Mar 2024 08:16:59 +1100 Subject: [PATCH 17/95] Fixes for tests to match paratoo API changes #3119 --- .../ParatooIntegrationSpec.groovy | 51 +- .../3.1/insertParatooProtocolConfig.js | 2 +- .../3.2/adhoc/insertParatooProtocols.js | 2350 +++++++++++++++++ 3 files changed, 2382 insertions(+), 21 deletions(-) create mode 100644 src/main/scripts/releases/3.2/adhoc/insertParatooProtocols.js diff --git a/src/integration-test/groovy/au/org/ala/fieldcapture/ParatooIntegrationSpec.groovy b/src/integration-test/groovy/au/org/ala/fieldcapture/ParatooIntegrationSpec.groovy index df2842430..61bb83195 100644 --- a/src/integration-test/groovy/au/org/ala/fieldcapture/ParatooIntegrationSpec.groovy +++ b/src/integration-test/groovy/au/org/ala/fieldcapture/ParatooIntegrationSpec.groovy @@ -1,6 +1,7 @@ package au.org.ala.fieldcapture import au.org.ala.ws.service.WebService +import groovy.json.JsonSlurper import org.apache.http.entity.ContentType import org.grails.testing.GrailsUnitTest import org.apache.http.HttpStatus @@ -54,26 +55,33 @@ class ParatooIntegrationSpec extends StubbedCasSpec implements GrailsUnitTest { ] Map mintCollectionIdPayload = [ - - surveyId: [ - projectId : 'monitorProject', - protocol : [ - id : "guid-1", // Protocol 23 used to obtain representative data for this functional test - version: 1 - ], - surveyType: 'soil-pit-characterisation-full', - time : '2023-08-28T00:34:13.100Z', - uuid : "123-123-123-123-123" + "survey_metadata": [ + "survey_details": [ + "survey_model": "soil-pit-characterisation-full", + "time": "2023-08-28T00:34:13.100Z", + "uuid": "123-123-123-123-123", + "project_id": "monitorProject", + "protocol_id": "guid-1", + "protocol_version": "1" + ], + "provenance":[ + "version_app": "0.0.1-xxxxx", + "version_core": "0.1.0-1fb53f81", + "version_core_documentation": "0.0.1-xxxxx", + "version_org": "4.4-SNAPSHOT", + "system_app": "monitor", + "system_core": "Monitor-dummy-data-production", + "system_org": "MERIT" + ] ] - ] + ] + + Map collectionPayload = [ - projectId: 'monitorProject', - protocol : [ - id : "guid-1", - version: 1 - ], - userId : '1', - eventTime: '2023-08-28T00:28:15.272Z' + "coreProvenance": [ + "system_core": "Monitor-test", + "version_core": "1" + ] ] when: @@ -90,11 +98,14 @@ class ParatooIntegrationSpec extends StubbedCasSpec implements GrailsUnitTest { resp = webService.post(url, mintCollectionIdPayload, null, ContentType.APPLICATION_JSON, false, false, headers) String orgMintedIdentifier = resp.resp.orgMintedIdentifier + byte[] jsonBytes = orgMintedIdentifier.decodeBase64() + Map json = new JsonSlurper().parse(jsonBytes) + String orgMintedUUID = json.survey_metadata.orgMintedUUID then: resp.statusCode == HttpStatus.SC_OK - orgMintedIdentifier != null + orgMintedUUID != null when: url = testConfig.ecodata.baseUrl + 'paratoo/pdp/monitorProject/guid-1/write' @@ -107,7 +118,7 @@ class ParatooIntegrationSpec extends StubbedCasSpec implements GrailsUnitTest { resp.resp.isAuthorised == true when: - collectionPayload.orgMintedIdentifier = orgMintedIdentifier + collectionPayload.orgMintedUUID = orgMintedUUID url = testConfig.ecodata.baseUrl + '/paratoo/collection' resp = webService.post(url, collectionPayload, null, ContentType.APPLICATION_JSON, false, false, headers) diff --git a/src/main/scripts/releases/3.1/insertParatooProtocolConfig.js b/src/main/scripts/releases/3.1/insertParatooProtocolConfig.js index 264572807..87aadeeb1 100644 --- a/src/main/scripts/releases/3.1/insertParatooProtocolConfig.js +++ b/src/main/scripts/releases/3.1/insertParatooProtocolConfig.js @@ -71,7 +71,7 @@ var protocols = { "usesPlotLayout": true, "tags": ["site"] }, - "3cbc5277-45fb-4e7a-8f33-19d9bff4cd78": {"name": "Drone Survey", "usesPlotLayout": false, "tags": ["survey"]}, + "3cbc5277-45fb-4e7a-8f33-19d9bff4cd78": {"name": "Drone Survey", "usesPlotLayout": false, "tags": ["development"]}, "3d2eaa76-a610-4575-ac30-abf40e57b68a": {"name": "Dev sandbox", "usesPlotLayout": false, "tags": ["development"]}, "5fd206b5-25cb-4371-bd90-7b2e8801ea25": { "name": "Photopoints - DSLR Panorama", diff --git a/src/main/scripts/releases/3.2/adhoc/insertParatooProtocols.js b/src/main/scripts/releases/3.2/adhoc/insertParatooProtocols.js new file mode 100644 index 000000000..cbf99e4d0 --- /dev/null +++ b/src/main/scripts/releases/3.2/adhoc/insertParatooProtocols.js @@ -0,0 +1,2350 @@ +let protocols = [ + { + "id": 1, + "attributes": { + "identifier": "068d17e8-e042-ae42-1e42-cff4006e64b0", + "name": "Opportune", + "module": "Opportune", + "endpointPrefix": "/opportunistic-surveys", + "version": 1, + "description": "Record opportune observations of species across a project area.", + "isWritable": true, + "workflow": [ + { + "modelName": "opportunistic-survey", + "splitSurveyStep": true + }, + { + "multiple": true, + "modelName": "opportunistic-observation", + "overrideDisplayName": "Opportune", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.869Z", + "updatedAt": "2024-03-21T06:27:31.869Z" + } + }, + { + "id": 2, + "attributes": { + "identifier": "cd2cbbc7-2f17-4b0f-91b4-06f46e9c90f2", + "name": "Vegetation Mapping", + "module": "Vegetation Mapping", + "endpointPrefix": "/vegetation-mapping-surveys", + "version": 1, + "description": "Classify vegetation at precise points across the project area and use this data to map vegetation associations.", + "isWritable": true, + "workflow": [ + { + "modelName": "vegetation-mapping-survey", + "splitSurveyStep": true + }, + { + "multiple": true, + "modelName": "vegetation-mapping-observation", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.882Z", + "updatedAt": "2024-03-21T06:27:31.882Z" + } + }, + { + "id": 3, + "attributes": { + "identifier": "a9cb9e38-690f-41c9-8151-06108caf539d", + "name": "Plot Selection", + "module": "Plot Selection and Layout", + "endpointPrefix": "/plot-selections", + "version": 1, + "description": "A desktop component to define project area boundaries, stratifying the project area into sampling units and selecting proposed plot locations prior to field collection.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-selection", + "addSurveyID": true, + "useManyEndpoint": true, + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.896Z", + "updatedAt": "2024-03-21T06:27:31.896Z" + } + }, + { + "id": 4, + "attributes": { + "identifier": "d7179862-1be3-49fc-8ec9-2e219c6f3854", + "name": "Plot Layout and Visit", + "module": "Plot Selection and Layout", + "endpointPrefix": "/plot-definition-surveys", + "version": 1, + "description": "A field based component to establish the plot positioning based on the results of the plot selection protocol (marking out the plot boundary, transects, and centre).", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-definition-survey", + "wrapperStepOnly": true + }, + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.908Z", + "updatedAt": "2024-03-21T06:27:31.908Z" + } + }, + { + "id": 5, + "attributes": { + "identifier": "617df00c-0e4f-4267-9efc-9ca9eae19686", + "name": "Plot Description(enhanced)", + "module": "Plot Description", + "endpointPrefix": "/plot-description-enhanceds", + "version": 1, + "description": "A comprehensive description of the landform, land surface and vegetation of a plot when it is established (first visit)", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-description-enhanced", + "protocol-variant": "full", + "overrideDisplayName": "Plot Description(enhanced)", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.920Z", + "updatedAt": "2024-03-21T06:27:31.920Z" + } + }, + { + "id": 6, + "attributes": { + "identifier": "dc10f902-e310-45eb-b82a-bebab050b46b", + "name": "Plot Description(standard)", + "module": "Plot Description", + "endpointPrefix": "/plot-description-standards", + "version": 1, + "description": "A condensed description of the vegetation of an established plot that has previously been described using the enhanced protocol (revisits)", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-description-standard", + "protocol-variant": "lite", + "overrideDisplayName": "Plot Description(standard)", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.932Z", + "updatedAt": "2024-03-21T06:27:31.932Z" + } + }, + { + "id": 7, + "attributes": { + "identifier": "3cbc5277-45fb-4e7a-8f33-19d9bff4cd78", + "name": "Drone Survey", + "module": "None", + "endpointPrefix": "/drone-surveys", + "version": 1, + "description": "Drone Survey", + "isWritable": true, + "workflow": [ + { + "modelName": "drone-survey" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.948Z", + "updatedAt": "2024-03-21T06:27:31.948Z" + } + }, + { + "id": 8, + "attributes": { + "identifier": "3d2eaa76-a610-4575-ac30-abf40e57b68a", + "name": "Dev sandbox", + "module": "None", + "endpointPrefix": "/dev-sandbox-surveys", + "version": 1, + "description": "An all-in-one Project for testing all Protocols", + "isWritable": true, + "workflow": [ + { + "modelName": "dev-sandbox-survey" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.960Z", + "updatedAt": "2024-03-21T06:27:31.960Z" + } + }, + { + "id": 9, + "attributes": { + "identifier": "5fd206b5-25cb-4371-bd90-7b2e8801ea25", + "name": "Photopoints - DSLR Panorama", + "module": "Photopoints", + "endpointPrefix": "/photopoints-surveys", + "version": 1, + "description": "360° panorama taken using a DSLR or high-end mirrorless camera that allows the user to set specific camera and lens settings, including focal length, aperture, and ISO.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "photopoints-survey", + "protocol-variant": "DSLR Full", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.971Z", + "updatedAt": "2024-03-21T06:27:31.971Z" + } + }, + { + "id": 10, + "attributes": { + "identifier": "383fa013-c52d-4186-911b-35e9b2375653", + "name": "Photopoints - Compact Panorama", + "module": "Photopoints", + "endpointPrefix": "/photopoints-surveys", + "version": 1, + "description": "360° panorama taken using a compact camera without the ability to set all the specific camera and lens settings required of the DSLR panorama protocol.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "photopoints-survey", + "protocol-variant": "Compact Lite", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.983Z", + "updatedAt": "2024-03-21T06:27:31.983Z" + } + }, + { + "id": 11, + "attributes": { + "identifier": "2dbb595b-3541-46bd-b200-13db3a823b74", + "name": "Photopoints - Device Panorama", + "module": "Photopoints", + "endpointPrefix": "/photopoints-surveys", + "version": 1, + "description": "360° panorama taken using the Monitor app on a mobile phone or tablet.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "photopoints-survey", + "protocol-variant": "On-device Lite", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:31.994Z", + "updatedAt": "2024-03-21T06:27:31.994Z" + } + }, + { + "id": 12, + "attributes": { + "identifier": "e15db26f-55de-4459-841b-d7ef87dea5cd", + "name": "Floristics - Enhanced", + "module": "Floristics", + "endpointPrefix": "/floristics-veg-survey-fulls", + "version": 1, + "description": "Collect plant specimen vouchers for all species present in a plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "floristics-veg-survey-full", + "protocol-variant": "full", + "usesCustomComponent": "true" + }, + { + "minimum": 1, + "multiple": true, + "modelName": "floristics-veg-voucher-full", + "deepPopulate": true, + "protocol-variant": "full", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "floristics-veg-genetic-voucher", + "defaultHidden": true, + "isSubmoduleStep": true, + "protocol-variant": "full", + "overrideDisplayName": "Plant Tissue Vouchering", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.013Z", + "updatedAt": "2024-03-21T06:27:32.013Z" + } + }, + { + "id": 13, + "attributes": { + "identifier": "bbd550c0-04c5-4a8c-ae39-cc748e920fd4", + "name": "Floristics - Standard", + "module": "Floristics", + "endpointPrefix": "/floristics-veg-survey-lites", + "version": 1, + "description": "Plant specimen vouchers collected for a subset of the species present in a plot and collect photo collected for the remaining species.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "floristics-veg-survey-lite", + "protocol-variant": "lite", + "usesCustomComponent": "true" + }, + { + "minimum": 1, + "multiple": true, + "required": false, + "modelName": "floristics-veg-voucher-lite", + "deepPopulate": true, + "protocol-variant": "lite", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "required": false, + "modelName": "floristics-veg-virtual-voucher", + "defaultHidden": true + }, + { + "multiple": true, + "modelName": "floristics-veg-genetic-voucher", + "defaultHidden": true, + "isSubmoduleStep": true, + "protocol-variant": "full", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.069Z", + "updatedAt": "2024-03-21T06:27:32.069Z" + } + }, + { + "id": 14, + "attributes": { + "identifier": "b92005b0-f418-4208-8671-58993089f587", + "name": "Plant Tissue Vouchering - Enhanced", + "module": "Plant Tissue Vouchering", + "endpointPrefix": "/floristics-veg-genetic-voucher-surveys", + "version": 1, + "description": "Plant tissue vouchers from a single plant collected for all species present in a plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "floristics-veg-genetic-voucher-survey", + "wrapperStepOnly": true, + "protocol-variant": "full", + "overrideDisplayName": "Plant Tissue Vouchering Survey" + }, + { + "multiple": true, + "modelName": "floristics-veg-genetic-voucher", + "protocol-variant": "full", + "overrideDisplayName": "Plant Tissue Vouchering", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.081Z", + "updatedAt": "2024-03-21T06:27:32.081Z" + } + }, + { + "id": 15, + "attributes": { + "identifier": "f01e0673-a29d-48bb-b6ce-cf1c0f0de345", + "name": "Plant Tissue Vouchering - Standard", + "module": "Plant Tissue Vouchering", + "endpointPrefix": "/floristics-veg-genetic-voucher-surveys", + "version": 1, + "description": "Plant tissue vouchers from a single plant collected for a subset of the species present in a plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "floristics-veg-genetic-voucher-survey", + "wrapperStepOnly": true, + "protocol-variant": "lite", + "overrideDisplayName": "Plant Tissue Vouchering Survey" + }, + { + "multiple": true, + "modelName": "floristics-veg-genetic-voucher", + "protocol-variant": "lite", + "overrideDisplayName": "Plant Tissue Vouchering", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.093Z", + "updatedAt": "2024-03-21T06:27:32.093Z" + } + }, + { + "id": 17, + "attributes": { + "identifier": "37a3b018-3779-4c4f-bfb3-d38eb53a2568", + "name": "Cover - Standard", + "module": "Cover", + "endpointPrefix": "/cover-point-intercept-surveys", + "version": 1, + "description": "Record fractional vegetation and substrate cover using the point intercept method across the 40 x 40 m sub-plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "cover-point-intercept-survey", + "wrapperStepOnly": true, + "protocol-variant": "lite" + }, + { + "multiple": true, + "modelName": "cover-point-intercept-point", + "protocol-variant": "lite", + "overrideDisplayName": "Point-intercept data collection", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "cover-point-intercept-species-intercept" + ], + "newInstanceForRelationOnAttributes": [ + "species_intercepts" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.118Z", + "updatedAt": "2024-03-21T06:27:32.118Z" + } + }, + { + "id": 19, + "attributes": { + "identifier": "58f2b4a6-6ce1-4364-9bae-f96fc3f86958", + "name": "Cover + Fire - Standard", + "module": "Fire Severity", + "endpointPrefix": "/cover-point-intercept-surveys", + "version": 1, + "description": "Record the cover and height of fire severity attributes 404 point-intercepts well as trunk char height at four locations within the plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "cover-point-intercept-survey", + "wrapperStepOnly": true, + "protocol-variant": "lite" + }, + { + "multiple": true, + "modelName": "cover-point-intercept-point", + "protocol-variant": "lite", + "overrideDisplayName": "Point-intercept data collection", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "cover-point-intercept-species-intercept" + ], + "newInstanceForRelationOnAttributes": [ + "species_intercepts" + ] + }, + { + "multiple": true, + "modelName": "fire-char-observation", + "defaultHidden": true, + "isSubmoduleStep": true, + "overrideDisplayName": "Trunk char height", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.143Z", + "updatedAt": "2024-03-21T06:27:32.143Z" + } + }, + { + "id": 20, + "attributes": { + "identifier": "36e9d224-a51f-47ea-9442-865e80144311", + "name": "Fire Survey", + "module": "Fire Severity", + "endpointPrefix": "/fire-surveys", + "version": 1, + "description": "Fire Severity", + "isWritable": false, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "fire-survey" + }, + { + "multiple": true, + "modelName": "fire-point-intercept-point", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "fire-species-intercept" + ], + "newInstanceForRelationOnAttributes": [ + "fire_species_intercepts" + ] + }, + { + "maximum": 4, + "minimum": 4, + "multiple": true, + "modelName": "fire-char-observation", + "overrideDisplayName": "Trunk char height", + "usesCustomComponent": "true" + } + ], + "isHidden": true, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.157Z", + "updatedAt": "2024-03-21T06:27:32.157Z" + } + }, + { + "id": 22, + "attributes": { + "identifier": "4b8b35c7-15ef-4abd-a7b2-2f4e24509b52", + "name": "Basal Area - Basal Wedge", + "module": "Basal Area", + "endpointPrefix": "/basal-wedge-surveys", + "version": 1, + "description": "Use a basal wedge to assess diameter at breast height (DBH) at nine sampling locations across the core monitoring plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "basal-wedge-survey", + "wrapperStepOnly": true, + "protocol-variant": "wedge" + }, + { + "maximum": 9, + "minimum": 9, + "multiple": true, + "modelName": "basal-wedge-observation", + "protocol-variant": "wedge", + "usesCustomComponent": "true", + "x-paratoo-description": "BasalWedge" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.187Z", + "updatedAt": "2024-03-21T06:27:32.187Z" + } + }, + { + "id": 25, + "attributes": { + "identifier": "db841be3-dfb7-4860-9474-a131f4de5954", + "name": "Recruitment - Survivorship", + "module": "Recruitment", + "endpointPrefix": "/recruitment-survivorship-surveys", + "version": 1, + "description": "Tag individuals for on-going monitoring of survivorship, recording location, health, growth stage, life-stage and size measurements.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "recruitment-survivorship-survey", + "usesCustomComponent": true + }, + { + "multiple": true, + "modelName": "recruitment-survivorship-observation", + "usesCustomComponent": true + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.224Z", + "updatedAt": "2024-03-21T06:27:32.224Z" + } + }, + { + "id": 27, + "attributes": { + "identifier": "1dd7d3ff-11b5-4690-8167-d8fe148656b9", + "name": "Soil Sub-pit and Metagenomics", + "module": "Soils", + "endpointPrefix": "/soil-sub-pit-and-metagenomics-surveys", + "version": 1, + "description": "Collect metagenomic soil surface samples and soil sub-pit samples at nine locations of differing microhabitats within the plot, or at a single location, outside the southwest corner of the plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout" + }, + { + "modelName": "plot-visit" + }, + { + "modelName": "soil-sub-pit-and-metagenomics-survey", + "hasLabPhase": true, + "overrideDisplayName": "Survey setup" + }, + { + "multiple": true, + "required": false, + "modelName": "soil-sub-pit", + "usesCustomComponent": true, + "relationOnAttributesModelNames": [ + "soil-sub-pit-observation" + ], + "newInstanceForRelationOnAttributes": [ + "sub_pit_observation" + ] + }, + { + "labPhase": true, + "multiple": true, + "required": false, + "modelName": "soil-sub-pit-sampling", + "overrideDisplayName": "Sampling", + "usesCustomComponent": true + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.252Z", + "updatedAt": "2024-03-21T06:27:32.252Z" + } + }, + { + "id": 29, + "attributes": { + "identifier": "39da41f1-dd45-4838-ae57-ea50588fd2bc", + "name": "Soils - Bulk Density", + "module": "Soils", + "endpointPrefix": "/soil-bulk-density-surveys", + "version": 1, + "description": "Collect soil core samples at 10 cm increments down to 30 cm from the edge of the soil pit.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "soil-bulk-density-survey", + "hasLabPhase": true + }, + { + "maximum": 3, + "minimum": 3, + "labPhase": true, + "multiple": true, + "required": false, + "modelName": "soil-bulk-density-sample", + "usesCustomComponent": true + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.276Z", + "updatedAt": "2024-03-21T06:27:32.276Z" + } + }, + { + "id": 31, + "attributes": { + "identifier": "2c5bb8d7-b624-4dc4-93d7-3f1276e65ad5", + "name": "Vertebrate Fauna - Trapping Survey Setup", + "module": "Vertebrate Fauna", + "endpointPrefix": "/vertebrate-trapping-setup-surveys", + "version": 1, + "description": "Record details of trapping survey including trap type, location and duration of trapping effort.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "vertebrate-trapping-setup-survey", + "overrideDisplayName": "Setup trapping survey" + }, + { + "multiple": true, + "modelName": "vertebrate-trap-line", + "overrideDisplayName": "Start/End trap line", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "vertebrate-trap" + ], + "newInstanceForRelationOnAttributes": [ + "traps" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.300Z", + "updatedAt": "2024-03-21T06:27:32.300Z" + } + }, + { + "id": 33, + "attributes": { + "identifier": "ab990a3a-a972-45d2-a384-13c3b01e9c7b", + "name": "Vertebrate Fauna - Trapping Survey Closure", + "module": "Vertebrate Fauna", + "endpointPrefix": "/vertebrate-end-trapping-surveys", + "version": 1, + "description": "Record details of trapping survey including trap type, location and duration of trapping effort", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout" + }, + { + "modelName": "plot-visit" + }, + { + "modelName": "vertebrate-end-trapping-survey", + "wrapperStepOnly": true + }, + { + "multiple": true, + "modelName": "vertebrate-end-trap", + "overrideDisplayName": "End traps", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "required": false, + "modelName": "vertebrate-closed-drift-photo", + "overrideDisplayName": "Closed drift line photos", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.325Z", + "updatedAt": "2024-03-21T06:27:32.325Z" + } + }, + { + "id": 16, + "attributes": { + "identifier": "93e65339-4bce-4ca1-a323-78977865ef93", + "name": "Cover - Enhanced", + "module": "Cover", + "endpointPrefix": "/cover-point-intercept-surveys", + "version": 1, + "description": "Record vegetation and substrate cover using the point intercept method across the 100 x 100 m core monitoring plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "cover-point-intercept-survey", + "wrapperStepOnly": true, + "protocol-variant": "full" + }, + { + "multiple": true, + "modelName": "cover-point-intercept-point", + "protocol-variant": "full", + "overrideDisplayName": "Point-intercept data collection", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "cover-point-intercept-species-intercept" + ], + "newInstanceForRelationOnAttributes": [ + "species_intercepts" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.106Z", + "updatedAt": "2024-03-21T06:27:32.106Z" + } + }, + { + "id": 18, + "attributes": { + "identifier": "8c47b1f8-fc58-4510-a138-e5592edd2dbc", + "name": "Cover + Fire - Enhanced", + "module": "Fire Severity", + "endpointPrefix": "/cover-point-intercept-surveys", + "version": 1, + "description": "Record the cover and height of fire severity attributes 404 point-intercepts well as trunk char height at four locations within the plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "cover-point-intercept-survey", + "wrapperStepOnly": true, + "protocol-variant": "full" + }, + { + "multiple": true, + "modelName": "cover-point-intercept-point", + "protocol-variant": "full", + "overrideDisplayName": "Point-intercept data collection", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "cover-point-intercept-species-intercept" + ], + "newInstanceForRelationOnAttributes": [ + "species_intercepts" + ] + }, + { + "maximum": 4, + "minimum": 4, + "multiple": true, + "modelName": "fire-char-observation", + "defaultHidden": true, + "isSubmoduleStep": true, + "overrideDisplayName": "Trunk char height", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.130Z", + "updatedAt": "2024-03-21T06:27:32.130Z" + } + }, + { + "id": 21, + "attributes": { + "identifier": "5005b0af-4360-4a8c-a203-b2c9e440547e", + "name": "Basal Area - DBH", + "module": "Basal Area", + "endpointPrefix": "/basal-area-dbh-measure-surveys", + "version": 1, + "description": "Record the actual diameter at breast height (DBH) for all trees within the 100 x 100 m core monitoring plot or the 40 x 40 m sub-plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "basal-area-dbh-measure-survey", + "protocol-variant": "full" + }, + { + "multiple": true, + "modelName": "basal-area-dbh-measure-observation", + "protocol-variant": "full", + "usesCustomComponent": "true", + "x-paratoo-description": "ProblemTrees" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.169Z", + "updatedAt": "2024-03-21T06:27:32.169Z" + } + }, + { + "id": 23, + "attributes": { + "identifier": "6e613128-92e8-4525-854c-4021f1d4d02f", + "name": "Coarse Woody Debris", + "module": "Coarse Woody Debris", + "endpointPrefix": "/coarse-woody-debris-surveys", + "version": 1, + "description": "The coarse woody debris (CWD) survey method within the 100 x 100 m core monitoring plot or the 40 x 40 m sub-plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "coarse-woody-debris-survey" + }, + { + "multiple": true, + "modelName": "coarse-woody-debris-observation", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.199Z", + "updatedAt": "2024-03-21T06:27:32.199Z" + } + }, + { + "id": 24, + "attributes": { + "identifier": "a05f8914-ef4f-4a46-8cf1-d035c9c46d4d", + "name": "Recruitment - Age Structure", + "module": "Recruitment", + "endpointPrefix": "/recruitment-field-surveys", + "version": 1, + "description": "Record the growth stage and life-stage of species at the plot level (100 m x 100 m) and seedling, sapling and juvenile counts at the sub-plot level (40 x 40 m)", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "recruitment-field-survey", + "wrapperStepOnly": true + }, + { + "multiple": true, + "modelName": "recruitment-growth-stage", + "overrideDisplayName": "Growth and life stages", + "usesCustomComponent": true + }, + { + "multiple": true, + "modelName": "recruitment-sapling-and-seedling-count", + "usesCustomComponent": true + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.211Z", + "updatedAt": "2024-03-21T06:27:32.211Z" + } + }, + { + "id": 26, + "attributes": { + "identifier": "1de5eed1-8f97-431c-b7ca-a8371deb3c28", + "name": "Soil Site Observation and Pit Characterisation", + "module": "Soils", + "endpointPrefix": "/soil-pit-characterisation-fulls", + "version": 1, + "description": "Describe aspects of the land surface around the soil pit. Characterise the soil profile by exposing the profile to a depth of 1 m+ and capture a photographic record of the soil pit and collect soil samples from 10 cm increments.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout" + }, + { + "modelName": "plot-visit" + }, + { + "modelName": "soil-pit-characterisation-full", + "hasLabPhase": true, + "overrideDisplayName": "Soil Pit Location" + }, + { + "required": false, + "modelName": "soil-landform-element", + "overrideDisplayName": "Land Form Element", + "usesCustomComponent": true + }, + { + "required": false, + "modelName": "soil-land-surface-phenomena", + "overrideDisplayName": "Land Surface Phenomena & Soil Development" + }, + { + "minimum": 0, + "multiple": true, + "required": false, + "modelName": "microrelief-observation", + "usesCustomComponent": true + }, + { + "minimum": 0, + "multiple": true, + "required": false, + "modelName": "erosion-observation", + "usesCustomComponent": true + }, + { + "minimum": 0, + "multiple": true, + "required": false, + "modelName": "surface-coarse-fragments-observation", + "usesCustomComponent": true + }, + { + "required": false, + "modelName": "rock-outcrop-observation", + "usesCustomComponent": true + }, + { + "required": false, + "modelName": "soil-pit-observation" + }, + { + "multiple": true, + "required": false, + "modelName": "soil-horizon-observation", + "usesCustomComponent": true, + "relationOnAttributesModelNames": [ + "soil-horizon-mottle", + "soil-horizon-coarse-fragment", + "soil-horizon-structure", + "soil-horizon-segregation", + "soil-horizon-void", + "soil-horizon-pan", + "soil-horizon-cutan", + "soil-horizon-root" + ], + "newInstanceForRelationOnAttributes": [ + "mottles", + "coarse_fragments", + "structure", + "segregation", + "voids", + "pans", + "cutans", + "roots" + ] + }, + { + "required": false, + "modelName": "soil-asc", + "x-patatoo-hint": "Assess and record the Australian Soil Classification (ASC), including the confidence level, order, suborder, great group, subgroup and family level. Refer to the third edition of The Australian Soil Classification for further descriptions", + "overrideDisplayName": "Australian Soil Classification (ASC)" + }, + { + "required": false, + "modelName": "soil-classification", + "usesCustomComponent": true + }, + { + "labPhase": true, + "multiple": true, + "required": false, + "modelName": "soil-horizon-sample", + "usesCustomComponent": true + } + ], + "isHidden": false, + "nextProtSuggestion": "39da41f1-dd45-4838-ae57-ea50588fd2bc", + "createdAt": "2024-03-21T06:27:32.240Z", + "updatedAt": "2024-03-21T06:27:32.240Z" + } + }, + { + "id": 28, + "attributes": { + "identifier": "15ea86ab-22f6-43fa-8cd5-751eab2347ad", + "name": "Soil Sample Pit", + "module": "Soils", + "endpointPrefix": "/soil-pit-characterisation-lites", + "version": 1, + "description": "Collect soil samples from a 1 m+ soil pit in a plot, including exposing the soil profile to 1 m+, sampling the soil profile in 10 cm increments.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "soil-pit-characterisation-lite", + "hasLabPhase": true, + "protocol-variant": "lite", + "overrideDisplayName": "Soil pit" + }, + { + "labPhase": true, + "multiple": true, + "required": false, + "modelName": "soil-lite-sample", + "protocol-variant": "lite", + "overrideDisplayName": "Soil pit sample" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.264Z", + "updatedAt": "2024-03-21T06:27:32.264Z" + } + }, + { + "id": 30, + "attributes": { + "identifier": "c1b38b0f-a888-4f28-871b-83da2ac1e533", + "name": "Vertebrate Fauna - Bird Survey", + "module": "Vertebrate Fauna", + "endpointPrefix": "/bird-surveys", + "version": 1, + "description": "Conduct a 2 ha, 20 minute survey or 500 m area search recording all bird species, their age class and behaviour details where possible.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "bird-survey", + "usesCustomComponent": "true" + }, + { + "modelName": "weather-observation" + }, + { + "minimum": 1, + "multiple": true, + "required": true, + "modelName": "bird-survey-observation" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.289Z", + "updatedAt": "2024-03-21T06:27:32.289Z" + } + }, + { + "id": 32, + "attributes": { + "identifier": "70fbd236-9e51-47a8-93da-125a18a13acc", + "name": "Vertebrate Fauna - Identify, Measure and Release", + "module": "Vertebrate Fauna", + "endpointPrefix": "/vertebrate-trap-check-surveys", + "version": 1, + "description": "Record capture details from trapping conducted including species identification, morphology meausrements, body condition and health status (manditory when trapping is conducted).", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "vertebrate-trap-check-survey", + "overrideDisplayName": "Trap Check Survey" + }, + { + "multiple": true, + "modelName": "vertebrate-check-trap", + "overrideDisplayName": "Check traps", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "vertebrate-captured-individual" + ], + "newInstanceForRelationOnAttributes": [ + "captured_individual" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.313Z", + "updatedAt": "2024-03-21T06:27:32.313Z" + } + }, + { + "id": 34, + "attributes": { + "identifier": "9d2c3fcf-881b-41df-944d-33bb6ef8ac51", + "name": "Vertebrate Fauna - Active and Passive Search", + "module": "Vertebrate Fauna", + "endpointPrefix": "/vertebrate-active-passive-search-surveys", + "version": 1, + "description": "Record all fauna observations whilst actively searching for fauna and signs of fauna and/or conduct passive nocturnal searches.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "vertebrate-active-passive-search-survey", + "overrideDisplayName": "Survey setup" + }, + { + "modelName": "vertebrate-active-passive-search", + "overrideDisplayName": "Start search", + "usesCustomComponent": true + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.337Z", + "updatedAt": "2024-03-21T06:27:32.337Z" + } + }, + { + "id": 36, + "attributes": { + "identifier": "9e75385a-4783-4911-8870-cca78b44d781", + "name": "Invertebrate Fauna - Wet Pitfall Trapping", + "module": "Invertebrate Fauna", + "endpointPrefix": "/invertebrate-wet-pitfall-surveys", + "version": 1, + "description": "Conduct pitfall trapping across a grid with a focus on capturing surface active invertebrate taxa.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "wet-pitfall-weather", + "overrideDisplayName": "Weather" + }, + { + "modelName": "invertebrate-wet-pitfall-survey", + "overrideDisplayName": "Trapping Information" + }, + { + "multiple": true, + "modelName": "invertebrate-wet-pitfall-trap", + "overrideDisplayName": "Add traps", + "usesCustomComponent": "true" + }, + { + "modelName": "invertebrate-wet-pitfall-trap-grid", + "overrideDisplayName": "Trap Grid Photo" + }, + { + "multiple": true, + "modelName": "remove-wet-pitfall-trap", + "overrideDisplayName": "Remove traps", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "invertebrate-wet-pitfall-vouchering", + "overrideDisplayName": "Vouchering", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.363Z", + "updatedAt": "2024-03-21T06:27:32.363Z" + } + }, + { + "id": 37, + "attributes": { + "identifier": "7dc49039-4999-43f6-8896-e33d7b28a934", + "name": "Invertebrate Fauna - Rapid Ground Trapping", + "module": "Invertebrate Fauna", + "endpointPrefix": "/invertebrate-rapid-ground-trappings", + "version": 1, + "description": "Conduct invertebrate trapping using baits with a focus on documenting the distribution and abundance of dominant ant species across a project area.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "invertebrate-rapid-ground-trapping", + "usesCustomComponent": "true" + }, + { + "maximum": 4, + "minimum": 4, + "multiple": true, + "modelName": "invertebrate-rapid-trap", + "overrideDisplayName": "Vouchering", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.374Z", + "updatedAt": "2024-03-21T06:27:32.374Z" + } + }, + { + "id": 39, + "attributes": { + "identifier": "7b0e4526-726e-4292-a897-238f336ce51e", + "name": "Invertebrate Fauna - Pan Trapping", + "module": "Invertebrate Fauna", + "endpointPrefix": "/invertebrate-pan-trappings", + "version": 1, + "description": "Conduct invertebrate trapping using coloured pans filled with liquid. Commonly used for monitoring bees and pollinators.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "invertebrate-pan-trapping", + "overrideDisplayName": "Survey setup" + }, + { + "multiple": true, + "modelName": "invertebrate-pan-trap", + "overrideDisplayName": "Add traps", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "remove-pan-trap", + "overrideDisplayName": "Remove traps", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "pan-trap-vouchering", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.401Z", + "updatedAt": "2024-03-21T06:27:32.401Z" + } + }, + { + "id": 41, + "attributes": { + "identifier": "aa64fd4d-2c5a-4f84-a197-9f3ce6409152", + "name": "Invertebrate Fauna - Post-field Sampling Curation", + "module": "Invertebrate Fauna", + "endpointPrefix": "", + "version": 1, + "description": "Instructions for invertebrate specimen presevation, sorting and storage of specimens.", + "isWritable": false, + "workflow": [], + "isHidden": true, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.424Z", + "updatedAt": "2024-03-21T06:27:32.424Z" + } + }, + { + "id": 43, + "attributes": { + "identifier": "08adf0ff-43c1-4f19-b2c4-f5da667baf65", + "name": "Interventions - Data Collection", + "module": "Interventions", + "endpointPrefix": "/interventions-general-project-informations", + "version": 1, + "description": "Record the location of intervention activities and detailed information about the nature of the intervention and how it was undertaken.", + "isWritable": true, + "workflow": [ + { + "modelName": "interventions-general-project-information", + "splitSurveyStep": true + }, + { + "multiple": true, + "modelName": "interventions", + "deepPopulate": true, + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.447Z", + "updatedAt": "2024-03-21T06:27:32.447Z" + } + }, + { + "id": 45, + "attributes": { + "identifier": "6000cb5f-ad75-41e2-9e3e-c070c527453a", + "name": "Metadata Collection", + "module": "Targeted Surveys", + "endpointPrefix": "/new-targeted-surveys", + "version": 1, + "description": "Record metadata for any other survey method employed", + "isWritable": true, + "workflow": [ + { + "modelName": "new-targeted-survey", + "splitSurveyStep": true + }, + { + "modelName": "metadata-collection", + "usesCustomComponent": true + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.474Z", + "updatedAt": "2024-03-21T06:27:32.474Z" + } + }, + { + "id": 48, + "attributes": { + "identifier": "3db7f7b6-a96d-495a-9981-5d6170a7458d", + "name": "Camera Trap Retrieval", + "module": "Camera Trapping", + "endpointPrefix": "/camera-trap-retrieval-surveys", + "version": 1, + "description": "Camera traps retrieved at the end of the deployment period.", + "isWritable": true, + "workflow": [ + { + "modelName": "camera-trap-retrieval-survey", + "splitSurveyStep": true, + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "camera-trap-retrieval-point", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.511Z", + "updatedAt": "2024-03-21T06:27:32.511Z" + } + }, + { + "id": 50, + "attributes": { + "identifier": "648d545a-cdae-4c19-bc65-0c9f93d9c0eb", + "name": "Sign-based Fauna Surveys - Within-plot Belt Transect", + "module": "Sign-based Fauna Surveys", + "endpointPrefix": "/within-plot-belt-transect-surveys", + "version": 1, + "description": "Record presence and age of fauna signs and their attributing species occuring along 1 m x 100 m transect/s within a plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout" + }, + { + "modelName": "plot-visit" + }, + { + "modelName": "within-plot-belt-transect-survey", + "overrideDisplayName": "Transect setup", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "within-plot-belt-transect", + "overrideDisplayName": "Commence transect survey", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "within-plot-belt-quadrat" + ], + "newInstanceForRelationOnAttributes": [ + "quadrat" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.540Z", + "updatedAt": "2024-03-21T06:27:32.540Z" + } + }, + { + "id": 52, + "attributes": { + "identifier": "cc826a19-a1e7-4dfe-8d6e-f135d258d7f9", + "name": "Sign-based Fauna - Plot Sign Search", + "module": "Sign-based Fauna Surveys", + "endpointPrefix": "/sign-based-active-plot-search-surveys", + "version": 1, + "description": "Record presence and age of fauna signs and their attributing species occuring within a plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout" + }, + { + "modelName": "plot-visit" + }, + { + "modelName": "sign-based-active-plot-search-survey", + "overrideDisplayName": "Survey setup", + "usesCustomComponent": true + }, + { + "modelName": "sign-based-active-plot-search", + "overrideDisplayName": "Commence search", + "usesCustomComponent": true + }, + { + "required": false, + "modelName": "sign-based-nearby-track-plot", + "overrideDisplayName": "Nearby track plot", + "usesCustomComponent": true + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.567Z", + "updatedAt": "2024-03-21T06:27:32.567Z" + } + }, + { + "id": 55, + "attributes": { + "identifier": "a76dac21-94f4-4851-af91-31f6dd00750f", + "name": "Fauna Ground Counts Transects", + "module": "Fauna Ground Counts", + "endpointPrefix": "/fauna-ground-counts-surveys", + "version": 1, + "description": "Record the survey details and any observations of fauna along a transect.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "fauna-ground-counts-survey", + "wrapperStepOnly": true + }, + { + "multiple": true, + "modelName": "field-reconnaissance-and-transect-set-up", + "usesCustomComponent": "true" + }, + { + "modelName": "fauna-ground-counts-observation", + "overrideDisplayName": "Survey Setup", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "observer-detail" + ], + "newInstanceForRelationOnAttributes": [ + "observer_details" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.602Z", + "updatedAt": "2024-03-21T06:27:32.602Z" + } + }, + { + "id": 57, + "attributes": { + "identifier": "80360ceb-bd6d-4ed4-b2ea-9bd45d101d0e", + "name": "Pest Fauna - Control Activities", + "module": "Pest Fauna Control Activities", + "endpointPrefix": "/pest-fauna-control-activities", + "version": 1, + "description": "Record numbers of pest animals removed from the population as a result of control activities undertaken.", + "isWritable": true, + "workflow": [ + { + "modelName": "pest-fauna-control-activity", + "splitSurveyStep": true, + "usesCustomComponent": "true" + }, + { + "modelName": "control-activity-observation", + "deepPopulate": true, + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.627Z", + "updatedAt": "2024-03-21T06:27:32.627Z" + } + }, + { + "id": 35, + "attributes": { + "identifier": "0628e486-9b33-4d86-98db-c6d3f10f7744", + "name": "Vertebrate Fauna - Acoustic and Ultrasonic Recordings", + "module": "Vertebrate Fauna", + "endpointPrefix": "", + "version": 1, + "description": "Record the details for acoustic recorders in the Biodiversity plot. Acoustic recorders may be set to record acoustic calls (birds, frogs and invertebrates) or ultrasonic calls (bats) depending on the equipment used.", + "isWritable": false, + "workflow": [], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.349Z", + "updatedAt": "2024-03-21T06:27:32.349Z" + } + }, + { + "id": 38, + "attributes": { + "identifier": "82463b77-aac2-407c-a03c-8669bd73baf0", + "name": "Invertebrate Fauna - Malaise Trapping", + "module": "Invertebrate Fauna", + "endpointPrefix": "/invertebrate-malaise-trappings", + "version": 1, + "description": "Conduct invertebrate trapping using a malaise trap. Commonly used for collecting arthripod and other flying insect taxa.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "invertebrate-malaise-trapping", + "overrideDisplayName": "Survey setup" + }, + { + "multiple": true, + "modelName": "invertebrate-malaise-trap", + "overrideDisplayName": "Add traps", + "usesCustomComponent": "true" + }, + { + "minimum": 0, + "multiple": true, + "required": false, + "modelName": "add-malaise-sample", + "overrideDisplayName": "Add samples", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "remove-malaise-trap", + "overrideDisplayName": "Remove traps", + "usesCustomComponent": "true" + }, + { + "minimum": 0, + "multiple": true, + "required": false, + "modelName": "malaise-trap-vouchering", + "overrideDisplayName": "Vouchering", + "usesCustomComponent": "true" + }, + { + "minimum": 0, + "multiple": true, + "required": false, + "modelName": "malaise-biomass", + "overrideDisplayName": "Biomass", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.388Z", + "updatedAt": "2024-03-21T06:27:32.388Z" + } + }, + { + "id": 40, + "attributes": { + "identifier": "8041a1a4-3e19-4fd2-86b9-d453023b5592", + "name": "Invertebrate Fauna - Active Search", + "module": "Invertebrate Fauna", + "endpointPrefix": "/invertebrate-active-search-surveys", + "version": 1, + "description": "Search the plot to collect representative specimens and create an inventory of as many invertebrate taxa as possible within a set time.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "invertebrate-active-search-survey", + "overrideDisplayName": "Survey setup", + "usesCustomComponent": true + }, + { + "modelName": "invertebrate-active-search", + "overrideDisplayName": "Start search", + "usesCustomComponent": true + }, + { + "multiple": true, + "modelName": "invertebrate-active-search-sample", + "overrideDisplayName": "Vouchering" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.412Z", + "updatedAt": "2024-03-21T06:27:32.412Z" + } + }, + { + "id": 42, + "attributes": { + "identifier": "7f95710a-2003-4119-a2c6-41ce4e34d12a", + "name": "Condition - Attributes", + "module": "Condition", + "endpointPrefix": "/condition-surveys", + "version": 1, + "description": "Collect data on a suite of condition indicators to describe biodiversity condition.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "condition-survey" + }, + { + "multiple": true, + "modelName": "condition-tree-survey", + "usesCustomComponent": "true" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.435Z", + "updatedAt": "2024-03-21T06:27:32.435Z" + } + }, + { + "id": 44, + "attributes": { + "identifier": "aae4dbd8-845a-406e-b682-ef01c3497711", + "name": "Dev Sandbox Bulk Survey", + "module": "None", + "endpointPrefix": "/dev-sandbox-bulk-surveys", + "version": 1, + "description": "", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "dev-sandbox-bulk-survey" + }, + { + "multiple": true, + "modelName": "dev-sandbox-bulk-observation" + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.462Z", + "updatedAt": "2024-03-21T06:27:32.462Z" + } + }, + { + "id": 46, + "attributes": { + "identifier": "ad088dbe-02b2-472a-901f-bd081e590bcf", + "name": "Camera Trap Deployment", + "module": "Camera Trapping", + "endpointPrefix": "/camera-trap-deployment-surveys", + "version": 1, + "description": "Camera traps deployed at points of interest, in an array or at a plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "camera-trap-deployment-survey", + "splitSurveyStep": true, + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "camera-trap-deployment-point", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "camera-trap-feature", + "camera-trap-information", + "camera-trap-setting" + ], + "newInstanceForRelationOnAttributes": [ + "features", + "camera_trap_information", + "camera_trap_settings" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.488Z", + "updatedAt": "2024-03-21T06:27:32.488Z" + } + }, + { + "id": 47, + "attributes": { + "identifier": "949ae38f-c047-42a7-8164-38c24ede35d5", + "name": "Camera Trap Reequipping", + "module": "Camera Trapping", + "endpointPrefix": "/camera-trap-reequipping-surveys", + "version": 1, + "description": "Camera trap batteries and SD cards replaced to extend deployment.", + "isWritable": true, + "workflow": [ + { + "modelName": "camera-trap-reequipping-survey", + "splitSurveyStep": true, + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "camera-trap-reequipping-point", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "camera-trap-information", + "camera-trap-setting" + ], + "newInstanceForRelationOnAttributes": [ + "camera_trap_information", + "camera_trap_settings" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.499Z", + "updatedAt": "2024-03-21T06:27:32.499Z" + } + }, + { + "id": 49, + "attributes": { + "identifier": "90c0f4cc-a22a-4820-9a8b-a01564bc197a", + "name": "Fauna Aerial Survey", + "module": "Fauna Aerial Surveys", + "endpointPrefix": "/aerial-surveys", + "version": 1, + "description": "Record the survey details, distance travelled and species counts for surveys undertaken from an aircraft.", + "isWritable": true, + "workflow": [ + { + "modelName": "aerial-survey", + "splitSurveyStep": true, + "usesCustomComponent": "true" + }, + { + "required": false, + "modelName": "aerial-setup-desktop", + "defaultHidden": true, + "overrideDisplayName": "Fauna aerial setup - desktop", + "usesCustomComponent": "true" + }, + { + "required": false, + "modelName": "aerial-observation", + "defaultHidden": true, + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "ferals-aerial-count-survey" + ], + "newInstanceForRelationOnAttributes": [ + "ferals_aerial_count_survey" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.525Z", + "updatedAt": "2024-03-21T06:27:32.525Z" + } + }, + { + "id": 51, + "attributes": { + "identifier": "2cd7b489-b582-41f6-9dcc-264f6ea7801a", + "name": "Sign-based Fauna Surveys - Off-plot Belt Transect", + "module": "Sign-based Fauna Surveys", + "endpointPrefix": "/off-plot-belt-transect-surveys", + "version": 1, + "description": "Record the presence and age of fauna signs and their attributing species occuring along a belt transect of user specified length and width outside of a plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "off-plot-belt-transect-survey", + "deepPopulate": true, + "splitSurveyStep": true, + "overrideDisplayName": "Transect setup", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "off-plot-belt-transect", + "overrideDisplayName": "Commence transect survey", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "off-plot-belt-quadrat" + ], + "newInstanceForRelationOnAttributes": [ + "quadrat" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.552Z", + "updatedAt": "2024-03-21T06:27:32.552Z" + } + }, + { + "id": 53, + "attributes": { + "identifier": "0c5d1d14-c71b-467f-aced-abe1c83c15d3", + "name": "Sign-based Fauna - Vehicle Track", + "module": "Sign-based Fauna Surveys", + "endpointPrefix": "/sign-based-vehicle-track-set-ups", + "version": 1, + "description": "Set up vehicle track transect/s and return on subsequent days record the presence of fauna tracks and their attributing species.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout" + }, + { + "modelName": "plot-visit" + }, + { + "modelName": "sign-based-vehicle-track-set-up", + "usesCustomComponent": "true" + }, + { + "modelName": "sign-based-vehicle-track-observation", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "sign-based-vehicle-track-log" + ], + "newInstanceForRelationOnAttributes": [ + "observations" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.578Z", + "updatedAt": "2024-03-21T06:27:32.578Z" + } + }, + { + "id": 54, + "attributes": { + "identifier": "685b5e9b-20c2-4688-9b04-b6caaf084aad", + "name": "Sign-based Fauna - Track Station", + "module": "Sign-based Fauna Surveys", + "endpointPrefix": "/sign-based-track-station-survey-setups", + "version": 1, + "description": "Set up a track station and return on subsequent days to record the presence of fauna tracks and their attributing speices.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout" + }, + { + "modelName": "plot-visit" + }, + { + "modelName": "sign-based-track-station-survey-setup", + "deepPopulate": true, + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "sign-based-track-station-observation", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "sign-based-track-station-log" + ], + "newInstanceForRelationOnAttributes": [ + "tracks" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.590Z", + "updatedAt": "2024-03-21T06:27:32.590Z" + } + }, + { + "id": 56, + "attributes": { + "identifier": "d706fd34-2f05-4559-b738-a65615a3d756", + "name": "Fauna Ground Counts Vantage Point", + "module": "Fauna Ground Counts", + "endpointPrefix": "/ground-counts-vantage-point-surveys", + "version": 1, + "description": "Record the survey details and any observations of fauna from a vantage point.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "ground-counts-vantage-point-survey", + "wrapperStepOnly": true + }, + { + "multiple": true, + "modelName": "ground-counts-vantage-point", + "overrideDisplayName": "Field Reconnaissance and Vantage Point Setup", + "usesCustomComponent": "true" + }, + { + "modelName": "ground-counts-vantage-point-setup", + "overrideDisplayName": "Survey Set Up", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "ground-counts-vantage-point-observation" + ], + "newInstanceForRelationOnAttributes": [ + "observations" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.613Z", + "updatedAt": "2024-03-21T06:27:32.613Z" + } + }, + { + "id": 58, + "attributes": { + "identifier": "06cd903e-b8b3-40a5-add4-f779739cce35", + "name": "Herbivory and Physical Damage - Within-plot Belt Transect", + "module": "Herbivory and Physical Damage", + "endpointPrefix": "/herbivory-and-physical-damage-belt-transect-setups", + "version": 1, + "description": "Record signs of herbivory and physical damage to vegetation and land along a 1 m x 100 m belt transect within a plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "herbivory-and-physical-damage-belt-transect-setup", + "overrideDisplayName": "Field Reconnaissance and Transect Set Up", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "herbivory-and-physical-damage-transect", + "overrideDisplayName": "Conduct the Survey", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "herbivory-and-physical-damage-quadrat" + ], + "newInstanceForRelationOnAttributes": [ + "quadrat" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.639Z", + "updatedAt": "2024-03-21T06:27:32.639Z" + } + }, + { + "id": 59, + "attributes": { + "identifier": "49d02f5d-b148-4b5b-ad6a-90e48c81b294", + "name": "Herbivory and Physical Damage - Off-plot Transect", + "module": "Herbivory and Physical Damage", + "endpointPrefix": "/herbivory-off-plot-belt-transect-setups", + "version": 1, + "description": "Record signs of herbivory and physical damage to vegetation and land along a belt transect of user specified length and width outside of a plot.", + "isWritable": true, + "workflow": [ + { + "modelName": "herbivory-off-plot-belt-transect-setup", + "deepPopulate": true, + "splitSurveyStep": true, + "overrideDisplayName": "Field Reconnaissance and Transect Set Up", + "usesCustomComponent": "true" + }, + { + "multiple": true, + "modelName": "herbivory-off-plot-transect", + "overrideDisplayName": "Conduct the Survey", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "herbivory-and-physical-damage-quadrat" + ], + "newInstanceForRelationOnAttributes": [ + "quadrat" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.658Z", + "updatedAt": "2024-03-21T06:27:32.658Z" + } + }, + { + "id": 60, + "attributes": { + "identifier": "228e5e1e-aa9f-47a3-930b-c1468757f81d", + "name": "Herbivory and Physical Damage - Active Plot Search", + "module": "Herbivory and Physical Damage", + "endpointPrefix": "/herbivory-and-physical-damage-active-search-setups", + "version": 1, + "description": "Record signs of herbivory and physical damage observed within a plot. Best suited where herbivory and physical damage is isolated and not homogenous across the project area.", + "isWritable": true, + "workflow": [ + { + "modelName": "plot-layout", + "usesCustomComponent": "true" + }, + { + "modelName": "plot-visit", + "usesCustomComponent": "true" + }, + { + "modelName": "herbivory-and-physical-damage-active-search-setup", + "overrideDisplayName": "Reconnaissance and survey setup" + }, + { + "modelName": "herbivory-and-physical-damage-active-search-transect", + "overrideDisplayName": "Conduct the Survey", + "usesCustomComponent": "true", + "relationOnAttributesModelNames": [ + "hapd-active-search-observation" + ], + "newInstanceForRelationOnAttributes": [ + "hapd_observed" + ] + } + ], + "isHidden": false, + "nextProtSuggestion": null, + "createdAt": "2024-03-21T06:27:32.674Z", + "updatedAt": "2024-03-21T06:27:32.674Z" + } + } +]; + +const key = 'paratoo.protocols'; +const data = JSON.stringify(protocols); + +db.setting.insert({key:key, value:data}); \ No newline at end of file From d3c564bebf5e75f0ab236896fd933b30a76b9e13 Mon Sep 17 00:00:00 2001 From: chrisala Date: Tue, 26 Mar 2024 08:18:19 +1100 Subject: [PATCH 18/95] Added constants #3119 --- .../au/org/ala/merit/DataSetController.groovy | 6 +++--- src/main/groovy/au/org/ala/merit/Score.groovy | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy index 75f6d7ac0..8e77f6fae 100644 --- a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy +++ b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy @@ -80,12 +80,12 @@ class DataSetController { Map serviceBaselineIndicatorOptions = [:] outcomeGroupsByServiceId.each { int serviceId, List groups -> List tags = groups.collect{it.allTags}.flatten().unique() - if (tags?.contains('Survey')) { + if (tags?.contains(Score.TAG_SURVEY)) { serviceBaselineIndicatorOptions[serviceId] = [:] - if (!tags?.contains('Baseline')) { + if (!tags?.contains(Score.TAG_BASELINE)) { serviceBaselineIndicatorOptions[serviceId].disableBaseline = true } - if (!tags?.contains('Indicator')) { + if (!tags?.contains(Score.TAG_INDICATOR)) { serviceBaselineIndicatorOptions[serviceId].disableIndicator = true } } diff --git a/src/main/groovy/au/org/ala/merit/Score.groovy b/src/main/groovy/au/org/ala/merit/Score.groovy index 7a267f150..4e15b2481 100644 --- a/src/main/groovy/au/org/ala/merit/Score.groovy +++ b/src/main/groovy/au/org/ala/merit/Score.groovy @@ -12,6 +12,16 @@ class Score { /** Project services/outputs that been delivered to 200% of the target are considered over delivered and produce a warning */ private static final int OVER_DELIVERY_PERCENTAGE_THRESHOLD = 200 + /** If the score is tagged with "Survey" it is measuring something from a survey typed activity/service*/ + static String TAG_SURVEY = "Survey" + + /** If the score is tagged with "Survey" it is measuring something from a survey typed activity/service*/ + static String TAG_BASELINE = "Baseline" + + /** If the score is tagged with "Survey" it is measuring something from a survey typed activity/service*/ + static String TAG_INDICATOR = "Indicator" + + /** The id of the Score this target is based on */ String scoreId String displayType From 3623a4c516ebfba38dda94dda277ec1dba09f230 Mon Sep 17 00:00:00 2001 From: chrisala Date: Tue, 26 Mar 2024 08:58:31 +1100 Subject: [PATCH 19/95] Added funding verification date to project settings #2973 --- grails-app/assets/javascripts/projects.js | 2 ++ grails-app/views/project/_editProject.gsp | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/grails-app/assets/javascripts/projects.js b/grails-app/assets/javascripts/projects.js index fa5821d63..d90a577d8 100644 --- a/grails-app/assets/javascripts/projects.js +++ b/grails-app/assets/javascripts/projects.js @@ -131,6 +131,7 @@ function ProjectViewModel(project, isUserEditor, organisations) { self.plannedStartDate = ko.observable(project.plannedStartDate).extend({simpleDate: false}); self.plannedEndDate = ko.observable(project.plannedEndDate).extend({simpleDate: false}); self.funding = ko.observable(project.funding).extend({currency:{}}); + self.fundingVerificationDate = ko.observable(project.fundingVerificationDate).extend({simpleDate: false}); self.regenerateProjectTimeline = ko.observable(false); self.projectDatesChanged = ko.computed(function() { return project.plannedStartDate != self.plannedStartDate() || @@ -933,6 +934,7 @@ function ProjectPageViewModel(project, sites, activities, organisations, userRol associatedSubProgram: self.associatedSubProgram(), programId: self.programId(), funding: new Number(self.funding()), + fundingVerificationDate: self.fundingVerificationDate(), status: self.status(), terminationReason: self.terminationReason(), tags: self.tags(), diff --git a/grails-app/views/project/_editProject.gsp b/grails-app/views/project/_editProject.gsp index 6daeb88a0..993dc63f0 100644 --- a/grails-app/views/project/_editProject.gsp +++ b/grails-app/views/project/_editProject.gsp @@ -96,18 +96,28 @@ +
    - -
    - + +
    +
    - + +
    + +
    +
    +
    + +
    +
    +
    - +
    From 0eb4b3d1ee367c78bd1128cfb5cb79a787914b62 Mon Sep 17 00:00:00 2001 From: chrisala Date: Tue, 26 Mar 2024 09:13:11 +1100 Subject: [PATCH 20/95] Use null instead of empty string for date #2973 --- grails-app/assets/javascripts/projects.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/assets/javascripts/projects.js b/grails-app/assets/javascripts/projects.js index d90a577d8..9e40ef09f 100644 --- a/grails-app/assets/javascripts/projects.js +++ b/grails-app/assets/javascripts/projects.js @@ -934,7 +934,7 @@ function ProjectPageViewModel(project, sites, activities, organisations, userRol associatedSubProgram: self.associatedSubProgram(), programId: self.programId(), funding: new Number(self.funding()), - fundingVerificationDate: self.fundingVerificationDate(), + fundingVerificationDate: self.fundingVerificationDate() || null, // Convert empty string to null status: self.status(), terminationReason: self.terminationReason(), tags: self.tags(), From 8bcb6e0877cc9553a7d99e555cb3d1dfa22405cc Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 15 Mar 2024 14:13:00 +1100 Subject: [PATCH 21/95] Work in progress for #3119 --- grails-app/assets/javascripts/dataSets.js | 16 +++++++++++- .../au/org/ala/merit/DataSetController.groovy | 25 ++++++++++++++++--- grails-app/views/dataSet/_editDataSet.gsp | 4 +-- grails-app/views/dataSet/create.gsp | 1 + grails-app/views/dataSet/edit.gsp | 1 + 5 files changed, 40 insertions(+), 7 deletions(-) diff --git a/grails-app/assets/javascripts/dataSets.js b/grails-app/assets/javascripts/dataSets.js index 194d6e3ec..8e79e125f 100644 --- a/grails-app/assets/javascripts/dataSets.js +++ b/grails-app/assets/javascripts/dataSets.js @@ -116,6 +116,7 @@ var DataSetViewModel = function(dataSet, projectService, options) { }); self.serviceAndOutcomes = ko.observable(selectedServiceAndOutcome && selectedServiceAndOutcome.label); self.projectProtocols = config.projectProtocols; + self.protocol = ko.observable(dataSet.protocol); self.projectOutcomeList = ko.observableArray(options.projectOutcomes); self.serviceId = ko.computed(function() { @@ -124,6 +125,15 @@ var DataSetViewModel = function(dataSet, projectService, options) { }); return selectedOutcome && selectedOutcome.serviceId; }); + + self.disableBaseline = function(e) { + var serviceConfig = config.serviceBaselineIndicatorOptions[self.serviceId()]; + return serviceConfig ? serviceConfig.disableBaseline : false; + }; + self.disableIndicator = function() { + var serviceConfig = config.serviceBaselineIndicatorOptions[self.serviceId()]; + return serviceConfig ? serviceConfig.disableIndicator : false; + }; self.projectOutcomes = ko.computed(function() { var selectedOutcome = _.find(options.projectOutcomes || [], function(serviceAndOutcome) { return serviceAndOutcome.label == self.serviceAndOutcomes(); @@ -228,7 +238,11 @@ var DataSetViewModel = function(dataSet, projectService, options) { if (valid) { var dataSet = ko.mapping.toJS(self, - {ignore: ['grantId', 'projectName', 'programName', 'validate', 'save', 'cancel', 'investmentOtherSelected', 'siteUrl', 'isAutoCreated', 'serviceAndOutcomes', 'projectOutcomeList', 'projectBaselines', 'projectProtocols']}); + {ignore: [ + 'grantId', 'projectName', 'programName', 'validate', 'save', 'cancel', + 'investmentOtherSelected', 'siteUrl', 'isAutoCreated', 'serviceAndOutcomes', + 'projectOutcomeList', 'projectBaselines', 'projectProtocols', 'disableBaseline', + 'disableIndicator']}); projectService.saveDataSet(dataSet).done(function() { // return to project window.location.href = config.returnToUrl; diff --git a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy index 3dc6b3c84..6b74d4a33 100644 --- a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy +++ b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy @@ -54,23 +54,39 @@ class DataSetController { List projectServices = projectService.getProjectServices(project) project.outputTargets?.each { Map outputTarget -> if (outputTarget.outcomeTargets) { + Map service = projectServices.find{it.scores?.find{score -> score.scoreId == outputTarget.scoreId}} if (service) { + Map score = service.scores.find{it.scoreId == outputTarget.scoreId} outputTarget.outcomeTargets.each { outcomeGroups << [ serviceId: service.id, service: service.name, outcomes:it.relatedOutcomes, - label:service.name+" "+it.relatedOutcomes + label:service.name+" "+it.relatedOutcomes, + tags:score.tags ] } } else { log.warn("No service found for scoreId ${outputTarget.scoreId} in project ${project.projectId}") - } + } + } + } + + Map outcomeGroupsByServiceId = outcomeGroups.groupBy{it.serviceId} + outcomeGroups = outcomeGroups.unique{it.label}.sort{it.label} + Map serviceBaselineIndicatorOptions = [:] + outcomeGroupsByServiceId.each { int serviceId, List groups -> + List tags = groups.collect{it.tags}.flatten().unique() + serviceBaselineIndicatorOptions[serviceId] = [:] + if (!tags?.contains('Baseline')) { + serviceBaselineIndicatorOptions[serviceId].disableBaseline = true + } + if (!tags?.contains('Indicator')) { + serviceBaselineIndicatorOptions[serviceId].disableIndicator = true } } - outcomeGroups = outcomeGroups.findAll{it.outcomes}.unique{it.label}.sort{it.label} List projectBaselines = projectService.listProjectBaselines(project) projectBaselines = projectBaselines?.collect{ @@ -89,7 +105,8 @@ class DataSetController { [projectId:projectId, programName:programName, supportsOutcomeTargets:config.supportsOutcomeTargets(), priorities:priorities, outcomes: outcomes, project:project, projectOutcomes:outcomeGroups, - projectBaselines:projectBaselines, projectProtocols:projectProtocols, dataSetNames:dataSetNames] + projectBaselines:projectBaselines, projectProtocols:projectProtocols, dataSetNames:dataSetNames, + serviceBaselineIndicatorOptions: serviceBaselineIndicatorOptions] } // Note that authorization is done against a project, so the project id must be supplied to the method. diff --git a/grails-app/views/dataSet/_editDataSet.gsp b/grails-app/views/dataSet/_editDataSet.gsp index ff19b9a41..502d8a5fa 100644 --- a/grails-app/views/dataSet/_editDataSet.gsp +++ b/grails-app/views/dataSet/_editDataSet.gsp @@ -77,8 +77,8 @@
    diff --git a/grails-app/views/dataSet/create.gsp b/grails-app/views/dataSet/create.gsp index 93a6553cd..1b75006da 100644 --- a/grails-app/views/dataSet/create.gsp +++ b/grails-app/views/dataSet/create.gsp @@ -55,6 +55,7 @@ config.projectBaselines = ; config.projectProtocols = ; config.invalidNames = ; + config.serviceBaselineIndicatorOptions = ; var viewModel = new DataSetViewModel({}, projectService, config); $.fn.select2.defaults.set( "theme", "bootstrap" ); ko.applyBindings(viewModel); diff --git a/grails-app/views/dataSet/edit.gsp b/grails-app/views/dataSet/edit.gsp index 240f5cd75..a10311659 100644 --- a/grails-app/views/dataSet/edit.gsp +++ b/grails-app/views/dataSet/edit.gsp @@ -56,6 +56,7 @@ config.projectBaselines = ; config.projectProtocols = ; config.invalidNames = ; + config.serviceBaselineIndicatorOptions = ; var viewModel = new DataSetViewModel(dataSet, projectService, config); $.fn.select2.defaults.set( "theme", "bootstrap" ); ko.applyBindings(viewModel); From b33a5312590dc475c0b1c77a4bcadc1f1d5edbe0 Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 25 Mar 2024 14:53:32 +1100 Subject: [PATCH 22/95] Fixed tests #3119 --- .../au/org/ala/merit/DataSetController.groovy | 19 +++++++++++-------- .../ala/merit/DataSetControllerSpec.groovy | 6 +++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy index 6b74d4a33..75f6d7ac0 100644 --- a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy +++ b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy @@ -64,7 +64,8 @@ class DataSetController { service: service.name, outcomes:it.relatedOutcomes, label:service.name+" "+it.relatedOutcomes, - tags:score.tags + projectTags:score.tags, + allTags: service.scores?.collect{it.tags}?.flatten()?.unique() ] } } @@ -78,13 +79,15 @@ class DataSetController { outcomeGroups = outcomeGroups.unique{it.label}.sort{it.label} Map serviceBaselineIndicatorOptions = [:] outcomeGroupsByServiceId.each { int serviceId, List groups -> - List tags = groups.collect{it.tags}.flatten().unique() - serviceBaselineIndicatorOptions[serviceId] = [:] - if (!tags?.contains('Baseline')) { - serviceBaselineIndicatorOptions[serviceId].disableBaseline = true - } - if (!tags?.contains('Indicator')) { - serviceBaselineIndicatorOptions[serviceId].disableIndicator = true + List tags = groups.collect{it.allTags}.flatten().unique() + if (tags?.contains('Survey')) { + serviceBaselineIndicatorOptions[serviceId] = [:] + if (!tags?.contains('Baseline')) { + serviceBaselineIndicatorOptions[serviceId].disableBaseline = true + } + if (!tags?.contains('Indicator')) { + serviceBaselineIndicatorOptions[serviceId].disableIndicator = true + } } } diff --git a/src/test/groovy/au/org/ala/merit/DataSetControllerSpec.groovy b/src/test/groovy/au/org/ala/merit/DataSetControllerSpec.groovy index 3d3f3e6fa..b0315e93b 100644 --- a/src/test/groovy/au/org/ala/merit/DataSetControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/DataSetControllerSpec.groovy @@ -45,7 +45,7 @@ class DataSetControllerSpec extends Specification implements ControllerUnitTest< model == [project:project, projectId:'p1', programName:"program 1", supportsOutcomeTargets:false, priorities:["p1"], outcomes:["1", "2"], projectOutcomes:[], projectBaselines:[[label:"b1 - a baseline", value:"b1"]], - projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames:['d1', 'd2']] + projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames:['d1', 'd2'], serviceBaselineIndicatorOptions:[:]] } @@ -90,7 +90,7 @@ class DataSetControllerSpec extends Specification implements ControllerUnitTest< model == [project:project, projectId:'p1', programName:"program 1", priorities:["p1"], supportsOutcomeTargets: true, outcomes:["1", "2"], projectOutcomes:[], dataSet:existingDataSets[1], projectBaselines:[[label:"b1 - a baseline", value:"b1"]], - projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames: ['data set 1', 'data set 3']] + projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames: ['data set 1', 'data set 3'], serviceBaselineIndicatorOptions:[:]] } void "The save method delegates to the projectService"() { @@ -155,6 +155,6 @@ class DataSetControllerSpec extends Specification implements ControllerUnitTest< model == [project:project, projectId:'p1', programName:"program 1", priorities:["p1"], supportsOutcomeTargets: false, outcomes:["1", "2"], projectOutcomes:[], dataSet:existingDataSets[1], projectBaselines:[[label:"b1 - a baseline", value:"b1"]], - projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames: ['data set 1', 'data set 2', 'data set 3']] + projectProtocols:[[label:"p1", value:"p1"], [label:'Other', value:'other']], dataSetNames: ['data set 1', 'data set 2', 'data set 3'], serviceBaselineIndicatorOptions:[:]] } } From 0fd7f6af500556192b5d7e988bd6e64518eed332 Mon Sep 17 00:00:00 2001 From: chrisala Date: Tue, 26 Mar 2024 08:18:19 +1100 Subject: [PATCH 23/95] Added constants #3119 --- .../au/org/ala/merit/DataSetController.groovy | 6 +++--- src/main/groovy/au/org/ala/merit/Score.groovy | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy index 75f6d7ac0..8e77f6fae 100644 --- a/grails-app/controllers/au/org/ala/merit/DataSetController.groovy +++ b/grails-app/controllers/au/org/ala/merit/DataSetController.groovy @@ -80,12 +80,12 @@ class DataSetController { Map serviceBaselineIndicatorOptions = [:] outcomeGroupsByServiceId.each { int serviceId, List groups -> List tags = groups.collect{it.allTags}.flatten().unique() - if (tags?.contains('Survey')) { + if (tags?.contains(Score.TAG_SURVEY)) { serviceBaselineIndicatorOptions[serviceId] = [:] - if (!tags?.contains('Baseline')) { + if (!tags?.contains(Score.TAG_BASELINE)) { serviceBaselineIndicatorOptions[serviceId].disableBaseline = true } - if (!tags?.contains('Indicator')) { + if (!tags?.contains(Score.TAG_INDICATOR)) { serviceBaselineIndicatorOptions[serviceId].disableIndicator = true } } diff --git a/src/main/groovy/au/org/ala/merit/Score.groovy b/src/main/groovy/au/org/ala/merit/Score.groovy index 7a267f150..4e15b2481 100644 --- a/src/main/groovy/au/org/ala/merit/Score.groovy +++ b/src/main/groovy/au/org/ala/merit/Score.groovy @@ -12,6 +12,16 @@ class Score { /** Project services/outputs that been delivered to 200% of the target are considered over delivered and produce a warning */ private static final int OVER_DELIVERY_PERCENTAGE_THRESHOLD = 200 + /** If the score is tagged with "Survey" it is measuring something from a survey typed activity/service*/ + static String TAG_SURVEY = "Survey" + + /** If the score is tagged with "Survey" it is measuring something from a survey typed activity/service*/ + static String TAG_BASELINE = "Baseline" + + /** If the score is tagged with "Survey" it is measuring something from a survey typed activity/service*/ + static String TAG_INDICATOR = "Indicator" + + /** The id of the Score this target is based on */ String scoreId String displayType From 5b1968814ecaf18345d255ce98d0708fc3f47305 Mon Sep 17 00:00:00 2001 From: sal153 Date: Tue, 26 Mar 2024 16:45:07 +1100 Subject: [PATCH 24/95] added application status in the condition #3090 --- grails-app/services/au/org/ala/merit/ProjectService.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index ae3298a6a..9e4921f4d 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -1127,7 +1127,7 @@ class ProjectService { * been populated with project reports. */ boolean canRegenerateReports(Map project) { - Status.isActive(project.status) && !hasSubmittedOrApprovedFinalReportInCategory(project) + Status.isActive(project.status) || APPLICATION_STATUS.equalsIgnoreCase(project.status) && !hasSubmittedOrApprovedFinalReportInCategory(project) } /** From 02a19f59bc22ea901b67ae3913b79509cc3dfaf0 Mon Sep 17 00:00:00 2001 From: sal153 Date: Wed, 27 Mar 2024 14:41:09 +1100 Subject: [PATCH 25/95] commit fix #3133 --- .../views/project/meriPlanReadOnly/_arrayAsList.gsp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/grails-app/views/project/meriPlanReadOnly/_arrayAsList.gsp b/grails-app/views/project/meriPlanReadOnly/_arrayAsList.gsp index 86e7e7daf..5b7d0d7ae 100644 --- a/grails-app/views/project/meriPlanReadOnly/_arrayAsList.gsp +++ b/grails-app/views/project/meriPlanReadOnly/_arrayAsList.gsp @@ -1,5 +1,12 @@ - + + + + + + + + From 9ce02c8c1799117dc930d80afb4ce09757815609 Mon Sep 17 00:00:00 2001 From: sal153 Date: Thu, 28 Mar 2024 08:25:19 +1100 Subject: [PATCH 26/95] commit test update #3133 --- .../groovy/pages/modules/ReadOnlyMeriPlan.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/integration-test/groovy/pages/modules/ReadOnlyMeriPlan.groovy b/src/integration-test/groovy/pages/modules/ReadOnlyMeriPlan.groovy index e2d072d4c..fa5900c0e 100644 --- a/src/integration-test/groovy/pages/modules/ReadOnlyMeriPlan.groovy +++ b/src/integration-test/groovy/pages/modules/ReadOnlyMeriPlan.groovy @@ -50,7 +50,7 @@ class ReadOnlyBaselineRow extends Module { targetMeasures(required:false) { $('.service span') } method { $('.baseline-method span[data-bind*=method]') } evidence(required:false) { $('.evidence span') } - methodProtocols(required:false) { $('.baseline-method span[data-bind*=protocols]')[0] } + methodProtocols(required:false) { $('.baseline-method span') } otherMethodProtocol(required:false) { $('.baseline-method span[data-bind*=method]') } } } @@ -61,7 +61,7 @@ class ReadOnlyMonitoringIndicatorRow extends Module { approach { $('span[data-bind*=data2]' ) } targetMeasures(required:false) { $('.monitoring-service span') } evidence(required:false) { $('.monitoring-evidence span') } - methodProtocols(required:false) { $('.monitoring-method span[data-bind*=protocols]')[0] } + methodProtocols(required:false) { $('.monitoring-method span') } otherMethodProtocol(required:false) { $('.monitoring-method span[data-bind*=method]') } } } From a6dcd8c9e8da4e8adca9ffda65f750ccf1d267a0 Mon Sep 17 00:00:00 2001 From: chrisala Date: Thu, 28 Mar 2024 10:17:16 +1100 Subject: [PATCH 27/95] Implemented species search for primary outcome #2983 --- grails-app/assets/javascripts/meriplan.js | 79 ++++++++++++++++--- grails-app/assets/javascripts/projects.js | 7 +- grails-app/views/project/index.gsp | 15 +++- .../project/meriPlan/_programOutcome.gsp | 13 +++ 4 files changed, 99 insertions(+), 15 deletions(-) diff --git a/grails-app/assets/javascripts/meriplan.js b/grails-app/assets/javascripts/meriplan.js index ffed53e80..fb52b04c2 100644 --- a/grails-app/assets/javascripts/meriplan.js +++ b/grails-app/assets/javascripts/meriplan.js @@ -369,7 +369,7 @@ function MERIPlan(project, projectService, config) { self.meriPlan().objectives.rows.push(new GenericRowViewModel()); }; self.addOutcome = function () { - self.meriPlan().objectives.rows1.push(new SingleAssetOutcomeViewModel()); + self.meriPlan().objectives.rows1.push(new SingleAssetOutcomeViewModel({}, config)); }; self.removeObjectives = function (row) { self.meriPlan().objectives.rows.remove(row); @@ -424,7 +424,7 @@ function MERIPlan(project, projectService, config) { self.meriPlan().partnership.removeRow(partnership); }; self.addSecondaryOutcome = function () { - self.meriPlan().outcomes.secondaryOutcomes.push(new SingleAssetOutcomeViewModel()); + self.meriPlan().outcomes.secondaryOutcomes.push(new SingleAssetOutcomeViewModel({}, config)); }; self.removeSecondaryOutcome = function (outcome) { self.meriPlan().outcomes.secondaryOutcomes.remove(outcome); @@ -458,7 +458,7 @@ function MERIPlan(project, projectService, config) { index++; code = codePrefix+index; } - outcomeStatementList.push(new SingleAssetOutcomeViewModel({code:code})); + outcomeStatementList.push(new SingleAssetOutcomeViewModel({code:code}, config)); } self.addMidTermOutcome = function () { addOutcomeStatement(self.meriPlan().outcomes.midTermOutcomes, 'MT'); @@ -917,7 +917,16 @@ function DetailsViewModel(o, project, budgetHeaders, risks, allServices, selecte self.caseStudy = ko.observable(o.caseStudy ? o.caseStudy : false); self.keq = new GenericViewModel(o.keq); self.objectives = new ObjectiveViewModel(o.objectives, config.programObjectives || []); // Used in original MERI plan template - self.outcomes = new OutcomesViewModel(o.outcomes, {outcomes:project.outcomes, priorities:project.priorities}); // Use in new MERI plan template + var outcomesConfig = { + outcomes:project.outcomes, + priorities:project.priorities, + bieUrl: config.bieUrl, + searchBieUrl: config.searchBieUrl, + speciesListUrl: config.speciesListUrl, + speciesImageUrl: config.speciesImageUrl, + speciesProfileUrl: config.speciesProfileUrl + }; + self.outcomes = new OutcomesViewModel(o.outcomes, outcomesConfig); // Use in new MERI plan template self.priorities = new GenericViewModel(o.priorities, ['data1', 'data2', 'data3', 'documentUrl']); self.implementation = new ImplementationViewModel(o.implementation); self.partnership = new GenericViewModel(o.partnership, ['data1', 'data2', 'data3', 'otherOrganisationType']); @@ -1721,7 +1730,7 @@ function OutcomesViewModel(outcomes, config) { return priorities; }; - var supportsMultiplePriorities = function(outcomeText, configItemName) { + var supportsConfiguration = function(outcomeText, configItemName) { var outcome = _.find(config.outcomes, function (outcome) { return outcome.outcome == outcomeText; }); @@ -1729,16 +1738,29 @@ function OutcomesViewModel(outcomes, config) { } self.primaryOutcomeSupportsMultiplePriorities = ko.pureComputed(function() { var outcomeText = self.primaryOutcome.description(); - return supportsMultiplePriorities(outcomeText, 'supportsMultiplePrioritiesAsPrimary') + return supportsConfiguration(outcomeText, 'supportsMultiplePrioritiesAsPrimary') }); self.secondaryOutcomeSupportsMultiplePriorities = function(outcomeText) { - return supportsMultiplePriorities(outcomeText, 'supportsMultiplePrioritiesAsSecondary') + return supportsConfiguration(outcomeText, 'supportsMultiplePrioritiesAsSecondary') }; - self.primaryOutcome = new SingleAssetOutcomeViewModel(outcomes.primaryOutcome); + self.supportsSpeciesSearch = function(outcomeText) { + return supportsConfiguration(outcomeText, 'supportsSpeciesSearch') + }; + + + config.supportsSpeciesSearch = _.find(filterByType(config.outcomes, PRIMARY_OUTCOMES, true), function(outcome) { + return outcome.supportsSpeciesSearch; + }); + self.primaryOutcome = new SingleAssetOutcomeViewModel(outcomes.primaryOutcome, config); + + config.supportsSpeciesSearch = _.find(filterByType(config.outcomes, SECONDARY_OUTCOMES, true), function(outcome) { + return outcome.supportsSpeciesSearch; + }); self.secondaryOutcomes = ko.observableArray(_.map(outcomes.secondaryOutcomes || [], function (outcome) { - return new SingleAssetOutcomeViewModel(outcome) + return new SingleAssetOutcomeViewModel(outcome, config) })); + config.supportsSpeciesSearch = false; self.shortTermOutcomes = ko.observableArray(_.map(outcomes.shortTermOutcomes || [], function (outcome) { return new SingleAssetOutcomeViewModel(outcome); })); @@ -1812,7 +1834,7 @@ function AssetViewModel(asset) { self.description = ko.observable(asset.description); } -function SingleAssetOutcomeViewModel(o) { +function SingleAssetOutcomeViewModel(o, config) { var self = this; if (!o) o = {}; @@ -1834,8 +1856,37 @@ function SingleAssetOutcomeViewModel(o) { }, owner: self }); + + if (config && config.supportsSpeciesSearch) { + var options = { + bieUrl: config.bieUrl, + searchBieUrl: config.searchBieUrl, + speciesListUrl: config.speciesListUrl, + speciesImageUrl: config.speciesImageUrl, + speciesProfileUrl: config.speciesProfileUrl + }; + + self.speciesAsset = new SpeciesViewModel(o.speciesAsset || {}, options, {}); + self.speciesAsset.name.subscribe(function () { + var scientificName = self.speciesAsset.scientificName(); + var commonName = self.speciesAsset.commonName(); + + var assetName; + if (scientificName && commonName) { + assetName = scientificName + ' (' + commonName + ')'; + } else if (scientificName) { + assetName = scientificName; + } else { + assetName = commonName; + } + self.asset(assetName); + }); + } self.description.subscribe(function () { self.assets([]); + if (self.speciesAsset) { + self.speciesAsset.loadData({}); + } }); self.relatedOutcome = ko.observable(o.relatedOutcome); @@ -1849,12 +1900,16 @@ function SingleAssetOutcomeViewModel(o) { !self.relatedOutcome()) { return null; } - return { - code:self.code, + var json = { + code: self.code, description: self.description(), assets: self.assets(), relatedOutcome: self.relatedOutcome() + }; + if (self.speciesAsset) { + json.speciesAsset = self.speciesAsset.name() ? self.speciesAsset.toJSON() : null } + return json; }; }; diff --git a/grails-app/assets/javascripts/projects.js b/grails-app/assets/javascripts/projects.js index 9e40ef09f..3f5bb1e83 100644 --- a/grails-app/assets/javascripts/projects.js +++ b/grails-app/assets/javascripts/projects.js @@ -873,7 +873,12 @@ function ProjectPageViewModel(project, sites, activities, organisations, userRol meriSubmissionDeclarationSelector: '#meriSubmissionDeclaration', editProjectStartDate: self.canEditStartDate, externalIds: self.externalIds, - canModifyMeriPlan: config.canModifyMeriPlan + canModifyMeriPlan: config.canModifyMeriPlan, + bieUrl: config.bieUrl, + searchBieUrl: config.searchBieUrl, + speciesListUrl: config.speciesListUrl, + speciesImageUrl: config.speciesImageUrl, + speciesProfileUrl: config.speciesProfileUrl }); self.meriPlan = new MERIPlan(project, projectService, meriPlanConfig); diff --git a/grails-app/views/project/index.gsp b/grails-app/views/project/index.gsp index 18e94c76e..684c4fee6 100644 --- a/grails-app/views/project/index.gsp +++ b/grails-app/views/project/index.gsp @@ -101,6 +101,11 @@ reportsHistoryUrl:"${createLink(controller: 'report', action:'reportingHistory')}", monitoringProtocolsUrl:"${createLink(action:'monitoringProtocolFormCategories', id: project.projectId)}", requestLabelUrl:"${createLink(action:'requestVoucherBarcodeLabels', id: project.projectId)}", + bieUrl: "${grailsApplication.config.getProperty('bie.baseURL')}", + searchBieUrl:"${createLink(controller:'species', action:'searchBie')}", + speciesListUrl:"${createLink(controller:'proxy', action:'speciesItemsForList')}", + speciesImageUrl:"${createLink(controller:'species', action:'speciesImage')}", + speciesProfileUrl:"${createLink(controller:'species', action:'speciesProfile')}" }, here = "${createLink(action:'index', id: project.projectId)}"; @@ -327,7 +332,12 @@ var config = { config.canModifyMeriPlan = ${projectContent.admin.canModifyMeriPlan}; config.userHoldsMeriPlanLock = ${project.lock?.userId == user?.userId}; config.viewReportUrl = fcConfig.viewReportUrl; - project.mapFeatures = $.parseJSON('${mapFeatures?.encodeAsJavaScript()}'); + config.bieUrl = fcConfig.bieUrl; + config.searchBieUrl = fcConfig.searchBieUrl; + config.speciesListUrl = fcConfig.speciesListUrl; + config.speciesImageUrl = fcConfig.speciesImageUrl; + config.speciesProfileUrl = fcConfig.speciesProfileUrl; + project.mapFeatures = $.parseJSON('${mapFeatures?.encodeAsJavaScript()}'); var viewModel = new ProjectPageViewModel(project, project.sites, project.activities || [], organisations, userRoles, config); viewModel.loadPrograms(programs); ko.applyBindings(viewModel); @@ -514,7 +524,8 @@ var config = { - + + diff --git a/grails-app/views/project/meriPlan/_programOutcome.gsp b/grails-app/views/project/meriPlan/_programOutcome.gsp index 184812d20..45b37c2b2 100644 --- a/grails-app/views/project/meriPlan/_programOutcome.gsp +++ b/grails-app/views/project/meriPlan/_programOutcome.gsp @@ -19,8 +19,21 @@ + + + + +
    + +
    + +
    +
    + + + From 2ee9beec1483c5529f1f150e22f19abe49c7f22d Mon Sep 17 00:00:00 2001 From: chrisala Date: Thu, 28 Mar 2024 10:46:26 +1100 Subject: [PATCH 28/95] Implemented species search for secondary outcome #2983 --- grails-app/assets/stylesheets/meriplan.css | 3 +++ .../views/project/meriPlan/_additionalOutcomes.gsp | 9 ++++++++- grails-app/views/project/meriPlan/_programOutcome.gsp | 7 +------ grails-app/views/shared/_speciesSelect.gsp | 6 ++++++ 4 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 grails-app/views/shared/_speciesSelect.gsp diff --git a/grails-app/assets/stylesheets/meriplan.css b/grails-app/assets/stylesheets/meriplan.css index d952e67c3..1f17c523a 100644 --- a/grails-app/assets/stylesheets/meriplan.css +++ b/grails-app/assets/stylesheets/meriplan.css @@ -516,4 +516,7 @@ input#changeProjectStartDate { .meri-plan .meriList { margin-left: 0; padding-left: 1rem; +} +.meri-plan .input-group.species-select { + flex-wrap: unset; } \ No newline at end of file diff --git a/grails-app/views/project/meriPlan/_additionalOutcomes.gsp b/grails-app/views/project/meriPlan/_additionalOutcomes.gsp index 71280213d..0a78c5e22 100644 --- a/grails-app/views/project/meriPlan/_additionalOutcomes.gsp +++ b/grails-app/views/project/meriPlan/_additionalOutcomes.gsp @@ -16,8 +16,15 @@ + + - + + + + + + diff --git a/grails-app/views/project/meriPlan/_programOutcome.gsp b/grails-app/views/project/meriPlan/_programOutcome.gsp index 45b37c2b2..6cec36393 100644 --- a/grails-app/views/project/meriPlan/_programOutcome.gsp +++ b/grails-app/views/project/meriPlan/_programOutcome.gsp @@ -25,12 +25,7 @@ -
    - -
    - -
    -
    + diff --git a/grails-app/views/shared/_speciesSelect.gsp b/grails-app/views/shared/_speciesSelect.gsp new file mode 100644 index 000000000..203fde037 --- /dev/null +++ b/grails-app/views/shared/_speciesSelect.gsp @@ -0,0 +1,6 @@ +
    + +
    + +
    +
    \ No newline at end of file From 7bf074926d9e57987808a3dae329f46ba7d9f81f Mon Sep 17 00:00:00 2001 From: chrisala Date: Thu, 28 Mar 2024 12:29:52 +1100 Subject: [PATCH 29/95] Fixed broken functional test #2983 --- .../fieldcapture/ManagementUnitPermissionSpec.groovy | 12 ++++++------ .../wiremock/mappings/userdetailslookup.json | 8 +++++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/integration-test/groovy/au/org/ala/fieldcapture/ManagementUnitPermissionSpec.groovy b/src/integration-test/groovy/au/org/ala/fieldcapture/ManagementUnitPermissionSpec.groovy index 795f2c090..93009516f 100644 --- a/src/integration-test/groovy/au/org/ala/fieldcapture/ManagementUnitPermissionSpec.groovy +++ b/src/integration-test/groovy/au/org/ala/fieldcapture/ManagementUnitPermissionSpec.groovy @@ -59,9 +59,9 @@ class ManagementUnitPermissionSpec extends StubbedCasSpec { def "an admin cannot add a user as a grant manager, but change change an editor to an admin"() { - setup: + setup: "Login as user 1 who is an admin of the 'test_mu' management unit" String projectId = '1' - loginAsMeritAdmin(browser) + loginAsUser('1', browser) when: to ManagementUnitPage, "test_mu" @@ -71,19 +71,19 @@ class ManagementUnitPermissionSpec extends StubbedCasSpec { then: adminTabPane.permissionAccess.permissions.size() == 3 - when: "We try and add a grant manager (user with id = 1001) as a grant manager to the project" + when: "We try and add a grant manager (user with id = 1001) as a grant manager to the MU" adminTabPane.permissionAccess.addPermission("user1001@user.com", "caseManager") then: "we cannot because the 'Grant Manager' option is disabled" - thrown(ElementNotInteractableException) + thrown(Exception) // The type of exception thrown has changed, but the element should be disabled and not clickable when: "We change user 4 to an admin" - adminTabPane.permissionAccess.findPermissionForUser('4').updateRole('admin') + adminTabPane.permissionAccess.findPermissionForDisplayName('First 4 Last 4').updateRole('admin') okBootbox() then: waitFor { - adminTabPane.permissionAccess.findPermissionForUser('4').roleText == "Admin" + adminTabPane.permissionAccess.findPermissionForDisplayName('First 4 Last 4').roleText == "Admin" } } diff --git a/src/integration-test/resources/wiremock/mappings/userdetailslookup.json b/src/integration-test/resources/wiremock/mappings/userdetailslookup.json index b6e8130b2..d0bc9790e 100644 --- a/src/integration-test/resources/wiremock/mappings/userdetailslookup.json +++ b/src/integration-test/resources/wiremock/mappings/userdetailslookup.json @@ -9,6 +9,12 @@ "headers": { "Content-Type": "application/json" }, - "body": "{\"userName\":\"user.{{request.query.userName}}@nowhere.com.au\", \"email\":\"user.{{request.query.userName}}@nowhere.com.au\", \"userId\":\"{{request.query.userName}}\"}" + "jsonBody": { + "userName":"user.{{request.query.userName}}@nowhere.com.au", + "email":"user.{{request.query.userName}}@nowhere.com.au", + "userId":"{{request.query.userName}}", + "firstName": "First {{request.query.userName}}", + "lastName": "Last {{request.query.userName}}" + } } } From 5632572dac0c58412f49f2ed8d2421b5176c4012 Mon Sep 17 00:00:00 2001 From: sal153 Date: Thu, 28 Mar 2024 14:19:02 +1100 Subject: [PATCH 30/95] commit updates #3076 --- ...reateRightWayDesertFireGrantsSubProgram.js | 848 ++++++++++++++++++ 1 file changed, 848 insertions(+) create mode 100644 src/main/scripts/releases/3.1/adhoc/createRightWayDesertFireGrantsSubProgram.js diff --git a/src/main/scripts/releases/3.1/adhoc/createRightWayDesertFireGrantsSubProgram.js b/src/main/scripts/releases/3.1/adhoc/createRightWayDesertFireGrantsSubProgram.js new file mode 100644 index 000000000..d2b5515ba --- /dev/null +++ b/src/main/scripts/releases/3.1/adhoc/createRightWayDesertFireGrantsSubProgram.js @@ -0,0 +1,848 @@ +load('../../../utils/uuid.js'); +load('../../../utils/audit.js'); +load('../../../utils/program.js'); +var userId = ''; + +const serviceFormName = "NHT Output Report"; +const annualReportFormName = "NHT Annual Report"; +const outcomes1ReportFormName = "NHT Outcomes 1 Report"; +const outcomes2ReportFormName = "NHT Outcomes 2 Report"; + +var config = + { + "excludes": [], + "programServiceConfig": { + "serviceFormName": serviceFormName, + "programServices": [ + { + "serviceTargets": [ + "c3276929-b8a9-4985-a329-49b86f14018c" + ], + "serviceId": 1 + }, + { + "serviceTargets": [ + "69deaaf9-cdc2-439a-b684-4cffdc7f224e" + ], + "serviceId": 2 + }, + { + "serviceTargets": [ + "1f8161bc-908b-4ec8-ab7f-edac973a657d", + "88908921-1248-4a7c-b185-51c625c737e3", + "fe9f1a6c-e614-489a-80fa-4d6d76f1cf95" + ], + "serviceId": 3 + }, + { + "serviceTargets": [ + "aa0c6b29-285e-4344-987e-dfeaf1d95648", + "a9d98baa-b2ab-4428-82cf-d96185e63aa6", + "c4ea5ce3-4a70-4df8-aff7-ffa929e7df61" + ], + "serviceId": 4 + }, + { + "serviceTargets": [ + "55d76c03-c89d-40fe-867b-93f7a48ff9c1", + "3cbf653f-f74c-4066-81d2-e3f78268185c", + "3855d565-3b77-497b-90af-addb271aa598", + "5dbfb32a-5933-4d8a-9937-41f350fb5f75" + ], + "serviceId": 5 + }, + { + "serviceTargets": [ + "22771c0d-8403-433b-b468-e36dc16a1d21", + "675cc878-eb80-435f-a841-d89b657fb2e3", + "dd9f8fd4-b6c7-4f09-bbbf-5d721afc7677", + "6f3cb6ab-5c6a-49be-9af9-9226fa751725" + ], + "serviceId": 7 + }, + { + "serviceTargets": [ + "e0b4cc3e-e94a-4c97-81dc-a4cb868c2cc3", + "b0bcfc54-76fa-4659-accf-276c18b50c31" + ], + "serviceId": 8 + }, + { + "serviceTargets": [ + "9416c9f4-48ca-4bd1-8822-cd45ebb56c58", + "2409e649-2ee2-47fd-9e76-ef2ffa07a5e7", + "d58f8dba-109d-4179-b130-a888cd3d303c", + "01686d38-9165-4497-9648-627ef81945a7" + ], + "serviceId": 9 + }, + { + "serviceTargets": [ + "0e2f8d61-b7b4-4d2d-b07c-4fc20bbe326a", + "bb506258-e907-43d3-99bd-0fe0400f654e" + ], + "serviceId": 10 + }, + { + "serviceTargets": [ + "3c83e639-9c19-4b31-a86f-9d2d5e78123b", + "e901be5e-8336-432e-b164-f278abd7430b" + ], + "serviceId": 12 + }, + { + "serviceTargets": [ + "5557288b-190e-4a3f-a60b-4bdff6ca8fe8", + "902df7a8-92f6-420d-9544-47d4b8cf31ca" + ], + "serviceId": 13 + }, + { + "serviceTargets": [ + "9deb3edf-50c7-4b04-a1fb-d1451eadf641", + "360c8b86-360c-4ca3-b1aa-626be56f2b11" + ], + "serviceId": 14 + }, + { + "serviceTargets": [ + "7c30bc26-829e-4080-8059-27af9285113b", + "158a5544-78e3-4d00-9f1b-62a85a938268" + ], + "serviceId": 15 + }, + { + "serviceTargets": [ + "4aa201ec-2066-40e1-a457-99daa569c8e2", + "f46f096a-a274-426b-adad-702e7cf8fab7", + "3b1403f3-139a-4206-b325-62ebfe05ddc4", + "7cb13c22-3dcd-43e7-808d-e0e26f5c090d" + ], + "serviceId": 16 + }, + { + "serviceTargets": [ + "5c6db4c1-7fde-452e-8735-e52842fe6217", + "41cb1e2c-59bc-4639-8bf7-fe0f528e006e" + ], + "serviceId": 18 + }, + { + "serviceTargets": [ + "4f71e00a-2d80-488d-9ce4-947e60589149", + "69a2ffba-41e9-406e-8ea4-5bdeee92cbde" + ], + "serviceId": 42 + }, + { + "serviceTargets": [ + "26ea592f-ee39-4e6e-b6af-5b53fb1a5675" + ], + "serviceId": 17 + }, + { + "serviceTargets": [ + "3587a984-68f9-4db3-b5af-49f265d853e0", + "9d2d01be-b517-4be2-a225-8b1c887e016e" + ], + "serviceId": 19 + }, + { + "serviceTargets": [ + "d0516817-5acb-46bd-9871-2696c245bad0", + "7fed132d-6a38-448c-b519-381ab9e1e027", + "e08dda14-360c-4b66-b8c5-eb0269c5aa44", + "f3671aa7-773f-447d-9649-ba7f11dbe97a" + ], + "serviceId": 20 + }, + { + "serviceTargets": [ + "5ab2b539-a5b4-40da-a556-a2c18066345b", + "36410625-05f3-42d3-b04f-a3b268498ee1" + ], + "serviceId": 23 + }, + { + "serviceTargets": [ + "0162246b-13fd-40c9-ae26-fb767eee76f8" + ], + "serviceId": 24 + }, + { + "serviceTargets": [ + "b9e710e4-7dd3-4acc-ac2c-c69f4bcb9787", + "00934509-f102-4d39-a043-7547a8ab9ac8", + "1021bec7-3836-4b33-90b4-76701efd4fe3", + "4dad393e-cbf7-43dd-87bb-62ea8f8afcdd" + ], + "serviceId": 26 + }, + { + "serviceTargets": [ + "a516c78d-740f-463b-a1ce-5b02b8c82dd3", + "4cbcb2b5-45cd-42dc-96bf-a9a181a4865b", + "fbc45154-1d60-4f5e-a484-fdff514f9d51", + "85191c99-f56d-46e6-9311-a58c1f37965d" + ], + "serviceId": 27 + }, + { + "serviceTargets": [ + "3cfa82aa-0b38-49c0-be37-0fa61b5b6e3c", + "91e90861-3ba7-4257-a765-6cab24c6f58a" + ], + "serviceId": 28 + }, + { + "serviceTargets": [ + "96be68cf-783d-452a-b8fd-3832163f95db", + "e70c70fd-4f31-41dc-a4b4-07f79efc3055" + ], + "serviceId": 29 + }, + { + "serviceTargets": [ + "598bd978-0907-4cad-a7a6-ec5a8a8bbdc4", + "d29bd931-1dd1-47c4-b456-c175099ff1df" + ], + "serviceId": 30 + }, + { + "serviceTargets": [ + "6db1ebd7-92c5-49f2-98b7-2faa700fd752", + "524d93b4-5cd1-4d0d-b1f8-d393028220ad" + ], + "serviceId": 31 + }, + { + "serviceTargets": [ + "8040931a-2e6c-41be-9e92-f1035093b2ac", + "5d652e6e-b719-45bf-8ae6-e9f293c24a92" + ], + "serviceId": 32 + }, + { + "serviceTargets": [ + "f74182bd-7a53-4157-aeb9-eda281bb0234", + "e7b7bb1e-66c2-4140-90f9-9534aa46ffa3" + ], + "serviceId": 33 + }, + { + "serviceTargets": [ + "15615a70-ee60-46b8-b5e9-b33d4d88de6b", + "d8dc153b-da23-4f7b-947a-89bc98338d6d", + "5f762c6d-4f42-4458-9855-03c6896959c1", + "5885f105-fc7d-43fd-8c26-c72938a95b76" + ], + "serviceId": 34 + }, + { + "serviceTargets": [ + "dea1ff8b-f4eb-4987-8073-500bbbf97fcd", + "fba17df1-d5cb-4643-987f-0626055b3c78" + ], + "serviceId": 35 + }, + { + "serviceTargets": [ + "3ec07754-4a7a-46fb-a76d-553921781716", + "fbc2dab8-7454-40f9-94f6-6bf258fcefff", + "7186e284-0cb2-418e-a8cc-4343eb618140" + ], + "serviceId": 36 + }, + { + "serviceTargets": [ + "3d06b150-bb86-47dc-8ad8-c33a51c3e3b3" + ], + "serviceId": 43 + }, + { + "serviceTargets": [ + "b8304577-afd8-45e0-8ef4-b71ae10998f5" + ], + "serviceId": 44 + } + ] + + }, + "visibility": "public", + "declarationPageType": "rdpReportDeclaration", + "requiresActivityLocking": true, + "supportsMeriPlanComparison": true, + "projectTemplate": "rlp", + "activityPeriodDescriptor": "Outputs report #", + "supportsParatoo": true, + "emailTemplates": { + "reportSubmittedEmailTemplate": "RLP_REPORT_SUBMITTED_EMAIL_TEMPLATE", + "reportReturnedEmailTemplate": "RLP_REPORT_RETURNED_EMAIL_TEMPLATE", + "planApprovedEmailTemplate": "RLP_PLAN_APPROVED_EMAIL_TEMPLATE", + "planReturnedEmailTemplate": "RLP_PLAN_RETURNED_EMAIL_TEMPLATE", + "reportApprovedEmailTemplate": "RLP_REPORT_APPROVED_EMAIL_TEMPLATE", + "planSubmittedEmailTemplate": "RLP_PLAN_SUBMITTED_EMAIL_TEMPLATE" + }, + "meriPlanTemplate": "configurableMeriPlan", + "riskAndThreatTypes": [ + "Performance", + "Work Health and Safety", + "People resources", + "Financial", + "External stakeholders", + "Natural Environment" + ], + "projectReports": [ + { + "reportType": "Single", + "reportDescriptionFormat": "Final Report", + "reportNameFormat": "Final Report", + "reportingPeriodInMonths": 0, + "multiple": false, + "description": "_Please note that the reporting fields for these reports are currently being developed_", + "alignToOwnerEnd": true, + "label": "Final Report", + "category": "Final Report", + "reportsAlignedToCalendar": false, + "activityType": "Final Report", + "alignToOwnerStart": true + } + ], + "navigationMode": "returnToProject", + "supportsMeriPlanHistory": true, + "requireMeritAdminToReturnMeriPlan":true, + "meriPlanContents": [ + { + "template": "name", + "model": { + "tableFormatting": true + } + }, + { + "template": "priorityPlace", + "model": { + "priorityPlaceLabel":"Does this project directly support a priority place?", + "priorityPlaceHelpText":"Priority places recognises that some threatened species share the same habitat, and that place-based action can support protection and recovery of more than one species." + } + }, + { + "template": "indigenousInvolvement" + }, + { + "template": "description", + "model": { + "tableFormatting": true, + "maxSize": "1000", + "placeholder": "Please provide a short description of this project. This project description will be visible on the project overview page in MERIT [Free text; limit response to 1000 characters (approx. 150 words)]" + } + }, + { + "template": "programOutcome", + "model": { + "maximumPriorities": "1000", + "priorityHelpText": "Enter the primary investment priority for the primary outcome, noting only one can be selected." + } + }, + { + "template": "additionalOutcomes", + "model": { + "title": "Additional benefits", + "helpTextHeading":"If the project is not delivering additional benefits, delete the row using the 'x' in the right-most column.", + "outcomePriority":"Additional outcome/s", + "priority":"Additional Investment Priorities", + "priorityHelpText":"Other investment priorities that will benefit from the project. Delete the row if there are no additional outcomes." + } + }, + { + "template": "outcomeStatements", + "model": { + "outcomeType": "short", + "helpText": "Outline the degree of impact having undertaken the services for up to three years. Ensure the outcomes are measurable with consideration to the baseline and proposed monitoring regime", + "subtitle": "Short-term outcome statement/s", + "extendedOutcomes": true + } + }, + { + "template": "extendedKeyThreats", + "model": { + "title":"Key threat(s) and/or key threatening processes", + "threatHelpText":"Describe the key threats or key threatening processes to the investment priority", + "evidenceHelpText": "List evidence that will be retained to demonstrate delivery of this service. Refer to Evidence Guide and Project Service Summaries for guidance", + "interventionHelpText":"Describe the proposed method to address the threat or threatening process", + "servicesHelpText": "Project Services/Target measures selected in this section will be pre-populated into the Project services and targets and Project service forecasts tables" + } + }, + { + "template": "projectMethodology", + "model": { + "maxSize": "4000", + "tableHeading": "Project delivery assumptions (4000 character limit [approx. 650 words])", + "helpText": "Include all those conditions or factors that are sufficient to guarantee the success of the project, for example, on ground activities were not impacted by adverse weather conditions. Ensure what’s documented here aligns to those assumptions documented within the Project Logic." + } + }, + { + "template": "projectPartnerships", + "model": { + "helpTextPartnerName":"Insert name of project partner. To be a project partner, they need to be actively involved in the planning or delivery of the project", + "helpTextHeading":"Note: Not limited to key subcontractors." + } + }, + { + "template": "extendedBaselineMonitoring", + "model": { + "approachHeading": "Monitoring method", + "indicatorHeading": "Monitoring methodology", + "baselineDataHelpText": "Existing baseline data needs to be based on best practice methods and be compatible with the EMSA protocols.", + "baselineDataDescriptionHelpText": "Describe the project baseline to be established, or the baseline data that currently exists", + "baselineServiceHelpText": "Select the relevant Project Service(s)/Target measure(s) that will be used to support the development of the baseline", + "monitoringServiceHelpText": "Select the relevant Project Services(s)/Target measure(s) that will be used to support ongoing monitoring", + "baselineMethodHelpText": "EMSA modules mandatory unless exemption agreed to by the Department. Where an exemption has been provided the user can then select \"Other\"", + "approachHelpText": "EMSA modules mandatory unless exemption agreed to by the Department. Where an exemption has been provided the user can then select \"Other\"", + "titleHelpText": "Describe the Project Baseline(s) and ongoing monitoring which will be used to report progress towards this projects outcome(s). Project Services/Target measures selected in this section will be pre-populated into the Project services and targets and Project service forecasts tables", + "newIndicatorText": "New monitoring indicator", + "evidenceHelpText": "List evidence that will be retained to demonstrate delivery of this service. Refer to Evidence Guide and Project Service Summaries for guidance" + } + }, + { + "template": "projectReview", + "model": { + "title": "Project review, improvement and evaluation methodology and approach (3000 character limit [approximately 500 words])" + } + }, + { + "template": "nationalAndRegionalPlans", + "model": { + "includeUrl": true, + "headingTitle": "Conservation and management plans" + } + }, + { + "template": "serviceOutcomeTargets", + "model": { + "title": "Project services and targets", + "serviceName": "Service", + "titleHelpText":"Service and Target measure fields pre-populated through the Project Service/Target Measure/s to address threats field and Monitoring methodology sections" + } + }, + { + "template": "serviceForecasts", + "excludedModes":["PRINT"], + "model": { + "titleHelpText":"Service and Target measure fields pre-populated through the Project Service/Target Measure/s to address threats field and Monitoring methodology sections" + } + + } + ], + keyThreatCodes: [ + 'Climate Change - Changed flooding regime', + 'Climate Change - Changed rainfall patterns', + 'Climate Change - Sea level rises', + 'Climate Change - Unexpected seasonal/temperature extremes', + 'Disease/pathogens - Areas that are infected', + 'Disease/pathogens - Possible infection of disease free areas', + 'Fire - Inappropriate fire regime', + 'Fire - Lack of protection for ecological assets during fire control activities', + 'Genetics - Bottleneck/inbreeding', + 'Habitat loss - Breeding place disturbance', + 'Habitat loss - Dieback/senescence', + 'Habitat loss - Feeding habitat loss/interference', + 'Habitat loss - Habitat fragmentation', + 'Habitat loss - Land clearing', + 'Habitat loss - Loss of critical ecosystem service supporting habitat', + 'Human interference - Fish and harvesting aquatic resources (commercial)', + 'Human interference - Flow-on effects of housing development', + 'Human interference - Illegal activities', + 'Human interference - Industrial development', + 'Human interference - Land use intensification', + 'Human interference - Recreational fishing', + 'Human interference - Recreational pressures', + 'Human interference - Road/vehicle strike', + 'Land management practices - Changes to hydrology and aquatic systems', + 'Land management practices - Domestic grazing/stock impacts', + 'Land management practices - Excess recharge of groundwater', + 'Land management practices - Excess use (or over-use) of surface water or groundwater resources', + 'Land management practices - Excessive fertiliser use', + 'Land management practices - Inappropriate ground cover management', + 'Land management practices - Runoff', + 'Native fauna - Competition', + 'Native fauna - Predation', + 'Pest - Competition/exclusion', + 'Pest - Disease transmission', + 'Pest - Habitat degradation', + 'Pest - Introduction of new pest animals', + 'Pest - Predation', + 'Pollution - Chemical', + 'Pollution - Eutrophication/algal blooms', + 'Pollution - Inappropriate waste disposal', + 'Pollution - Sediment ', + 'Population size/range - Low habitat area', + 'Population size/range - Low population numbers', + 'Weeds - Competition', + 'Weeds - Introduction of new weed', + 'Weeds - Spread of weeds from surrounding areas' + ], + priorityPlaces: [ + "Australian Alps – NSW/ACT/VIC", + "Brigalow Country – QLD", + "Bruny Island – TAS", + "Christmas Island – External Territory", + "Eastern Forests of Far North Queensland – QLD", + "Fitz-Stirlings – WA", + "French Island – VIC", + "Giant Kelp Ecological Community – TAS", + "Greater Blue Mountains – NSW", + "Kakadu & West Arnhem – NT", + "Kangaroo Island – SA", + "MacDonnell Ranges – NT", + "Mallee Birds Ecological Community – VIC/SA/NSW", + "Midlands region of central Tasmanian – TAS", + "Norfolk Island – External Territory", + "Raine Island – Queensland", + "Remnant WA Wheatbelt Woodlands – WA", + "South East Coastal Ranges – NSW/VIC", + "Southern Plains, including the Western Victorian volcanic plain and karst springs – VIC/SA", + "Yampi Sounds and surrounds – WA" + ] + + }; + + +var outcomes = [ + { + "priorities": [ + { + "category": "Right Way Desert Fire Grants Threatened Species Primary" + } + ], + "targeted": true, + "shortDescription": "Right Way Desert Fire Grants Species", + "category": "Threatened Species", + "type": "primary", + "supportsMultiplePrioritiesAsPrimary": true, + "outcome": "1. Species and Landscapes (Long term): Threatened Ecological Communities (TECs) and priority places – The condition of targeted EPBC Act listed Threatened Ecological Communities and identified priority places under the Threatened Species Action Plan 2022-2032 is improved" + }, + { + "priorities": [ + { + "category": "Right Way Desert Fire Grants Threatened Species Secondary" + } + ], + "targeted": true, + "shortDescription": "Right Way Desert Fire Grants Species", + "category": "Threatened Species", + "type": "secondary", + "supportsMultiplePrioritiesAsSecondary": true, + "outcome": "1. Species and Landscapes (Long term): Threatened Species (TS) - The trajectory of species targeted under the Threatened Species Action Plan 2022-2032 and other EPBC Act listed Species is improved" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened species - Targeted threatened species (TS) are on track for improved trajectory" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened species - Species at high risk of imminent extinction are identified and supported to persist" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened species - Priority species are being assisted to strengthen reliance and adaptive capacity for climate change" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened species - Increased leadership and/or participation of First Nations people in the management and recovery of threatened species" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened Ecological Communities and priority places - The implementation of priority actions is leading to an improvement in the condition of targeted TECs and priority places" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened Ecological Communities and priority places - Resilience to climate change and extreme events has been increased" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened Ecological Communities and priority places - Increased leadership and/or participation of First Nations people in the management and recovery of threatened ecological communities and priority places" + }, + { + "category": "World Heritage", + "type": "medium", + "outcome": "2. World Heritage Protection (Medium term): Threats to the outstanding universal value of world heritage properties listed for their natural heritage value have been reduced through the implementation of priority actions" + }, + { + "category": "World Heritage", + "type": "medium", + "outcome": "2. World Heritage Protection (Medium term): Managing Threats - Threats from climate change, extreme events and invasive species have been reduced" + }, + { + "category": "World Heritage", + "type": "medium", + "outcome": "2. World Heritage Protection (Medium term): Managing Threats - Threats from disease have been reduced" + }, + { + "category": "World Heritage", + "type": "medium", + "outcome": "2. World Heritage Protection (Medium term): Managing Threats - Increased leadership and/or participation of First Nations people in the management of threats to World Heritage properties" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "2. World Heritage Protection (Medium term): Improving land management practices and protecting habitat - Threats from inappropriate fire management are reduced" + }, + { + "category": "World Heritage", + "type": "medium", + "outcome": "2. World Heritage Protection (Medium term): Improving land management practices and protecting habitat - Threats from inappropriate management of human impacts, climate change and extreme events are reduced" + }, + { + "category": "World Heritage", + "type": "medium", + "outcome": "2. World Heritage Protection (Medium term): Improving land management practices and protecting habitat - Increased leadership and/or participation of First Nations people in the management and protection of World Heritage properties" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Priority actions at targeted Ramsar sites will reduce threats, restore or maintain ecological character and increase climate change resilience" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Managing Threats - The critical components, processes and services of the wetland actively maintained and/or improved" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Managing Threats - Absence/reduction of non-native species" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Managing Threats - Increased leadership and/or participation of First Nations people in the management of threats to Ramsar sites" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Managing Threats - Adaptive management planning and actions are building resilience to extreme climate events" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Protecting and Improving Habitat - Wetland biota and/or abundance is maintained and improved" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Protecting and Improving Habitat - Hydrological regimes have been restored and maintained" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Protecting and Improving Habitat - Improved condition of wetland vegetation/habitat" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Protecting and Improving Habitat - Quality of breeding, foraging and roosting habitat is improved" + }, + { + "category": "Ramsar", + "type": "medium", + "outcome": "3. Ramsar Wetland Protection (Medium term): Protecting and Improving Habitat - Increased leadership and/or participation of First Nations people in the restoration and/or maintenance of the ecological character of Ramsar sites" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Managing Threats - Pest predator an competitor species have been controlled or are under active, long-term control programs" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Managing Threats - Threats from disease have been contained, reduced or excluded" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Land management practices have improved" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Quality of (TS/TECs) habitat has improved" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Area/Extent of (TS/TECs) habitat has increased" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Increased connectivity between patches" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Quality of breeding and foraging habitat is improved " + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Creating insurance populations - Existing populations have been protected" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Creating insurance populations - Re-introductions have enhanced wild populations" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Climate adaption and resilience - Climate change resilience and adaptive capacity actions underway" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): First Nations People and community involvement - First Nations people are leading and/or participating in recovery activities" + }, + { + "type": "short", + "category": "World Heritage", + "outcome": "2. World Heritage Protection (Short term): Managing threats - Pest predator and competitor species have been controlled" + }, + { + "type": "short", + "category": "World Heritage", + "outcome": "2. World Heritage Protection (Short term): Managing threats -Threats from disease have been contained or reduced" + }, + { + "type": "short", + "category": "World Heritage", + "outcome": "2. World Heritage Protection (Short term): Improving land management practices and protecting habitat - Inappropriate fire regimes have been reduced or halted" + }, + { + "type": "short", + "category": "World Heritage", + "outcome": "2. World Heritage Protection (Short term): Improving land management practices and protecting habitat - Land management practices have improved (within and around heritage properties)" + }, + { + "type": "short", + "category": "World Heritage", + "outcome": "2. World Heritage Protection (Short term): Improving land management practices and protecting habitat - Actions to reduce nutrient levels have been implemented, and nutrient levels are beginning to stabilise/improve " + }, + { + "type": "short", + "category": "World Heritage", + "outcome": "2. World Heritage Protection (Short term): Climate adaption and resilience - Climate change resilience and adaptive capacity actions underway" + }, + { + "type": "short", + "category": "World Heritage", + "outcome": "2. World Heritage Protection (Short term): First Nations People and community involvement - First Nations people are leading and/or participating in management and protection activities" + }, + { + "type": "short", + "category": "Ramsar", + "outcome": "3. Ramsar Wetland Protection (Short term): Managing threats - Inappropriate land management practices have decreased within the catchment" + }, + { + "type": "short", + "category": "Ramsar", + "outcome": "3. Ramsar Wetland Protection (Short term): Managing Threats - Pest predator and competitor species have been controlled " + }, + { + "type": "short", + "category": "Ramsar", + "outcome": "3. Ramsar Wetland Protection (Short term): Managing Threats - Appropriate fire management regimes within and external to site" + }, + { + "type": "short", + "category": "Ramsar", + "outcome": "3. Ramsar Wetland Protection (Short term): Protecting and Improving Habitat - Area and quality of suitable wetland habitat has increased and/or is maintained" + }, + { + "type": "short", + "category": "Ramsar", + "outcome": "3. Ramsar Wetland Protection (Short term): Protecting and Improving Habitat - Water quality has been stabilised and/or improved " + }, + { + "type": "short", + "category": "Ramsar", + "outcome": "3. Ramsar Wetland Protection (Short term): Protecting and Improving Habitat - Improved access control to protect sensitive species and habitats" + }, + { + "type": "short", + "category": "Ramsar", + "outcome": "3. Ramsar Wetland Protection (Short term): Climate adaption and resilience - Climate change resilience and adaptive capacity actions underway to improve and/or maintain the ecological character of Ramsar sites " + }, + { + "type": "short", + "category": "Ramsar", + "outcome": "3. Ramsar Wetland Protection (Short term): First Nations People and community involvement - First Nations people are leading and/or participating in restoration, maintenance and protection activities" + } +]; + +var priorities = [ + { + "category": "Right Way Desert Fire Grants Threatened Species Primary", + "priority": "Greater Bilby (Macrotis lagotis)" + }, + { + "category": "Right Way Desert Fire Grants Threatened Species Primary", + "priority": "Night Parrot (Pezoporus occidentalis)" + }, + { + "category": "Right Way Desert Fire Grants Threatened Species Primary", + "priority": "Princess Parrot (Polytelis alexandrae)" + }, + { + "category": "Right Way Desert Fire Grants Threatened Species Primary", + "priority": "Malleefowl (Leipoa ocellata)" + }, + { + "category": "Right Way Desert Fire Grants Threatened Species Primary", + "priority": "Northern Quoll (Dasyurus hallucatus)" + }, + { + "category": "Right Way Desert Fire Grants Threatened Species Primary", + "priority": "Central Rock-rat, Antina (Zyzomys pedunculatus)" + }, + { + "category": "Right Way Desert Fire Grants Threatened Species Primary", + "priority": "Great Desert Skink, Tjakura, Warrarna, Mulyamiji (Liopholis kintorei)" + }, + { + "category": "Right Way Desert Fire Grants Threatened Species Secondary", + "priority": "The community of native species dependent on natural discharge of groundwater from the Great Artesian Basin" + } +]; + +let parentProgram = "Natural Heritage Trust"; +var subprograms = ["Emerging Priorities Projects - Right Way Desert Fire - Grants"] + +var parent = db.program.find({name: parentProgram}).next(); +subprograms.forEach(function (subProgram){ + var now = ISODate(); + var p = {name: subProgram, programId: UUID.generate(), dateCreated: now, lastUpdate: now, parent: parent._id, status: "active"} + var program = db.program.find({name: subProgram}) + if (!program.hasNext()) { + db.program.insertOne(p); + } else { + print("Program Already Exist: " + subProgram) + } +}); + +subprograms.forEach(function (subprogram){ + var program = db.program.find({name: subprogram}); + while(program.hasNext()){ + var p = program.next(); + print("sub program ID: " + p.programId) + db.program.updateOne({programId:p.programId}, {$set:{config:config, outcomes:outcomes, priorities:priorities}}); + } +}); + + From 387cdaae09dcd4d29fb12c318a18f84676b7be1d Mon Sep 17 00:00:00 2001 From: chrisala Date: Tue, 2 Apr 2024 10:37:39 +1100 Subject: [PATCH 31/95] Fixed read only / comparison meri plan views #2983 --- .../views/project/meriPlanChangesReport.gsp | 15 ++++++++++++++- grails-app/views/project/meriPlanReport.gsp | 16 +++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/grails-app/views/project/meriPlanChangesReport.gsp b/grails-app/views/project/meriPlanChangesReport.gsp index 72828d601..aa8a63d8c 100644 --- a/grails-app/views/project/meriPlanChangesReport.gsp +++ b/grails-app/views/project/meriPlanChangesReport.gsp @@ -11,6 +11,11 @@ serverUrl: "${grailsApplication.config.getProperty('grails.serverURL')}", imageLocation:"${assetPath(src:'/')}", healthCheckUrl:"${createLink(controller:'ajax', action:'keepSessionAlive')}", + bieUrl: "${grailsApplication.config.getProperty('bie.baseURL')}", + searchBieUrl:"${createLink(controller:'species', action:'searchBie')}", + speciesListUrl:"${createLink(controller:'proxy', action:'speciesItemsForList')}", + speciesImageUrl:"${createLink(controller:'species', action:'speciesImage')}", + speciesProfileUrl:"${createLink(controller:'species', action:'speciesProfile')}", returnTo: "${createLink(controller: 'project', action: 'index', id: project.projectId)}" }, here = window.location.href; @@ -51,7 +56,13 @@ var project = ; var changed = ; - var config = []; + var config = { + bieUrl: fcConfig.bieUrl, + searchBieUrl: fcConfig.searchBieUrl, + speciesListUrl: fcConfig.speciesListUrl, + speciesImageUrl: fcConfig.speciesImageUrl, + speciesProfileUrl: fcConfig.speciesProfileUrl + }; var themes = ; config.themes = themes; var services = ; @@ -96,6 +107,8 @@ + + diff --git a/grails-app/views/project/meriPlanReport.gsp b/grails-app/views/project/meriPlanReport.gsp index ce01cacb8..280372a61 100644 --- a/grails-app/views/project/meriPlanReport.gsp +++ b/grails-app/views/project/meriPlanReport.gsp @@ -10,6 +10,11 @@ serverUrl: "${grailsApplication.config.getProperty('grails.serverURL')}", imageLocation:"${assetPath(src:'/')}", healthCheckUrl:"${createLink(controller:'ajax', action:'keepSessionAlive')}", + bieUrl: "${grailsApplication.config.getProperty('bie.baseURL')}", + searchBieUrl:"${createLink(controller:'species', action:'searchBie')}", + speciesListUrl:"${createLink(controller:'proxy', action:'speciesItemsForList')}", + speciesImageUrl:"${createLink(controller:'species', action:'speciesImage')}", + speciesProfileUrl:"${createLink(controller:'species', action:'speciesProfile')}", returnTo: "${createLink(controller: 'project', action: 'index', id: project.projectId)}" }, here = window.location.href; @@ -47,7 +52,13 @@ $(function() { var project = ; - var config = []; + var config = { + bieUrl: fcConfig.bieUrl, + searchBieUrl: fcConfig.searchBieUrl, + speciesListUrl: fcConfig.speciesListUrl, + speciesImageUrl: fcConfig.speciesImageUrl, + speciesProfileUrl: fcConfig.speciesProfileUrl + }; var themes = ; config.themes = themes; var services = ; @@ -61,6 +72,7 @@ config.programActivities = ; config.excludeFinancialYearData = ${config.program?.config?.excludeFinancialYearData ?: false}; config.useServiceOutcomesModel = ${config.program?.config?.meriPlanContents?.find{it.template == 'serviceOutcomeTargets'} != null}; + var viewModel = new ReadOnlyMeriPlan(project, new ProjectService(project, config), config); viewModel.name = project.name; viewModel.description = project.description; @@ -71,6 +83,8 @@ + + From ea978c33156b6a93d62388dfebb6022a7400a27b Mon Sep 17 00:00:00 2001 From: sal153 Date: Wed, 3 Apr 2024 11:00:27 +1100 Subject: [PATCH 32/95] commit updates for comparison view #3133 --- grails-app/taglib/au/org/ala/merit/FCTagLib.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grails-app/taglib/au/org/ala/merit/FCTagLib.groovy b/grails-app/taglib/au/org/ala/merit/FCTagLib.groovy index 58bef8126..14e8706b7 100644 --- a/grails-app/taglib/au/org/ala/merit/FCTagLib.groovy +++ b/grails-app/taglib/au/org/ala/merit/FCTagLib.groovy @@ -984,7 +984,7 @@ class FCTagLib { out << getScoreLabels(resultOrigMonitoringList[property], config, true) } else { if (resultOrigMonitoringList[property] instanceof List) { - out << resultOrigMonitoringList[property].collect{it}.join(',') + out << resultOrigMonitoringList[property].collect{it == 'Other' ? 'Other: ' + resultOrigMonitoringList['data2'] : it}.join(',') } else { out << resultOrigMonitoringList[property] } @@ -999,7 +999,7 @@ class FCTagLib { out << getScoreLabels(resultChangedMonitoringList[property], config, true) } else { if (resultChangedMonitoringList[property] instanceof List) { - out << resultChangedMonitoringList[property].collect{it}.join(',') + out << resultChangedMonitoringList[property].collect{it == 'Other' ? 'Other: ' + resultChangedMonitoringList['data2'] : it}.join(',') } else { out << resultChangedMonitoringList[property] } From d35d8e29c7747e0c86d5c96719293097ceafe1ab Mon Sep 17 00:00:00 2001 From: chrisala Date: Wed, 3 Apr 2024 14:15:17 +1100 Subject: [PATCH 33/95] Fix for population of short term outcome #2983 --- grails-app/assets/javascripts/meriplan.js | 28 +++++++++++++---------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/grails-app/assets/javascripts/meriplan.js b/grails-app/assets/javascripts/meriplan.js index fb52b04c2..f66a22a2a 100644 --- a/grails-app/assets/javascripts/meriplan.js +++ b/grails-app/assets/javascripts/meriplan.js @@ -1867,19 +1867,23 @@ function SingleAssetOutcomeViewModel(o, config) { }; self.speciesAsset = new SpeciesViewModel(o.speciesAsset || {}, options, {}); - self.speciesAsset.name.subscribe(function () { - var scientificName = self.speciesAsset.scientificName(); - var commonName = self.speciesAsset.commonName(); - - var assetName; - if (scientificName && commonName) { - assetName = scientificName + ' (' + commonName + ')'; - } else if (scientificName) { - assetName = scientificName; - } else { - assetName = commonName; + // Need to subscribe to an event that fires after all of the fields of the speciesAsset have been loaded. + self.speciesAsset.transients.textFieldValue.subscribe(function () { + + if (!self.speciesAsset.transients.editing()) { + var scientificName = self.speciesAsset.scientificName(); + var commonName = self.speciesAsset.commonName(); + + var assetName; + if (scientificName && commonName) { + assetName = scientificName + ' (' + commonName + ')'; + } else if (scientificName) { + assetName = scientificName; + } else { + assetName = commonName; + } + self.asset(assetName); } - self.asset(assetName); }); } self.description.subscribe(function () { From 02afe9bf2f78a873f11281284750773d47dbed0b Mon Sep 17 00:00:00 2001 From: chrisala Date: Thu, 4 Apr 2024 11:50:22 +1100 Subject: [PATCH 34/95] Don't clear asset on descripton change #3140 --- grails-app/assets/javascripts/meriplan.js | 6 ------ karma.conf.js | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/grails-app/assets/javascripts/meriplan.js b/grails-app/assets/javascripts/meriplan.js index f66a22a2a..1121b1947 100644 --- a/grails-app/assets/javascripts/meriplan.js +++ b/grails-app/assets/javascripts/meriplan.js @@ -1886,12 +1886,6 @@ function SingleAssetOutcomeViewModel(o, config) { } }); } - self.description.subscribe(function () { - self.assets([]); - if (self.speciesAsset) { - self.speciesAsset.loadData({}); - } - }); self.relatedOutcome = ko.observable(o.relatedOutcome); diff --git a/karma.conf.js b/karma.conf.js index 4bd418b8e..ea5ca1f2f 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -100,7 +100,7 @@ module.exports = function (config) { // start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['Chrome','Firefox','ChromeHeadless'], + browsers: ['ChromeHeadless'], // Continuous Integration mode From aa3928642b7ae800c1b6629cc35d009c7b1ca097 Mon Sep 17 00:00:00 2001 From: sal153 Date: Thu, 4 Apr 2024 12:42:15 +1100 Subject: [PATCH 35/95] commit program script #3141 --- ...limateSmartAgricultureProgramSubProgram.js | 706 ++++++++++++++++++ 1 file changed, 706 insertions(+) create mode 100644 src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js diff --git a/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js b/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js new file mode 100644 index 000000000..fb0418fb5 --- /dev/null +++ b/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js @@ -0,0 +1,706 @@ +load('../../../utils/uuid.js'); +load('../../../utils/audit.js'); +load('../../../utils/program.js'); +var userId = ''; + +const serviceFormName = "NHT Output Report"; +const annualReportFormName = "NHT Annual Report"; +const outcomes1ReportFormName = "NHT Outcomes 1 Report"; +const outcomes2ReportFormName = "NHT Outcomes 2 Report"; + +var config = + { + "excludes": [], + "programServiceConfig": { + "serviceFormName": serviceFormName, + "programServices": [ + { + "serviceTargets": [ + "c3276929-b8a9-4985-a329-49b86f14018c" + ], + "serviceId": 1 + }, + { + "serviceTargets": [ + "69deaaf9-cdc2-439a-b684-4cffdc7f224e" + ], + "serviceId": 2 + }, + { + "serviceTargets": [ + "1f8161bc-908b-4ec8-ab7f-edac973a657d", + "88908921-1248-4a7c-b185-51c625c737e3", + "fe9f1a6c-e614-489a-80fa-4d6d76f1cf95" + ], + "serviceId": 3 + }, + { + "serviceTargets": [ + "aa0c6b29-285e-4344-987e-dfeaf1d95648", + "a9d98baa-b2ab-4428-82cf-d96185e63aa6", + "c4ea5ce3-4a70-4df8-aff7-ffa929e7df61" + ], + "serviceId": 4 + }, + { + "serviceTargets": [ + "55d76c03-c89d-40fe-867b-93f7a48ff9c1", + "3cbf653f-f74c-4066-81d2-e3f78268185c", + "3855d565-3b77-497b-90af-addb271aa598", + "5dbfb32a-5933-4d8a-9937-41f350fb5f75" + ], + "serviceId": 5 + }, + { + "serviceTargets": [ + "22771c0d-8403-433b-b468-e36dc16a1d21", + "675cc878-eb80-435f-a841-d89b657fb2e3", + "dd9f8fd4-b6c7-4f09-bbbf-5d721afc7677", + "6f3cb6ab-5c6a-49be-9af9-9226fa751725" + ], + "serviceId": 7 + }, + { + "serviceTargets": [ + "e0b4cc3e-e94a-4c97-81dc-a4cb868c2cc3", + "b0bcfc54-76fa-4659-accf-276c18b50c31" + ], + "serviceId": 8 + }, + { + "serviceTargets": [ + "9416c9f4-48ca-4bd1-8822-cd45ebb56c58", + "2409e649-2ee2-47fd-9e76-ef2ffa07a5e7", + "d58f8dba-109d-4179-b130-a888cd3d303c", + "01686d38-9165-4497-9648-627ef81945a7" + ], + "serviceId": 9 + }, + { + "serviceTargets": [ + "0e2f8d61-b7b4-4d2d-b07c-4fc20bbe326a", + "bb506258-e907-43d3-99bd-0fe0400f654e" + ], + "serviceId": 10 + }, + { + "serviceTargets": [ + "3c83e639-9c19-4b31-a86f-9d2d5e78123b", + "e901be5e-8336-432e-b164-f278abd7430b" + ], + "serviceId": 12 + }, + { + "serviceTargets": [ + "5557288b-190e-4a3f-a60b-4bdff6ca8fe8", + "902df7a8-92f6-420d-9544-47d4b8cf31ca" + ], + "serviceId": 13 + }, + { + "serviceTargets": [ + "9deb3edf-50c7-4b04-a1fb-d1451eadf641", + "360c8b86-360c-4ca3-b1aa-626be56f2b11" + ], + "serviceId": 14 + }, + { + "serviceTargets": [ + "7c30bc26-829e-4080-8059-27af9285113b", + "158a5544-78e3-4d00-9f1b-62a85a938268" + ], + "serviceId": 15 + }, + { + "serviceTargets": [ + "4aa201ec-2066-40e1-a457-99daa569c8e2", + "f46f096a-a274-426b-adad-702e7cf8fab7", + "3b1403f3-139a-4206-b325-62ebfe05ddc4", + "7cb13c22-3dcd-43e7-808d-e0e26f5c090d" + ], + "serviceId": 16 + }, + { + "serviceTargets": [ + "5c6db4c1-7fde-452e-8735-e52842fe6217", + "41cb1e2c-59bc-4639-8bf7-fe0f528e006e" + ], + "serviceId": 18 + }, + { + "serviceTargets": [ + "4f71e00a-2d80-488d-9ce4-947e60589149", + "69a2ffba-41e9-406e-8ea4-5bdeee92cbde" + ], + "serviceId": 42 + }, + { + "serviceTargets": [ + "26ea592f-ee39-4e6e-b6af-5b53fb1a5675" + ], + "serviceId": 17 + }, + { + "serviceTargets": [ + "3587a984-68f9-4db3-b5af-49f265d853e0", + "9d2d01be-b517-4be2-a225-8b1c887e016e" + ], + "serviceId": 19 + }, + { + "serviceTargets": [ + "d0516817-5acb-46bd-9871-2696c245bad0", + "7fed132d-6a38-448c-b519-381ab9e1e027", + "e08dda14-360c-4b66-b8c5-eb0269c5aa44", + "f3671aa7-773f-447d-9649-ba7f11dbe97a" + ], + "serviceId": 20 + }, + { + "serviceTargets": [ + "5ab2b539-a5b4-40da-a556-a2c18066345b", + "36410625-05f3-42d3-b04f-a3b268498ee1" + ], + "serviceId": 23 + }, + { + "serviceTargets": [ + "0162246b-13fd-40c9-ae26-fb767eee76f8" + ], + "serviceId": 24 + }, + { + "serviceTargets": [ + "b9e710e4-7dd3-4acc-ac2c-c69f4bcb9787", + "00934509-f102-4d39-a043-7547a8ab9ac8", + "1021bec7-3836-4b33-90b4-76701efd4fe3", + "4dad393e-cbf7-43dd-87bb-62ea8f8afcdd" + ], + "serviceId": 26 + }, + { + "serviceTargets": [ + "a516c78d-740f-463b-a1ce-5b02b8c82dd3", + "4cbcb2b5-45cd-42dc-96bf-a9a181a4865b", + "fbc45154-1d60-4f5e-a484-fdff514f9d51", + "85191c99-f56d-46e6-9311-a58c1f37965d" + ], + "serviceId": 27 + }, + { + "serviceTargets": [ + "3cfa82aa-0b38-49c0-be37-0fa61b5b6e3c", + "91e90861-3ba7-4257-a765-6cab24c6f58a" + ], + "serviceId": 28 + }, + { + "serviceTargets": [ + "96be68cf-783d-452a-b8fd-3832163f95db", + "e70c70fd-4f31-41dc-a4b4-07f79efc3055" + ], + "serviceId": 29 + }, + { + "serviceTargets": [ + "598bd978-0907-4cad-a7a6-ec5a8a8bbdc4", + "d29bd931-1dd1-47c4-b456-c175099ff1df" + ], + "serviceId": 30 + }, + { + "serviceTargets": [ + "6db1ebd7-92c5-49f2-98b7-2faa700fd752", + "524d93b4-5cd1-4d0d-b1f8-d393028220ad" + ], + "serviceId": 31 + }, + { + "serviceTargets": [ + "8040931a-2e6c-41be-9e92-f1035093b2ac", + "5d652e6e-b719-45bf-8ae6-e9f293c24a92" + ], + "serviceId": 32 + }, + { + "serviceTargets": [ + "f74182bd-7a53-4157-aeb9-eda281bb0234", + "e7b7bb1e-66c2-4140-90f9-9534aa46ffa3" + ], + "serviceId": 33 + }, + { + "serviceTargets": [ + "15615a70-ee60-46b8-b5e9-b33d4d88de6b", + "d8dc153b-da23-4f7b-947a-89bc98338d6d", + "5f762c6d-4f42-4458-9855-03c6896959c1", + "5885f105-fc7d-43fd-8c26-c72938a95b76" + ], + "serviceId": 34 + }, + { + "serviceTargets": [ + "dea1ff8b-f4eb-4987-8073-500bbbf97fcd", + "fba17df1-d5cb-4643-987f-0626055b3c78" + ], + "serviceId": 35 + }, + { + "serviceTargets": [ + "3ec07754-4a7a-46fb-a76d-553921781716", + "fbc2dab8-7454-40f9-94f6-6bf258fcefff", + "7186e284-0cb2-418e-a8cc-4343eb618140" + ], + "serviceId": 36 + }, + { + "serviceTargets": [ + "3d06b150-bb86-47dc-8ad8-c33a51c3e3b3" + ], + "serviceId": 43 + }, + { + "serviceTargets": [ + "b8304577-afd8-45e0-8ef4-b71ae10998f5" + ], + "serviceId": 44 + } + ] + + }, + "visibility": "private", + "declarationPageType": "rdpReportDeclaration", + "requiresActivityLocking": true, + "supportsMeriPlanComparison": true, + "projectTemplate": "rlp", + "activityPeriodDescriptor": "Outputs report #", + "supportsParatoo": true, + "emailTemplates": { + "reportSubmittedEmailTemplate": "RLP_REPORT_SUBMITTED_EMAIL_TEMPLATE", + "reportReturnedEmailTemplate": "RLP_REPORT_RETURNED_EMAIL_TEMPLATE", + "planApprovedEmailTemplate": "RLP_PLAN_APPROVED_EMAIL_TEMPLATE", + "planReturnedEmailTemplate": "RLP_PLAN_RETURNED_EMAIL_TEMPLATE", + "reportApprovedEmailTemplate": "RLP_REPORT_APPROVED_EMAIL_TEMPLATE", + "planSubmittedEmailTemplate": "RLP_PLAN_SUBMITTED_EMAIL_TEMPLATE" + }, + "meriPlanTemplate": "configurableMeriPlan", + "riskAndThreatTypes": [ + "Performance", + "Work Health and Safety", + "People resources", + "Financial", + "External stakeholders", + "Natural Environment" + ], + "projectReports": [ + { + "reportType": "Activity", + "reportsAlignedToCalendar": true, + "reportDescriptionFormat": "Year %5$s - %6$s %7$d Outputs Report", + "reportNameFormat": "Year %5$s - %6$s %7$d Outputs Report", + "reportingPeriodInMonths": 3, + "description": "", + "category": "Outputs Reporting", + "activityType": serviceFormName, + "canSubmitDuringReportingPeriod": true, + "label": "Quarter", + "minimumReportDurationInDays": 1 + + }, + { + "firstReportingPeriodEnd": "2024-06-30T14:00:00Z", + "reportType": "Administrative", + "reportDescriptionFormat": "Annual Progress Report %2$tY - %3$tY for %4$s", + "reportNameFormat": "Annual Progress Report %2$tY - %3$tY", + "reportingPeriodInMonths": 12, + "category": "Annual Progress Reporting", + "activityType": annualReportFormName, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "label": "Annual", + "minimumReportDurationInDays": 1 + }, + { + "reportType": "Single", + "reportDescriptionFormat": "Outcomes Report 1 for %4$s", + "minimumOwnerDurationInMonths": null, + "reportNameFormat": "Outcomes Report 1", + "reportingPeriodInMonths": 36, + "alignToOwnerStart":true, + "alignToOwnerEnd":true, + "multiple": false, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "maximumOwnerDurationInMonths": 35, + "category": "Outcomes Report 1", + "reportsAlignedToCalendar": false, + "activityType": outcomes1ReportFormName, + "label":"Outcomes Report 1" + }, + { + "reportType": "Single", + "reportDescriptionFormat": "Outcomes Report 1 for %4$s", + "minimumOwnerDurationInMonths": 36, + "maximumOwnerDurationInMonths": 47, + "reportNameFormat": "Outcomes Report 1", + "reportingPeriodInMonths": 24, + "multiple": false, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "category": "Outcomes Report 1", + "activityType": outcomes1ReportFormName, + "label": "Outcomes Report 1" + }, + { + "reportType": "Single", + "reportDescriptionFormat": "Outcomes Report 1 for %4$s", + "reportNameFormat": "Outcomes Report 1", + "reportingPeriodInMonths": 36, + "multiple": false, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "minimumOwnerDurationInMonths": 48, + "calendarAlignmentMonth": 7, + "category": "Outcomes Report", + "reportsAlignedToCalendar": true, + "activityType": outcomes1ReportFormName, + "label": "Outcomes Report 1" + }, + { + "reportType": "Single", + "reportDescriptionFormat": "Outcomes Report 2 for %4$s", + "minimumOwnerDurationInMonths": 36, + "reportNameFormat": "Outcomes Report 2", + "alignToOwnerStart":true, + "alignToOwnerEnd":true, + "multiple": false, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "category": "Outcomes Report 2", + "activityType": outcomes2ReportFormName, + "label": "Outcomes Report 2" + } + ], + "navigationMode": "returnToProject", + "supportsMeriPlanHistory": true, + "requireMeritAdminToReturnMeriPlan":true, + "meriPlanContents": [ + { + "template": "name", + "model": { + "tableFormatting": true + } + }, + { + "template": "priorityPlace", + "model": { + "priorityPlaceLabel":"Does this project directly support a priority place?", + "priorityPlaceHelpText":"Priority places recognises that some threatened species share the same habitat, and that place-based action can support protection and recovery of more than one species." + } + }, + { + "template": "indigenousInvolvement" + }, + { + "template": "description", + "model": { + "tableFormatting": true, + "maxSize": "1000", + "placeholder": "Please provide a short description of this project. This project description will be visible on the project overview page in MERIT [Free text; limit response to 1000 characters (approx. 150 words)]" + } + }, + { + "template": "programOutcome", + "model": { + "maximumPriorities": "1000", + "priorityHelpText": "Enter the primary investment priority for the primary outcome, noting only one can be selected." + } + }, + { + "template": "additionalOutcomes", + "model": { + "title": "Additional benefits", + "helpTextHeading":"If the project is not delivering additional benefits, delete the row using the 'x' in the right-most column.", + "outcomePriority":"Additional outcome/s", + "priority":"Additional Investment Priorities", + "priorityHelpText":"Other investment priorities that will benefit from the project. Delete the row if there are no additional outcomes." + } + }, + { + "template": "outcomeStatements", + "model": { + "outcomeType": "mid", + "subtitle": "Medium-term outcome statement/s", + "title": "Project Outcomes", + "extendedOutcomes": true, + "helpText":"Projects more than 3 years in duration must set medium-term Project outcomes achievable at project completion. Ensure proposed outcomes are measurable with consideration to the baseline and proposed monitoring regime", + "minimumNumberOfOutcomes": 0 + } + }, + { + "template": "outcomeStatements", + "model": { + "outcomeType": "short", + "helpText": "Outline the degree of impact having undertaken the services for up to three years. Ensure the outcomes are measurable with consideration to the baseline and proposed monitoring regime", + "subtitle": "Short-term outcome statement/s", + "extendedOutcomes": true + } + }, + { + "template": "extendedKeyThreats", + "model": { + "title":"Key threat(s) and/or key threatening processes", + "threatHelpText":"Describe the key threats or key threatening processes to the investment priority", + "evidenceHelpText": "List evidence that will be retained to demonstrate delivery of this service. Refer to Evidence Guide and Project Service Summaries for guidance", + "interventionHelpText":"Describe the proposed method to address the threat or threatening process", + "servicesHelpText": "Project Services/Target measures selected in this section will be pre-populated into the Project services and targets and Project service forecasts tables" + } + }, + { + "template": "projectMethodology", + "model": { + "maxSize": "4000", + "tableHeading": "Project delivery assumptions (4000 character limit [approx. 650 words])", + "helpText": "Include all those conditions or factors that are sufficient to guarantee the success of the project, for example, on ground activities were not impacted by adverse weather conditions. Ensure what’s documented here aligns to those assumptions documented within the Project Logic." + } + }, + { + "template": "projectPartnerships", + "model": { + "helpTextPartnerName":"Insert name of project partner. To be a project partner, they need to be actively involved in the planning or delivery of the project", + "helpTextHeading":"Note: Not limited to key subcontractors." + } + }, + { + "template": "extendedBaselineMonitoring", + "model": { + "approachHeading": "Monitoring method", + "indicatorHeading": "Monitoring methodology", + "baselineDataHelpText": "Existing baseline data needs to be based on best practice methods and be compatible with the EMSA protocols.", + "baselineDataDescriptionHelpText": "Describe the project baseline to be established, or the baseline data that currently exists", + "baselineServiceHelpText": "Select the relevant Project Service(s)/Target measure(s) that will be used to support the development of the baseline", + "monitoringServiceHelpText": "Select the relevant Project Services(s)/Target measure(s) that will be used to support ongoing monitoring", + "baselineMethodHelpText": "EMSA modules mandatory unless exemption agreed to by the Department. Where an exemption has been provided the user can then select \"Other\"", + "approachHelpText": "EMSA modules mandatory unless exemption agreed to by the Department. Where an exemption has been provided the user can then select \"Other\"", + "titleHelpText": "Describe the Project Baseline(s) and ongoing monitoring which will be used to report progress towards this projects outcome(s). Project Services/Target measures selected in this section will be pre-populated into the Project services and targets and Project service forecasts tables", + "newIndicatorText": "New monitoring indicator", + "evidenceHelpText": "List evidence that will be retained to demonstrate delivery of this service. Refer to Evidence Guide and Project Service Summaries for guidance" + } + }, + { + "template": "projectReview", + "model": { + "title": "Project review, improvement and evaluation methodology and approach (3000 character limit [approximately 500 words])" + } + }, + { + "template": "nationalAndRegionalPlans", + "model": { + "includeUrl": true, + "headingTitle": "Conservation and management plans" + } + }, + { + "template": "serviceOutcomeTargets", + "model": { + "title": "Project services and targets", + "serviceName": "Service", + "titleHelpText":"Service and Target measure fields pre-populated through the Project Service/Target Measure/s to address threats field and Monitoring methodology sections" + } + }, + { + "template": "serviceForecasts", + "excludedModes":["PRINT"], + "model": { + "titleHelpText":"Service and Target measure fields pre-populated through the Project Service/Target Measure/s to address threats field and Monitoring methodology sections" + } + + } + ], + keyThreatCodes: [ + 'Climate Change - Changed flooding regime', + 'Climate Change - Changed rainfall patterns', + 'Climate Change - Sea level rises', + 'Climate Change - Unexpected seasonal/temperature extremes', + 'Disease/pathogens - Areas that are infected', + 'Disease/pathogens - Possible infection of disease free areas', + 'Fire - Inappropriate fire regime', + 'Fire - Lack of protection for ecological assets during fire control activities', + 'Genetics - Bottleneck/inbreeding', + 'Habitat loss - Breeding place disturbance', + 'Habitat loss - Dieback/senescence', + 'Habitat loss - Feeding habitat loss/interference', + 'Habitat loss - Habitat fragmentation', + 'Habitat loss - Land clearing', + 'Habitat loss - Loss of critical ecosystem service supporting habitat', + 'Human interference - Fish and harvesting aquatic resources (commercial)', + 'Human interference - Flow-on effects of housing development', + 'Human interference - Illegal activities', + 'Human interference - Industrial development', + 'Human interference - Land use intensification', + 'Human interference - Recreational fishing', + 'Human interference - Recreational pressures', + 'Human interference - Road/vehicle strike', + 'Land management practices - Changes to hydrology and aquatic systems', + 'Land management practices - Domestic grazing/stock impacts', + 'Land management practices - Excess recharge of groundwater', + 'Land management practices - Excess use (or over-use) of surface water or groundwater resources', + 'Land management practices - Excessive fertiliser use', + 'Land management practices - Inappropriate ground cover management', + 'Land management practices - Runoff', + 'Native fauna - Competition', + 'Native fauna - Predation', + 'Pest - Competition/exclusion', + 'Pest - Disease transmission', + 'Pest - Habitat degradation', + 'Pest - Introduction of new pest animals', + 'Pest - Predation', + 'Pollution - Chemical', + 'Pollution - Eutrophication/algal blooms', + 'Pollution - Inappropriate waste disposal', + 'Pollution - Sediment ', + 'Population size/range - Low habitat area', + 'Population size/range - Low population numbers', + 'Weeds - Competition', + 'Weeds - Introduction of new weed', + 'Weeds - Spread of weeds from surrounding areas' + ], + priorityPlaces: [ + "Australian Alps – NSW/ACT/VIC", + "Brigalow Country – QLD", + "Bruny Island – TAS", + "Christmas Island – External Territory", + "Eastern Forests of Far North Queensland – QLD", + "Fitz-Stirlings – WA", + "French Island – VIC", + "Giant Kelp Ecological Community – TAS", + "Greater Blue Mountains – NSW", + "Kakadu & West Arnhem – NT", + "Kangaroo Island – SA", + "MacDonnell Ranges – NT", + "Mallee Birds Ecological Community – VIC/SA/NSW", + "Midlands region of central Tasmanian – TAS", + "Norfolk Island – External Territory", + "Raine Island – Queensland", + "Remnant WA Wheatbelt Woodlands – WA", + "South East Coastal Ranges – NSW/VIC", + "Southern Plains, including the Western Victorian volcanic plain and karst springs – VIC/SA", + "Yampi Sounds and surrounds – WA" + ] + + }; + + +var outcomes = [ + { + "priorities": [ + { + "category": "Climate change adaptation" + } + ], + "targeted": true, + "shortDescription": "Climate change adaptation", + "category": "Threatened Species", + "outcome": "1. The agriculture sector is adopting practices to reduce emissions and build resilience to climate change" + }, + { + "priorities": [ + { + "category": "Carbon and biodiversity market information" + } + ], + "targeted": true, + "shortDescription": "Carbon and biodiversity market information", + "category": "Threatened Species", + "outcome": "2. The agriculture sector is supported to harness carbon and biodiversity incentives and implement industry sustainability frameworks" + }, + { + "priorities": [ + { + "category": "Native vegetation and biodiversity on-farm" + } + ], + "targeted": true, + "shortDescription": "Native vegetation and biodiversity on-farm", + "category": "Threatened Species", + "outcome": "3. Farmers are supported to drive agricultural growth, while adopting sustainable natural resource management practices that protect and conserve natural capital and biodiversity" + }, + + + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. The agriculture sector is adopting practices to reduce emissions and build resilience to climate change (Medium term)" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. The agriculture sector is supported to harness carbon and biodiversity incentives and implement industry sustainability frameworks (Medium term)" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Farmers are supported to drive agricultural growth, while adopting sustainable natural resource management practices that protect and conserve natural capital and biodiversity (Medium term)" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. The agriculture sector is adopting practices to reduce emissions and build resilience to climate change (Short term)" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. The agriculture sector is supported to harness carbon and biodiversity incentives and implement industry sustainability frameworks (Short term)" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Farmers are supported to drive agricultural growth, while adopting sustainable natural resource management practices that protect and conserve natural capital and biodiversity (Short term)" + } +]; + +var priorities = [ + { + "category": "Climate change adaptation", + "priority": "On-farm emissions reduction practices" + }, + { + "category": "Carbon and biodiversity market information", + "priority": "Sustainability framework engagement" + }, + { + "category": "Carbon and biodiversity market information", + "priority": "Market access and traceability" + }, + { + "category": "Native vegetation and biodiversity on-farm", + "priority": "Soil carbon" + }, + { + "category": "Native vegetation and biodiversity on-farm", + "priority": "Soil erosion" + }, + { + "category": "Native vegetation and biodiversity on-farm", + "priority": "Soil acidification" + }, + { + "category": "Native vegetation and biodiversity on-farm", + "priority": "Sustainable agriculture practices" + } +]; + +//Create the parent program +let programName = "Natural Heritage Trust"; +var parent = createOrFindProgram(programName); +var subprograms = ["Climate-Smart Agriculture Program - Regional Landscape Priority Projects"] + +subprograms.forEach(function (subProgram){ + createOrFindProgram(subProgram, parent._id); +}); + +subprograms.forEach(function (subprogram){ + var program = db.program.find({name: subprogram}); + while(program.hasNext()){ + var p = program.next(); + print("sub program ID: " + p.programId) + db.program.updateOne({programId:p.programId}, {$set:{config:config, outcomes:outcomes, priorities:priorities}}); + useNhtServiceLabels(p.name); + } +}); + From d5f826f3e828e4e4966a942519695acf429ac1a1 Mon Sep 17 00:00:00 2001 From: chrisala Date: Thu, 4 Apr 2024 13:16:05 +1100 Subject: [PATCH 36/95] Only allow barcodes when EMSA modules selected #3126 --- .../au/org/ala/merit/ProjectController.groovy | 3 ++- .../services/au/org/ala/merit/ProjectService.groovy | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index 3ef8c4e6c..136208d07 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -203,7 +203,7 @@ class ProjectController { site : [label: 'Sites', visible: config.includesContent(ProgramConfig.ProjectContent.SITES), disabled: !user?.hasViewAccess, editable:user?.isEditor, type: 'tab', template:'projectSites'], dashboard : [label: 'Dashboard', visible: config.includesContent(ProgramConfig.ProjectContent.DASHBOARD), disabled: !user?.hasViewAccess, type: 'tab'], datasets : [label: 'Data set summary', visible: datasetsVisible, template: '/project/dataset/dataSets', type:'tab'], - admin : [label: 'Admin', visible: adminTabVisible, user:user, type: 'tab', template:'projectAdmin', project:project, canChangeProjectDates: canChangeProjectDates, minimumProjectEndDate:minimumProjectEndDate, showMERIActivityWarning:true, showAnnouncementsTab: showAnnouncementsTab, showSpecies:true, meriPlanTemplate:MERI_PLAN_TEMPLATE, showMeriPlanHistory:showMeriPlanHistory, requireMeriPlanApprovalReason:Boolean.valueOf(config.supportsMeriPlanHistory), config:config, activityPeriodDescriptor:config.activityPeriodDescriptor ?: 'Stage', canRegenerateReports: canRegenerateReports, canModifyMeriPlan: canModifyMeriPlan, showRequestLabels:config.supportsParatoo]] + admin : [label: 'Admin', visible: adminTabVisible, user:user, type: 'tab', template:'projectAdmin', project:project, canChangeProjectDates: canChangeProjectDates, minimumProjectEndDate:minimumProjectEndDate, showMERIActivityWarning:true, showAnnouncementsTab: showAnnouncementsTab, showSpecies:true, meriPlanTemplate:MERI_PLAN_TEMPLATE, showMeriPlanHistory:showMeriPlanHistory, requireMeriPlanApprovalReason:Boolean.valueOf(config.supportsMeriPlanHistory), config:config, activityPeriodDescriptor:config.activityPeriodDescriptor ?: 'Stage', canRegenerateReports: canRegenerateReports, canModifyMeriPlan: canModifyMeriPlan]] if (template == MERI_ONLY_TEMPLATE) { model = [details:model.details] @@ -255,6 +255,7 @@ class ProjectController { rlpModel.admin.showAnnouncementsTab = false rlpModel.admin.risksAndThreatsVisible = risksAndThreatsVisible rlpModel.admin.showMeriPlanComparison = showMeriPlanComparison + rlpModel.admin.showRequestLabels = config.supportsParatoo && projectService.hasSelectedEmsaModules(project) model = buildRLPTargetsModel(rlpModel, project) } diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index ae3298a6a..f24084d96 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -31,6 +31,8 @@ class ProjectService { static final String APPLICATION_STATUS = 'Application' static final String ACTIVE = 'active' + static final String OTHER_EMSA_MODULE = 'Other' + static dateWithTime = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss") static dateWithTimeFormat2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss") static convertTo = new SimpleDateFormat("dd MMM yyyy") @@ -2069,6 +2071,17 @@ class ProjectService { outcomes.findAll{it}.unique() } + List getSelectedEmsaModules(Map project) { + List baselineProtocols = project.custom?.details?.baseline?.rows?.collect{it.protocols}?.flatten() ?:[] + List monitoringProtocols = project.custom?.details?.monitoring?.rows?.collect{it.protocols}?.flatten() ?:[] + + (baselineProtocols + monitoringProtocols).unique().findAll{it} + } + + boolean hasSelectedEmsaModules(Map project) { + getSelectedEmsaModules(project).findAll{it != OTHER_EMSA_MODULE}.size() > 0 + } + @Cacheable("programList") List getProgramList() { List programs = programService.listOfAllPrograms() From 1394c3cc1bac5ce14c8db29f90b5a5b1b140e623 Mon Sep 17 00:00:00 2001 From: chrisala Date: Thu, 4 Apr 2024 13:51:15 +1100 Subject: [PATCH 37/95] Implement requested changes to funding verification UI #3126 --- grails-app/assets/javascripts/projects.js | 7 +++++++ grails-app/views/project/_editProject.gsp | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/grails-app/assets/javascripts/projects.js b/grails-app/assets/javascripts/projects.js index 3f5bb1e83..03ddb4e02 100644 --- a/grails-app/assets/javascripts/projects.js +++ b/grails-app/assets/javascripts/projects.js @@ -132,6 +132,13 @@ function ProjectViewModel(project, isUserEditor, organisations) { self.plannedEndDate = ko.observable(project.plannedEndDate).extend({simpleDate: false}); self.funding = ko.observable(project.funding).extend({currency:{}}); self.fundingVerificationDate = ko.observable(project.fundingVerificationDate).extend({simpleDate: false}); + self.verifyFunding = function() { + self.fundingVerificationDate.date(new Date()); + }; + self.funding.subscribe(function() { + self.verifyFunding(); + }); + self.regenerateProjectTimeline = ko.observable(false); self.projectDatesChanged = ko.computed(function() { return project.plannedStartDate != self.plannedStartDate() || diff --git a/grails-app/views/project/_editProject.gsp b/grails-app/views/project/_editProject.gsp index 993dc63f0..619ea7e48 100644 --- a/grails-app/views/project/_editProject.gsp +++ b/grails-app/views/project/_editProject.gsp @@ -108,7 +108,8 @@
    - + +
    From 19bee5c5fe4482b0bef3d7526eeffdce11d10820 Mon Sep 17 00:00:00 2001 From: temi Date: Thu, 4 Apr 2024 15:07:36 +1100 Subject: [PATCH 38/95] #3049 - modified nhtOutputReport.json to prepop species records - added code to support species prepop - modified Paratoo Config --- build.gradle | 2 +- forms/nht/nhtOutputReport.json | 448 ++++++++++++++---- .../au/org/ala/merit/ProjectController.groovy | 5 + .../au/org/ala/merit/ProjectService.groovy | 7 + .../3.1/insertParatooProtocolConfig.js | 343 ++++++++++---- 5 files changed, 618 insertions(+), 187 deletions(-) diff --git a/build.gradle b/build.gradle index b039b7c2e..0616d595c 100644 --- a/build.gradle +++ b/build.gradle @@ -186,7 +186,7 @@ dependencies { providedCompile "io.methvin:directory-watcher:0.4.0" if (!Boolean.valueOf(inplace)) { - implementation "org.grails.plugins:ecodata-client-plugin:6.2" + implementation "org.grails.plugins:ecodata-client-plugin:6.3-SPECIES-SNAPSHOT" } } diff --git a/forms/nht/nhtOutputReport.json b/forms/nht/nhtOutputReport.json index d8622d0c2..d53a0c9a8 100644 --- a/forms/nht/nhtOutputReport.json +++ b/forms/nht/nhtOutputReport.json @@ -370,7 +370,8 @@ "expression": "formatDateForValidation(meetingDateFrom)", "type": "computed" } - }] + } + ] }, { "dataType": "text", @@ -1007,7 +1008,6 @@ } ] }, - { "dataType": "feature", "name": "areaOfReleaseSite", @@ -1072,7 +1072,6 @@ } ] }, - { "columns": [ { @@ -4033,7 +4032,6 @@ "source": "accessControlDetails", "type": "table" } - ] }, { @@ -4476,7 +4474,6 @@ } ] }, - { "dataType": "number", "name": "totalAreaPestAnimalsTreatedFollowUp", @@ -6061,7 +6058,6 @@ } ] }, - { "type": "row", "items": [ @@ -7118,7 +7114,6 @@ } ] }, - { "columns": [ { @@ -7185,70 +7180,68 @@ } ] }, - + { + "type": "row", + "items": [ { - "type": "row", - "items": [ - { - "preLabel": "Optionally attach photos", - "source": "photographicEvidence", - "type": "image" - } - ] - }, + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + }, + { + "type": "row", + "items": [ { - "type": "row", - "items": [ - { - "preLabel": "Clarification, if needed", - "type": "textarea", - "rows": 4, - "css": "span8", - "source": "comments", - "placeholder": "Clarification comments include information for your project manager about the service like:\n • any reported items that are not being invoiced (eg, over-achievement) \n • any extraneous circumstances that affected delivery of the service \n" - } - ] - }, + "preLabel": "Clarification, if needed", + "type": "textarea", + "rows": 4, + "css": "span8", + "source": "comments", + "placeholder": "Clarification comments include information for your project manager about the service like:\n • any reported items that are not being invoiced (eg, over-achievement) \n • any extraneous circumstances that affected delivery of the service \n" + } + ] + }, + { + "type": "row", + "items": [ { - "type": "row", - "items": [ - { - "type": "literal", - "source": "

    Available Evidence

    This field is mandatory for all projects as part of the invoicing process. Please list evidence you have retained for this service and provide information to where the evidence is stored (links/file location data). Refer to the Project Service Evidence Guide and the Project Service Summaries for information on the evidence requirements.*" - }, - { - "preLabel": "Data have been uploaded", - "source": "dataUploaded", - "type": "boolean" - } - ] + "type": "literal", + "source": "

    Available Evidence

    This field is mandatory for all projects as part of the invoicing process. Please list evidence you have retained for this service and provide information to where the evidence is stored (links/file location data). Refer to the Project Service Evidence Guide and the Project Service Summaries for information on the evidence requirements.*" }, { - "type": "row", - "items": [ - { - "preLabel": "", - "source": "projectAssuranceDetails", - "type": "textarea", - "rows": 4, - "placeholder": "List the documentary evidence you have available for this project service. Include specifically, the document titles and location (e.g. internal IT network pathway, URLs) to assist with locating this material for future audits/assurance purposes." - } - ] - }, + "preLabel": "Data have been uploaded", + "source": "dataUploaded", + "type": "boolean" + } + ] + }, + { + "type": "row", + "items": [ { - "type": "table", - "source": "assuranceDocuments", - "userAddedRows": true, - "disableTableUpload": true, - "columns": [ - { - "title": "Attached documents", - "source": "attachments", - "type": "document" - } - ] + "preLabel": "", + "source": "projectAssuranceDetails", + "type": "textarea", + "rows": 4, + "placeholder": "List the documentary evidence you have available for this project service. Include specifically, the document titles and location (e.g. internal IT network pathway, URLs) to assist with locating this material for future audits/assurance purposes." } - + ] + }, + { + "type": "table", + "source": "assuranceDocuments", + "userAddedRows": true, + "disableTableUpload": true, + "columns": [ + { + "title": "Attached documents", + "source": "attachments", + "type": "document" + } + ] + } ] }, "modelName": null, @@ -8581,7 +8574,7 @@ "dataType": "list", "name": "agreementsTable" } - ], + ], "dataType": "list", "name": "conservationAgreementsControlled" }, @@ -9352,18 +9345,62 @@ } ] }, - "target": { + "target": { "type": "singleValue", "name": "sitesTreated" } } + }, + { + "type": "pre_populate", + "config": { + "waitForInitialisation": true, + "source": { + "url": "/project/getSpeciesRecordsFromActivity", + "params": [ + { + "expression": "owner.projectId", + "name": "id", + "type": "computed" + }, + { + "expression": "x=find(owner.custom.dataSets, \"dataSetId\", dataSetId); x.activityId", + "name": "activityId", + "type": "computed", + "required": true + } + ] + }, + "mapping": [ + { + "source-path": "name", + "target": "species" + }, + { + "source-path": "threatenedEcologicalCommunity", + "target": "threatenedEcologicalCommunity" + }, + { + "source-path": "individualsOrGroups", + "target": "individualsOrGroups" + }, + { + "source-path": "individualCount", + "target": "numberOfIndividualsOrGroups" + } + ], + "target": { + "type": "singleLoad", + "name": "farmManagementSurveySpeciesTable" + } + } } ] }, { "columns": [ { - "dataType": "species", + "dataType": "text", "name": "species", "validate": "required" }, @@ -10005,7 +10042,6 @@ } ] }, - { "type": "col", "css": "span3 col-border-right", @@ -10337,13 +10373,53 @@ "name": "sitesCoveredForFaunaSurvey" } } + }, + { + "type": "pre_populate", + "config": { + "waitForInitialisation": true, + "source": { + "url": "/project/getSpeciesRecordsFromActivity", + "params": [ + { + "expression": "owner.projectId", + "name": "id", + "type": "computed" + }, + { + "expression": "x=find(owner.custom.dataSets, \"dataSetId\", dataSetId); x.activityId", + "name": "activityId", + "type": "computed", + "required": true + } + ] + }, + "mapping": [ + { + "source-path": "name", + "target": "species" + }, + { + "source-path": "individualsOrGroups", + "target": "individualsOrGroups" + }, + { + "source-path": "individualCount", + "target": "numberOfIndividualsOrGroups" + } + ], + "target": { + "type": "singleLoad", + "name": "faunaSurveySpeciesTable" + } + } } ] }, { "columns": [ { - "dataType": "species", + "dataType": "text", "name": "species", "validate": "required" }, @@ -12657,6 +12733,50 @@ } }, "behaviour": [ + { + "type": "pre_populate", + "config": { + "waitForInitialisation": true, + "source": { + "url": "/project/getSpeciesRecordsFromActivity", + "params": [ + { + "expression": "owner.projectId", + "name": "id", + "type": "computed" + }, + { + "expression": "x=find(owner.custom.dataSets, \"dataSetId\", dataSetId); x.activityId", + "name": "activityId", + "type": "computed", + "required": true + } + ] + }, + "mapping": [ + { + "source-path": "name", + "target": "species" + }, + { + "source-path": "threatenedEcologicalCommunity", + "target": "threatenedEcologicalCommunity" + }, + { + "source-path": "individualsOrGroups", + "target": "individualsOrGroups" + }, + { + "source-path": "individualCount", + "target": "numberOfIndividualsOrGroups" + } + ], + "target": { + "type": "singleLoad", + "name": "floraSurveySpeciesTable" + } + } + }, { "type": "pre_populate", "config": { @@ -12672,7 +12792,7 @@ } ] }, - "target": { + "target": { "type": "singleValue", "name": "sitesCoveredForFloraSurvey" } @@ -12683,7 +12803,7 @@ { "columns": [ { - "dataType": "species", + "dataType": "text", "name": "species", "validate": "required" }, @@ -12784,8 +12904,6 @@ "dataType": "feature", "name": "sitesCoveredForFloraSurvey", "description": "Mapping field to be done and Area (ha)/length (km) field be auto-calculated from mapping." - - }, { "computed": { @@ -13607,7 +13725,7 @@ "width": "40%", "source": "species", "title": "Target species recorded", - "type": "speciesSelect" + "type": "text" }, { "width": "35%", @@ -14812,7 +14930,7 @@ } ] }, - "target": { + "target": { "type": "singleValue", "name": "sitesCoveredForHabitatConditionSurvey" } @@ -16152,7 +16270,6 @@ "description": "", "validate": "required,maxSize[300]" }, - { "dataType": "feature", "name": "sitesIdentified", @@ -20632,18 +20749,58 @@ } ] }, - "target": { + "target": { "type": "singleValue", "name": "sitesCoveredForPestAnimal" } } + }, + { + "type": "pre_populate", + "config": { + "waitForInitialisation": true, + "source": { + "url": "/project/getSpeciesRecordsFromActivity", + "params": [ + { + "expression": "owner.projectId", + "name": "id", + "type": "computed" + }, + { + "expression": "x=find(owner.custom.dataSets, \"dataSetId\", dataSetId); x.activityId", + "name": "activityId", + "type": "computed", + "required": true + } + ] + }, + "mapping": [ + { + "source-path": "name", + "target": "species" + }, + { + "source-path": "individualCount", + "target": "individualsOrGroups" + }, + { + "source-path": "numberOfIndividualsOrGroups", + "target": "numberOfIndividualsOrGroups" + } + ], + "target": { + "type": "singleLoad", + "name": "pestAnimalSurveySpeciesTable" + } + } } ] }, { "columns": [ { - "dataType": "species", + "dataType": "text", "name": "species", "validate": "required" }, @@ -20739,7 +20896,6 @@ "dataType": "feature", "name": "sitesCoveredForPestAnimal", "description": "Mapping field to be done and Area (ha)/length (km) field be auto-calculated from mapping." - }, { "computed": { @@ -21561,7 +21717,7 @@ "width": "55%", "source": "species", "title": "Target species recorded", - "type": "speciesSelect" + "type": "text" }, { "width": "25%", @@ -22176,7 +22332,6 @@ ], "defaultValue": "" }, - { "dataType": "number", "name": "totalLengthRemediationInitial", @@ -22241,7 +22396,6 @@ ], "defaultValue": "" }, - { "dataType": "number", "name": "totalStructuresInstalled", @@ -26227,18 +26381,78 @@ } ] }, - "target": { + "target": { "type": "singleValue", "name": "sitesCoveredForPlantSurvival" } } + }, + { + "type": "pre_populate", + "config": { + "waitForInitialisation": true, + "source": { + "url": "/project/getSpeciesRecordsFromActivity", + "params": [ + { + "expression": "owner.projectId", + "name": "id", + "type": "computed" + }, + { + "expression": "x=find(owner.custom.dataSets, \"dataSetId\", dataSetId); x.activityId", + "name": "activityId", + "type": "computed", + "required": true + } + ] + }, + "mapping": [ + { + "source-path": "name", + "target": "species" + }, + { + "source-path": "plantingMethod", + "target": "plantingMethod" + }, + { + "source-path": "hectaresPlanted", + "target": "hectaresPlanted" + }, + { + "source-path": "kilosOfDirectSeeding", + "target": "kilosOfDirectSeeding" + }, + { + "source-path": "numberPlanted", + "target": "numberPlanted" + }, + { + "source-path": "individualsOrGroups", + "target": "individualsOrGroups" + }, + { + "source-path": "numberOfIndividualsGroupsSurvived", + "target": "numberOfIndividualsGroupsSurvived" + }, + { + "source-path": "survivalRate", + "target": "survivalRate" + } + ], + "target": { + "type": "singleLoad", + "name": "plantSurvivalSurveySpeciesTable" + } + } } ] }, { "columns": [ { - "dataType": "species", + "dataType": "text", "name": "species", "validate": "required" }, @@ -26376,7 +26590,6 @@ "dataType": "feature", "name": "sitesCoveredForPlantSurvival", "description": "Mapping field to be done and Area (ha)/length (km) field be auto-calculated from mapping." - }, { "computed": { @@ -27139,7 +27352,7 @@ "width": "30%", "source": "species", "title": "Target species recorded", - "type": "speciesSelect" + "type": "text" }, { "width": "20%", @@ -28309,7 +28522,7 @@ } ] }, - "target": { + "target": { "type": "singleValue", "name": "sitesCoveredForSkillsAndKnowledge" } @@ -29320,7 +29533,7 @@ } ] }, - "target": { + "target": { "type": "singleValue", "name": "sitesCoveredForSoilSurvey" } @@ -29402,8 +29615,6 @@ "dataType": "feature", "name": "sitesCoveredForSoilSurvey", "description": "Mapping field to be done and Area (ha)/length (km) field be auto-calculated from mapping." - - }, { "computed": { @@ -31241,8 +31452,6 @@ "name": "monitoringIndicator", "dataType": "stringList", "description": "", - - "computed": { "expression": "if(projectBaseline, x=pluck(findAll($context.owner.custom.details.monitoring.rows, \"relatedBaseline\", projectBaseline), \"data1\", \"No monitoring indicators associated with this baseline\"), '')" } @@ -31634,7 +31843,6 @@ } ] }, - { "type": "row", "items": [ @@ -31983,7 +32191,6 @@ "units": "km", "decimalPlaces": 3 }, - { "dataType": "feature", "name": "sitesInterventionsReleased", @@ -32558,7 +32765,6 @@ } ] }, - { "type": "col", "css": "span3 col-border-right", @@ -32864,7 +33070,7 @@ } ] }, - "target": { + "target": { "type": "singleValue", "name": "sitesCoveredForWaterQuality" } @@ -34020,18 +34226,62 @@ } ] }, - "target": { + "target": { "type": "singleValue", "name": "sitesCoveredForWeedDistribution" } } + }, + { + "type": "pre_populate", + "config": { + "waitForInitialisation": true, + "source": { + "url": "/project/getSpeciesRecordsFromActivity", + "params": [ + { + "expression": "owner.projectId", + "name": "id", + "type": "computed" + }, + { + "expression": "x=find(owner.custom.dataSets, \"dataSetId\", dataSetId); x.activityId", + "name": "activityId", + "type": "computed", + "required": true + } + ] + }, + "mapping": [ + { + "source-path": "name", + "target": "species" + }, + { + "source-path": "threatenedEcologicalCommunity", + "target": "threatenedEcologicalCommunity" + }, + { + "source-path": "estimatedCoverPercent", + "target": "estimatedCoverPercent" + }, + { + "source-path": "weedSurveyObjective", + "target": "weedSurveyObjective" + } + ], + "target": { + "type": "singleLoad", + "name": "weedSurveySpeciesTable" + } + } } ] }, { "columns": [ { - "dataType": "species", + "dataType": "text", "name": "species", "validate": "required" }, @@ -34950,7 +35200,7 @@ "width": "40%", "source": "species", "title": "Target species recorded", - "type": "speciesSelect" + "type": "text" }, { "width": "10%", diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index a850af88a..d78dc59a7 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -1162,6 +1162,11 @@ class ProjectController { null } + @PreAuthorise + def getSpeciesRecordsFromActivity (String activityId) { + render projectService.getSpeciesRecordsFromActivity(activityId) as JSON + } + private def error(String message, String projectId) { flash.message = message if (projectId) { diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index d0fe86645..d6425f801 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -2207,4 +2207,11 @@ class ProjectService { } result } + + List getSpeciesRecordsFromActivity (String activityId) { + if (activityId) { + String url = "${grailsApplication.config.getProperty('ecodata.baseUrl')}record/listForActivity/${activityId}" + webService.getJson(url)?.records + } + } } diff --git a/src/main/scripts/releases/3.1/insertParatooProtocolConfig.js b/src/main/scripts/releases/3.1/insertParatooProtocolConfig.js index 87aadeeb1..3792c6270 100644 --- a/src/main/scripts/releases/3.1/insertParatooProtocolConfig.js +++ b/src/main/scripts/releases/3.1/insertParatooProtocolConfig.js @@ -1,322 +1,491 @@ var protocolConfig = { // Vegetation Mapping Survey - 'cd2cbbc7-2f17-4b0f-91b4-06f46e9c90f2': { - apiEndpoint: 'vegetation-mapping-observations', + "cd2cbbc7-2f17-4b0f-91b4-06f46e9c90f2": { + apiEndpoint: "vegetation-mapping-observations", usesPlotLayout: false, - geometryType: 'Point', - geometryPath: 'attributes.position', - startDatePath: 'attributes.vegetation_mapping_survey.data.attributes.start_date_time', + geometryType: "Point", + geometryPath: "attributes.position", + startDatePath: "attributes.vegetation_mapping_survey.data.attributes.start_date_time", endDatePath: null, - surveyIdPath: 'attributes.vegetation_mapping_survey.data.attributes.surveyId' + surveyIdPath: "attributes.vegetation_mapping_survey.data.attributes.surveyId" }, - 'floristics-veg-survey-lite': { - apiEndpoint: 'floristics-veg-survey-lites', + "floristics-veg-survey-lite": { + apiEndpoint: "floristics-veg-survey-lites", usesPlotLayout: true, - startDatePath: 'attributes.start_date_time', - endDatePath: 'attributes.end_date_time', - surveyIdPath: 'attributes.surveyId' + startDatePath: "attributes.start_date_time", + endDatePath: "attributes.end_date_time", + surveyIdPath: "attributes.surveyId" }, - 'floristics-veg-survey-fulls': { - apiEndpoint: 'floristics-veg-survey-fulls', + "floristics-veg-survey-fulls": { + apiEndpoint: "floristics-veg-survey-fulls", usesPlotLayout: true, - startDatePath: 'attributes.start_date_time', - endDatePath: 'attributes.end_date_time', - surveyIdPath: 'attributes.surveyId' + startDatePath: "attributes.start_date_time", + endDatePath: "attributes.end_date_time", + surveyIdPath: "attributes.surveyId" }, - 'photopoints-survey': { - apiEndpoint: 'photopoints-surveys', + "photopoints-survey": { + apiEndpoint: "photopoints-surveys", usesPlotLayout: true, - startDatePath: 'attributes.start_date_time', - endDatePath: 'attributes.end_date_time', - surveyIdPath: 'attributes.surveyId' + startDatePath: "attributes.start_date_time", + endDatePath: "attributes.end_date_time", + surveyIdPath: "attributes.surveyId" }, // Pest Fauna Control Activities - '80360ceb-bd6d-4ed4-b2ea-9bd45d101d0e': { - apiEndpoint: 'pest-fauna-control-activities', + "80360ceb-bd6d-4ed4-b2ea-9bd45d101d0e": { + apiEndpoint: "pest-fauna-control-activities", usesPlotLayout: false, - startDatePath: 'attributes.start_time', - endDatePath: 'attributes.end_time', + startDatePath: "attributes.start_time", + endDatePath: "attributes.end_time", geometryType: "LineString", point1: "attributes.start_location", // Type string: format: Lat: -35.2592426, Lng: 149.0651714 point2: "attributes.end_location" // Format: Lat: -35.2592426, Lng: 149.0651714 }, // Basal Area DBH - '5005b0af-4360-4a8c-a203-b2c9e440547e': { - apiEndpoint: 'basal-area-dbh-measure-surveys', + "5005b0af-4360-4a8c-a203-b2c9e440547e": { + apiEndpoint: "basal-area-dbh-measure-surveys", usesPlotLayout: true, - startDatePath: 'attributes.start_date', - endDatePath: 'attributes.start_date', + startDatePath: "attributes.start_date", + endDatePath: "attributes.start_date", } }; var protocols = { "068d17e8-e042-ae42-1e42-cff4006e64b0": - {"name": "Opportune", "usesPlotLayout": false, "tags": ["survey"]}, - "cd2cbbc7-2f17-4b0f-91b4-06f46e9c90f2": {"name": "Vegetation Mapping", "usesPlotLayout": false, "tags": ["survey"]}, + { + "name": "Opportune", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "opportunistic-surveys", + "overrides": { + "dataModel": { + "opportunistic-observation.number_of_individuals": { + "dwcAttribute": "individualCount" + } + }, + "viewModel": null + } + }, + "cd2cbbc7-2f17-4b0f-91b4-06f46e9c90f2": { + "name": "Vegetation Mapping", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "vegetation-mapping-surveys", + "geometryType": "Point", + "geometryPath": "attributes.position", + "startDatePath": "attributes.vegetation_mapping_survey.data.attributes.start_date_time", + "endDatePath": null, + "surveyIdPath": "attributes.vegetation_mapping_survey.data.attributes.surveyId" + }, "a9cb9e38-690f-41c9-8151-06108caf539d": - {"name": "Plot Selection", "usesPlotLayout": false, "tags": ["site"]}, + { + "name": "Plot Selection", + "usesPlotLayout": false, + "apiEndpoint": "plot-selections", + "tags": ["site"] + }, "d7179862-1be3-49fc-8ec9-2e219c6f3854": { "name": "Plot Layout and Visit", "usesPlotLayout": false, + "apiEndpoint": "plot-definition-surveys", "tags": ["site"] }, "617df00c-0e4f-4267-9efc-9ca9eae19686": { "name": "Plot Description(enhanced)", + "apiEndpoint": "plot-description-enhanceds", "usesPlotLayout": true, "tags": ["site"] }, "dc10f902-e310-45eb-b82a-bebab050b46b": { "name": "Plot Description(standard)", + "apiEndpoint": "plot-description-standards", "usesPlotLayout": true, "tags": ["site"] }, - "3cbc5277-45fb-4e7a-8f33-19d9bff4cd78": {"name": "Drone Survey", "usesPlotLayout": false, "tags": ["development"]}, - "3d2eaa76-a610-4575-ac30-abf40e57b68a": {"name": "Dev sandbox", "usesPlotLayout": false, "tags": ["development"]}, + "3cbc5277-45fb-4e7a-8f33-19d9bff4cd78": { + "name": "Drone Survey", "usesPlotLayout": false, "tags": ["survey"], + "apiEndpoint": "drone-surveys" + }, + "3d2eaa76-a610-4575-ac30-abf40e57b68a": { + "name": "Dev sandbox", "usesPlotLayout": false, "tags": ["development"], + "apiEndpoint": "dev-sandbox-surveys" + }, "5fd206b5-25cb-4371-bd90-7b2e8801ea25": { "name": "Photopoints - DSLR Panorama", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "photopoints-surveys", }, "383fa013-c52d-4186-911b-35e9b2375653": { "name": "Photopoints - Compact Panorama", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "photopoints-surveys", + "startDatePath": "attributes.start_date_time", + "endDatePath": "attributes.end_date_time", + "surveyIdPath": "attributes.surveyId" }, "2dbb595b-3541-46bd-b200-13db3a823b74": { "name": "Photopoints - Device Panorama", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "photopoints-surveys", }, "e15db26f-55de-4459-841b-d7ef87dea5cd": { "name": "Floristics - Enhanced", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "floristics-veg-survey-fulls", + "startDatePath": "attributes.start_date_time", + "endDatePath": "attributes.end_date_time", + "surveyIdPath": "attributes.surveyId" }, "bbd550c0-04c5-4a8c-ae39-cc748e920fd4": { "name": "Floristics - Standard", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "floristics-veg-survey-lites", + "startDatePath": "attributes.start_date_time", + "endDatePath": "attributes.end_date_time", + "surveyIdPath": "attributes.surveyId" }, "b92005b0-f418-4208-8671-58993089f587": { "name": "Plant Tissue Vouchering - Enhanced", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "floristics-veg-genetic-voucher-surveys" }, "f01e0673-a29d-48bb-b6ce-cf1c0f0de345": { "name": "Plant Tissue Vouchering - Standard", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "floristics-veg-genetic-voucher-surveys" + }, + "93e65339-4bce-4ca1-a323-78977865ef93": { + "name": "Cover - Enhanced", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "cover-point-intercept-surveys", + }, + "37a3b018-3779-4c4f-bfb3-d38eb53a2568": { + "name": "Cover - Standard", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "cover-point-intercept-surveys" }, - "93e65339-4bce-4ca1-a323-78977865ef93": {"name": "Cover - Enhanced", "usesPlotLayout": true, "tags": ["survey"]}, - "37a3b018-3779-4c4f-bfb3-d38eb53a2568": {"name": "Cover - Standard", "usesPlotLayout": true, "tags": ["survey"]}, "8c47b1f8-fc58-4510-a138-e5592edd2dbc": { "name": "Cover + Fire - Enhanced", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "cover-point-intercept-surveys" }, "58f2b4a6-6ce1-4364-9bae-f96fc3f86958": { "name": "Cover + Fire - Standard", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "cover-point-intercept-surveys" + }, + "36e9d224-a51f-47ea-9442-865e80144311": { + "name": "Fire Survey", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "fire-surveys" + }, + "5005b0af-4360-4a8c-a203-b2c9e440547e": { + "name": "Basal Area - DBH", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "basal-area-dbh-measure-surveys", + "startDatePath": "attributes.start_date", + "endDatePath": "attributes.start_date", + "overrides": { + "dataModel": { + "floristics-veg-voucher-full.host_species": { + "dataType": "species" + }, + "floristics-veg-voucher-lite.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "floristics-veg-voucher-full.host_species": { + "type": "speciesSelect" + }, + "floristics-veg-voucher-lite.host_species": { + "type": "speciesSelect" + } + } + } }, - "36e9d224-a51f-47ea-9442-865e80144311": {"name": "Fire Survey", "usesPlotLayout": true, "tags": ["survey"]}, - "5005b0af-4360-4a8c-a203-b2c9e440547e": {"name": "Basal Area - DBH", "usesPlotLayout": true, "tags": ["survey"]}, "4b8b35c7-15ef-4abd-a7b2-2f4e24509b52": { "name": "Basal Area - Basal Wedge", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "basal-wedge-surveys" }, "6e613128-92e8-4525-854c-4021f1d4d02f": { "name": "Coarse Woody Debris", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "coarse-woody-debris-surveys" }, "a05f8914-ef4f-4a46-8cf1-d035c9c46d4d": { "name": "Recruitment - Age Structure", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "recruitment-field-surveys" }, "db841be3-dfb7-4860-9474-a131f4de5954": { "name": "Recruitment - Survivorship", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "recruitment-survivorship-surveys" }, "1dd7d3ff-11b5-4690-8167-d8fe148656b9": { "name": "Soil Sub-pit and Metagenomics", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "soil-sub-pit-and-metagenomics-surveys" + }, + "15ea86ab-22f6-43fa-8cd5-751eab2347ad": { + "name": "Soil Sample Pit", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "soil-pit-characterisation-lites" }, - "15ea86ab-22f6-43fa-8cd5-751eab2347ad": {"name": "Soil Sample Pit", "usesPlotLayout": true, "tags": ["survey"]}, "1de5eed1-8f97-431c-b7ca-a8371deb3c28": { "name": "Soil Site Observation and Pit Characterisation", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "soil-pit-characterisation-fulls" }, "39da41f1-dd45-4838-ae57-ea50588fd2bc": { "name": "Soils - Bulk Density", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "soil-bulk-density-surveys" }, "c1b38b0f-a888-4f28-871b-83da2ac1e533": { "name": "Vertebrate Fauna - Bird Survey", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "bird-surveys", + "overrides": { + "dataModel": { + "bird-survey.bird-survey-observation.count": { + "dwcAttribute": "individualCount" + } + } + } }, "ab990a3a-a972-45d2-a384-13c3b01e9c7b": { "name": "Vertebrate Fauna - Trapping Survey Closure", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "vertebrate-end-trapping-surveys" }, "82463b77-aac2-407c-a03c-8669bd73baf0": { "name": "Invertebrate Fauna - Malaise Trapping", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "invertebrate-malaise-trappings" }, "8041a1a4-3e19-4fd2-86b9-d453023b5592": { "name": "Invertebrate Fauna - Active Search", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "invertebrate-active-search-surveys" }, "7f95710a-2003-4119-a2c6-41ce4e34d12a": { "name": "Condition - Attributes", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "condition-surveys" }, "aae4dbd8-845a-406e-b682-ef01c3497711": { "name": "Dev Sandbox Bulk Survey", "usesPlotLayout": true, - "tags": ["development"] + "tags": ["development"], + "apiEndpoint": "dev-sandbox-bulk-surveys" }, "6000cb5f-ad75-41e2-9e3e-c070c527453a": { "name": "Metadata Collection", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "new-targeted-surveys" }, "949ae38f-c047-42a7-8164-38c24ede35d5": { "name": "Camera Trap Reequipping", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "camera-trap-reequipping-surveys" }, "90c0f4cc-a22a-4820-9a8b-a01564bc197a": { "name": "Fauna Aerial Survey", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "aerial-surveys" }, "2c5bb8d7-b624-4dc4-93d7-3f1276e65ad5": { "name": "Vertebrate Fauna - Trapping Survey Setup", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "vertebrate-trapping-setup-surveys" }, "70fbd236-9e51-47a8-93da-125a18a13acc": { "name": "Vertebrate Fauna - Identify, Measure and Release", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "vertebrate-trap-check-surveys" }, "9d2c3fcf-881b-41df-944d-33bb6ef8ac51": { "name": "Vertebrate true - Active and Passive Search", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "vertebrate-active-passive-search-surveys" }, "0628e486-9b33-4d86-98db-c6d3f10f7744": { "name": "Vertebrate Fauna - Acoustic and Ultrasonic Recordings", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "" }, "9e75385a-4783-4911-8870-cca78b44d781": { "name": "Invertebrate Fauna - Wet Pitfall Trapping", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "invertebrate-wet-pitfall-surveys" }, "7dc49039-4999-43f6-8896-e33d7b28a934": { "name": "Invertebrate Fauna - Rapid Ground Trapping", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "invertebrate-rapid-ground-trappings" }, "7b0e4526-726e-4292-a897-238f336ce51e": { "name": "Invertebrate Fauna - Pan Trapping", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "invertebrate-pan-trappings" }, "aa64fd4d-2c5a-4f84-a197-9f3ce6409152": { "name": "Invertebrate Fauna - Post-field Sampling Curation", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "" }, "08adf0ff-43c1-4f19-b2c4-f5da667baf65": { "name": "Interventions - Data Collection", "usesPlotLayout": false, - "tags": ["intervention"] + "tags": ["intervention"], + "apiEndpoint": "interventions-general-project-informations" }, "ad088dbe-02b2-472a-901f-bd081e590bcf": { "name": "Camera Trap Deployment", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "camera-trap-deployment-surveys" }, "3db7f7b6-a96d-495a-9981-5d6170a7458d": { "name": "Camera Trap Retrieval", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "camera-trap-retrieval-surveys" }, "648d545a-cdae-4c19-bc65-0c9f93d9c0eb": { "name": "Sign-based Fauna Surveys - Within-plot Belt Transect", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "within-plot-belt-transect-surveys" }, "2cd7b489-b582-41f6-9dcc-264f6ea7801a": { "name": "Sign-based Fauna Surveys - Off-plot Belt Transect", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "off-plot-belt-transect-surveys" }, "0c5d1d14-c71b-467f-aced-abe1c83c15d3": { "name": "Sign-based Fauna - Vehicle Track", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "sign-based-vehicle-track-set-ups" }, "a76dac21-94f4-4851-af91-31f6dd00750f": { "name": "Fauna Ground Counts Transects", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "fauna-ground-counts-surveys" }, "80360ceb-bd6d-4ed4-b2ea-9bd45d101d0e": { "name": "Pest Fauna - Control Activities", "usesPlotLayout": false, - "tags": ["intervention"] + "tags": ["intervention"], + "apiEndpoint": "pest-fauna-control-activities", + "startDatePath": "attributes.start_time", + "endDatePath": "attributes.end_time", + "geometryType": "LineString" }, "228e5e1e-aa9f-47a3-930b-c1468757f81d": { "name": "Herbivory and Physical Damage - Active Plot Search", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "herbivory-and-physical-damage-active-search-setups" }, "cc826a19-a1e7-4dfe-8d6e-f135d258d7f9": { "name": "Sign-based Fauna - Plot Sign Search", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "sign-based-active-plot-search-surveys" }, "685b5e9b-20c2-4688-9b04-b6caaf084aad": { "name": "Sign-based Fauna - Track Station", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "overrides": { + "dataModel": { + "sign-based-track-station-survey-setup.sign-based-track-station-observation.tracks.number_of_individuals": { + "dwcAttribute": "individualCount" + } + } + }, + "apiEndpoint": "sign-based-track-station-survey-setups" }, "d706fd34-2f05-4559-b738-a65615a3d756": { "name": "Fauna Ground Counts Vantage Point", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "ground-counts-vantage-point-surveys" }, "06cd903e-b8b3-40a5-add4-f779739cce35": { "name": "Herbivory and Physical Damage - Within-plot Belt Transect", "usesPlotLayout": true, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "herbivory-and-physical-damage-belt-transect-setups", + "overrides": { + "dataModel": { + "herbivory-and-physical-damage-belt-transect-setup.target_species.lut": { + "dataType": "species" + }, + "herbivory-and-physical-damage-transect.quadrat.quadrat_observation.herbivory_attributable_fauna_species.lut": { + "dataType": "species" + }, + "herbivory-and-physical-damage-transect.quadrat.quadrat_observation.physical_damage_attributable_fauna_species.lut":{ + "dataType": "species" + } + }, + "viewModel": null + } }, "49d02f5d-b148-4b5b-ad6a-90e48c81b294": { "name": "Herbivory and Physical Damage - Off-plot Transect", "usesPlotLayout": false, - "tags": ["survey"] + "tags": ["survey"], + "apiEndpoint": "herbivory-off-plot-belt-transect-setups" } }; -var key = 'paratoo.surveyData.mapping'; +var key = "paratoo.surveyData.mapping"; var setting = { key: key, value: JSON.stringify(protocols), From 675138464574f88c74da805cbfd27a62f8fb06b0 Mon Sep 17 00:00:00 2001 From: sal153 Date: Fri, 5 Apr 2024 08:19:47 +1100 Subject: [PATCH 39/95] commit updates #3090 --- .../au/org/ala/merit/ProjectController.groovy | 3 ++- .../au/org/ala/merit/ProjectService.groovy | 14 +++++++++++++- grails-app/views/project/_editProject.gsp | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index 3ef8c4e6c..5bc450fd6 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -160,6 +160,7 @@ class ProjectController { project.outcomes = new JSONArray(config.outcomes ?: []) project.hasApprovedOrSubmittedReports = reportService.includesSubmittedOrApprovedReports(project.reports) boolean canRegenerateReports = projectService.canRegenerateReports(project) + boolean canManuallyRegenerateReports = projectService.canManuallyRegenerateReports(project) def meriPlanVisible = config.includesContent(ProgramConfig.ProjectContent.MERI_PLAN) boolean canModifyMeriPlan = config.requireMeritAdminToReturnMeriPlan ? userService.userIsAlaOrFcAdmin() : user?.isCaseManager def risksAndThreatsVisible = config.includesContent(ProgramConfig.ProjectContent.RISKS_AND_THREATS) && user?.hasViewAccess @@ -203,7 +204,7 @@ class ProjectController { site : [label: 'Sites', visible: config.includesContent(ProgramConfig.ProjectContent.SITES), disabled: !user?.hasViewAccess, editable:user?.isEditor, type: 'tab', template:'projectSites'], dashboard : [label: 'Dashboard', visible: config.includesContent(ProgramConfig.ProjectContent.DASHBOARD), disabled: !user?.hasViewAccess, type: 'tab'], datasets : [label: 'Data set summary', visible: datasetsVisible, template: '/project/dataset/dataSets', type:'tab'], - admin : [label: 'Admin', visible: adminTabVisible, user:user, type: 'tab', template:'projectAdmin', project:project, canChangeProjectDates: canChangeProjectDates, minimumProjectEndDate:minimumProjectEndDate, showMERIActivityWarning:true, showAnnouncementsTab: showAnnouncementsTab, showSpecies:true, meriPlanTemplate:MERI_PLAN_TEMPLATE, showMeriPlanHistory:showMeriPlanHistory, requireMeriPlanApprovalReason:Boolean.valueOf(config.supportsMeriPlanHistory), config:config, activityPeriodDescriptor:config.activityPeriodDescriptor ?: 'Stage', canRegenerateReports: canRegenerateReports, canModifyMeriPlan: canModifyMeriPlan, showRequestLabels:config.supportsParatoo]] + admin : [label: 'Admin', visible: adminTabVisible, user:user, type: 'tab', template:'projectAdmin', project:project, canChangeProjectDates: canChangeProjectDates, minimumProjectEndDate:minimumProjectEndDate, showMERIActivityWarning:true, showAnnouncementsTab: showAnnouncementsTab, showSpecies:true, meriPlanTemplate:MERI_PLAN_TEMPLATE, showMeriPlanHistory:showMeriPlanHistory, requireMeriPlanApprovalReason:Boolean.valueOf(config.supportsMeriPlanHistory), config:config, activityPeriodDescriptor:config.activityPeriodDescriptor ?: 'Stage', canRegenerateReports: canRegenerateReports, canManuallyRegenerateReports: canManuallyRegenerateReports, canModifyMeriPlan: canModifyMeriPlan, showRequestLabels:config.supportsParatoo]] if (template == MERI_ONLY_TEMPLATE) { model = [details:model.details] diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index 9e4921f4d..d1b5161c5 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -772,7 +772,10 @@ class ProjectService { response = updateUnchecked(projectId, [plannedStartDate:plannedStartDate, plannedEndDate:plannedEndDate]) //user explicitly generates the report from the reporting tab - generateProjectStageReports(projectId, dateChangeOptions) + if (!APPLICATION_STATUS.equalsIgnoreCase(project.status)) { + generateProjectStageReports(projectId, dateChangeOptions) + } + if (dateChangeOptions.updateActivities) { updateActivityDates(projectId, previousStartDate) @@ -1123,6 +1126,7 @@ class ProjectService { /** * Returns true if project reports are allowed to be regenerated. + * This allows project dates to be changed while a project is in the Application status * @param project the project to check, expects the reports property to have * been populated with project reports. */ @@ -1130,6 +1134,14 @@ class ProjectService { Status.isActive(project.status) || APPLICATION_STATUS.equalsIgnoreCase(project.status) && !hasSubmittedOrApprovedFinalReportInCategory(project) } + /** + * Returns true if project reports are allowed to be regenerated. + * This validation disables the "Re-create project reports" if project status is still in Application + */ + boolean canManuallyRegenerateReports(Map project) { + Status.isActive(project.status) && !hasSubmittedOrApprovedFinalReportInCategory(project) + } + /** * Checks if the supplied project has any reports that can't be modified * with an end date that overlaps the project end date. this check is required diff --git a/grails-app/views/project/_editProject.gsp b/grails-app/views/project/_editProject.gsp index 993dc63f0..163f9f7ac 100644 --- a/grails-app/views/project/_editProject.gsp +++ b/grails-app/views/project/_editProject.gsp @@ -310,7 +310,7 @@
    - + Re-create project reports will be disabled when the Project status is not Active, or if the last report in any category has been submitted, cancelled or approved
    From 79d853fbe252e254083fcbfb477e86418bb5b9f0 Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 5 Apr 2024 08:51:14 +1100 Subject: [PATCH 40/95] Trying to understand test failure #2973 --- src/integration-test/groovy/pages/RlpProjectPage.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/integration-test/groovy/pages/RlpProjectPage.groovy b/src/integration-test/groovy/pages/RlpProjectPage.groovy index a10e9453e..26be44b48 100644 --- a/src/integration-test/groovy/pages/RlpProjectPage.groovy +++ b/src/integration-test/groovy/pages/RlpProjectPage.groovy @@ -54,7 +54,7 @@ class RlpProjectPage extends ReloadablePage { adminContent.projectSettingsTab.click() waitFor { adminContent.projectSettings.displayed } adminContent.projectSettings.regenerateReports() - waitFor { hasBeenReloaded() } + waitFor 20, { hasBeenReloaded() } } def openAdminTab() { From ec4be7d354917c184fdb7cdd9a5af6acb21ff1fd Mon Sep 17 00:00:00 2001 From: temi Date: Fri, 5 Apr 2024 09:50:26 +1100 Subject: [PATCH 41/95] #3049 - fixed broken integration test --- .../ala/fieldcapture/ManagementUnitPermissionSpec.groovy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/integration-test/groovy/au/org/ala/fieldcapture/ManagementUnitPermissionSpec.groovy b/src/integration-test/groovy/au/org/ala/fieldcapture/ManagementUnitPermissionSpec.groovy index 795f2c090..8fba1dc98 100644 --- a/src/integration-test/groovy/au/org/ala/fieldcapture/ManagementUnitPermissionSpec.groovy +++ b/src/integration-test/groovy/au/org/ala/fieldcapture/ManagementUnitPermissionSpec.groovy @@ -1,8 +1,8 @@ package au.org.ala.fieldcapture -import org.openqa.selenium.ElementNotInteractableException + +import org.openqa.selenium.JavascriptException import pages.ManagementUnitPage -import pages.RlpProjectPage class ManagementUnitPermissionSpec extends StubbedCasSpec { def setupSpec() { @@ -75,7 +75,7 @@ class ManagementUnitPermissionSpec extends StubbedCasSpec { adminTabPane.permissionAccess.addPermission("user1001@user.com", "caseManager") then: "we cannot because the 'Grant Manager' option is disabled" - thrown(ElementNotInteractableException) + thrown(JavascriptException) when: "We change user 4 to an admin" adminTabPane.permissionAccess.findPermissionForUser('4').updateRole('admin') From ed8ceb8b820584d917666a390c80dceabe94ce98 Mon Sep 17 00:00:00 2001 From: sal153 Date: Fri, 5 Apr 2024 10:24:55 +1100 Subject: [PATCH 42/95] commit program script updates #3141 --- ...teClimateSmartAgricultureProgramSubProgram.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js b/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js index fb0418fb5..42b19f4c6 100644 --- a/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js +++ b/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js @@ -28,17 +28,15 @@ var config = }, { "serviceTargets": [ - "1f8161bc-908b-4ec8-ab7f-edac973a657d", - "88908921-1248-4a7c-b185-51c625c737e3", - "fe9f1a6c-e614-489a-80fa-4d6d76f1cf95" + "f9c85612-602e-465c-89e0-e155b34b1f31" ], "serviceId": 3 }, { "serviceTargets": [ - "aa0c6b29-285e-4344-987e-dfeaf1d95648", "a9d98baa-b2ab-4428-82cf-d96185e63aa6", - "c4ea5ce3-4a70-4df8-aff7-ffa929e7df61" + "c4ea5ce3-4a70-4df8-aff7-ffa929e7df61", + "dcf917dc-eaf7-49e2-ae7b-abf65edeedae" ], "serviceId": 4 }, @@ -174,7 +172,8 @@ var config = "b9e710e4-7dd3-4acc-ac2c-c69f4bcb9787", "00934509-f102-4d39-a043-7547a8ab9ac8", "1021bec7-3836-4b33-90b4-76701efd4fe3", - "4dad393e-cbf7-43dd-87bb-62ea8f8afcdd" + "4dad393e-cbf7-43dd-87bb-62ea8f8afcdd", + "7186117e-ac17-4ed9-8c9c-8ee1c3bf473b" ], "serviceId": 26 }, @@ -249,7 +248,8 @@ var config = "serviceTargets": [ "3ec07754-4a7a-46fb-a76d-553921781716", "fbc2dab8-7454-40f9-94f6-6bf258fcefff", - "7186e284-0cb2-418e-a8cc-4343eb618140" + "7186e284-0cb2-418e-a8cc-4343eb618140", + "c7d0963e-2847-4f5f-8a1c-e149dfa4c9d1" ], "serviceId": 36 }, @@ -268,7 +268,7 @@ var config = ] }, - "visibility": "private", + "visibility": "public", "declarationPageType": "rdpReportDeclaration", "requiresActivityLocking": true, "supportsMeriPlanComparison": true, From 5ad8ea27caad839bed149fb14bda2638de0f306d Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 5 Apr 2024 13:54:45 +1100 Subject: [PATCH 43/95] Added help text #2973 --- grails-app/views/project/_editProject.gsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grails-app/views/project/_editProject.gsp b/grails-app/views/project/_editProject.gsp index 619ea7e48..995a93e02 100644 --- a/grails-app/views/project/_editProject.gsp +++ b/grails-app/views/project/_editProject.gsp @@ -106,7 +106,7 @@
    - + If the funding amount is already correct, press the "Verify funding is correct" button to record the verification date. If you update the funding amount the verification date will automatically be updated.
    From ce78d6b09009a5a84bb04fdf541f3da9a1d81b6c Mon Sep 17 00:00:00 2001 From: temi Date: Fri, 5 Apr 2024 15:07:50 +1100 Subject: [PATCH 44/95] #3049 - reverted text fields to species fields to enable non-monitor users to enter data via fieldcapture - prepop fetch now creates species object to match expectation of species field --- forms/nht/nhtOutputReport.json | 34 +++++++++---------- .../au/org/ala/merit/ProjectService.groovy | 16 ++++++++- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/forms/nht/nhtOutputReport.json b/forms/nht/nhtOutputReport.json index d53a0c9a8..394dd6d97 100644 --- a/forms/nht/nhtOutputReport.json +++ b/forms/nht/nhtOutputReport.json @@ -9373,7 +9373,7 @@ }, "mapping": [ { - "source-path": "name", + "source-path": "species", "target": "species" }, { @@ -9400,7 +9400,7 @@ { "columns": [ { - "dataType": "text", + "dataType": "species", "name": "species", "validate": "required" }, @@ -10396,7 +10396,7 @@ }, "mapping": [ { - "source-path": "name", + "source-path": "species", "target": "species" }, { @@ -10419,7 +10419,7 @@ { "columns": [ { - "dataType": "text", + "dataType": "species", "name": "species", "validate": "required" }, @@ -11336,7 +11336,7 @@ "width": "55%", "source": "species", "title": "Target species recorded", - "type": "text" + "type": "speciesSelect" }, { "width": "25%", @@ -12755,7 +12755,7 @@ }, "mapping": [ { - "source-path": "name", + "source-path": "species", "target": "species" }, { @@ -12803,7 +12803,7 @@ { "columns": [ { - "dataType": "text", + "dataType": "species", "name": "species", "validate": "required" }, @@ -13725,7 +13725,7 @@ "width": "40%", "source": "species", "title": "Target species recorded", - "type": "text" + "type": "speciesSelect" }, { "width": "35%", @@ -20777,7 +20777,7 @@ }, "mapping": [ { - "source-path": "name", + "source-path": "species", "target": "species" }, { @@ -20800,7 +20800,7 @@ { "columns": [ { - "dataType": "text", + "dataType": "species", "name": "species", "validate": "required" }, @@ -21717,7 +21717,7 @@ "width": "55%", "source": "species", "title": "Target species recorded", - "type": "text" + "type": "speciesSelect" }, { "width": "25%", @@ -26409,7 +26409,7 @@ }, "mapping": [ { - "source-path": "name", + "source-path": "species", "target": "species" }, { @@ -26452,7 +26452,7 @@ { "columns": [ { - "dataType": "text", + "dataType": "species", "name": "species", "validate": "required" }, @@ -27352,7 +27352,7 @@ "width": "30%", "source": "species", "title": "Target species recorded", - "type": "text" + "type": "speciesSelect" }, { "width": "20%", @@ -34254,7 +34254,7 @@ }, "mapping": [ { - "source-path": "name", + "source-path": "species", "target": "species" }, { @@ -34281,7 +34281,7 @@ { "columns": [ { - "dataType": "text", + "dataType": "species", "name": "species", "validate": "required" }, @@ -35200,7 +35200,7 @@ "width": "40%", "source": "species", "title": "Target species recorded", - "type": "text" + "type": "speciesSelect" }, { "width": "10%", diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index d6425f801..6711a7af4 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -2210,8 +2210,22 @@ class ProjectService { List getSpeciesRecordsFromActivity (String activityId) { if (activityId) { + String displayFormat = 'SCIENTIFICNAME(COMMONNAME)' String url = "${grailsApplication.config.getProperty('ecodata.baseUrl')}record/listForActivity/${activityId}" - webService.getJson(url)?.records + def records = webService.getJson(url)?.records + + records?.each { record -> + record.species = [ + scientificName: record.scientificName, + commonName: record.commonName, + outputSpeciesId: record.outputSpeciesId, + guid: record.scientificNameID ?: record.guid ?: record.taxonConceptID ?: "A_GUID" + ] + + record.species.name = speciesService.formatSpeciesName(displayFormat, record.species) + } + + records } } } From 1d36c8e681f2f3321b5fcaaad53ef84c10df9de6 Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 8 Apr 2024 13:20:23 +1000 Subject: [PATCH 45/95] Early prototyping #3142 --- forms/nht/safAnnualReport.json | 109 ++++++++++++++++++ .../au/org/ala/merit/ProjectController.groovy | 14 +++ .../3.3/createScoresForSafAnnualReport.js | 57 +++++++++ 3 files changed, 180 insertions(+) create mode 100644 forms/nht/safAnnualReport.json create mode 100644 src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js diff --git a/forms/nht/safAnnualReport.json b/forms/nht/safAnnualReport.json new file mode 100644 index 000000000..e6ae0dcee --- /dev/null +++ b/forms/nht/safAnnualReport.json @@ -0,0 +1,109 @@ +{ + "name": "SAF Annual Report", + "description": null, + "type": "Activity", + "sections": [ + { + "collapsedByDefault": false, + "modelName": null, + "templateName": "outputReportData", + "optional": false, + "optionalQuestionText": null, + "title": "Output report data", + "collapsibleHeading": null, + "name": "Output report data", + "description": null, + "template": { + "dataModel": [ + { + "name": "communicationsDuringPeriod", + "dataType": "list", + "columns": [ + { + "dataType": "text", + "name": "communications" + } + ] + } + ], + "viewModel": [ + { + "type": "table", + "title": "Communications", + "columns": [ + { + "type": "text", + "source": "yesCommunicationsMaterial" + + } + ] + } + ], + "pre-populate": [ + { + "source": { + "url": "/project/agReport/", + "params": [ + { + "expression": "owner.projectId", + "name": "id", + "type": "computed" + }, + { + "expression": "activity.plannedEndDate", + "name": "financialYearEndDate", + "type": "computed" + } + ] + + }, + "merge": { + "communicationsDuringPeriod": { + "keys": [ + "yesCommunicationsMaterial" + ], + + "addUnmatchedNewRows": true, + "deleteUnmatchedExistingRows": true + } + }, + "mapping": [ + { + "mapping": [ + { + "source-path": "service", + "target": "serviceName" + }, + { + "source-path": "targetMeasure", + "target": "targetMeasure" + }, + { + "source-path": "scoreId", + "target": "scoreId" + }, + { + "source-path": "financialYearTarget", + "target": "annualTarget" + }, + { + "source-path": "financialYearResult", + "target": "result" + } + ], + "source-path": "targets", + "target": "communicationsDuringPeriod" + }] + } + ] + } + } + ], + "formVersion": 1, + "category": null, + "status": "active", + "gmsId": null, + "supportsSites": false, + "supportsPhotoPoints": false, + "minOptionalSectionsCompleted": 1 +} \ No newline at end of file diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index 136208d07..5a8c0472f 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -1148,6 +1148,20 @@ class ProjectController { null } + def agAnnualReport(String id) { + String url = grailsApplication.config.getProperty('ecodata.baseUrl') + 'project/projectMetrics/' + id + Map params = [approvedOnly:false, scoreIds: [ + 'e7701823-e534-414e-80f5-86f9eecef50c', + 'f474c538-c8d7-4431-86c3-741163a50a35' + ]] + + Map result = webService.doPost(url, params) + if (result.resp) { + result.resp = result.resp.collect{new Score(it)} + } + render result as JSON + } + private def error(String message, String projectId) { flash.message = message if (projectId) { diff --git a/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js b/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js new file mode 100644 index 000000000..06f07b5db --- /dev/null +++ b/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js @@ -0,0 +1,57 @@ +let scores = [ + + { + scoreId: 'e7701823-e534-414e-80f5-86f9eecef50c', // Deliberately coding the score ids to keep consistency between test & prod + entityTypes: [], + tags: [], + displayType: '', + entity: 'Activity', + outputType: 'NHT Communications', + isOutputTarget: false, + category: 'Annual Reporting', + status: 'active', + label: 'Output report communications', + description: 'All the communications from the output report', + configuration: { + filter: { + filterValue: 'NHT - Communications', + type: 'filter', + property: 'name' + }, + childAggregations: [ { property: 'data', type: 'SET' } ] + } + }, + + { + scoreId: 'f474c538-c8d7-4431-86c3-741163a50a35', // Deliberately coding the score ids to keep consistency between test & prod + entityTypes: [], + tags: [], + displayType: '', + entity: 'Activity', + outputType: 'NHT - Project Engagements', + isOutputTarget: false, + category: 'Annual Reporting', + status: 'active', + label: 'Project engagements', + description: 'All the Project engagements from the output report', + configuration: { + filter: { + filterValue: 'NHT - Project Engagements', + type: 'filter', + property: 'name' + }, + childAggregations: [ { property: 'data.engagementDetails', type: 'SET' } ] + } + } + +]; + +for (let i=0; i Date: Mon, 8 Apr 2024 16:37:57 +1000 Subject: [PATCH 46/95] commit progress #3146 --- .../regionalCapacityServicesAnnualReport.json | 1270 +++++++++++++++++ 1 file changed, 1270 insertions(+) create mode 100644 forms/other/regionalCapacityServicesAnnualReport.json diff --git a/forms/other/regionalCapacityServicesAnnualReport.json b/forms/other/regionalCapacityServicesAnnualReport.json new file mode 100644 index 000000000..a43717706 --- /dev/null +++ b/forms/other/regionalCapacityServicesAnnualReport.json @@ -0,0 +1,1270 @@ +{ + "name": "Regional Capacity Services Annual Report", + "sections": [ + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": false, + "modelName": "RLP - Core services annual report", + "name": "RLP - Core services annual report", + "optional": false, + "optionalQuestionText": null, + "template": { + "modelName": "RLP - Core services annual report", + "dataModel": [ + { + "dataType": "text", + "name": "coreServicesProgress", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "name": "coreServicesIssues", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "name": "governanceFrameworksMaintained", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "name": "financialAgreementsApplied", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "boolean", + "name": "interestRequirementsConfirmation", + "validate": "required" + }, + { + "dataType": "text", + "name": "firstNationsPeopleDevelopment", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "name": "subContractorsRegisterSubmitted", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "name": "subContractorsRegisterNotSubmitted", + "dataType": "text", + "description": "The Subcontractor register should include subcontractor name, description of the subcontracting agreement, start and finish dates, value of the subcontract and if the subcontractor is an Indigenous owned and operated organisation.", + "behaviour": [ + { + "condition": "subContractorsRegisterSubmitted == \"No\"", + "type": "visible" + } + ] + }, + { + "dataType": "text", + "name": "riskManagementImplemented", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "name": "yesRiskManagementActions", + "dataType": "text", + "validate": "required,maxSize[1250]", + "behaviour": [ + { + "condition": "riskManagementImplemented == \"Yes\"", + "type": "enable" + } + ] + }, + { + "name": "noRiskManagementActions", + "dataType": "text", + "validate": "required,maxSize[1250]", + "behaviour": [ + { + "condition": "riskManagementImplemented == \"No\"", + "type": "enable" + } + ] + }, + { + "dataType": "text", + "name": "governanceIssuesOccurred", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "managementActionsForGovernanceRisksAndIssues", + "behaviour": [ + { + "condition": "governanceIssuesOccurred == \"Yes\"", + "type": "enable" + } + ], + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "name": "adaptiveManagementImplemented", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "adaptiveManagementActions", + "behaviour": [ + { + "condition": "adaptiveManagementImplemented == \"Yes\"", + "type": "enable" + } + ], + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "name": "whsIncidentsOccurred", + "description": "A notifiable incident is prescribed within the Work Health and Safety Act as:
  • the death of a person, or
  • the serious injury or illness of a person, or
  • a dangerous incident
  • ", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "whsIncidents", + "behaviour": [ + { + "condition": "whsIncidentsOccurred == \"Yes\"", + "type": "enable" + } + ], + "validate": "required,maxSize[1250]" + }, + { + "dataType": "list", + "name": "coreServicesPlansTable", + "allowRowDelete": "false", + "columns": [ + { + "name": "coreServicesPlans", + "dataType": "text" + }, + { + "name": "coreServicesPlanLastReviewed", + "dataType": "date", + "validate": "required" + }, + { + "name": "coreServicesPlanActionsRequired", + "dataType": "text", + "validate": "required" + } + ] + }, + { + "dataType": "text", + "name": "communityParticipation", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "name": "communityParticipationFor20PercentRequirement", + "description": "", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "name": "requirementAgreedServicesAgreement", + "description": "", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "number", + "name": "totalInvestmentUnderClause3Point7", + "validate": "required" + }, + { + "name": "investment2018_19", + "dataType": "number", + "validate": "required" + }, + { + "name": "investment2019_20", + "dataType": "number", + "validate": "required" + }, + { + "name": "investment2020_21", + "dataType": "number", + "validate": "required" + }, + { + "name": "investment2021_22", + "dataType": "number", + "validate": "required" + }, + { + "name": "investment2022_23", + "dataType": "number", + "validate": "required" + }, + { + "name": "investmentTotal", + "dataType": "number", + "computed": { + "expression": "investment2018_19+investment2019_20+investment2020_21+investment2021_22+investment2022_23" + } + }, + { + "name": "percentageInvested", + "dataType": "number", + "computed": { + "expression": "investmentTotal/totalInvestmentUnderClause3Point7*100" + } + }, + { + "dataType": "text", + "name": "variationPreviousReportingYear", + "description": "", + "validate": "required" + }, + { + "dataType": "text", + "name": "indigenousParticipationTarget", + "validate": "required", + "constraints": [ + "N/A - Exempt", + "General - At least 4%" + ] + }, + { + "dataType": "text", + "name": "indigenousParticipationForClause40Point2", + "description": "Provide information on all community participation in any Core Services and relevant Projects over the past 12 months", + "validate": "maxSize[1250]", + "behaviour": [ + { + "type": "conditional_validation", + "condition": "indigenousParticipationTarget == \"General - At least 4%\"", + "value": { + "validate": "required,maxSize[1250]" + } + } + ] + }, + { + "dataType": "text", + "name": "agreedServicesForClause40Point2", + "description": "", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "list", + "name": "subcontractedWorkForceByFinancialYear", + "allowRowDelete": "false", + "columns": [ + { + "name": "contractWorkforceType", + "dataType": "text" + }, + { + "name": "contractWorkforce2018_19", + "dataType": "number", + "validate": "required" + }, + { + "name": "contractWorkforce2019_20", + "dataType": "number", + "validate": "required" + }, + { + "name": "contractWorkforce2020_21", + "dataType": "number", + "validate": "required" + }, + { + "name": "contractWorkforce2021_22", + "dataType": "number", + "validate": "required" + }, + { + "name": "contractWorkforce2022_23", + "dataType": "number", + "validate": "required" + }, + { + "name": "contractWorkforceTotal", + "dataType": "number", + "computed": { + "expression": "contractWorkforce2018_19+contractWorkforce2019_20+contractWorkforce2020_21+contractWorkforce2021_22+contractWorkforce2022_23" + } + } + ] + }, + { + "name": "percentageOfIndigenousSubcontractors", + "dataType": "number", + "computed": { + "expression": "subcontractedWorkForceByFinancialYear[0].contractWorkforceTotal()/subcontractedWorkForceByFinancialYear[1].contractWorkforceTotal()*100" + } + }, + { + "dataType": "list", + "name": "organisationWorkForceByFinancialYear", + "allowRowDelete": "false", + "columns": [ + { + "name": "organisationWorkforceType", + "dataType": "text" + }, + { + "name": "organisationWorkforce2018_19", + "dataType": "number", + "validate": "required" + }, + { + "name": "organisationWorkforce2019_20", + "dataType": "number", + "validate": "required" + }, + { + "name": "organisationWorkforce2020_21", + "dataType": "number", + "validate": "required" + }, + { + "name": "organisationWorkforce2021_22", + "dataType": "number", + "validate": "required" + }, + { + "name": "organisationWorkforce2022_23", + "dataType": "number", + "validate": "required" + }, + { + "name": "organisationWorkforceTotal", + "dataType": "number", + "computed": { + "expression": "organisationWorkforce2018_19+organisationWorkforce2019_20+organisationWorkforce2020_21+organisationWorkforce2021_22+organisationWorkforce2022_23" + } + } + ] + }, + { + "name": "percentageOfIndigenousEmployees", + "dataType": "number", + "computed": { + "expression": "organisationWorkForceByFinancialYear[0].organisationWorkforceTotal()/organisationWorkForceByFinancialYear[1].organisationWorkforceTotal()*100" + } + }, + { + "dataType": "number", + "name": "indigenousInvestmentAmount", + "validate": "required,min[0]" + }, + { + "name": "serviceSubcontracted2018_19", + "dataType": "number", + "validate": "required" + }, + { + "name": "serviceSubcontracted2019_20", + "dataType": "number", + "validate": "required" + }, + { + "name": "serviceSubcontracted2020_21", + "dataType": "number", + "validate": "required" + }, + { + "name": "serviceSubcontracted2021_22", + "dataType": "number", + "validate": "required" + }, + { + "name": "serviceSubcontracted2022_23", + "dataType": "number", + "validate": "required" + }, + { + "name": "serviceSubcontractedTotal", + "dataType": "number", + "computed": { + "expression": "serviceSubcontracted2018_19+serviceSubcontracted2019_20+serviceSubcontracted2020_21+serviceSubcontracted2021_22+serviceSubcontracted2022_23" + } + }, + { + "name": "percentageSubcontractedOfTotal", + "dataType": "number", + "computed": { + "expression": "serviceSubcontractedTotal/indigenousInvestmentAmount*100" + } + }, + { + "dataType": "text", + "name": "indigenousParticipation", + "description": "Provide information on all Indigenous employment and procurement in Core Services or projects over the past 12 months", + "validate": "maxSize[1250]", + "behaviour": [ + { + "type": "conditional_validation", + "condition": "indigenousParticipationTarget == \"General - At least 4%\"", + "value": { + "validate": "required,maxSize[1250]" + } + } + ] + }, + { + "dataType": "text", + "name": "variationPreviousReportingYearInvestment", + "description": "", + "validate": "required" + }, + { + "dataType": "text", + "name": "keyCommunicationActivities", + "description": "Include communications activities specifically related to Core Services", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "name": "waterPlansSubmitted", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "waterPlansNotSubmittedReason", + "behaviour": [ + { + "condition": "waterPlansSubmitted == \"No\"", + "type": "enable" + } + ], + "validate": "required,maxSize[1250]" + } + ], + "name": "RLP - Core services annual report", + "title": "Annual Regional Capacity Services Report", + "viewModel": [ + { + "type": "row", + "items": [ + { + "source": "

    Note: this report applies to Regional Capacity Services (Schedule 2) delivered under the Deed in the last 12 months

    ", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "1. Please outline key achievements in the delivery of Regional Capacity Services (RCS9.2(a)). (1250 character, [approx. 250 word] limit)", + "source": "coreServicesProgress", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "2. Please outline key issues in the delivery of Regional Capacity Services and how they were managed/rectified. Please include how adaptive management actions are/ will be implemented (RCS9.2(b)). (1250 character, [approx. 250 word] limit)", + "source": "coreServicesIssues", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "3. Please describe how appropriate governance and financial frameworks have been maintained, as required in the Deed (RCS7). Include any management actions that have been taken to ensure governance frameworks are appropriate. (1250 character, [approx. 250 word] limit)", + "source": "governanceFrameworksMaintained", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "3.a Please list the types of financial agreements applied relevant to delivery of regional capacity services or projects. (1250 character, [approx. 250 word] limit)", + "source": "financialAgreementsApplied", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "3.b Please confirm probity and conflict of interest requirements were addressed and documented for the processes listed above in 3.a.", + "source": "interestRequirementsConfirmation", + "type": "boolean" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "3.c Please describe actions undertaken in this financial year (if any) to ensure the development of employee and management competence in First Nations peoples’ culture. (1250 character, [approx. 250 word] limit)", + "source": "firstNationsPeopleDevelopment", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "3.d Please confirm you have submitted the register of all Subcontractors to your Customer Contract Manager as per clause 20.7 of the Deed.", + "source": "subContractorsRegisterSubmitted", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "", + "source": "subContractorsRegisterNotSubmitted", + "preLabel": "Please submit your Subcontractor register to your Customer Contract Manager." + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "3.e Have organisational risk management processes been implemented and documented?", + "source": "riskManagementImplemented", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "3.e(i) Please describe what management actions have been undertaken in relation to risk reviews and implementation. (1250 character, [approx. 250 word] limit)", + "source": "yesRiskManagementActions", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "3.e(ii) Please provide reasons to explain why and timeframes for when this will be done. (1250 character, [approx. 250 word] limit)", + "source": "noRiskManagementActions", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "4. Have any governance risks or issues occurred?", + "css": "span6", + "source": "governanceIssuesOccurred", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "4. a) Please describe what management actions have been taken. (1250 character [approx. 250 word] limit).", + "source": "managementActionsForGovernanceRisksAndIssues", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "5. Have adaptive management actions been implemented, or planned to be implemented, to improve the delivery of Core Services?", + "css": "span6", + "source": "adaptiveManagementImplemented", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "5. a) Please describe these adaptive management actions and how they are/ will be implemented. (1250 character [approx. 250 word] limit).", + "source": "adaptiveManagementActions", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "6. Have any notifiable Work Health and Safety incidents occurred, while undertaking Core Services?", + "css": "span6", + "source": "whsIncidentsOccurred", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "6. a) Please describe the Work Health and Safety incidents, were they reported and the outcome of any investigation. (1250 character [approx. 250 word] limit).", + "source": "whsIncidents", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "7. Please complete the below table on Core Services plans", + "helpText": "Provide the department with a copy of your updated plan" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "coreServicesPlansTable", + "type": "table", + "disableTableUpload": true, + "columns": [ + { + "title": "Plan:", + "source": "coreServicesPlans", + "type": "readonlyText", + "width": "30%" + }, + { + "title": "Date last reviewed", + "source": "coreServicesPlanLastReviewed", + "type": "date", + "width": "10%" + }, + { + "title": "Are there any outstanding actions required to get you on track to meet target measures in your plan?", + "source": "coreServicesPlanActionsRequired", + "type": "textarea", + "width": "50%" + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "8. Community participation and investment in projects delivered under the Services Agreement", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "8. a) Please describe how the community has participated in the delivery of Core Services and projects. (1250 character [approx. 250 word] limit).", + "source": "communityParticipation", + "type": "textarea", + "helpText": "Provide information on all community participation in any Core Services and relevant Projects over the past 12 months" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "8. b) Please provide the level of community investment that contributes to the requirement of clause 3.7(m)(ii) in Schedule 2 Statement of Works, or equivalent clause. [that at least 20% of the combined value of RLP Projects delivered in a management unit by a Service Provider must directly support the delivery of small on-ground projects and related activities that are delivered by, or directly engage with, the local landcare community (the Requirement)]. (1250 character [approx. 250 word] limit).", + "source": "communityParticipationFor20PercentRequirement", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "8. c) Are you on track to meet the Requirement over the life of the agreed Services Agreement? Note that quantitative figures will be collected in Question 8d), and the investment percentage will be calculated. (1250 character [approx. 250 word] limit).", + "source": "requirementAgreedServicesAgreement", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "8. d) i) Enter the total contracted value of investments in your Management Unit to 2023 where clause 3.7(m)(ii) of the Statement of Work applies", + "source": "totalInvestmentUnderClause3Point7", + "type": "number", + "helpText": "The total value of project services minus projects with an exemption from SOW3.7m(ii)" + } + ] + }, + { + "type": "row", + "items": [ + { + "title": "8. d) ii) In the last 12 months what has been the value of investments made that contribute to this requirement?", + "type": "table", + "disableTableUpload": true, + "columns": [ + { + "title": "2018/19 ($)", + "source": "investment2018_19", + "type": "number", + "readonly": true + }, + { + "title": "2019/20 ($)", + "source": "investment2019_20", + "type": "number", + "readonly": true + }, + { + "title": "2020/21 ($)", + "source": "investment2020_21", + "type": "number", + "readonly": true + }, + { + "title": "2021/22 ($)", + "source": "investment2021_22", + "type": "number", + "readonly": true + }, + { + "title": "2022/23 ($)", + "source": "investment2022_23", + "type": "number" + }, + { + "title": "Total ($)", + "source": "investmentTotal", + "type": "number" + }, + { + "title": "%", + "source": "percentageInvested", + "type": "number" + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "8. e) Please explain any variation from previous year's reporting, including any investment that has been finalised since the previous report.", + "source": "variationPreviousReportingYear", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "9. Indigenous employment and procurement investment", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "9. a) Please describe how Indigenous people have participated in the delivery of the Core Services and projects. (1250 character [approx. 250 word] limit)", + "source": "indigenousParticipation", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "9. b) Please describe the level of Indigenous employment and procurement investment that contributes to the requirement of clause 40.2 of the agreed Services Agreement.", + "source": "indigenousParticipationForClause40Point2", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "9. c) Are you on track to meet the requirement of clause 40.2 of the agreed Services Agreement over the life of the agreed Services Agreement? Note that quantitative figures will be collected in question 9e), and the investment percentage will be calculated. (1250 character [approx. 250 word] limit)", + "source": "agreedServicesForClause40Point2", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "9. d) Please identify level of Indigenous employment and procurement investment you have agreed to provide under your Services Agreement", + "source": "indigenousParticipationTarget", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "9. e) i) Enter the total contracted value of investments in your Management Unit to 2023 where clause 40.2 of the agreed Services Agreement applies.", + "helpText": "The total value of services minus projects with an exemption from clause 40.2(a)(ii)" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "indigenousInvestmentAmount", + "css": "span2", + "type": "currency" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "9. e) ii) In the last 12 months what has been the value of services subcontracted to Indigenous Enterprises where clause 40.2(a)(ii) of the agreed Services Agreement applies?", + "helpText": "Please enter any information known for program reporting purposes. Note that there are a number of options presented to meet the investment requirement in clause 40.2. You do not need to meet the requirement for all options" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "table", + "disableTableUpload": true, + "columns": [ + { + "title": "2018/19 ($)", + "source": "serviceSubcontracted2018_19", + "type": "number", + "readonly": true + }, + { + "title": "2019/20 ($)", + "source": "serviceSubcontracted2019_20", + "type": "number", + "readonly": true + }, + { + "title": "2020/21 ($)", + "source": "serviceSubcontracted2020_21", + "type": "number", + "readonly": true + }, + { + "title": "2021/22 ($)", + "source": "serviceSubcontracted2021_22", + "type": "number", + "readonly": true + }, + { + "title": "2022/23 ($)", + "source": "serviceSubcontracted2022_23", + "type": "number" + }, + { + "title": "Total ($)", + "source": "serviceSubcontractedTotal", + "type": "number" + }, + { + "title": "% of total", + "source": "percentageSubcontractedOfTotal", + "type": "number" + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "title": "9. e) iii) In the past 12 months what has been the level of full-time equivalent (FTE) Australian-based workforce deployed on subcontracts to deliver services where clause 40.2(a)(1)(A) of the agreed Services Agreement applies?", + "source": "subcontractedWorkForceByFinancialYear", + "type": "table", + "disableTableUpload": true, + "columns": [ + { + "title": "", + "source": "contractWorkforceType", + "type": "readonlyText", + "width": "40%" + }, + { + "title": "2018/19", + "source": "contractWorkforce2018_19", + "type": "number", + "width": "10%", + "readonly": true + }, + { + "title": "2019/20", + "source": "contractWorkforce2019_20", + "type": "number", + "width": "10%", + "readonly": true + }, + { + "title": "2020/21", + "source": "contractWorkforce2020_21", + "type": "number", + "width": "10%", + "readonly": true + }, + { + "title": "2021/22", + "source": "contractWorkforce2021_22", + "type": "number", + "width": "10%", + "readonly": true + }, + { + "title": "2022/23", + "source": "contractWorkforce2022_23", + "type": "number", + "width": "10%" + }, + { + "title": "Total", + "source": "contractWorkforceTotal", + "type": "number", + "width": "10%" + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Percentage of Indigenous FTE in subcontracted workforce, calculated from input to table", + "type": "number", + "source": "percentageOfIndigenousSubcontractors" + } + ] + }, + { + "type": "row", + "items": [ + { + "title": "9. e) iv) In the past 12 months what has been the level of full-time equivalent (FTE) Australian-based workforce within the Service Provider's Organisation engaged to deliver the services where clause 40.2(a)(1)(B) of the agreed Services Agreement applies?", + "source": "organisationWorkForceByFinancialYear", + "type": "table", + "disableTableUpload": true, + "columns": [ + { + "title": "", + "source": "organisationWorkforceType", + "type": "readonlyText", + "width": "40%" + }, + { + "title": "2018/19", + "source": "organisationWorkforce2018_19", + "type": "number", + "width": "10%", + "readonly": true + }, + { + "title": "2019/20", + "source": "organisationWorkforce2019_20", + "type": "number", + "width": "10%", + "readonly": true + }, + { + "title": "2020/21", + "source": "organisationWorkforce2020_21", + "type": "number", + "width": "10%", + "readonly": true + }, + { + "title": "2021/22", + "source": "organisationWorkforce2021_22", + "type": "number", + "width": "10%", + "readonly": true + }, + { + "title": "2022/23", + "source": "organisationWorkforce2022_23", + "type": "number", + "width": "10%" + }, + { + "title": "Total", + "source": "organisationWorkforceTotal", + "type": "number", + "width": "10%" + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Percentage of Indigenous FTE in the organisation workforce, calculated from input to table", + "type": "number", + "source": "percentageOfIndigenousEmployees" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "9. f) Please explain any variation from previous year's reporting, including any investment that has been finalised since the previous report.", + "source": "variationPreviousReportingYearInvestment", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "10. What have been the key communications activities undertaken as part of core services? (1250 character [approx. 250 word] limit).", + "source": "keyCommunicationActivities", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "11. Have all required reports in relation to the Regional Agriculture Landcare Facilitator position been submitted?", + "css": "span6", + "source": "waterPlansSubmitted", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "11. a) Please provide a reason why and describe what management actions have been implemented to rectify this. (1250 character [approx. 250 word] limit).", + "source": "waterPlansNotSubmittedReason", + "type": "textarea" + } + ] + } + ], + "pre-populate": [ + { + "source": { + "params": [ + { + "expression": "owner.managementUnitId", + "name": "managementUnitId", + "type": "computed" + }, + { + "name": "startDate", + "value": "2021-07-01T13:00:00Z" + }, + { + "name": "endDate", + "value": "2022-07-01T13:00:00Z" + } + ], + "url": "/managementUnit/previousReportContents/" + }, + "mapping": [ + { + "source-path": "model.data.investment2018_19", + "target": "investment2018_19" + }, + { + "source-path": "model.data.investment2019_20", + "target": "investment2019_20" + }, + { + "source-path": "model.data.investment2020_21", + "target": "investment2020_21" + }, + { + "source-path": "model.data.investment2021_22", + "target": "investment2021_22" + }, + { + "source-path": "model.data.serviceSubcontracted2018_19", + "target": "serviceSubcontracted2018_19" + }, + { + "source-path": "model.data.serviceSubcontracted2019_20", + "target": "serviceSubcontracted2019_20" + }, + { + "source-path": "model.data.serviceSubcontracted2020_21", + "target": "serviceSubcontracted2020_21" + }, + { + "source-path": "model.data.serviceSubcontracted2021_22", + "target": "serviceSubcontracted2021_22" + }, + { + "mapping": [ + { + "source-path": "contractWorkforceType", + "target": "contractWorkforceType" + }, + { + "source-path": "contractWorkforce2018_19", + "target": "contractWorkforce2018_19" + }, + { + "source-path": "contractWorkforce2019_20", + "target": "contractWorkforce2019_20" + }, + { + "source-path": "contractWorkforce2020_21", + "target": "contractWorkforce2020_21" + }, + { + "source-path": "contractWorkforce2021_22", + "target": "contractWorkforce2021_22" + } + ], + "source-path": "model.data.subcontractedWorkForceByFinancialYear", + "target": "subcontractedWorkForceByFinancialYear" + }, + { + "mapping": [ + { + "source-path": "organisationWorkforceType", + "target": "organisationWorkforceType" + }, + { + "source-path": "organisationWorkforce2018_19", + "target": "organisationWorkforce2018_19" + }, + { + "source-path": "organisationWorkforce2019_20", + "target": "organisationWorkforce2019_20" + }, + { + "source-path": "organisationWorkforce2020_21", + "target": "organisationWorkforce2020_21" + }, + { + "source-path": "organisationWorkforce2021_22", + "target": "organisationWorkforce2021_22" + } + ], + "source-path": "model.data.organisationWorkForceByFinancialYear", + "target": "organisationWorkForceByFinancialYear" + } + ] + }, + { + "source": { + "type": "literal", + "literal": { + "coreServicesPlansTable": [ + { + "coreServicesPlans": "Community participation plan" + }, + { + "coreServicesPlans": "Indigenous participation plan" + }, + { + "coreServicesPlans": "Communications plan" + }, + { + "coreServicesPlans": "WHS plan" + } + ] + } + }, + "mapping": [ + { + "source-path": "coreServicesPlansTable", + "target": "coreServicesPlansTable", + "mapping": [ + { + "source-path": "coreServicesPlans", + "target": "coreServicesPlans" + } + ] + } + ], + "merge": { + "coreServicesPlansTable": { + "keys": [ + "coreServicesPlans" + ], + "addUnmatchedNewRows": true, + "deleteUnmatchedExistingRows": true + } + } + } + ] + }, + "templateName": "rlpCoreServicesAnnualReport", + "title": null + } + ], + "status": "active", + "supportsPhotoPoints": false, + "supportsSites": false, + "type": "Report" +} + From 584a5d9ba508a036bb6329b1626a875481a4a790 Mon Sep 17 00:00:00 2001 From: temi Date: Mon, 8 Apr 2024 16:52:05 +1000 Subject: [PATCH 47/95] #3049 - updated ecodata-client-plugin version - added a script to run on ecodata --- build.gradle | 2 +- .../3.2/insertParatooProtocolConfig.js | 448 ++++++++++++++++++ 2 files changed, 449 insertions(+), 1 deletion(-) create mode 100644 src/main/scripts/releases/3.2/insertParatooProtocolConfig.js diff --git a/build.gradle b/build.gradle index 0616d595c..06844481b 100644 --- a/build.gradle +++ b/build.gradle @@ -186,7 +186,7 @@ dependencies { providedCompile "io.methvin:directory-watcher:0.4.0" if (!Boolean.valueOf(inplace)) { - implementation "org.grails.plugins:ecodata-client-plugin:6.3-SPECIES-SNAPSHOT" + implementation "org.grails.plugins:ecodata-client-plugin:6.3-SNAPSHOT" } } diff --git a/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js b/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js new file mode 100644 index 000000000..d177ac29b --- /dev/null +++ b/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js @@ -0,0 +1,448 @@ +var protocols = { + "068d17e8-e042-ae42-1e42-cff4006e64b0": + { + "name": "Opportune", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "opportunistic-surveys", + "overrides": { + "dataModel": { + "opportunistic-observation.number_of_individuals": { + "dwcAttribute": "individualCount" + } + }, + "viewModel": null + } + }, + "cd2cbbc7-2f17-4b0f-91b4-06f46e9c90f2": { + "name": "Vegetation Mapping", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "vegetation-mapping-surveys", + "geometryType": "Point", + "geometryPath": "attributes.position", + "startDatePath": "attributes.vegetation_mapping_survey.data.attributes.start_date_time", + "endDatePath": null, + "surveyIdPath": "attributes.vegetation_mapping_survey.data.attributes.surveyId" + }, + "a9cb9e38-690f-41c9-8151-06108caf539d": + { + "name": "Plot Selection", + "usesPlotLayout": false, + "apiEndpoint": "plot-selections", + "tags": ["site"] + }, + "d7179862-1be3-49fc-8ec9-2e219c6f3854": { + "name": "Plot Layout and Visit", + "usesPlotLayout": false, + "apiEndpoint": "plot-definition-surveys", + "tags": ["site"] + }, + "617df00c-0e4f-4267-9efc-9ca9eae19686": { + "name": "Plot Description(enhanced)", + "apiEndpoint": "plot-description-enhanceds", + "usesPlotLayout": true, + "tags": ["site"] + }, + "dc10f902-e310-45eb-b82a-bebab050b46b": { + "name": "Plot Description(standard)", + "apiEndpoint": "plot-description-standards", + "usesPlotLayout": true, + "tags": ["site"] + }, + "3cbc5277-45fb-4e7a-8f33-19d9bff4cd78": { + "name": "Drone Survey", "usesPlotLayout": false, "tags": ["survey"], + "apiEndpoint": "drone-surveys" + }, + "3d2eaa76-a610-4575-ac30-abf40e57b68a": { + "name": "Dev sandbox", "usesPlotLayout": false, "tags": ["development"], + "apiEndpoint": "dev-sandbox-surveys" + }, + "5fd206b5-25cb-4371-bd90-7b2e8801ea25": { + "name": "Photopoints - DSLR Panorama", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "photopoints-surveys", + }, + "383fa013-c52d-4186-911b-35e9b2375653": { + "name": "Photopoints - Compact Panorama", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "photopoints-surveys", + "startDatePath": "attributes.start_date_time", + "endDatePath": "attributes.end_date_time", + "surveyIdPath": "attributes.surveyId" + }, + "2dbb595b-3541-46bd-b200-13db3a823b74": { + "name": "Photopoints - Device Panorama", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "photopoints-surveys", + }, + "e15db26f-55de-4459-841b-d7ef87dea5cd": { + "name": "Floristics - Enhanced", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "floristics-veg-survey-fulls", + "startDatePath": "attributes.start_date_time", + "endDatePath": "attributes.end_date_time", + "surveyIdPath": "attributes.surveyId" + }, + "bbd550c0-04c5-4a8c-ae39-cc748e920fd4": { + "name": "Floristics - Standard", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "floristics-veg-survey-lites", + "startDatePath": "attributes.start_date_time", + "endDatePath": "attributes.end_date_time", + "surveyIdPath": "attributes.surveyId" + }, + "b92005b0-f418-4208-8671-58993089f587": { + "name": "Plant Tissue Vouchering - Enhanced", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "floristics-veg-genetic-voucher-surveys" + }, + "f01e0673-a29d-48bb-b6ce-cf1c0f0de345": { + "name": "Plant Tissue Vouchering - Standard", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "floristics-veg-genetic-voucher-surveys" + }, + "93e65339-4bce-4ca1-a323-78977865ef93": { + "name": "Cover - Enhanced", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "cover-point-intercept-surveys", + }, + "37a3b018-3779-4c4f-bfb3-d38eb53a2568": { + "name": "Cover - Standard", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "cover-point-intercept-surveys" + }, + "8c47b1f8-fc58-4510-a138-e5592edd2dbc": { + "name": "Cover + Fire - Enhanced", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "cover-point-intercept-surveys" + }, + "58f2b4a6-6ce1-4364-9bae-f96fc3f86958": { + "name": "Cover + Fire - Standard", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "cover-point-intercept-surveys" + }, + "36e9d224-a51f-47ea-9442-865e80144311": { + "name": "Fire Survey", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "fire-surveys" + }, + "5005b0af-4360-4a8c-a203-b2c9e440547e": { + "name": "Basal Area - DBH", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "basal-area-dbh-measure-surveys", + "startDatePath": "attributes.start_date", + "endDatePath": "attributes.start_date", + "overrides": { + "dataModel": { + "floristics-veg-voucher-full.host_species": { + "dataType": "species" + }, + "floristics-veg-voucher-lite.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "floristics-veg-voucher-full.host_species": { + "type": "speciesSelect" + }, + "floristics-veg-voucher-lite.host_species": { + "type": "speciesSelect" + } + } + } + }, + "4b8b35c7-15ef-4abd-a7b2-2f4e24509b52": { + "name": "Basal Area - Basal Wedge", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "basal-wedge-surveys" + }, + "6e613128-92e8-4525-854c-4021f1d4d02f": { + "name": "Coarse Woody Debris", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "coarse-woody-debris-surveys" + }, + "a05f8914-ef4f-4a46-8cf1-d035c9c46d4d": { + "name": "Recruitment - Age Structure", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "recruitment-field-surveys" + }, + "db841be3-dfb7-4860-9474-a131f4de5954": { + "name": "Recruitment - Survivorship", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "recruitment-survivorship-surveys" + }, + "1dd7d3ff-11b5-4690-8167-d8fe148656b9": { + "name": "Soil Sub-pit and Metagenomics", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "soil-sub-pit-and-metagenomics-surveys" + }, + "15ea86ab-22f6-43fa-8cd5-751eab2347ad": { + "name": "Soil Sample Pit", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "soil-pit-characterisation-lites" + }, + "1de5eed1-8f97-431c-b7ca-a8371deb3c28": { + "name": "Soil Site Observation and Pit Characterisation", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "soil-pit-characterisation-fulls" + }, + "39da41f1-dd45-4838-ae57-ea50588fd2bc": { + "name": "Soils - Bulk Density", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "soil-bulk-density-surveys" + }, + "c1b38b0f-a888-4f28-871b-83da2ac1e533": { + "name": "Vertebrate Fauna - Bird Survey", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "bird-surveys", + "overrides": { + "dataModel": { + "bird-survey.bird-survey-observation.count": { + "dwcAttribute": "individualCount" + } + } + } + }, + "ab990a3a-a972-45d2-a384-13c3b01e9c7b": { + "name": "Vertebrate Fauna - Trapping Survey Closure", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "vertebrate-end-trapping-surveys" + }, + "82463b77-aac2-407c-a03c-8669bd73baf0": { + "name": "Invertebrate Fauna - Malaise Trapping", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "invertebrate-malaise-trappings" + }, + "8041a1a4-3e19-4fd2-86b9-d453023b5592": { + "name": "Invertebrate Fauna - Active Search", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "invertebrate-active-search-surveys" + }, + "7f95710a-2003-4119-a2c6-41ce4e34d12a": { + "name": "Condition - Attributes", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "condition-surveys" + }, + "aae4dbd8-845a-406e-b682-ef01c3497711": { + "name": "Dev Sandbox Bulk Survey", + "usesPlotLayout": true, + "tags": ["development"], + "apiEndpoint": "dev-sandbox-bulk-surveys" + }, + "6000cb5f-ad75-41e2-9e3e-c070c527453a": { + "name": "Metadata Collection", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "new-targeted-surveys" + }, + "949ae38f-c047-42a7-8164-38c24ede35d5": { + "name": "Camera Trap Reequipping", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "camera-trap-reequipping-surveys" + }, + "90c0f4cc-a22a-4820-9a8b-a01564bc197a": { + "name": "Fauna Aerial Survey", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "aerial-surveys" + }, + "2c5bb8d7-b624-4dc4-93d7-3f1276e65ad5": { + "name": "Vertebrate Fauna - Trapping Survey Setup", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "vertebrate-trapping-setup-surveys" + }, + "70fbd236-9e51-47a8-93da-125a18a13acc": { + "name": "Vertebrate Fauna - Identify, Measure and Release", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "vertebrate-trap-check-surveys" + }, + "9d2c3fcf-881b-41df-944d-33bb6ef8ac51": { + "name": "Vertebrate true - Active and Passive Search", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "vertebrate-active-passive-search-surveys" + }, + "0628e486-9b33-4d86-98db-c6d3f10f7744": { + "name": "Vertebrate Fauna - Acoustic and Ultrasonic Recordings", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "" + }, + "9e75385a-4783-4911-8870-cca78b44d781": { + "name": "Invertebrate Fauna - Wet Pitfall Trapping", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "invertebrate-wet-pitfall-surveys" + }, + "7dc49039-4999-43f6-8896-e33d7b28a934": { + "name": "Invertebrate Fauna - Rapid Ground Trapping", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "invertebrate-rapid-ground-trappings" + }, + "7b0e4526-726e-4292-a897-238f336ce51e": { + "name": "Invertebrate Fauna - Pan Trapping", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "invertebrate-pan-trappings" + }, + "aa64fd4d-2c5a-4f84-a197-9f3ce6409152": { + "name": "Invertebrate Fauna - Post-field Sampling Curation", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "" + }, + "08adf0ff-43c1-4f19-b2c4-f5da667baf65": { + "name": "Interventions - Data Collection", + "usesPlotLayout": false, + "tags": ["intervention"], + "apiEndpoint": "interventions-general-project-informations" + }, + "ad088dbe-02b2-472a-901f-bd081e590bcf": { + "name": "Camera Trap Deployment", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "camera-trap-deployment-surveys" + }, + "3db7f7b6-a96d-495a-9981-5d6170a7458d": { + "name": "Camera Trap Retrieval", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "camera-trap-retrieval-surveys" + }, + "648d545a-cdae-4c19-bc65-0c9f93d9c0eb": { + "name": "Sign-based Fauna Surveys - Within-plot Belt Transect", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "within-plot-belt-transect-surveys" + }, + "2cd7b489-b582-41f6-9dcc-264f6ea7801a": { + "name": "Sign-based Fauna Surveys - Off-plot Belt Transect", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "off-plot-belt-transect-surveys" + }, + "0c5d1d14-c71b-467f-aced-abe1c83c15d3": { + "name": "Sign-based Fauna - Vehicle Track", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "sign-based-vehicle-track-set-ups" + }, + "a76dac21-94f4-4851-af91-31f6dd00750f": { + "name": "Fauna Ground Counts Transects", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "fauna-ground-counts-surveys" + }, + "80360ceb-bd6d-4ed4-b2ea-9bd45d101d0e": { + "name": "Pest Fauna - Control Activities", + "usesPlotLayout": false, + "tags": ["intervention"], + "apiEndpoint": "pest-fauna-control-activities", + "startDatePath": "attributes.start_time", + "endDatePath": "attributes.end_time", + "geometryType": "LineString" + }, + "228e5e1e-aa9f-47a3-930b-c1468757f81d": { + "name": "Herbivory and Physical Damage - Active Plot Search", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "herbivory-and-physical-damage-active-search-setups" + }, + "cc826a19-a1e7-4dfe-8d6e-f135d258d7f9": { + "name": "Sign-based Fauna - Plot Sign Search", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "sign-based-active-plot-search-surveys" + }, + "685b5e9b-20c2-4688-9b04-b6caaf084aad": { + "name": "Sign-based Fauna - Track Station", + "usesPlotLayout": true, + "tags": ["survey"], + "overrides": { + "dataModel": { + "sign-based-track-station-survey-setup.sign-based-track-station-observation.tracks.number_of_individuals": { + "dwcAttribute": "individualCount" + } + } + }, + "apiEndpoint": "sign-based-track-station-survey-setups" + }, + "d706fd34-2f05-4559-b738-a65615a3d756": { + "name": "Fauna Ground Counts Vantage Point", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "ground-counts-vantage-point-surveys" + }, + "06cd903e-b8b3-40a5-add4-f779739cce35": { + "name": "Herbivory and Physical Damage - Within-plot Belt Transect", + "usesPlotLayout": true, + "tags": ["survey"], + "apiEndpoint": "herbivory-and-physical-damage-belt-transect-setups", + "overrides": { + "dataModel": { + "herbivory-and-physical-damage-belt-transect-setup.target_species.lut": { + "dataType": "species" + }, + "herbivory-and-physical-damage-transect.quadrat.quadrat_observation.herbivory_attributable_fauna_species.lut": { + "dataType": "species" + }, + "herbivory-and-physical-damage-transect.quadrat.quadrat_observation.physical_damage_attributable_fauna_species.lut":{ + "dataType": "species" + } + }, + "viewModel": null + } + }, + "49d02f5d-b148-4b5b-ad6a-90e48c81b294": { + "name": "Herbivory and Physical Damage - Off-plot Transect", + "usesPlotLayout": false, + "tags": ["survey"], + "apiEndpoint": "herbivory-off-plot-belt-transect-setups" + } +}; + + +var key = "paratoo.surveyData.mapping"; +var setting = { + key: key, + value: JSON.stringify(protocols), + dateCreated: ISODate(), + lastUpdated: ISODate() +}; +if (db.setting.findOne({key: key})) { + db.setting.replaceOne({key: key}, setting); +} else { + db.setting.insertOne(setting); +} + From 43fd430b04658dd4225b3658a4b0af2bf9c41144 Mon Sep 17 00:00:00 2001 From: sal153 Date: Mon, 8 Apr 2024 17:45:32 +1000 Subject: [PATCH 48/95] commit updates #3090 --- .../au/org/ala/merit/ProjectController.groovy | 4 ++-- .../au/org/ala/merit/ProjectService.groovy | 13 +----------- grails-app/views/project/_editProject.gsp | 20 +++++++++---------- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index cb31e1c51..806256a25 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -160,7 +160,7 @@ class ProjectController { project.outcomes = new JSONArray(config.outcomes ?: []) project.hasApprovedOrSubmittedReports = reportService.includesSubmittedOrApprovedReports(project.reports) boolean canRegenerateReports = projectService.canRegenerateReports(project) - boolean canManuallyRegenerateReports = projectService.canManuallyRegenerateReports(project) + boolean hasSubmittedOrApprovedFinalReportInCategory = projectService.hasSubmittedOrApprovedFinalReportInCategory(project) def meriPlanVisible = config.includesContent(ProgramConfig.ProjectContent.MERI_PLAN) boolean canModifyMeriPlan = config.requireMeritAdminToReturnMeriPlan ? userService.userIsAlaOrFcAdmin() : user?.isCaseManager def risksAndThreatsVisible = config.includesContent(ProgramConfig.ProjectContent.RISKS_AND_THREATS) && user?.hasViewAccess @@ -204,7 +204,7 @@ class ProjectController { site : [label: 'Sites', visible: config.includesContent(ProgramConfig.ProjectContent.SITES), disabled: !user?.hasViewAccess, editable:user?.isEditor, type: 'tab', template:'projectSites'], dashboard : [label: 'Dashboard', visible: config.includesContent(ProgramConfig.ProjectContent.DASHBOARD), disabled: !user?.hasViewAccess, type: 'tab'], datasets : [label: 'Data set summary', visible: datasetsVisible, template: '/project/dataset/dataSets', type:'tab'], - admin : [label: 'Admin', visible: adminTabVisible, user:user, type: 'tab', template:'projectAdmin', project:project, canChangeProjectDates: canChangeProjectDates, minimumProjectEndDate:minimumProjectEndDate, showMERIActivityWarning:true, showAnnouncementsTab: showAnnouncementsTab, showSpecies:true, meriPlanTemplate:MERI_PLAN_TEMPLATE, showMeriPlanHistory:showMeriPlanHistory, requireMeriPlanApprovalReason:Boolean.valueOf(config.supportsMeriPlanHistory), config:config, activityPeriodDescriptor:config.activityPeriodDescriptor ?: 'Stage', canRegenerateReports: canRegenerateReports, canManuallyRegenerateReports: canManuallyRegenerateReports, canModifyMeriPlan: canModifyMeriPlan, showRequestLabels:config.supportsParatoo]] + admin : [label: 'Admin', visible: adminTabVisible, user:user, type: 'tab', template:'projectAdmin', project:project, canChangeProjectDates: canChangeProjectDates, minimumProjectEndDate:minimumProjectEndDate, showMERIActivityWarning:true, showAnnouncementsTab: showAnnouncementsTab, showSpecies:true, meriPlanTemplate:MERI_PLAN_TEMPLATE, showMeriPlanHistory:showMeriPlanHistory, requireMeriPlanApprovalReason:Boolean.valueOf(config.supportsMeriPlanHistory), config:config, activityPeriodDescriptor:config.activityPeriodDescriptor ?: 'Stage', canRegenerateReports: canRegenerateReports, hasSubmittedOrApprovedFinalReportInCategory: hasSubmittedOrApprovedFinalReportInCategory, canModifyMeriPlan: canModifyMeriPlan, showRequestLabels:config.supportsParatoo]] if (template == MERI_ONLY_TEMPLATE) { model = [details:model.details] diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index 825aa1b6f..98e6521bd 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -774,10 +774,7 @@ class ProjectService { response = updateUnchecked(projectId, [plannedStartDate:plannedStartDate, plannedEndDate:plannedEndDate]) //user explicitly generates the report from the reporting tab - if (!APPLICATION_STATUS.equalsIgnoreCase(project.status)) { - generateProjectStageReports(projectId, dateChangeOptions) - } - + generateProjectStageReports(projectId, dateChangeOptions) if (dateChangeOptions.updateActivities) { updateActivityDates(projectId, previousStartDate) @@ -1133,14 +1130,6 @@ class ProjectService { * been populated with project reports. */ boolean canRegenerateReports(Map project) { - Status.isActive(project.status) || APPLICATION_STATUS.equalsIgnoreCase(project.status) && !hasSubmittedOrApprovedFinalReportInCategory(project) - } - - /** - * Returns true if project reports are allowed to be regenerated. - * This validation disables the "Re-create project reports" if project status is still in Application - */ - boolean canManuallyRegenerateReports(Map project) { Status.isActive(project.status) && !hasSubmittedOrApprovedFinalReportInCategory(project) } diff --git a/grails-app/views/project/_editProject.gsp b/grails-app/views/project/_editProject.gsp index 85e56ccd3..cf2961891 100644 --- a/grails-app/views/project/_editProject.gsp +++ b/grails-app/views/project/_editProject.gsp @@ -172,10 +172,7 @@ Date the project is intended to commence.
    - - - - + @@ -183,23 +180,26 @@ + + +
    - - + + - +
    @@ -311,7 +311,7 @@
    - + Re-create project reports will be disabled when the Project status is not Active, or if the last report in any category has been submitted, cancelled or approved
    From 955279dce5f79bd04d10e6d10946cfbe183eba3d Mon Sep 17 00:00:00 2001 From: temi Date: Tue, 9 Apr 2024 05:20:05 +1000 Subject: [PATCH 49/95] #3049 3.2-SPECIES-SNAPSHOT --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 7781a9e4f..2ce2f2e5b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -meritVersion=3.2-SNAPSHOT +meritVersion=3.2-SPECIES-SNAPSHOT grailsVersion=5.3.5 grailsGradlePluginVersion=5.3.0 groovyVersion=3.0.11 From b3eca81839e27d0ea7f14d3da74304427832e35b Mon Sep 17 00:00:00 2001 From: temi Date: Tue, 9 Apr 2024 14:48:20 +1000 Subject: [PATCH 50/95] #3049 - added activity id to dataset fields --- grails-app/assets/javascripts/dataSets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-app/assets/javascripts/dataSets.js b/grails-app/assets/javascripts/dataSets.js index 8e79e125f..cfcf26671 100644 --- a/grails-app/assets/javascripts/dataSets.js +++ b/grails-app/assets/javascripts/dataSets.js @@ -92,6 +92,7 @@ var DataSetViewModel = function(dataSet, projectService, options) { self.grantId = dataSet.grantId; self.projectName = dataSet.projectName; self.programName = dataSet.programName; + self.activityId = dataSet.activityId; self.programOutcome = ko.observable(dataSet.programOutcome); self.investmentPriorities = ko.observableArray(dataSet.investmentPriorities); self.otherInvestmentPriority = ko.observable(dataSet.otherInvestmentPriority); From dc2d061ccf54fa8694e4ab13243e97119c9112da Mon Sep 17 00:00:00 2001 From: temi Date: Tue, 9 Apr 2024 15:21:42 +1000 Subject: [PATCH 51/95] #3049 - fixed broken test --- src/test/js/spec/DataSetsSpec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/js/spec/DataSetsSpec.js b/src/test/js/spec/DataSetsSpec.js index 79b850132..1c16a0845 100644 --- a/src/test/js/spec/DataSetsSpec.js +++ b/src/test/js/spec/DataSetsSpec.js @@ -112,7 +112,8 @@ describe("The data set summaries view models behave correctly", function () { "otherSensitivity":null, "otherDataSetType":null, "sizeInKB": 205, - "protocol":"guid-1" + "protocol":"guid-1", + "activityId":"1" }; } From 3deca241756cc7150362566d8e1c2ea529dbb22c Mon Sep 17 00:00:00 2001 From: sal153 Date: Tue, 9 Apr 2024 15:45:07 +1000 Subject: [PATCH 52/95] commit progress #3146 --- .../regionalCapacityServicesAnnualReport.json | 869 ++++-------------- 1 file changed, 183 insertions(+), 686 deletions(-) diff --git a/forms/other/regionalCapacityServicesAnnualReport.json b/forms/other/regionalCapacityServicesAnnualReport.json index a43717706..9fb45d068 100644 --- a/forms/other/regionalCapacityServicesAnnualReport.json +++ b/forms/other/regionalCapacityServicesAnnualReport.json @@ -30,6 +30,7 @@ { "dataType": "text", "name": "financialAgreementsApplied", + "description": "This may include landholder agreements, EOIs, procurements, grants, or any agreement where a third party has been engaged to deliver RCS or project services.", "validate": "required,maxSize[1250]" }, { @@ -95,7 +96,7 @@ }, { "dataType": "text", - "name": "governanceIssuesOccurred", + "name": "interestConflictReported", "constraints": [ "Yes", "No" @@ -104,18 +105,18 @@ }, { "dataType": "text", - "name": "managementActionsForGovernanceRisksAndIssues", + "name": "interestConflictNotReported", "behaviour": [ { - "condition": "governanceIssuesOccurred == \"Yes\"", - "type": "enable" + "condition": "interestConflictReported == \"No\"", + "type": "visible" } - ], - "validate": "required,maxSize[1250]" + ] }, { "dataType": "text", - "name": "adaptiveManagementImplemented", + "name": "whsIncidentsReported", + "description": "Refer to Deed of Standing Offer clause 42.3(b) Notifying the Customer for list of WHS notification requirements.", "constraints": [ "Yes", "No" @@ -124,19 +125,28 @@ }, { "dataType": "text", - "name": "adaptiveManagementActions", + "name": "whsIncidentsNotReported", + "behaviour": [ + { + "condition": "whsIncidentsReported == \"No\"", + "type": "visible" + } + ] + }, + { + "dataType": "text", + "name": "whsIncidentsBeenReported", + "validate": "required,maxSize[1250]", "behaviour": [ { - "condition": "adaptiveManagementImplemented == \"Yes\"", + "condition": "whsIncidentsReported == \"Yes\"", "type": "enable" } - ], - "validate": "required,maxSize[1250]" + ] }, { "dataType": "text", - "name": "whsIncidentsOccurred", - "description": "A notifiable incident is prescribed within the Work Health and Safety Act as:
  • the death of a person, or
  • the serious injury or illness of a person, or
  • a dangerous incident
  • ", + "name": "whsPlanReviewed", "constraints": [ "Yes", "No" @@ -145,14 +155,31 @@ }, { "dataType": "text", - "name": "whsIncidents", + "name": "whsPlanNotReviewed", + "validate": "required,maxSize[1250]", "behaviour": [ { - "condition": "whsIncidentsOccurred == \"Yes\"", + "condition": "whsPlanReviewed == \"No\"", "type": "enable" } - ], - "validate": "required,maxSize[1250]" + ] + }, + { + "dataType": "text", + "name": "whsPlanBeenReviewed", + "validate": "required,maxSize[1250]", + "behaviour": [ + { + "condition": "whsPlanReviewed == \"Yes\"", + "type": "enable" + } + ] + }, + { + "dataType": "text", + "name": "completedRcs1Requirements", + "validate": "required,maxSize[1250]", + "description": "An annual update on natural resource management trends in the management unit(s), including against the 5-year Outcomes and related Community knowledge, attitudes and behaviours is identified in RCS3.4(vi)." }, { "dataType": "list", @@ -169,299 +196,82 @@ "validate": "required" }, { - "name": "coreServicesPlanActionsRequired", + "name": "coreServicesPlanStatus", "dataType": "text", - "validate": "required" + "validate": "required", + "constraints": [ + "On track", + "Not on track" + ] + }, + { + "name": "coreServicesPlanStatusNotOnTrack", + "dataType": "text", + "validate": "required,maxSize[1250]", + "behaviour": [ + { + "condition": "coreServicesPlanStatus == \"Not on track\"", + "type": "enable" + } + ] } ] }, { - "dataType": "text", - "name": "communityParticipation", - "validate": "required,maxSize[1250]" + "dataType": "boolean", + "name": "relationshipManagementPlan", + "validate": "required" }, { "dataType": "text", - "name": "communityParticipationFor20PercentRequirement", - "description": "", + "name": "communityParticipation", + "description": "Please do not include activities reported under Projects and Project Supports and Overheads.", "validate": "required,maxSize[1250]" }, { "dataType": "text", - "name": "requirementAgreedServicesAgreement", - "description": "", + "name": "descriptionIndigenousParticipation", + "description": "For example, outline what initiatives you took to try and increase purchasing from Indigenous Enterprises and increase the employment of First Nations people).", "validate": "required,maxSize[1250]" }, - { - "dataType": "number", - "name": "totalInvestmentUnderClause3Point7", - "validate": "required" - }, - { - "name": "investment2018_19", - "dataType": "number", - "validate": "required" - }, - { - "name": "investment2019_20", - "dataType": "number", - "validate": "required" - }, - { - "name": "investment2020_21", - "dataType": "number", - "validate": "required" - }, - { - "name": "investment2021_22", - "dataType": "number", - "validate": "required" - }, - { - "name": "investment2022_23", - "dataType": "number", - "validate": "required" - }, - { - "name": "investmentTotal", - "dataType": "number", - "computed": { - "expression": "investment2018_19+investment2019_20+investment2020_21+investment2021_22+investment2022_23" - } - }, - { - "name": "percentageInvested", - "dataType": "number", - "computed": { - "expression": "investmentTotal/totalInvestmentUnderClause3Point7*100" - } - }, - { - "dataType": "text", - "name": "variationPreviousReportingYear", - "description": "", - "validate": "required" - }, { "dataType": "text", - "name": "indigenousParticipationTarget", - "validate": "required", - "constraints": [ - "N/A - Exempt", - "General - At least 4%" - ] + "name": "deedIncluded", + "description": "For the last 12 months, identify the date you provided your response to the Department and which schedule 10 clause you addressed.", + "validate": "required,maxSize[1250]" }, { "dataType": "text", - "name": "indigenousParticipationForClause40Point2", - "description": "Provide information on all community participation in any Core Services and relevant Projects over the past 12 months", - "validate": "maxSize[1250]", - "behaviour": [ - { - "type": "conditional_validation", - "condition": "indigenousParticipationTarget == \"General - At least 4%\"", - "value": { - "validate": "required,maxSize[1250]" - } - } - ] + "name": "maintainCapability", + "description": "Please do not list communications materials previously reported through Regional Capacity Services quarterly reports.", + "validate": "required,maxSize[1250]" }, { "dataType": "text", - "name": "agreedServicesForClause40Point2", - "description": "", + "name": "environmentalSustainability", "validate": "required,maxSize[1250]" }, { "dataType": "list", - "name": "subcontractedWorkForceByFinancialYear", - "allowRowDelete": "false", - "columns": [ - { - "name": "contractWorkforceType", - "dataType": "text" - }, - { - "name": "contractWorkforce2018_19", - "dataType": "number", - "validate": "required" - }, - { - "name": "contractWorkforce2019_20", - "dataType": "number", - "validate": "required" - }, - { - "name": "contractWorkforce2020_21", - "dataType": "number", - "validate": "required" - }, - { - "name": "contractWorkforce2021_22", - "dataType": "number", - "validate": "required" - }, - { - "name": "contractWorkforce2022_23", - "dataType": "number", - "validate": "required" - }, - { - "name": "contractWorkforceTotal", - "dataType": "number", - "computed": { - "expression": "contractWorkforce2018_19+contractWorkforce2019_20+contractWorkforce2020_21+contractWorkforce2021_22+contractWorkforce2022_23" - } - } - ] - }, - { - "name": "percentageOfIndigenousSubcontractors", - "dataType": "number", - "computed": { - "expression": "subcontractedWorkForceByFinancialYear[0].contractWorkforceTotal()/subcontractedWorkForceByFinancialYear[1].contractWorkforceTotal()*100" - } - }, - { - "dataType": "list", - "name": "organisationWorkForceByFinancialYear", + "name": "projectContractsTable", "allowRowDelete": "false", "columns": [ { - "name": "organisationWorkforceType", - "dataType": "text" - }, - { - "name": "organisationWorkforce2018_19", - "dataType": "number", - "validate": "required" - }, - { - "name": "organisationWorkforce2019_20", - "dataType": "number", - "validate": "required" - }, - { - "name": "organisationWorkforce2020_21", + "name": "totalDcceewContracts", "dataType": "number", "validate": "required" }, { - "name": "organisationWorkforce2021_22", + "name": "totalDaffContracts", "dataType": "number", "validate": "required" }, { - "name": "organisationWorkforce2022_23", + "name": "totalDcceewSubContracts", "dataType": "number", "validate": "required" - }, - { - "name": "organisationWorkforceTotal", - "dataType": "number", - "computed": { - "expression": "organisationWorkforce2018_19+organisationWorkforce2019_20+organisationWorkforce2020_21+organisationWorkforce2021_22+organisationWorkforce2022_23" - } } ] - }, - { - "name": "percentageOfIndigenousEmployees", - "dataType": "number", - "computed": { - "expression": "organisationWorkForceByFinancialYear[0].organisationWorkforceTotal()/organisationWorkForceByFinancialYear[1].organisationWorkforceTotal()*100" - } - }, - { - "dataType": "number", - "name": "indigenousInvestmentAmount", - "validate": "required,min[0]" - }, - { - "name": "serviceSubcontracted2018_19", - "dataType": "number", - "validate": "required" - }, - { - "name": "serviceSubcontracted2019_20", - "dataType": "number", - "validate": "required" - }, - { - "name": "serviceSubcontracted2020_21", - "dataType": "number", - "validate": "required" - }, - { - "name": "serviceSubcontracted2021_22", - "dataType": "number", - "validate": "required" - }, - { - "name": "serviceSubcontracted2022_23", - "dataType": "number", - "validate": "required" - }, - { - "name": "serviceSubcontractedTotal", - "dataType": "number", - "computed": { - "expression": "serviceSubcontracted2018_19+serviceSubcontracted2019_20+serviceSubcontracted2020_21+serviceSubcontracted2021_22+serviceSubcontracted2022_23" - } - }, - { - "name": "percentageSubcontractedOfTotal", - "dataType": "number", - "computed": { - "expression": "serviceSubcontractedTotal/indigenousInvestmentAmount*100" - } - }, - { - "dataType": "text", - "name": "indigenousParticipation", - "description": "Provide information on all Indigenous employment and procurement in Core Services or projects over the past 12 months", - "validate": "maxSize[1250]", - "behaviour": [ - { - "type": "conditional_validation", - "condition": "indigenousParticipationTarget == \"General - At least 4%\"", - "value": { - "validate": "required,maxSize[1250]" - } - } - ] - }, - { - "dataType": "text", - "name": "variationPreviousReportingYearInvestment", - "description": "", - "validate": "required" - }, - { - "dataType": "text", - "name": "keyCommunicationActivities", - "description": "Include communications activities specifically related to Core Services", - "validate": "required,maxSize[1250]" - }, - { - "dataType": "text", - "name": "waterPlansSubmitted", - "constraints": [ - "Yes", - "No" - ], - "validate": "required" - }, - { - "dataType": "text", - "name": "waterPlansNotSubmittedReason", - "behaviour": [ - { - "condition": "waterPlansSubmitted == \"No\"", - "type": "enable" - } - ], - "validate": "required,maxSize[1250]" } ], "name": "RLP - Core services annual report", @@ -471,7 +281,7 @@ "type": "row", "items": [ { - "source": "

    Note: this report applies to Regional Capacity Services (Schedule 2) delivered under the Deed in the last 12 months

    ", + "source": "

    Note: this report applies to Regional Capacity Services (Schedule 2) delivered under the Deed in the last 12 months.

    ", "type": "literal" } ] @@ -590,9 +400,9 @@ "type": "row", "items": [ { - "preLabel": "4. Have any governance risks or issues occurred?", + "preLabel": "4. Have you reported all Conflicts of Interest as per clause 45.2?", "css": "span6", - "source": "governanceIssuesOccurred", + "source": "interestConflictReported", "type": "selectOne" } ] @@ -601,20 +411,9 @@ "type": "row", "items": [ { - "preLabel": "4. a) Please describe what management actions have been taken. (1250 character [approx. 250 word] limit).", - "source": "managementActionsForGovernanceRisksAndIssues", - "type": "textarea" - } - ] - }, - { - "type": "row", - "items": [ - { - "preLabel": "5. Have adaptive management actions been implemented, or planned to be implemented, to improve the delivery of Core Services?", - "css": "span6", - "source": "adaptiveManagementImplemented", - "type": "selectOne" + "type": "", + "source": "interestConflictNotReported", + "preLabel": "Please notify your Customer Contract Manager of any outstanding Conflicts of Interest, and outline how they were managed." } ] }, @@ -622,9 +421,8 @@ "type": "row", "items": [ { - "preLabel": "5. a) Please describe these adaptive management actions and how they are/ will be implemented. (1250 character [approx. 250 word] limit).", - "source": "adaptiveManagementActions", - "type": "textarea" + "source": "5. Work Health and Safety requirements", + "type": "literal" } ] }, @@ -632,9 +430,8 @@ "type": "row", "items": [ { - "preLabel": "6. Have any notifiable Work Health and Safety incidents occurred, while undertaking Core Services?", - "css": "span6", - "source": "whsIncidentsOccurred", + "preLabel": "5.a In the past 12 months, have all notifiable Work Health and Safety incidents (if any) been reported to the Department as per clause 42.3 of the Deed?", + "source": "whsIncidentsReported", "type": "selectOne" } ] @@ -643,9 +440,9 @@ "type": "row", "items": [ { - "preLabel": "6. a) Please describe the Work Health and Safety incidents, were they reported and the outcome of any investigation. (1250 character [approx. 250 word] limit).", - "source": "whsIncidents", - "type": "textarea" + "type": "", + "source": "whsIncidentsNotReported", + "preLabel": "Please notify the Department immediately." } ] }, @@ -653,8 +450,9 @@ "type": "row", "items": [ { - "preLabel": "7. Please complete the below table on Core Services plans", - "helpText": "Provide the department with a copy of your updated plan" + "preLabel": "5.a(i) Has the incident been investigated and/or resolved? (1250 character [approx. 250 word] limit).", + "source": "whsIncidentsBeenReported", + "type": "textarea" } ] }, @@ -662,29 +460,10 @@ "type": "row", "items": [ { - "source": "coreServicesPlansTable", - "type": "table", - "disableTableUpload": true, - "columns": [ - { - "title": "Plan:", - "source": "coreServicesPlans", - "type": "readonlyText", - "width": "30%" - }, - { - "title": "Date last reviewed", - "source": "coreServicesPlanLastReviewed", - "type": "date", - "width": "10%" - }, - { - "title": "Are there any outstanding actions required to get you on track to meet target measures in your plan?", - "source": "coreServicesPlanActionsRequired", - "type": "textarea", - "width": "50%" - } - ] + "preLabel": "5.b Has the WHS Plan been reviewed in the past 12 months?", + "css": "span6", + "source": "whsPlanReviewed", + "type": "selectOne" } ] }, @@ -692,8 +471,9 @@ "type": "row", "items": [ { - "source": "8. Community participation and investment in projects delivered under the Services Agreement", - "type": "literal" + "preLabel": "5.b(i) Please provide details of the review and any changes made to the WHS Plan. Please submit the revised WHS Plan to your Customer Contract Manager if you have not already done so. (1250 character [approx. 250 word] limit).", + "source": "whsPlanBeenReviewed", + "type": "textarea" } ] }, @@ -701,10 +481,9 @@ "type": "row", "items": [ { - "preLabel": "8. a) Please describe how the community has participated in the delivery of Core Services and projects. (1250 character [approx. 250 word] limit).", - "source": "communityParticipation", - "type": "textarea", - "helpText": "Provide information on all community participation in any Core Services and relevant Projects over the past 12 months" + "preLabel": "5.b(ii) Please provide reasons to explain why and timeframes for when this will be done. (1250 character [approx. 250 word] limit).", + "source": "whsPlanNotReviewed", + "type": "textarea" } ] }, @@ -712,9 +491,8 @@ "type": "row", "items": [ { - "preLabel": "8. b) Please provide the level of community investment that contributes to the requirement of clause 3.7(m)(ii) in Schedule 2 Statement of Works, or equivalent clause. [that at least 20% of the combined value of RLP Projects delivered in a management unit by a Service Provider must directly support the delivery of small on-ground projects and related activities that are delivered by, or directly engage with, the local landcare community (the Requirement)]. (1250 character [approx. 250 word] limit).", - "source": "communityParticipationFor20PercentRequirement", - "type": "textarea" + "source": "6. Natural resource management planning ", + "type": "literal" } ] }, @@ -722,8 +500,8 @@ "type": "row", "items": [ { - "preLabel": "8. c) Are you on track to meet the Requirement over the life of the agreed Services Agreement? Note that quantitative figures will be collected in Question 8d), and the investment percentage will be calculated. (1250 character [approx. 250 word] limit).", - "source": "requirementAgreedServicesAgreement", + "preLabel": "6.a Please outline any activities completed this year towards meeting the requirements under RCS1 – to maintain the currency of NRM planning and prioritisation of management actions. (1250 character [approx. 250 word] limit).", + "source": "completedRcs1Requirements", "type": "textarea" } ] @@ -732,10 +510,8 @@ "type": "row", "items": [ { - "preLabel": "8. d) i) Enter the total contracted value of investments in your Management Unit to 2023 where clause 3.7(m)(ii) of the Statement of Work applies", - "source": "totalInvestmentUnderClause3Point7", - "type": "number", - "helpText": "The total value of project services minus projects with an exemption from SOW3.7m(ii)" + "preLabel": "7. Please complete the below table on Regional Capacity Services plans", + "helpText": "" } ] }, @@ -743,48 +519,33 @@ "type": "row", "items": [ { - "title": "8. d) ii) In the last 12 months what has been the value of investments made that contribute to this requirement?", + "source": "coreServicesPlansTable", "type": "table", "disableTableUpload": true, "columns": [ { - "title": "2018/19 ($)", - "source": "investment2018_19", - "type": "number", - "readonly": true - }, - { - "title": "2019/20 ($)", - "source": "investment2019_20", - "type": "number", - "readonly": true - }, - { - "title": "2020/21 ($)", - "source": "investment2020_21", - "type": "number", - "readonly": true - }, - { - "title": "2021/22 ($)", - "source": "investment2021_22", - "type": "number", - "readonly": true + "title": "Plan:", + "source": "coreServicesPlans", + "type": "readonlyText", + "width": "30%" }, { - "title": "2022/23 ($)", - "source": "investment2022_23", - "type": "number" + "title": "Date last reviewed", + "source": "coreServicesPlanLastReviewed", + "type": "date", + "width": "10%" }, { - "title": "Total ($)", - "source": "investmentTotal", - "type": "number" + "title": "Status of implementing actions in plan", + "source": "coreServicesPlanStatus", + "type": "selectOne", + "width": "10%" }, { - "title": "%", - "source": "percentageInvested", - "type": "number" + "title": "Please provide details of actions undertaken for implementation of the plan to be ‘on-track’, the reasons these have been unsuccessful, and future actions to be undertaken.", + "source": "coreServicesPlanStatusNotOnTrack", + "type": "textarea", + "width": "50%" } ] } @@ -794,17 +555,7 @@ "type": "row", "items": [ { - "preLabel": "8. e) Please explain any variation from previous year's reporting, including any investment that has been finalised since the previous report.", - "source": "variationPreviousReportingYear", - "type": "textarea" - } - ] - }, - { - "type": "row", - "items": [ - { - "source": "9. Indigenous employment and procurement investment", + "source": "8. Relationship management plan", "type": "literal" } ] @@ -813,9 +564,9 @@ "type": "row", "items": [ { - "preLabel": "9. a) Please describe how Indigenous people have participated in the delivery of the Core Services and projects. (1250 character [approx. 250 word] limit)", - "source": "indigenousParticipation", - "type": "textarea" + "preLabel": "8.a Please confirm you have notified the Department of any changes to key contact details as per RCS5.2.", + "source": "relationshipManagementPlan", + "type": "boolean" } ] }, @@ -823,9 +574,8 @@ "type": "row", "items": [ { - "preLabel": "9. b) Please describe the level of Indigenous employment and procurement investment that contributes to the requirement of clause 40.2 of the agreed Services Agreement.", - "source": "indigenousParticipationForClause40Point2", - "type": "textarea" + "source": "9. Community participation ", + "type": "literal" } ] }, @@ -833,8 +583,8 @@ "type": "row", "items": [ { - "preLabel": "9. c) Are you on track to meet the requirement of clause 40.2 of the agreed Services Agreement over the life of the agreed Services Agreement? Note that quantitative figures will be collected in question 9e), and the investment percentage will be calculated. (1250 character [approx. 250 word] limit)", - "source": "agreedServicesForClause40Point2", + "preLabel": "9.a Please describe how the Community and First Nations people has been engaged and supported in the prioritising, planning and the delivery of natural resource management activities as they relate to the 5-year outcomes and any investment priorities across the management unit (RCS2). (1250 character [approx. 250 word] limit)", + "source": "communityParticipation", "type": "textarea" } ] @@ -843,28 +593,8 @@ "type": "row", "items": [ { - "preLabel": "9. d) Please identify level of Indigenous employment and procurement investment you have agreed to provide under your Services Agreement", - "source": "indigenousParticipationTarget", - "type": "selectOne" - } - ] - }, - { - "type": "row", - "items": [ - { - "preLabel": "9. e) i) Enter the total contracted value of investments in your Management Unit to 2023 where clause 40.2 of the agreed Services Agreement applies.", - "helpText": "The total value of services minus projects with an exemption from clause 40.2(a)(ii)" - } - ] - }, - { - "type": "row", - "items": [ - { - "source": "indigenousInvestmentAmount", - "css": "span2", - "type": "currency" + "source": "10. Indigenous employment and procurement investment ", + "type": "literal" } ] }, @@ -872,8 +602,9 @@ "type": "row", "items": [ { - "preLabel": "9. e) ii) In the last 12 months what has been the value of services subcontracted to Indigenous Enterprises where clause 40.2(a)(ii) of the agreed Services Agreement applies?", - "helpText": "Please enter any information known for program reporting purposes. Note that there are a number of options presented to meet the investment requirement in clause 40.2. You do not need to meet the requirement for all options" + "preLabel": "10.a Please describe how Indigenous people have participated in the delivery of the Regional Capacity Services (Deed clause 38). (1250 character [approx. 250 word] limit)", + "source": "descriptionIndigenousParticipation", + "type": "textarea" } ] }, @@ -881,49 +612,9 @@ "type": "row", "items": [ { - "type": "table", - "disableTableUpload": true, - "columns": [ - { - "title": "2018/19 ($)", - "source": "serviceSubcontracted2018_19", - "type": "number", - "readonly": true - }, - { - "title": "2019/20 ($)", - "source": "serviceSubcontracted2019_20", - "type": "number", - "readonly": true - }, - { - "title": "2020/21 ($)", - "source": "serviceSubcontracted2020_21", - "type": "number", - "readonly": true - }, - { - "title": "2021/22 ($)", - "source": "serviceSubcontracted2021_22", - "type": "number", - "readonly": true - }, - { - "title": "2022/23 ($)", - "source": "serviceSubcontracted2022_23", - "type": "number" - }, - { - "title": "Total ($)", - "source": "serviceSubcontractedTotal", - "type": "number" - }, - { - "title": "% of total", - "source": "percentageSubcontractedOfTotal", - "type": "number" - } - ] + "preLabel": "10.b Where your Deed includes a Schedule 10, please provide an update on the progress made towards meeting these requirements or identify where you have previously provided information to the Department to demonstrate your compliance with the obligations under the Schedule. (1250 character [approx. 250 word] limit)", + "source": "deedIncluded", + "type": "textarea" } ] }, @@ -931,58 +622,8 @@ "type": "row", "items": [ { - "title": "9. e) iii) In the past 12 months what has been the level of full-time equivalent (FTE) Australian-based workforce deployed on subcontracts to deliver services where clause 40.2(a)(1)(A) of the agreed Services Agreement applies?", - "source": "subcontractedWorkForceByFinancialYear", - "type": "table", - "disableTableUpload": true, - "columns": [ - { - "title": "", - "source": "contractWorkforceType", - "type": "readonlyText", - "width": "40%" - }, - { - "title": "2018/19", - "source": "contractWorkforce2018_19", - "type": "number", - "width": "10%", - "readonly": true - }, - { - "title": "2019/20", - "source": "contractWorkforce2019_20", - "type": "number", - "width": "10%", - "readonly": true - }, - { - "title": "2020/21", - "source": "contractWorkforce2020_21", - "type": "number", - "width": "10%", - "readonly": true - }, - { - "title": "2021/22", - "source": "contractWorkforce2021_22", - "type": "number", - "width": "10%", - "readonly": true - }, - { - "title": "2022/23", - "source": "contractWorkforce2022_23", - "type": "number", - "width": "10%" - }, - { - "title": "Total", - "source": "contractWorkforceTotal", - "type": "number", - "width": "10%" - } - ] + "source": "11. Maintain capability to conduct communication activities ", + "type": "literal" } ] }, @@ -990,9 +631,9 @@ "type": "row", "items": [ { - "preLabel": "Percentage of Indigenous FTE in subcontracted workforce, calculated from input to table", - "type": "number", - "source": "percentageOfIndigenousSubcontractors" + "preLabel": "11.a What have been the key communications activities undertaken as part of Regional Capacity Services (RCS3)? (1250 character [approx. 250 word] limit)", + "source": "maintainCapability", + "type": "textarea" } ] }, @@ -1000,58 +641,8 @@ "type": "row", "items": [ { - "title": "9. e) iv) In the past 12 months what has been the level of full-time equivalent (FTE) Australian-based workforce within the Service Provider's Organisation engaged to deliver the services where clause 40.2(a)(1)(B) of the agreed Services Agreement applies?", - "source": "organisationWorkForceByFinancialYear", - "type": "table", - "disableTableUpload": true, - "columns": [ - { - "title": "", - "source": "organisationWorkforceType", - "type": "readonlyText", - "width": "40%" - }, - { - "title": "2018/19", - "source": "organisationWorkforce2018_19", - "type": "number", - "width": "10%", - "readonly": true - }, - { - "title": "2019/20", - "source": "organisationWorkforce2019_20", - "type": "number", - "width": "10%", - "readonly": true - }, - { - "title": "2020/21", - "source": "organisationWorkforce2020_21", - "type": "number", - "width": "10%", - "readonly": true - }, - { - "title": "2021/22", - "source": "organisationWorkforce2021_22", - "type": "number", - "width": "10%", - "readonly": true - }, - { - "title": "2022/23", - "source": "organisationWorkforce2022_23", - "type": "number", - "width": "10%" - }, - { - "title": "Total", - "source": "organisationWorkforceTotal", - "type": "number", - "width": "10%" - } - ] + "source": "12. Environmental sustainability ", + "type": "literal" } ] }, @@ -1059,9 +650,9 @@ "type": "row", "items": [ { - "preLabel": "Percentage of Indigenous FTE in the organisation workforce, calculated from input to table", - "type": "number", - "source": "percentageOfIndigenousEmployees" + "preLabel": "12.a Please outline what initiatives you have put in place to support environmental sustainability outcomes and increase the use of Recycled Content during the Deed Period and each Work Order Term, as per clause 15.8 of the Deed. (1250 character [approx. 250 word] limit)", + "source": "environmentalSustainability", + "type": "textarea" } ] }, @@ -1069,9 +660,8 @@ "type": "row", "items": [ { - "preLabel": "9. f) Please explain any variation from previous year's reporting, including any investment that has been finalised since the previous report.", - "source": "variationPreviousReportingYearInvestment", - "type": "textarea" + "source": "

    Annual reporting on total value of Contracts

    ", + "type": "literal" } ] }, @@ -1079,9 +669,8 @@ "type": "row", "items": [ { - "preLabel": "10. What have been the key communications activities undertaken as part of core services? (1250 character [approx. 250 word] limit).", - "source": "keyCommunicationActivities", - "type": "textarea" + "source": "

    Note: this report applies to other Contracts (work orders) entered into under the Deed in the last 12 months.

    ", + "type": "literal" } ] }, @@ -1089,10 +678,7 @@ "type": "row", "items": [ { - "preLabel": "11. Have all required reports in relation to the Regional Agriculture Landcare Facilitator position been submitted?", - "css": "span6", - "source": "waterPlansSubmitted", - "type": "selectOne" + "preLabel": "Please complete the table below with the value of project contracts that you have entered into under the Deed. Do not include Regional Capacity Services." } ] }, @@ -1100,136 +686,47 @@ "type": "row", "items": [ { - "preLabel": "11. a) Please provide a reason why and describe what management actions have been implemented to rectify this. (1250 character [approx. 250 word] limit).", - "source": "waterPlansNotSubmittedReason", - "type": "textarea" - } - ] - } - ], - "pre-populate": [ - { - "source": { - "params": [ - { - "expression": "owner.managementUnitId", - "name": "managementUnitId", - "type": "computed" - }, - { - "name": "startDate", - "value": "2021-07-01T13:00:00Z" - }, - { - "name": "endDate", - "value": "2022-07-01T13:00:00Z" - } - ], - "url": "/managementUnit/previousReportContents/" - }, - "mapping": [ - { - "source-path": "model.data.investment2018_19", - "target": "investment2018_19" - }, - { - "source-path": "model.data.investment2019_20", - "target": "investment2019_20" - }, - { - "source-path": "model.data.investment2020_21", - "target": "investment2020_21" - }, - { - "source-path": "model.data.investment2021_22", - "target": "investment2021_22" - }, - { - "source-path": "model.data.serviceSubcontracted2018_19", - "target": "serviceSubcontracted2018_19" - }, - { - "source-path": "model.data.serviceSubcontracted2019_20", - "target": "serviceSubcontracted2019_20" - }, - { - "source-path": "model.data.serviceSubcontracted2020_21", - "target": "serviceSubcontracted2020_21" - }, - { - "source-path": "model.data.serviceSubcontracted2021_22", - "target": "serviceSubcontracted2021_22" - }, - { - "mapping": [ - { - "source-path": "contractWorkforceType", - "target": "contractWorkforceType" - }, - { - "source-path": "contractWorkforce2018_19", - "target": "contractWorkforce2018_19" - }, - { - "source-path": "contractWorkforce2019_20", - "target": "contractWorkforce2019_20" - }, - { - "source-path": "contractWorkforce2020_21", - "target": "contractWorkforce2020_21" - }, - { - "source-path": "contractWorkforce2021_22", - "target": "contractWorkforce2021_22" - } - ], - "source-path": "model.data.subcontractedWorkForceByFinancialYear", - "target": "subcontractedWorkForceByFinancialYear" - }, - { - "mapping": [ - { - "source-path": "organisationWorkforceType", - "target": "organisationWorkforceType" - }, - { - "source-path": "organisationWorkforce2018_19", - "target": "organisationWorkforce2018_19" - }, + "source": "projectContractsTable", + "type": "table", + "disableTableUpload": true, + "columns": [ { - "source-path": "organisationWorkforce2019_20", - "target": "organisationWorkforce2019_20" + "title": "Total value ($ excl GST) of Contracts for which the Customer is DCCEEW", + "source": "totalDcceewContracts", + "type": "number", + "width": "33%" }, { - "source-path": "organisationWorkforce2020_21", - "target": "organisationWorkforce2020_21" + "title": "Total value ($ excl GST) of Contracts for which the Customer is DAFF", + "source": "totalDaffContracts", + "type": "number", + "width": "34%" }, { - "source-path": "organisationWorkforce2021_22", - "target": "organisationWorkforce2021_22" + "title": "Total value ($ excl GST) of Subcontracts with First Nations people / Indigenous Enterprises for which the Customer is DCCEEW", + "source": "totalDcceewSubContracts", + "type": "number", + "width": "33%" } - ], - "source-path": "model.data.organisationWorkForceByFinancialYear", - "target": "organisationWorkForceByFinancialYear" + ] } ] - }, + } + ], + "pre-populate": [ { "source": { "type": "literal", "literal": { "coreServicesPlansTable": [ { - "coreServicesPlans": "Community participation plan" - }, - { - "coreServicesPlans": "Indigenous participation plan" + "coreServicesPlans": "Community Participation Plan" }, { - "coreServicesPlans": "Communications plan" + "coreServicesPlans": "Indigenous Participation Plan" }, { - "coreServicesPlans": "WHS plan" + "coreServicesPlans": "Communications Plan" } ] } @@ -1258,7 +755,7 @@ } ] }, - "templateName": "rlpCoreServicesAnnualReport", + "templateName": "regionalCapacityServicesAnnualReport", "title": null } ], From 042651d2e8dc4dd6ec4d0190231a0c02bf7f5374 Mon Sep 17 00:00:00 2001 From: sal153 Date: Wed, 10 Apr 2024 14:37:08 +1000 Subject: [PATCH 53/95] commit program script #3148 --- .../3.2/adhoc/createBushBlitzSubProgram.js | 283 ++++++++++++++++++ 1 file changed, 283 insertions(+) create mode 100644 src/main/scripts/releases/3.2/adhoc/createBushBlitzSubProgram.js diff --git a/src/main/scripts/releases/3.2/adhoc/createBushBlitzSubProgram.js b/src/main/scripts/releases/3.2/adhoc/createBushBlitzSubProgram.js new file mode 100644 index 000000000..4d7590c17 --- /dev/null +++ b/src/main/scripts/releases/3.2/adhoc/createBushBlitzSubProgram.js @@ -0,0 +1,283 @@ +load('../../../utils/uuid.js'); +load('../../../utils/audit.js'); +load('../../../utils/program.js'); + +var config = + { + "meriPlanContents": [ + { + "template": "programOutcome", + "model": { + "maximumPriorities": "1000", + "helpTextHeading": "Bushfire program outcomes are listed in the secondary outcomes" + } + }, + { + "template": "outcomeStatements", + "model": { + "subtitle": "Please provide project outcome statements", + "placeholder": "", + "title": "Outcome statements" + } + }, + { + "template": "sectionHeading", + "model": { + "heading": "Project Details" + } + }, + { + "template": "name", + "model": { + "tableFormatting": true, + "placeHolder": "[150 characters]" + } + }, + { + "template": "description", + "model": { + "tableFormatting": true, + "helpTextHeading": "A succinct overview of the project: (i) what will be done and (ii) why it will be done", + "maxSize": "1000", + "placeholder": "Please provide a short description of this project. This project description will be visible on the project overview page in MERIT [Free text; limit response to 1000 characters (approx. 150 words)]" + } + }, + { + "template": "projectPartnerships", + "model": { + "namePlaceHolder": "[Free text]", + "helpTextPartnerNature": "If partnership with an organisation: provide the name of the organisation and the role they will play/how you will support them. If partnering with community groups or members of the public: indicate each group or individual you will engage with", + "partnershipPlaceHolder": "[Free text]" + } + }, + { + "template": "keyThreats", + "model": { + "interventionHelpText": "Describe the proposed interventions to address the threat and how this will deliver on the project outcome" + } + }, + { + "template": "projectMethodology", + "model": { + "maxSize": "4000", + "title": "Project methodology", + "tableHeading": "Please describe the methodology that will be used to achieve the project's outcome statements. To help demonstrate best practice delivery approaches and cost effectiveness of methodologies used, include details of the specific delivery mechanisms to leverage change (e.g. delivery method, approach and justification)", + "placeHolder": "[Free text; limit response to 4000 characters (approx. 650 words)]" + } + }, + { + "template": "monitoringBaseline", + "model": { + "baselineMethodHelpText": "Describe the project baseline (s) units of measure or data which will be used to report progress towards this project’s outcome and the monitoring design", + "titleHelpText": "Describe the project baseline(s) units of measure or data which will be used to report progress towards this project’s outcomes and the monitoring design. Refer to the Regional Land Partnerships Evaluation Plan which provides guidance on baselines and the monitoring indicators for each outcome. Note, other monitoring indicators can also be used." + } + }, + { + "template": "monitoringIndicators", + "model": { + "approachHeading": "Describe the project monitoring indicator(s) approach", + "indicatorHeading": "Project monitoring indicators", + "indicatorHelpText": "List the measurable indicators of project success that will be monitored. Indicators should link back to the outcome statements and have units of measure. Indicators should measure both project outputs (e.g. area (ha) of rabbit control, length (km) of predator proof fencing) and change the project is aiming to achieve (e.g. Change in abundance of X threatened species at Y location, Change in vegetation cover (%), etc).", + "approachHelpText": "How will the indicator be monitored? Briefly describe the method to be used to monitor the indicator (including timing of monitoring, who will collect/collate / analyse data, etc)", + "indicatorPlaceHolder": "[Free text]", + "approachPlaceHolder": "[Free text]" + } + }, + { + "template": "projectReview" + }, + { + "template": "serviceTargets", + "model": { + "title": "Activities and Targets Table", + "serviceName": "Activities" + } + } + ], + "excludes": [], + "programServiceConfig": { + "serviceFormName": "Bush Blitz Progress Report", + "programServices": [ + { + "serviceTargets": [ + "0df7c177-2864-4a25-b420-2cf3c45ce749" + ], + "serviceId": 1 + }, + { + "serviceTargets": [ + "69deaaf9-cdc2-439a-b684-4cffdc7f224e" + ], + "serviceId": 2 + }, + { + "serviceTargets": [ + "1f8161bc-908b-4ec8-ab7f-edac973a657d", + "88908921-1248-4a7c-b185-51c625c737e3", + "26a8213e-1770-4dc4-8f99-7e6302197504", + "15a49c6f-2177-4183-9955-c7e487970171", + "fe9f1a6c-e614-489a-80fa-4d6d76f1cf95", + "f7089b5b-333f-4f33-b0df-f7ef88e9f683" + ], + "serviceId": 3 + }, + { + "serviceTargets": [ + "011a161f-7275-4b5e-986e-3fe4640d0265", + "3e402423-3e0b-4549-9e09-2b71329ea069" + ], + "serviceId": 13 + }, + { + "serviceTargets": [ + "def4e2af-dcad-4a15-8336-3765e6671f08", + "cf3ccbf5-d031-4a22-a746-961cdefa7318" + ], + "serviceId": 15 + }, + { + "serviceTargets": [ + "2d877a91-6312-4c44-9ae1-2494ea3e43db" + ], + "serviceId": 17 + }, + { + "serviceTargets": [ + "4f747371-fa5f-4200-ae37-6cd59d268fe8" + ], + "serviceId": 29 + } + ] + }, + "visibility": "public", + "organisationRelationship": "Service Provider", + "excludeFinancialYearData": false, + "requiresActivityLocking": true, + "projectTemplate": "rlp", + "activityPeriodDescriptor": "Outputs report #", + "meriPlanTemplate": "configurableMeriPlan", + "riskAndThreatTypes": [ + "Performance", + "Work Health and Safety", + "People resources", + "Financial", + "External stakeholders", + "Natural Environment" + ], + "projectReports": [ + { + "reportType": "Activity", + "firstReportingPeriodEnd": "2022-12-31T13:00:00Z", + "reportDescriptionFormat": "Progress Report %1d", + "reportNameFormat": "Progress Report %1d", + "reportingPeriodInMonths": 6, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "minimumReportDurationInDays": 3, + "label": "Semester", + "category": "Progress Reports", + "activityType": "Bush Blitz Progress Report", + "reportsAlignedToCalendar": true, + "canSubmitDuringReportingPeriod": true + }, + { + "reportType": "Single", + "reportDescriptionFormat": "Final Report", + "reportNameFormat": "Final Report", + "reportingPeriodInMonths": 0, + "multiple": false, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "alignToOwnerEnd": true, + "label": "Final Report", + "category": "Final Report", + "reportsAlignedToCalendar": false, + "activityType": "Koala Conservation Final Report", + "alignToOwnerStart": true + } + ], + "navigationMode": "returnToProject", + "objectives": [ + "Prevent extinction and limit decline of native species", + "Reduce immediate suffering of native animals directly impacted by the fires", + "Maximise chances of long-term recovery of native species and communities", + "Ensure learning and continual improvement is core of the response" + ], + "supportedServiceIds": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36 + ] + }; + +var priorities = [ + { + "category": "Bush Blitz Priority", + "priority": "Species taxonomy" + } +]; + +var outcomes = [ + { + "priorities": [ + { + "category": "Bush Blitz Priority" + } + ], + "targeted": true, + "supportsMultiplePrioritiesAsPrimary": false, + "shortDescription": "Increased Taxonomic Information", + "type": "primary", + "category": "environment", + "outcome": "Improved scientific knowledge and public awareness of the presence and features of previously undiscovered species, and of known species, to support improved management and conservation of Australia’s biodiversity." + } +] + +//Create the parent program +let programName = "Natural Heritage Trust"; +var parent = createOrFindProgram(programName); +var subprograms = ["Bush Blitz"] + +subprograms.forEach(function (subProgram){ + createOrFindProgram(subProgram, parent._id, "Habitat Restoration Projects - Grants"); +}); + +subprograms.forEach(function (subprogram){ + var program = db.program.find({name: subprogram}); + while(program.hasNext()){ + var p = program.next(); + print("sub program ID: " + p.programId) + db.program.updateOne({programId:p.programId}, {$set:{config:config, outcomes:outcomes, priorities:priorities}}); + } +}); From e9a50b9b38ef922c9083ee35e37db28850d17210 Mon Sep 17 00:00:00 2001 From: temi Date: Thu, 11 Apr 2024 06:51:29 +1000 Subject: [PATCH 54/95] #3049 - changed commonName attribute --- grails-app/services/au/org/ala/merit/ProjectService.groovy | 2 +- src/main/scripts/releases/3.2/insertParatooProtocolConfig.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index 8177cba70..e91d0d4d1 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -2231,7 +2231,7 @@ class ProjectService { records?.each { record -> record.species = [ scientificName: record.scientificName, - commonName: record.commonName, + commonName: record.vernacularName, outputSpeciesId: record.outputSpeciesId, guid: record.scientificNameID ?: record.guid ?: record.taxonConceptID ?: "A_GUID" ] diff --git a/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js b/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js index d177ac29b..9e5b619fd 100644 --- a/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js +++ b/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js @@ -391,7 +391,7 @@ var protocols = { "tags": ["survey"], "overrides": { "dataModel": { - "sign-based-track-station-survey-setup.sign-based-track-station-observation.tracks.number_of_individuals": { + "sign-based-track-station-observation.tracks.number_of_individuals": { "dwcAttribute": "individualCount" } } @@ -414,6 +414,9 @@ var protocols = { "herbivory-and-physical-damage-belt-transect-setup.target_species.lut": { "dataType": "species" }, + "herbivory-and-physical-damage-belt-transect-setup.target_species.other_species.other_species": { + "dataType": "species" + }, "herbivory-and-physical-damage-transect.quadrat.quadrat_observation.herbivory_attributable_fauna_species.lut": { "dataType": "species" }, From 4361b88f979238fd1fd11382ee397e446117f6df Mon Sep 17 00:00:00 2001 From: sal153 Date: Thu, 11 Apr 2024 11:16:33 +1000 Subject: [PATCH 55/95] commit progress report progress #3149 --- forms/nht/bushBlitzProgressReport.json | 12831 +++++++++++++++++++++++ 1 file changed, 12831 insertions(+) create mode 100644 forms/nht/bushBlitzProgressReport.json diff --git a/forms/nht/bushBlitzProgressReport.json b/forms/nht/bushBlitzProgressReport.json new file mode 100644 index 000000000..17e700666 --- /dev/null +++ b/forms/nht/bushBlitzProgressReport.json @@ -0,0 +1,12831 @@ +{ + "class": "au.org.ala.ecodata.ActivityForm", + "id": "5f362a01c2dc7eba0f107d4a", + "activationDate": null, + "category": "Reports", + "formVersion": 1, + "gmsId": null, + "minOptionalSectionsCompleted": 1, + "name": "Bush Blitz Progress Report", + "publicationStatus": "published", + "sections": [ + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": false, + "modelName": null, + "name": "Bush Blitz Progress Report", + "optional": false, + "optionalQuestionText": null, + "template": { + "pre-populate": [ + { + "mapping": [ + { + "mapping": [], + "source-path": "issue", + "target": "issue" + } + ], + "merge": false, + "source": { + "literal": { + "issue": [] + } + } + } + ], + "dataModel": [ + { + "dataType": "text", + "description": "Summary of Project Progress for the Period", + "name": "progressSummary", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "list", + "name": "projectOutcomes", + "columns": [ + { + "dataType": "text", + "name": "outcomeStatement", + "validate": "required,maxSize[500]" + }, + { + "dataType": "text", + "name": "achievement", + "validate": "required,maxSize[1000]" + } + ] + }, + { + "dataType": "text", + "name": "issuesEncountered", + "validate": "required", + "constraints": [ + "Yes", + "No" + ] + }, + { + "dataType": "list", + "description": "", + "name": "issue", + "columns": [ + { + "dataType": "text", + "name": "nature", + "validate": "required,maxSize[1000]", + "behaviour": [ + { + "type": "enable_and_clear", + "condition": "issuesEncountered == \"Yes\"" + } + ] + }, + { + "dataType": "text", + "name": "how", + "validate": "required,maxSize[1000]", + "behaviour": [ + { + "type": "enable_and_clear", + "condition": "issuesEncountered == \"Yes\"" + } + ] + }, + { + "dataType": "text", + "name": "implication", + "validate": "required,maxSize[1000]", + "behaviour": [ + { + "type": "enable_and_clear", + "condition": "issuesEncountered == \"Yes\"" + } + ] + } + ] + }, + { + "dataType": "text", + "name": "projectRisksTable", + "validate": "required", + "constraints": [ + "Yes", + "No" + ] + }, + { + "dataType": "list", + "description": "", + "name": "goodNewsStories", + "columns": [ + { + "dataType": "text", + "description": "", + "name": "storyDetails", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "image", + "name": "photo" + } + ] + }, + { + "dataType": "text", + "description": "", + "name": "projectMonitoringAndLearnings", + "validate": "required,maxSize[1250]" + }, + { + "dataType": "text", + "description": "", + "name": "otherComments", + "validate": "maxSize[1250]" + }, + { + "dataType": "text", + "name": "projectContactDetailsChanged", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + } + ], + "modelName": "Progress Report", + "title": "Overview of Project Progress", + "viewModel": [ + { + "items": [ + { + "source": "

    1. Project progress

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + + "type": "literal", + + "source": "1.1 Provide an executive summary of what has been achieved to date against the project milestones, objectives and outcomes outlined in the Project MoU and MERI Plan, including progress against the project’s key performance indicators." + } + ], + "type": "row" + }, + { + "source": "projectOutcomes", + "type": "table", + "userAddedRows": true, + "columns": [ + { + "source": "", + "type": "literal", + "width": "5%", + "preLabel": { + "computed": "\\'No. \\' || (index + 1)" + }, + "title": "Outcome No." + }, + { + "type": "textarea", + "source": "outcomeStatement", + "title": "Outcome", + "rows": 5, + "width": "45%" + }, + { + "type": "textarea", + "source": "achievement", + "title": "Achievement against the outcome", + "rows": 5, + "width": "50%" + } + ] + }, + { + "items": [ + { + "preLabel": "1.2 Has this project encountered any issues or delays in delivering the milestones and/or outcomes in the project MoU and MERI Plan? If yes, please outline in the table below:", + "type": "selectOne", + "source": "issuesEncountered" + } + ], + "type": "row" + }, + { + "behaviour": [ + { + "type": "if_expression", + "condition": "issuesEncountered == \"Yes\"" + } + ], + "columns": [ + { + "source": "", + "type": "literal", + "preLabel": { + "computed": "\\'No. \\' || (index + 1)" + }, + "title": "Issue No." + }, + { + "source": "nature", + "type": "textarea", + "title": "Nature of the issue" + }, + { + "source": "how", + "type": "textarea", + "title": "How you are managing, or proposing to manage, the issue?" + }, + { + "source": "implication", + "type": "textarea", + "title": "Implications for the project", + "helpText": "(e.g. Impacts on timeframes, feasibility, costs, ability to meet contracted deliverables)" + } + ], + "userAddedRows": true, + "source": "issue", + "type": "table" + }, + { + "items": [ + { + "preLabel": "1.3 Has the risk project risks table in MERIT been updated in this reporting period?", + "type": "selectOne", + "source": "projectRisksTable" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "

    2. Good News Stories

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "2.1 Please provide good news stories that highlight what the project is doing/achieving. This information is intended for potential use by the Department in publicly promoting the program. Photos may be attached to this report via attachment to email however please ensure permissions of persons in the photos are obtained prior to the photos being attached and used for promotional purposes.", + "type": "literal" + } + ], + "type": "row" + }, + { + "columns": [ + { + "source": "", + "type": "literal", + "width": "5%", + "preLabel": { + "computed": "\\'No. \\' || (index + 1)" + }, + "title": "Story No." + }, + { + "source": "storyDetails", + "type": "textarea", + "rows": 4, + "title": "Good News Story Details", + "width": "50%" + }, + { + "type": "image", + "source": "photo", + "title": "", + "width": "45%" + } + ], + "userAddedRows": true, + "source": "goodNewsStories", + "type": "table" + }, + { + "items": [ + { + "source": "

    3. Monitoring, Evaluation and Project Learnings

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + "preLabel": "3.1 Provide a summary of any monitoring or evaluation activities undertaken this period, and of any project learnings. Comment on key findings and any changes you have made in response to these (where required)", + "source": "projectMonitoringAndLearnings", + "type": "textarea", + "rows": 5 + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "

    Other Comments

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "otherComments", + "preLabel": "Please provide any further comments you may wish to make on the project.", + "type": "textarea" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "

    4. Activity Reporting


    Only selected services in the MERI Plan is auto-populated and viewed in the Progress Report/s.
    Reported data from each of the Progress Report/s is aggregated into the Final Report.
    ", + "type": "literal" + } + ], + "type": "row" + } + ], + "pre-populate": [ + { + "source": { + "context-path": "owner" + }, + "merge": { + "projectOutcomes": { + "deleteUnmatchedExistingRows": true, + "addUnmatchedNewRows": true, + "keys": [ + "outcomeStatement" + ] + } + }, + "mapping": [ + { + "target": "projectOutcomes", + "mapping": [ + { + "target": "outcomeStatement", + "source-path": "description" + } + ], + "source-path": "custom.details.outcomes.shortTermOutcomes" + } + ] + } + ] + }, + "templateName": "bushBlitzProgressReport", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Baseline data", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Collecting or synthesising baseline data", + "modelName": "RLP - Baseline data", + "dataModel": [ + { + "dataType": "number", + "name": "numberBaselineDataSets", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "comments", + "validate": "required,maxSize[500]", + "description": "Please list the multiple data sets collected and/or synthesised." + }, + { + "dataType": "text", + "name": "projectAssuranceDetails" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "type": "row", + "items": [ + { + "source": "numberBaselineDataSets", + "preLabel": "Number of baseline data sets collected and/or synthesised", + "type": "number", + "css": "span4" + }, + { + "source": "comments", + "preLabel": "Comments", + "type": "textarea", + "rows": 4, + "css": "span8" + } + ] + } + ], + "type": "section" + } + ] + }, + "templateName": "statesBaselineData", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Communication materials", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "communicationMaterialType", + "constraints": [ + "Advertising", + "Book", + "Brochures", + "Extension materials", + "Fliers", + "Media release", + "Report", + "Social media posts", + "Videos", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherCommunicationMaterialType", + "behaviour": [ + { + "condition": "communicationMaterialType == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[100]" + }, + { + "dataType": "number", + "name": "numberOfCommunicationMaterialsPublished", + "description": "Refers to unique publications not number printed", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "communicationMaterialPurpose", + "validate": "required,maxSize[300]" + } + ], + "dataType": "list", + "name": "communicationMaterials" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Communication Materials", + "title": "Communication Materials", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "25%", + "source": "communicationMaterialType", + "title": "Type of communication material published", + "type": "select2" + }, + { + "width": "25%", + "source": "otherCommunicationMaterialType", + "title": "Type of communication material published (if Other)", + "type": "textarea" + }, + { + "width": "15%", + "source": "numberOfCommunicationMaterialsPublished", + "title": "Number of communication materials published", + "type": "number" + }, + { + "width": "35%", + "source": "communicationMaterialPurpose", + "title": "Purpose of communication material", + "type": "textarea" + } + ], + "userAddedRows": true, + "source": "communicationMaterials", + "type": "table" + } + ] + } + ] + }, + "templateName": "statesCommunicationMaterials", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Community engagement", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "eventType", + "constraints": [ + "Field days", + "Training / workshop events", + "Conferences / seminars", + "One-on-one technical advice interactions", + "On-ground trials / demonstrations", + "On-ground works" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfEvents", + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfParticipants", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfIndigenousParticipants", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfFarmers", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfGroups", + "validate": "required,min[0]" + }, + { + "dataType": "stringList", + "name": "industryType", + "constraints": [ + "Cropping", + "Dairy", + "Dryland agriculture", + "Horticulture", + "Grazing", + "Fisheries", + "Aquaculture", + "Environmental" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "eventPurpose", + "validate": "required,maxSize[300]" + } + ], + "dataType": "list", + "name": "events" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Community engagement", + "title": "Community/stakeholder engagement", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "15%", + "source": "eventType", + "title": "Type of Community / Stakeholder engagement activity", + "type": "select2" + }, + { + "width": "10%", + "source": "numberOfEvents", + "title": "Number of Community / Stakeholder engagement type events", + "type": "number" + }, + { + "width": "20%", + "source": "eventPurpose", + "title": "Purpose of engagement", + "type": "textarea" + }, + { + "width": "10%", + "source": "numberOfGroups", + "title": "Number of communities or groups engaged", + "type": "number" + }, + { + "width": "10%", + "source": "numberOfParticipants", + "title": "Total number of attendees / participants", + "type": "number" + }, + { + "width": "10%", + "source": "numberOfIndigenousParticipants", + "title": "Number of Indigenous attendees / participants", + "type": "number" + }, + { + "width": "10%", + "source": "numberOfFarmers", + "title": "Number of farmers attending / participating", + "type": "number" + }, + { + "width": "15%", + "source": "industryType", + "title": "Industry type engaged", + "type": "select2Many" + } + ], + "userAddedRows": true, + "source": "events", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesCommunityEngagement", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Controlling access", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "number", + "name": "numberInstalled", + "validate": "required,min[0]" + }, + { + "dataType": "feature", + "name": "sitesInstalled" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesInstalled)" + }, + "dataType": "number", + "decimalPlaces": 3, + "name": "sitesInstalledCalculatedAreaHa", + "units": "ha", + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The controlled area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(sitesInstalled)" + }, + "dataType": "number", + "decimalPlaces": 3, + "name": "sitesInstalledCalculatedLengthKm", + "units": "km", + "behaviour": [ + { + "condition": "lengthInvoicedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The length controlled must be mapped", + "validate": "required,min[0.001]" + } + } + ] + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(areaInstalledHa, sitesInstalledCalculatedAreaHa, 0.1) and within(lengthInstalledKm, sitesInstalledCalculatedLengthKm, 0.1)) or roundTo(areaInstalledHa, 2) != roundTo(areaInvoicedHa, 2) or roundTo(lengthInstalledKm, 2) != roundTo(lengthInvoicedKm, 2)", + "type": "visible" + } + ], + "validate": "required" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesInstalled)", + "type": "computed" + }, + "dataType": "number", + "name": "areaInstalledHa", + "decimalPlaces": 3, + "units": "ha", + "validate": "required,min[0]" + }, + { + "defaultValue": { + "expression": "$geom.lengthKm(sitesInstalled)", + "type": "computed" + }, + "dataType": "number", + "name": "lengthInstalledKm", + "decimalPlaces": 3, + "units": "km", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "decimalPlaces": 3, + "units": "ha", + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaInstalledHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "number", + "name": "lengthInvoicedKm", + "decimalPlaces": 3, + "units": "km", + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "lengthInstalledKm", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(areaInstalledHa, sitesInstalledCalculatedAreaHa, 0.1) and within(lengthInstalledKm, sitesInstalledCalculatedLengthKm, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "feature", + "name": "protectedSites" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(protectedSites)", + "type": "computed" + }, + "dataType": "number", + "name": "areaProtectedHa", + "decimalPlaces": 3, + "units": "ha" + }, + { + "dataType": "text", + "name": "accessControlType", + "description": "", + "constraints": [ + "Boardwalks", + "Bollards & barriers", + "Constructed parking bays", + "Fencing, styles, gates & grids", + "Formed traffic ways", + "Signage", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherAccessControlType", + "description": "Please specify the type of access control if Other (specify in notes) was selected in the Type of Access Control Installed column.", + "behaviour": [ + { + "condition": "accessControlType == \"Other\"", + "type": "enable" + } + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "controlObjective", + "description": "What is your access control method? and/or What do you intend to achieve by using your structure/s?", + "validate": "required,maxSize[300]" + } + ], + "dataType": "list", + "name": "accessControlDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Controlling access", + "title": "Controlling access", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "5%", + "source": "numberInstalled", + "type": "number", + "title": "Number of structures installed" + }, + { + "width": "15%", + "type": "col", + "title": "Site/s where access has been controlled", + "items": [ + { + "source": "sitesInstalled", + "type": "feature" + }, + { + "type": "row", + "items": [ + { + "readonly": true, + "source": "sitesInstalledCalculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "readonly": true, + "source": "sitesInstalledCalculatedLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "May be changed manually if different to the calculated areas", + "width": "20%", + "type": "col", + "title": "Actual length (km) / area (ha) where access has been controlled", + "items": [ + { + "source": "areaInstalledHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "lengthInstalledKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "15%", + "type": "col", + "title": "Site/s protected by access control structures", + "items": [ + { + "source": "protectedSites", + "type": "feature" + }, + { + "source": "areaProtectedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "width": "20%", + "type": "col", + "title": "Type of access control installed", + "items": [ + { + "source": "accessControlType", + "type": "select2" + }, + { + "source": "otherAccessControlType", + "type": "text" + } + ] + }, + { + "width": "25%", + "source": "controlObjective", + "title": "Control objective", + "type": "textarea", + "rows": 5 + } + ], + "userAddedRows": true, + "source": "accessControlDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos of the access control work performed", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesControllingAccess", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Pest animal management", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "site" + }, + { + "dataType": "number", + "name": "siteCalculatedAreaHa", + "computed": { + "expression": "$geom.areaHa(site)" + }, + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The controlled area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "dataType": "number", + "name": "siteCalculatedLengthKm", + "computed": { + "expression": "$geom.lengthKm(site)" + }, + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthInvoicedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The controlled length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "dataType": "number", + "name": "areaControlledHa", + "validate": "required,min[0]", + "units": "ha", + "decimalPlaces": 3, + "defaultValue": { + "type": "computed", + "expression": "$geom.areaHa(site)" + } + }, + { + "dataType": "number", + "name": "lengthControlledKm", + "validate": "required,min[0]", + "units": "km", + "decimalPlaces": 3, + "defaultValue": { + "type": "computed", + "expression": "$geom.lengthKm(site)" + } + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "areaControlledHa" + } + } + ] + }, + { + "dataType": "number", + "name": "lengthInvoicedKm", + "units": "km", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "lengthControlledKm" + } + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required", + "behaviour": [ + { + "condition": "not (within(areaControlledHa, siteCalculatedAreaHa, 0.1))", + "type": "if" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "validate": "required,maxSize[300]", + "behaviour": [ + { + "type": "if", + "condition": "not within(areaControlledHa, siteCalculatedAreaHa, 0.1) and \"Other\" == mappingNotAlignedReason" + } + ] + }, + { + "dataType": "text", + "name": "mappingLengthNotAlignedReason", + "constraints": [ + "Mapped area simplifies more complex length/s where work was undertaken during this period", + "Other" + ], + "validate": "required", + "behaviour": [ + { + "condition": "not (within(lengthControlledKm, siteCalculatedLengthKm, 0.1))", + "type": "if" + } + ] + }, + { + "dataType": "text", + "name": "mappingLengthNotAlignedComments", + "validate": "required,maxSize[300]", + "behaviour": [ + { + "type": "if", + "condition": "not (within(lengthControlledKm, siteCalculatedLengthKm, 0.1)) and \"Other\" == mappingLengthNotAlignedReason" + } + ] + }, + { + "dataType": "text", + "name": "invoicedLengthNotActualReason", + "constraints": [ + "Work was undertaken over a greater length than will be invoiced for", + "Other" + ], + "validate": "required", + "behaviour": [ + { + "condition": "roundTo(lengthControlledKm, 2) != roundTo(lengthInvoicedKm, 2)", + "type": "if" + } + ] + }, + { + "dataType": "text", + "name": "invoicedLengthNotActualComments", + "behaviour": [ + { + "type": "if", + "condition": "roundTo(lengthControlledKm, 2) != roundTo(lengthInvoicedKm, 2) and \"Other\" == invoicedLengthNotActualReason" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "validate": "required", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(areaControlledHa, siteCalculatedAreaHa, 0.1) and within(lengthControlledKm, siteCalculatedLengthKm, 0.1)) or roundTo(areaControlledHa, 2) != roundTo(areaInvoicedHa, 2)", + "type": "if" + } + ] + }, + { + "columns": [ + { + "dataType": "species", + "name": "pestSpecies", + "dwcAttribute": "scientificName", + "description": "Pest species targeted for treatment (start typing a scientific or common name for a species)", + "validate": "required" + }, + { + "dataType": "text", + "name": "pestManagementMethod", + "dwcAttribute": "treatmentMethod", + "description": "The method used in this activity to manage pests", + "constraints": [ + "Aerial shoot", + "Bait & trap", + "Bait only", + "Feral free enclosure", + "Exclusion fencing", + "Fumigation", + "Ground shoot", + "Trap & cull", + "Trap & remove", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherManagementMethod", + "description": "Please specify the management method used if Other was selected in the Management Method column.", + "behaviour": [ + { + "condition": "pestManagementMethod == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[100]" + }, + { + "dataType": "text", + "name": "treatmentObjective", + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "individualsOrColonies", + "constraints": [ + "Colonies", + "Individuals" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "individualsOrColoniesRemoved", + "validate": "required" + } + ], + "dataType": "list", + "name": "pestAnimalsControlled" + } + ], + "dataType": "list", + "name": "areasControlled" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Pest animal management", + "title": "Controlling pest animals", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "Add a new controlled area", + "userAddedRows": true, + "source": "areasControlled", + "type": "repeat", + "items": [ + { + "type": "row", + "css": "border-bottom", + "items": [ + { + "preLabel": "Initial or follow-up control?", + "css": "span3", + "source": "initialOrFollowup", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "css": "span3 col-border-right", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s where pest control was undertaken", + "source": "site", + "type": "feature" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "siteCalculatedAreaHa", + "type": "number", + "readonly": true, + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "siteCalculatedLengthKm", + "type": "number", + "readonly": true, + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "type": "col", + "css": "span4 col-border-right", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) treated for pest animals", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "areaControlledHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual area being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping area didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Actual length (km) treated for pest animals", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "lengthControlledKm", + "type": "number", + "validate": "required", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual length being different to mapped amount", + "source": "mappingLengthNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping length didn't align with the invoiced amount", + "source": "mappingLengthNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "addRowText": "Add a species", + "columns": [ + { + "width": "40%", + "source": "pestSpecies", + "title": "Target pest species", + "type": "speciesSelect" + }, + { + "width": "10%", + "source": "pestManagementMethod", + "title": "Type of control", + "type": "selectOne" + }, + { + "width": "10%", + "source": "otherManagementMethod", + "title": "Type of control (if other)", + "type": "text" + }, + { + "width": "20%", + "source": "treatmentObjective", + "title": "Treatment objective", + "type": "textarea" + }, + { + "width": "10%", + "source": "individualsOrColonies", + "title": "Individuals or colonies?", + "type": "selectOne" + }, + { + "width": "10%", + "source": "individualsOrColoniesRemoved", + "title": "Number of individuals or colonies removed / destroyed", + "type": "number" + } + ], + "userAddedRows": true, + "source": "pestAnimalsControlled", + "type": "table" + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesPestAnimalManagement", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Management plan development", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "newOrRevised", + "description": "", + "constraints": [ + "New plan", + "Revised plan" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "managementPlanType", + "description": "", + "constraints": [ + "Fire management plan", + "Catchment plan", + "Farm management plan", + "Implementation works design", + "Marine protection plan", + "Project arrangements and governance", + "Project plan", + "Ramsar management plan", + "Recovery plan", + "Regional plan", + "Resource management plan", + "Site development plan", + "Site management plan", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherManagementPlanType", + "description": "", + "behaviour": [ + { + "condition": "managementPlanType == \"Other\"", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "number", + "name": "numberOfPlansDeveloped", + "validate": "required,min[0]" + }, + { + "dataType": "feature", + "name": "sitesCoveredByPlan" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesCoveredByPlan)" + }, + "dataType": "number", + "name": "calculatedAreaHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The area covered by the plan must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not within(areaCoveredByPlanHa, calculatedAreaHa, 0.1) or (roundTo(areaCoveredByPlanHa, 2) != roundTo(areaInvoicedHa, 2))", + "type": "visible" + } + ], + "validate": "required" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesCoveredByPlan)", + "type": "computed" + }, + "dataType": "number", + "name": "areaCoveredByPlanHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not within(areaCoveredByPlanHa, calculatedAreaHa, 0.1)", + "type": "visible" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaCoveredByPlanHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "speciesOrTECCoveredByPlan", + "description": "This free text field allows multiple species and/or TECs to be entered. For Species: Use Scientific names with (common name in brackets), TECs should be written as listed in EPBC. Species or TECs should be separated by commas.", + "validate": "required,maxSize[300]" + } + ], + "dataType": "list", + "name": "managementPlans" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Management plan development", + "title": "Developing farm / project / site management plan", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "10%", + "source": "newOrRevised", + "title": "Are these plans new or revised?", + "type": "selectOne" + }, + { + "width": "20%", + "type": "col", + "title": "Type of plan", + "items": [ + { + "type": "row", + "items": [ + { + "source": "managementPlanType", + "type": "select2" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "otherManagementPlanType", + "placeholder": "Type of plan (if Other)", + "type": "textarea" + } + ] + } + ] + }, + { + "width": "10%", + "source": "numberOfPlansDeveloped", + "title": "Number of plans developed", + "type": "number" + }, + { + "width": "15%", + "type": "col", + "title": "Sites/s covered by plan/s", + "items": [ + { + "source": "sitesCoveredByPlan", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "width": "20%", + "title": "Actual area (ha) covered by plan/s", + "type": "col", + "items": [ + { + "source": "areaCoveredByPlanHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "22%", + "source": "speciesOrTECCoveredByPlan", + "type": "textarea", + "title": "Species and/or Threatened ecological communities covered in plan" + } + ], + "userAddedRows": true, + "source": "managementPlans", + "type": "table" + } + ] + } + ] + }, + "templateName": "statesManagementPlanDevelopment", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Debris removal", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "clearedSites" + }, + { + "computed": { + "expression": "$geom.areaHa(clearedSites)" + }, + "dataType": "number", + "name": "calculatedDebrisRemovedHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaOfRemovedDebrisInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The cleared area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(clearedSites)" + }, + "dataType": "number", + "name": "calculatedDebrisRemovedKm", + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "debrisRemovedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The cleared length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedDebrisRemovedHa" + }, + "dataType": "number", + "units": "ha", + "decimalPlaces": 3, + "name": "debrisRemovedHa", + "validate": "required,min[0]" + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedDebrisRemovedKm" + }, + "dataType": "number", + "units": "km", + "decimalPlaces": 3, + "name": "debrisRemovedKm", + "validate": "required,min[0]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "validate": "required", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(debrisRemovedHa, calculatedDebrisRemovedHa, 0.1)) or roundTo(debrisRemovedHa, 2) != roundTo(areaOfRemovedDebrisInvoicedHa, 2)", + "type": "visible" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required", + "behaviour": [ + { + "condition": "not (within(calculatedDebrisRemovedHa, debrisRemovedHa, 0.1))", + "type": "visible" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "validate": "required,maxSize[300]", + "behaviour": [ + { + "type": "visible", + "condition": "\"Other\" == mappingNotAlignedReason" + } + ] + }, + { + "dataType": "number", + "units": "ha", + "decimalPlaces": 3, + "name": "areaOfRemovedDebrisInvoicedHa", + "validate": [ + { + "rule": "min[0]" + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "debrisRemovedHa" + } + } + ] + }, + { + "dataType": "text", + "name": "debrisType", + "description": "", + "constraints": [ + "Building & Industrial waste", + "Domestic waste", + "Green waste", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherDebrisType", + "description": "if Other", + "behaviour": [ + { + "condition": "debrisType == \"Other\"", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "validated": "required,min[0]", + "dataType": "number", + "name": "weightOfDebrisTonnes", + "units": "tonnes" + }, + { + "validated": "required,min[0]", + "dataType": "number", + "name": "volumeRemovedM3", + "units": "m3" + } + ], + "dataType": "list", + "name": "debrisRemovalDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Debris removal", + "title": "Debris removal", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "15%", + "source": "initialOrFollowup", + "title": "Initial or follow-up activity?", + "type": "selectOne" + }, + { + "width": "20%", + "title": "Site/s where debris removal was implemented", + "type": "col", + "items": [ + { + "type": "feature", + "source": "clearedSites" + }, + { + "source": "calculatedDebrisRemovedHa", + "readonly": "readonly", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "calculatedDebrisRemovedKm", + "readonly": "readonly", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "width": "22%", + "type": "col", + "title": "Actual area (ha) / length (km) of debris removed", + "helpText": "Enter the amount which were actually removed during this reporting period.", + "items": [ + { + "source": "debrisRemovedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "debrisRemovedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "20%", + "title": "Type of debris removed", + "type": "col", + "validate": "required", + "items": [ + { + "type": "row", + "items": [ + { + "source": "debrisType", + "type": "select2" + } + ] + }, + { + "source": "otherDebrisType", + "type": "text" + } + ] + }, + { + "width": "12%", + "source": "weightOfDebrisTonnes", + "title": "Weight (tonnes) of debris removed", + "type": "number" + }, + { + "width": "12%", + "source": "volumeRemovedM3", + "title": "Volume (m3) of debris removed", + "type": "number" + } + ], + "userAddedRows": true, + "source": "debrisRemovalDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesDebrisRemoval", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Erosion Management", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "existingErosionSites" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(existingErosionSites)", + "type": "computed" + }, + "dataType": "number", + "name": "existingErosionAreaHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "min[0]" + }, + { + "dataType": "feature", + "name": "sitesManaged" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesManaged)" + }, + "dataType": "number", + "name": "calculatedAreaOfErosionControlHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaOfErosionControlInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The controlled area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(sitesManaged)" + }, + "dataType": "number", + "name": "calculatedLengthOfErosionControlKm", + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthOfErosionControlInvoicedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The controlled length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(areaOfErosionControlHa, calculatedAreaOfErosionControlHa, 0.1) and within(lengthOfErosionControlKm, calculatedLengthOfErosionControlKm, 0.1)) or roundTo(areaOfErosionControlHa, 2) != roundTo(areaOfErosionControlInvoicedHa, 2) or roundTo(lengthOfErosionControlKm, 2) != roundTo(lengthOfErosionControlInvoicedKm, 2)", + "type": "visible" + } + ], + "validate": "required" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesManaged)", + "type": "computed" + }, + "dataType": "number", + "name": "areaOfErosionControlHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "defaultValue": { + "expression": "$geom.lengthKm(sitesManaged)", + "type": "computed" + }, + "dataType": "number", + "name": "lengthOfErosionControlKm", + "units": "km", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaOfErosionControlInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaOfErosionControlHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "number", + "name": "lengthOfErosionControlInvoicedKm", + "units": "km", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "lengthOfErosionControlKm", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(areaOfErosionControlHa, calculatedAreaOfErosionControlHa, 0.1) and within(lengthOfErosionControlKm, calculatedLengthOfErosionControlKm, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "number", + "name": "numberInstalled", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "erosionManagementMethod", + "constraints": [ + "Alternative watering point", + "Erosion control structures", + "Farming practice change", + "Fencing", + "Revegetation", + "Terracing", + "Vegetated waterway (bioswale)", + "Windbreaks", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherErosionManagementMethod", + "behaviour": [ + { + "condition": "erosionManagementMethod == \"Other\"", + "type": "visible" + } + ], + "validate": "required,max[300]" + }, + { + "dataType": "feature", + "name": "sitesBenefittingFromErosionControl" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesBenefittingFromErosionControl)", + "type": "computed" + }, + "dataType": "number", + "name": "areaBenefitingHa", + "decimalPlaces": 3, + "units": "ha" + }, + { + "dataType": "text", + "name": "evidenceOfBenefit", + "validate": "maxSize[300]" + } + ], + "dataType": "list", + "name": "erosionManagementDetails", + "minSize": 0 + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Erosion Management", + "title": "Erosion management", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "10%", + "source": "initialOrFollowup", + "title": "Initial or follow-up activity?", + "type": "selectOne" + }, + { + "width": "7%", + "title": "Site/s where erosion is evident", + "type": "col", + "items": [ + { + "source": "existingErosionSites", + "type": "feature" + }, + { + "source": "existingErosionAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "width": "10%", + "type": "col", + "title": "Site/s of erosion control", + "items": [ + { + "source": "sitesManaged", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaOfErosionControlHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedLengthOfErosionControlKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "width": "22%", + "type": "col", + "title": "Actual area (ha) / length (km) of erosion control", + "items": [ + { + "source": "areaOfErosionControlHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "lengthOfErosionControlKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "10%", + "source": "numberInstalled", + "title": "Number of erosion control structures installed", + "type": "number" + }, + { + "width": "20%", + "type": "col", + "title": "Type of treatment method", + "items": [ + { + "type": "row", + "items": [ + { + "source": "erosionManagementMethod", + "type": "select2" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "otherErosionManagementMethod", + "placeholder": "Type of treatment method", + "type": "textarea" + } + ] + } + ] + }, + { + "width": "20%", + "title": "Please map any off-site area/s if they benefitted from this erosion management activity", + "type": "col", + "items": [ + { + "source": "sitesBenefittingFromErosionControl", + "type": "feature" + }, + { + "source": "areaBenefitingHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "source": "evidenceOfBenefit", + "placeholder": "Please describe evidence of off-site benefits", + "type": "textarea" + } + ] + } + ] + } + ], + "userAddedRows": true, + "source": "erosionManagementDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesErosionManagement", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Maintaining feral free enclosures", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "newOrMaintained", + "constraints": [ + "Newly established", + "Maintained" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfEnclosures", + "validate": "required" + }, + { + "dataType": "number", + "name": "daysSpentOnMaintenanceOfEnclosures", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)", + "validate": "min[0]" + }, + { + "dataType": "feature", + "name": "siteOfEnclosures" + }, + { + "computed": { + "expression": "$geom.areaHa(siteOfEnclosures)" + }, + "dataType": "number", + "name": "calculatedAreaOfEnclosuresHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The area of the enclosure must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "$geom.areaHa(siteOfEnclosures)", + "type": "computed" + }, + "dataType": "number", + "name": "areaOfEnclosuresHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaOfEnclosuresHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not within(areaOfEnclosuresHa, calculatedAreaOfEnclosuresHa, 0.1)", + "type": "if" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "if" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not within(areaOfEnclosuresHa, calculatedAreaOfEnclosuresHa, 0.1) or roundTo(areaOfEnclosuresHa, 2) != roundTo(areaInvoicedHa, 2)", + "type": "if" + } + ], + "validate": "required" + }, + { + "columns": [ + { + "dataType": "species", + "name": "protectedSpecies", + "dwcAttribute": "scientificName", + "description": "The threatened species protected by the enclosure", + "validate": "required" + }, + { + "dataType": "text", + "name": "targetFeralSpecies", + "description": "", + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "individualsOrPopulations", + "constraints": [ + "Individuals", + "Populations" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfPopulationsOrIndividualsProtected", + "validate": "required,min[0]" + } + ], + "dataType": "list", + "name": "speciesProtected" + } + ], + "dataType": "list", + "name": "enclosureDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Maintaining feral free enclosures", + "title": "Establishing and maintaining feral-free enclosures", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "Add a new feral free area", + "userAddedRows": true, + "source": "enclosureDetails", + "type": "repeat", + "items": [ + { + "css": "border-bottom", + "type": "row", + "items": [ + { + "preLabel": "Newly established or maintained feral free enclosure?", + "css": "span4", + "source": "newOrMaintained", + "type": "selectOne" + }, + { + "preLabel": "Number of feral free enclosures", + "css": "span3", + "source": "numberOfEnclosures", + "type": "number" + }, + { + "preLabel": "Number of days maintaining feral-free enclosures", + "css": "span3", + "source": "daysSpentOnMaintenanceOfEnclosures", + "type": "number" + } + ] + }, + { + "type": "row", + "items": [ + { + "css": "span3 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s of feral free enclosures", + "source": "siteOfEnclosures", + "type": "feature" + } + ] + }, + { + "readonly": "readonly", + "source": "calculatedAreaOfEnclosuresHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "css": "span4 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) of feral-free enclosures", + "source": "areaOfEnclosuresHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "addRowText": "Add a species", + "columns": [ + { + "width": "35%", + "source": "protectedSpecies", + "title": "Targeted species being protected", + "type": "speciesSelect" + }, + { + "width": "40%", + "source": "targetFeralSpecies", + "title": "Targeted feral species being controlled", + "type": "text" + }, + { + "width": "15%", + "source": "individualsOrPopulations", + "title": "Individuals or populations?", + "type": "selectOne" + }, + { + "width": "10%", + "source": "numberOfPopulationsOrIndividualsProtected", + "title": "Number of populations (or individuals) protected within feral free enclosures", + "type": "number" + } + ], + "userAddedRows": true, + "source": "speciesProtected", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesFeralFreeEnclosures", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Establishing ex-situ breeding programs", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "inSituExSitu", + "constraints": [ + "Ex-situ", + "In-situ" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "newOrMaintained", + "constraints": [ + "Newly established", + "Maintained" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfSitesCreated", + "validate": "required,min[1]" + }, + { + "dataType": "number", + "name": "numberOfDaysMaintainingBreedingPrograms", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)", + "validate": "required,min[0]" + }, + { + "dataType": "feature", + "name": "sitesOfBreedingProgram", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)" + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.areaHa(sitesOfBreedingProgram)" + }, + "dataType": "number", + "name": "areaOfEnclosureHa", + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.areaHa(sitesOfBreedingProgram)*0.9" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.areaHa(sitesOfBreedingProgram)*1.1" + } + } + ] + }, + { + "columns": [ + { + "dataType": "species", + "name": "targetSpecies", + "dwcAttribute": "scientificName", + "description": "The threatened species targeted by the breeding program", + "validate": "required" + }, + { + "dataType": "text", + "name": "breedingTechnique", + "constraints": [ + "Seed bank or captive breeding", + "Seed orchard", + "Seed nursery", + "Propagation", + "Seed viability testing", + "Seed genetic testing", + "Fauna captive breeding program", + "Fauna wild breeding program", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherBreedingTechnique", + "description": "", + "behaviour": [ + { + "condition": "breedingTechnique == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "individualsOrGroups", + "constraints": [ + "Individuals", + "Groups" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfIndividualsOrGroups", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfIndividualsReleased", + "validate": "required,min[0]" + } + ], + "dataType": "list", + "name": "speciesInBreedingProgram" + } + ], + "dataType": "list", + "name": "breedingProgramDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Establishing ex-situ breeding programs", + "title": "Establishing and maintaining breeding programs", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "Add a new breeding area", + "userAddedRows": true, + "source": "breedingProgramDetails", + "type": "repeat", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Ex-situ / In-situ", + "css": "span3", + "source": "inSituExSitu", + "type": "selectOne" + }, + { + "preLabel": "Is this a newly established or maintained breeding program?", + "css": "span3", + "source": "newOrMaintained", + "type": "selectOne" + }, + { + "preLabel": "Number of breeding sites created", + "css": "span3", + "source": "numberOfSitesCreated", + "type": "number" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Number of days maintaining breeding program", + "css": "span3", + "source": "numberOfDaysMaintainingBreedingPrograms", + "type": "number" + }, + { + "preLabel": "Site/s of breeding program", + "css": "span3", + "source": "sitesOfBreedingProgram", + "type": "feature" + }, + { + "preLabel": "Area (ha) of feral-free enclosures established or maintained", + "css": "span3", + "source": "areaOfEnclosureHa", + "type": "number" + } + ] + }, + { + "addRowText": "Add a species", + "columns": [ + { + "width": "30%", + "source": "targetSpecies", + "title": "Targeted threatened species", + "type": "speciesSelect" + }, + { + "width": "15%", + "source": "breedingTechnique", + "type": "select2", + "title": "Technique of breeding program" + }, + { + "width": "20%", + "source": "otherBreedingTechnique", + "type": "text", + "title": "Technique of breeding program (if Other)" + }, + { + "width": "15%", + "source": "individualsOrGroups", + "type": "selectOne", + "title": "Individuals or groups?" + }, + { + "width": "10%", + "source": "numberOfIndividualsOrGroups", + "title": "Number of groups / individuals in breeding program", + "type": "number" + }, + { + "width": "10%", + "source": "numberOfIndividualsReleased", + "title": "Number of individuals released or established in the wild", + "type": "number" + } + ], + "userAddedRows": true, + "source": "speciesInBreedingProgram", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesExSituBreedingSites", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Establishing Agreements", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "agreementType", + "description": "", + "constraints": [ + "On title in perpetuity (e.g. conservation convenant)", + "Binding agreement not on title in perpetuity (e.g. property vegetation plan)", + "Termed agreement not on title - binding (e.g. land management agreement)", + "Not on title - non-binding (e.g. Wildlife Refuge)", + "No protection mechanism applicable", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherAgreementType", + "description": "", + "behaviour": [ + { + "condition": "agreementType == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "establishedOrMaintained", + "constraints": [ + "Established", + "Maintained" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfAgreements", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfDaysMaintainingAgreements", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)", + "validate": "required,min[0]" + }, + { + "dataType": "feature", + "name": "agreementSites" + }, + { + "computed": { + "expression": "$geom.areaHa(agreementSites)" + }, + "dataType": "number", + "name": "calculatedAreaCoveredByAgreementsHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaOfCoveredByAgreementsInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "calculatedAreaCoveredByAgreementsHa", + "type": "computed" + }, + "dataType": "number", + "name": "areaCoveredByAgreementsHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(areaCoveredByAgreementsHa, calculatedAreaCoveredByAgreementsHa, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "number", + "name": "areaOfCoveredByAgreementsInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaCoveredByAgreementsHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(calculatedAreaCoveredByAgreementsHa, areaCoveredByAgreementsHa, 0.1)) or roundTo(areaCoveredByAgreementsHa, 2) != roundTo(areaOfCoveredByAgreementsInvoicedHa, 2)", + "type": "visible" + } + ], + "validate": "required" + } + ], + "dataType": "list", + "name": "agreements" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Establishing Agreements", + "title": "Establishing and maintaining agreements", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "20%", + "title": "Agreement type", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "agreementType", + "type": "select2" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "otherAgreementType", + "title": "Other agreement type", + "type": "textarea" + } + ] + } + ] + }, + { + "width": "10%", + "source": "establishedOrMaintained", + "type": "selectOne", + "title": "Established or maintained?" + }, + { + "width": "15%", + "source": "numberOfAgreements", + "type": "number", + "title": "Number of agreements" + }, + { + "width": "20%", + "source": "numberOfDaysMaintainingAgreements", + "type": "number", + "title": "Number of days maintaining agreements (if applicable)" + }, + { + "width": "20%", + "title": "Site/s where agreements were established", + "type": "col", + "items": [ + { + "source": "agreementSites", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaCoveredByAgreementsHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "Enter the actual amount during this reporting period.", + "width": "15%", + "type": "col", + "title": "Actual area (ha) of site/s agreements", + "items": [ + { + "source": "areaCoveredByAgreementsHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual amount being different to aligned amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the actual didn't align with the agreed amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ], + "userAddedRows": true, + "source": "agreements", + "type": "table" + } + ] + } + ] + }, + "templateName": "statesEstablishingAgreements", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Establishing monitoring regimes", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Establishing monitoring regimes", + "modelName": "RLP - Establishing monitoring regimes", + "dataModel": [ + { + "name": "monitoringRegimes", + "dataType": "list", + "columns": [ + { + "dataType": "text", + "name": "typeOfMonitoringRegime", + "validate": "required", + "constraints": [ + "Ramsar", + "Threatened Species", + "World Heritage", + "Threatened Ecological Communities", + "Soil, biodiversity & vegetation", + "Climate change & market demands" + ] + }, + { + "dataType": "text", + "name": "establishedOrMaintained", + "validate": "required", + "constraints": [ + "Established", + "Maintained" + ] + }, + { + "dataType": "number", + "name": "numberMonitoringRegimesEstablished", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfDaysMaintainingMonitoringRegimes", + "validate": "required,min[0]", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)" + }, + { + "dataType": "text", + "name": "monitoringRegimeObjective", + "validate": "required,maxSize[500]", + "description": "What type of monitoring and reporting is being established/maintained? What information will these monitoring regimes capture?" + } + ] + }, + { + "name": "photographicEvidence", + "dataType": "image" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "type": "section", + "items": [ + { + "type": "table", + "userAddedRows": true, + "source": "monitoringRegimes", + "columns": [ + { + "source": "typeOfMonitoringRegime", + "type": "selectOne", + "title": "Type of monitoring regime", + "width": "20%" + }, + { + "source": "establishedOrMaintained", + "type": "selectOne", + "title": "Established or maintained?", + "width": "15%" + }, + { + "source": "numberMonitoringRegimesEstablished", + "title": "Number of monitoring regimes", + "type": "number", + "width": "10%" + }, + { + "source": "numberOfDaysMaintainingMonitoringRegimes", + "title": "Number of days maintaining monitoring regimes", + "type": "number", + "width": "10%" + }, + { + "source": "monitoringRegimeObjective", + "title": "Monitoring regimes objective", + "type": "textarea", + "rows": 3, + "width": "55%" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "image", + "source": "photographicEvidence", + "preLabel": "Optionally attach photos" + } + ] + } + ] + } + ] + }, + "templateName": "statesMonitoringRegimes", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Farm Management Survey", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Farm management surveys", + "modelName": "RLP - Farm Management Survey", + "dataModel": [ + { + "dataType": "list", + "name": "farmManagementSurveys", + "columns": [ + { + "dataType": "text", + "description": "", + "name": "baselineOrIndicatorSurvey", + "constraints": [ + "Baseline", + "Indicator" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfFarmManagementSurveys", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfDaysConductingSurveys", + "validate": "required,min[0]", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)" + }, + { + "dataType": "text", + "name": "surveyPurpose", + "validate": "required,maxSize[500]", + "description": "What will the survey aim to capture?" + } + ] + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "source": "farmManagementSurveys", + "columns": [ + { + "title": "Baseline survey or indicator (follow-up) survey?", + "source": "baselineOrIndicatorSurvey", + "type": "selectOne", + "width": "25%" + }, + { + "title": "Number of farm management surveys conducted", + "source": "numberOfFarmManagementSurveys", + "type": "number", + "width": "10%" + }, + { + "title": "Number of days spent on these farm management surveys", + "source": "numberOfDaysConductingSurveys", + "type": "number", + "width": "10%" + }, + { + "title": "Survey purpose", + "type": "textarea", + "rows": 3, + "source": "surveyPurpose", + "width": "55%" + } + ], + "userAddedRows": true, + "type": "table" + } + ], + "type": "section" + } + ] + }, + "templateName": "statesFarmManagementSurvey", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Fauna survey", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "baselineOrIndicatorSurvey", + "description": "", + "constraints": [ + "Baseline", + "Indicator" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfFaunaSurveys", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "dateRange", + "description": "What time of year (eg. Dates by dd/mm/yyyyy, Months, Season/s)", + "validate": "required,maxSize[300]" + }, + { + "dataType": "feature", + "name": "sitesSurveyed" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesSurveyed)" + }, + "dataType": "number", + "name": "siteCalculatedAreaHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The area surveyed must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesSurveyed)", + "type": "computed" + }, + "dataType": "number", + "name": "areaSurveyedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaSurveyedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1)", + "type": "if" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "if" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1) or roundTo(areaSurveyedHa, 2) != roundTo(areaInvoicedHa, 2)", + "type": "if" + } + ], + "validate": "required" + }, + { + "columns": [ + { + "dataType": "species", + "name": "species", + "validate": "required" + }, + { + "dataType": "text", + "name": "surveyTechnique", + "description": "What/how will the survey capture the fauna data", + "validate": "required,maxSize[500]" + }, + { + "dataType": "text", + "name": "individualsOrGroups", + "constraints": [ + "Individuals", + "Groups" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfIndividualsOrGroups", + "validate": "required,min[0]" + } + ], + "dataType": "list", + "name": "faunaSurveyDetails" + } + ], + "dataType": "list", + "name": "faunaSurveys", + "minSize": 1 + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Fauna survey", + "title": "Fauna survey", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "New survey site", + "userAddedRows": true, + "source": "faunaSurveys", + "type": "repeat", + "items": [ + { + "css": "border-bottom", + "type": "row", + "items": [ + { + "preLabel": "Baseline survey or indicator (follow-up) survey?", + "css": "span3", + "source": "baselineOrIndicatorSurvey", + "type": "selectOne" + }, + { + "preLabel": "Number of fauna surveys conducted", + "css": "span3", + "source": "numberOfFaunaSurveys", + "type": "number" + }, + { + "preLabel": "Date range", + "css": "span3", + "source": "dateRange", + "type": "text" + } + ] + }, + { + "type": "row", + "items": [ + { + "css": "span3 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s covered by fauna surveys", + "source": "sitesSurveyed", + "type": "feature" + } + ] + }, + { + "readonly": true, + "source": "siteCalculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "css": "span4 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) covered by fauna surveys", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "areaSurveyedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "addRowText": "Add a species", + "columns": [ + { + "width": "40%", + "source": "species", + "title": "Target species recorded", + "type": "speciesSelect" + }, + { + "width": "35%", + "source": "surveyTechnique", + "title": "Survey technique", + "type": "text" + }, + { + "width": "15%", + "source": "individualsOrGroups", + "title": "Individuals or groups?", + "type": "selectOne" + }, + { + "width": "10%", + "source": "numberOfIndividualsOrGroups", + "title": "Number of groups / individuals in fauna survey", + "type": "number" + } + ], + "userAddedRows": true, + "source": "faunaSurveyDetails", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesFaunaSurvey", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Fire management", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "sitesTreated" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesTreated)" + }, + "dataType": "number", + "name": "calculatedAreaTreatedHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedTreatedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The managed area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(sitesTreated)" + }, + "dataType": "number", + "name": "calculatedLengthTreatedKm", + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthTreatedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The managed length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedAreaTreatedHa" + }, + "dataType": "number", + "name": "areaTreatedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedLengthTreatedKm" + }, + "dataType": "number", + "name": "lengthTreatedKm", + "units": "km", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required", + "behaviour": [ + { + "condition": "not (within(calculatedAreaTreatedHa, areaTreatedHa, 0.1))", + "type": "visible" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "validate": "required,maxSize[300]", + "behaviour": [ + { + "type": "visible", + "condition": "\"Other\" == mappingNotAlignedReason" + } + ] + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "validate": "required", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(calculatedAreaTreatedHa, areaTreatedHa, 0.1)) or roundTo(areaTreatedHa, 2) != roundTo(areaInvoicedTreatedHa, 2)", + "type": "visible" + } + ] + }, + { + "dataType": "number", + "name": "areaInvoicedTreatedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "min[0]" + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "areaTreatedHa" + } + } + ] + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.lengthKm(sitesTreated)" + }, + "dataType": "number", + "name": "lengthTreatedKm", + "units": "km", + "decimalPlaces": 3, + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.lengthKm(sitesTreated)*0.9" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.lengthKm(sitesTreated)*1.1" + } + } + ] + }, + { + "dataType": "text", + "name": "fireManagementType", + "description": "", + "constraints": [ + "Cultural burn", + "Ecological burn", + "Grading", + "Hazard reduction burn", + "Herbicide", + "Slashing", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherFireManagementType", + "behaviour": [ + { + "condition": "fireManagementType == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[100]" + }, + { + "dataType": "feature", + "name": "sitesBenefittedByFireAction" + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.areaHa(sitesBenefittedByFireAction)" + }, + "dataType": "number", + "name": "areaBenefittedByFireActionHa", + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.areaHa(sitesBenefittedByFireAction)*0.9" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.areaHa(sitesBenefittedByFireAction)*1.1" + } + } + ] + }, + { + "dataType": "text", + "name": "evidenceOfBenefit", + "validate": "maxSize[300]" + } + ], + "dataType": "list", + "name": "fireManagementDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Fire management", + "title": "Implementing fire management actions", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "10%", + "source": "initialOrFollowup", + "type": "selectOne", + "title": "Initial or follow-up control?" + }, + { + "width": "15%", + "title": "Area (ha) treated by fire management action", + "type": "col", + "items": [ + { + "source": "sitesTreated", + "type": "feature" + }, + { + "source": "calculatedAreaTreatedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + }, + "readonly": "readonly" + }, + { + "source": "calculatedLengthTreatedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + }, + "readonly": "readonly" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "width": "20%", + "type": "col", + "title": "Actual area (ha) / length (km) treated by managment action", + "helpText": "Enter the amount you will invoice for during this reporting period.", + "items": [ + { + "source": "areaTreatedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "lengthTreatedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "15%", + "title": "Type of fire management action", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "fireManagementType", + "type": "select2" + } + ] + }, + { + "source": "otherFireManagementType", + "type": "text" + } + ] + }, + { + "width": "20%", + "type": "col", + "title": "Please map any off-site area/s if they benefitted from this fire management action", + "items": [ + { + "source": "sitesBenefittedByFireAction", + "type": "feature", + "title": "Please map any off-site area/s if they benefitted from this fire management action" + }, + { + "source": "areaBenefittedByFireActionHa", + "type": "number", + "readonly": "readonly", + "title": "Area (ha) protected by fire management action" + } + ] + }, + { + "width": "20%", + "source": "evidenceOfBenefit", + "type": "textarea", + "rows": 3, + "title": "If off-site area was mapped please provide a description on the evidence available to reflect this benefit" + } + ], + "userAddedRows": true, + "source": "fireManagementDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "isiFireManagement", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Flora survey", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "baselineOrIndicatorSurvey", + "description": "", + "constraints": [ + "Baseline", + "Indicator" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfFloraSurveys", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "dateRange", + "description": "What time of year (eg. Dates by dd/mm/yyyyy, Months, Season/s)", + "validate": "required,maxSize[300]" + }, + { + "dataType": "feature", + "name": "sitesSurveyed" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesSurveyed)" + }, + "dataType": "number", + "name": "siteCalculatedAreaHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The surveyed area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesSurveyed)", + "type": "computed" + }, + "dataType": "number", + "name": "areaSurveyedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaSurveyedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1)", + "type": "if" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "if" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1) or roundTo(areaSurveyedHa, 2) != roundTo(areaInvoicedHa, 2)", + "type": "if" + } + ], + "validate": "required" + }, + { + "columns": [ + { + "dataType": "species", + "name": "species", + "validate": "required" + }, + { + "dataType": "text", + "name": "threatenedEcologicalCommunity", + "validate": "maxSize[300]" + }, + { + "dataType": "text", + "name": "surveyTechnique", + "description": "What/how will the survey capture the flora data", + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "individualsOrGroups", + "constraints": [ + "Individuals", + "Groups" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfIndividualsOrGroups", + "validate": "required,min[0]" + } + ], + "dataType": "list", + "name": "floraSurveyDetails" + } + ], + "dataType": "list", + "name": "floraSurveys", + "minSize": 1 + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Flora survey", + "title": "Flora survey", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "New survey site", + "userAddedRows": true, + "source": "floraSurveys", + "type": "repeat", + "items": [ + { + "css": "border-bottom", + "type": "row", + "items": [ + { + "preLabel": "Baseline survey or indicator (follow-up) survey?", + "css": "span3", + "source": "baselineOrIndicatorSurvey", + "type": "selectOne" + }, + { + "preLabel": "Number of flora surveys conducted", + "css": "span3", + "source": "numberOfFloraSurveys", + "type": "number" + }, + { + "preLabel": "Date range", + "css": "span3", + "source": "dateRange", + "type": "text" + } + ] + }, + { + "type": "row", + "items": [ + { + "css": "span3 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s covered by flora surveys", + "source": "sitesSurveyed", + "type": "feature" + } + ] + }, + { + "readonly": true, + "source": "siteCalculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "css": "span4 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) covered by flora surveys", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "areaSurveyedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "columns": [ + { + "width": "30%", + "source": "species", + "title": "Target species recorded", + "type": "speciesSelect" + }, + { + "width": "25%", + "source": "threatenedEcologicalCommunity", + "title": "Threatened ecological communities (if applicable)", + "type": "text" + }, + { + "width": "20%", + "source": "surveyTechnique", + "title": "Survey technique", + "type": "text" + }, + { + "width": "15%", + "source": "individualsOrGroups", + "title": "Individuals or groups?", + "type": "selectOne" + }, + { + "width": "10%", + "source": "numberOfIndividualsOrGroups", + "title": "Number of groups / individuals in flora survey", + "type": "number" + } + ], + "userAddedRows": true, + "source": "floraSurveyDetails", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesFloraSurvey", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Habitat augmentation", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "sitesOfAugmentation" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesOfAugmentation)" + }, + "dataType": "number", + "name": "calculatedAreaAugmentedHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedAumentationHa > 0", + "type": "conditional_validation", + "value": { + "message": "The augmented area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(sitesOfAugmentation)" + }, + "dataType": "number", + "name": "calculatedLengthAugmentedKm", + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthAugmentedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The augmented length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedAreaAugmentedHa" + }, + "dataType": "number", + "name": "areaAugmentedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedLengthAugmentedKm" + }, + "dataType": "number", + "name": "lengthAugmentedKm", + "units": "km", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "validate": "required", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(calculatedAreaAugmentedHa, areaAugmentedHa, 0.1)) or roundTo(areaAugmentedHa, 2) != roundTo(areaInvoicedAumentationHa, 2)", + "type": "visible" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required", + "behaviour": [ + { + "condition": "not (within(calculatedAreaAugmentedHa, areaAugmentedHa, 0.1))", + "type": "visible" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "validate": "required,maxSize[300]", + "behaviour": [ + { + "type": "visible", + "condition": "\"Other\" == mappingNotAlignedReason" + } + ] + }, + { + "dataType": "number", + "name": "areaInvoicedAumentationHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "areaAugmentedHa" + } + } + ] + }, + { + "dataType": "number", + "name": "numberOfStructuresInstalled", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "habitatAugmentationType", + "description": "", + "constraints": [ + "Artificial fauna movement devices", + "Artificial nesting or roosting habitat (incl. tiles, fence posts)", + "Environmental thinning", + "Improving fish passage", + "Natural features (rocks, logs)", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherHabitatAugmentationType", + "description": "Please specify the habitat augmentation type if Other (specify in notes) was selected in the Type of habitat augmentation column.", + "behaviour": [ + { + "condition": "habitatAugmentationType == \"Other\"", + "type": "visible" + } + ], + "validate": "required,maxSize[100]" + }, + { + "dataType": "text", + "name": "habitatAugmentationObjective", + "description": "", + "validate": "required,maxSize[300]" + }, + { + "dataType": "feature", + "name": "sitesBenefittedByHabitatAugmentation" + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.areaHa(sitesBenefittedByHabitatAugmentation)" + }, + "dataType": "number", + "name": "areaBenefittedByHabitatAugmentationHa", + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.areaHa(sitesBenefittedByHabitatAugmentation)*0.9" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.areaHa(sitesBenefittedByHabitatAugmentation)*1.1" + } + } + ] + }, + { + "dataType": "text", + "name": "evidenceOfBenefit", + "validate": "maxSize[300]" + } + ], + "dataType": "list", + "name": "habitatAugmentationDetails" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Habitat augmentation", + "title": "Habitat augmentation", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "10%", + "source": "initialOrFollowup", + "title": "Initial or follow-up control?", + "type": "selectOne" + }, + { + "width": "10%", + "title": "Site/s of habitat augmentation", + "type": "col", + "items": [ + { + "source": "sitesOfAugmentation", + "type": "feature" + }, + { + "source": "calculatedAreaAugmentedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + }, + "readonly": "readonly" + }, + { + "source": "calculatedLengthAugmentedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + }, + "readonly": "readonly" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "width": "10%", + "type": "col", + "title": "Actual area (ha) / length (km) of habitat augmentation", + "helpText": "Enter the amount you will invoice for during this reporting period.", + "items": [ + { + "source": "areaAugmentedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "lengthAugmentedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "10%", + "source": "numberOfStructuresInstalled", + "type": "number", + "title": "Number of structures installed" + }, + { + "width": "15%", + "title": "Type of habitat augmentation / installed", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "habitatAugmentationType", + "type": "select2" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "otherHabitatAugmentationType", + "type": "textarea" + } + ] + } + ] + }, + { + "width": "20%", + "source": "habitatAugmentationObjective", + "title": "Purpose of habitat augmentation", + "type": "textarea" + }, + { + "width": "10%", + "title": "Please map any off-site area/s if they benefitted from this habitat augmentation", + "type": "col", + "items": [ + { + "source": "sitesBenefittedByHabitatAugmentation", + "type": "feature" + }, + { + "source": "areaBenefittedByHabitatAugmentationHa", + "type": "number", + "displayOptions": { + "displayUnits": true + }, + "readonly": "readonly" + } + ] + }, + { + "width": "20%", + "source": "evidenceOfBenefit", + "title": "If off-site area was mapped please provide a description on the evidence available to reflect this benefit", + "type": "textarea" + } + ], + "userAddedRows": true, + "source": "habitatAugmentationDetails", + "type": "table" + } + ] + } + ] + }, + "templateName": "statesHabitatAugmentation", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Identifying sites", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Identifying the location of potential sites", + "modelName": "RLP - Identifying sites", + "dataModel": [ + { + "dataType": "number", + "name": "numberSitesIdentified", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "sitesPurpose", + "description": "Please start with the '[Service name]:' for which the site has been identified for. Then a brief description of what work/s are required to fix the area.", + "validate": "required,maxSize[500]" + }, + { + "name": "photographicEvidence", + "dataType": "image" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "type": "row", + "items": [ + { + "source": "numberSitesIdentified", + "preLabel": "Number of potential sites identified", + "type": "number", + "css": "span3" + }, + { + "source": "sitesPurpose", + "preLabel": "What have these sites been identified for?", + "type": "textarea", + "rows": 5, + "css": "span9" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "image", + "source": "photographicEvidence", + "preLabel": "Optionally attach photos" + } + ] + } + ], + "type": "section" + } + ] + }, + "templateName": "statesIdentifyingSites", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Improving hydrological regimes", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "installedOrMaintained", + "description": "", + "constraints": [ + "Installed", + "Maintained" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfTreatmentsImplemented", + "validate": "required,min[0]" + }, + { + "dataType": "feature", + "name": "improvedSites" + }, + { + "computed": { + "expression": "$geom.areaHa(improvedSites)" + }, + "dataType": "number", + "name": "calculatedAreaCoveringRegimeChangeHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "invoicedAreaHa > 0", + "type": "conditional_validation", + "value": { + "message": "The area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(improvedSites)" + }, + "dataType": "number", + "name": "calculatedLengthOfRegimeChangeKm", + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthOfRegimeChangeKm > 0", + "type": "conditional_validation", + "value": { + "message": "The length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "validate": "required", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(calculatedAreaCoveringRegimeChangeHa, areaCoveringRegimeChangeHa, 0.1) and within(calculatedLengthOfRegimeChangeKm, lengthOfRegimeChangeKm, 0.1))", + "type": "visible" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required", + "behaviour": [ + { + "condition": "not (within(calculatedAreaCoveringRegimeChangeHa, areaCoveringRegimeChangeHa, 0.1) and within(calculatedLengthOfRegimeChangeKm, lengthOfRegimeChangeKm, 0.1))", + "type": "visible" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "validate": "required,maxSize[300]", + "behaviour": [ + { + "type": "visible", + "condition": "\"Other\" == mappingNotAlignedReason" + } + ] + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedAreaCoveringRegimeChangeHa" + }, + "dataType": "number", + "name": "areaCoveringRegimeChangeHa", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "ha" + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedLengthOfRegimeChangeKm" + }, + "dataType": "number", + "name": "lengthOfRegimeChangeKm", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "km" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaCoveringRegimeChangeHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "treatmentType", + "description": "", + "constraints": [ + "Removing barriers (e.g fish barriers)", + "Structure instalment or modification (e.g. weirs, flow gauging stations, fords, culverts)", + "Resnagging", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherTreatmentType", + "behaviour": [ + { + "condition": "treatmentType == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "treatmentObjective", + "description": "Aim of the action - e.g. hydrological regime change from X to Y", + "validate": "required,maxSize[300]" + }, + { + "dataType": "feature", + "name": "sitesOfCatchmentManaged" + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.areaHa(sitesOfCatchmentManaged)" + }, + "dataType": "number", + "name": "areaOfCatchmentManagedHa", + "description": "Area improved by hydrological regime change", + "validate": "min[0]" + } + ], + "dataType": "list", + "name": "hydrologicalRegimeDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Improving hydrological regimes", + "title": "Improving hydrological regimes", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "15%", + "source": "installedOrMaintained", + "type": "selectOne", + "title": "Installed or maintained?" + }, + { + "width": "10%", + "source": "numberOfTreatmentsImplemented", + "title": "Number of treatments implemented to improve water management", + "type": "number" + }, + { + "width": "10%", + "type": "col", + "items": [ + { + "type": "feature", + "source": "improvedSites" + }, + { + "type": "row", + "items": [ + { + "type": "number", + "source": "calculatedAreaCoveringRegimeChangeHa", + "displayOptions": { + "displayUnits": true + }, + "readonly": true + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "number", + "source": "calculatedLengthOfRegimeChangeKm", + "displayOptions": { + "displayUnits": true + }, + "readonly": true + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ], + "title": "Site/s where hydrological regimes are being improved" + }, + { + "width": "15%", + "title": "Actual area (ha) / length (km) covering the hydrological regime change", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "areaCoveringRegimeChangeHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "lengthOfRegimeChangeKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "30%", + "title": "Type of treatment implemented to improve water management", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "treatmentType", + "type": "select2" + } + ] + }, + { + "source": "otherTreatmentType", + "placeholder": "Type of treatment implemented (if Other)", + "type": "text" + } + ] + }, + { + "width": "25%", + "source": "treatmentObjective", + "title": "Hydrological treatment objective", + "type": "textarea" + }, + { + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "type": "feature", + "source": "sitesOfCatchmentManaged" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "areaOfCatchmentManagedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + } + ], + "width": "10%", + "title": "Site/s of catchment being managed as a result of this management action" + } + ], + "userAddedRows": true, + "source": "hydrologicalRegimeDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesImprovingHydrologicalRegimes", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Improving land management practices", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "implementationSite" + }, + { + "computed": { + "expression": "$geom.areaHa(implementationSite)" + }, + "dataType": "number", + "name": "calculatedAreaImplementedHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaImplementedInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(implementationSite)" + }, + "dataType": "number", + "name": "calculatedLengthImplementedKm", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthImplementedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "$geom.areaHa(implementationSite)", + "type": "computed" + }, + "dataType": "number", + "name": "areaImplementedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "defaultValue": { + "expression": "$geom.lengthKm(implementationSite)", + "type": "computed" + }, + "dataType": "number", + "name": "lengthImplementedKm", + "units": "km", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(calculatedAreaImplementedHa, areaImplementedHa, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(calculatedAreaImplementedHa, areaImplementedHa, 0.1)) or roundTo(areaImplementedHa, 2) != roundTo(areaImplementedInvoicedHa, 2)", + "type": "visible" + } + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "areaImplementedInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaImplementedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "practiceChangeType", + "description": "", + "constraints": [ + "Fencing", + "Erosion management", + "Stocking rates", + "Watering arrangements", + "Paddock design", + "Rotation grazing", + "Permaculture", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherPracticeChangeType", + "description": "Please specify the type of land management practice change if Other (specify in notes) was selected in the Type of land management practice change.", + "behaviour": [ + { + "condition": "practiceChangeType == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[100]" + }, + { + "dataType": "text", + "name": "industryType", + "constraints": [ + "Broad acre cropping", + "Dairy", + "Horticulture", + "Grazing", + "Fisheries", + "Aquaculture", + "Environment" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "practiceChangeObjective", + "description": "How will the practice change/s contribute to the area", + "validate": "required,maxSize[300]" + }, + { + "dataType": "feature", + "name": "offSiteBenefitSites" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(offSiteBenefitSites)", + "type": "computed" + }, + "dataType": "number", + "name": "offSiteBenefitAreaHa", + "validate": [ + { + "param": { + "expression": "$geom.areaHa(offSiteBenefitSites)*0.9", + "type": "computed" + }, + "rule": "min" + }, + { + "param": { + "expression": "$geom.areaHa(offSiteBenefitSites)*1.1", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "evidenceOfBenefit", + "validate": "maxSize[300]" + } + ], + "dataType": "list", + "name": "landManagementDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Improving land management practices", + "title": "Improving land management practices", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "10%", + "source": "initialOrFollowup", + "type": "selectOne", + "title": "Initial or follow-up control?" + }, + { + "width": "5%", + "type": "col", + "title": "Site/s covered by practice change", + "items": [ + { + "source": "implementationSite", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaImplementedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedLengthImplementedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "Enter the amount you will invoice for during this reporting period.", + "width": "15%", + "type": "col", + "title": "Actual area (ha) covered by practice change", + "items": [ + { + "source": "areaImplementedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "lengthImplementedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "20%", + "title": "Type of action", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "practiceChangeType", + "type": "select2" + } + ] + }, + { + "source": "otherPracticeChangeType", + "title": "Type of action (if Other)", + "type": "text" + } + ] + }, + { + "width": "10%", + "source": "industryType", + "title": "Industry type", + "type": "selectOne" + }, + { + "width": "15%", + "source": "practiceChangeObjective", + "title": "Purpose of improving land management practice", + "type": "textarea" + }, + { + "width": "25%", + "title": "Please map any off-site area/s if they benefitted from this practice change", + "type": "col", + "items": [ + { + "source": "offSiteBenefitSites", + "type": "feature" + }, + { + "source": "offSiteBenefitAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "evidenceOfBenefit", + "placeholder": "Please provide a description on the evidence available to reflect this benefit", + "type": "textarea" + } + ] + } + ], + "userAddedRows": true, + "source": "landManagementDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesLandManagementPractices", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Disease management", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "siteTreated" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(siteTreated)", + "type": "computed" + }, + "dataType": "number", + "name": "calculatedAreaTreatedHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaTreatedInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The managed area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(siteTreated)" + }, + "dataType": "number", + "name": "calculatedLengthTreatedKm", + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthTreatedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The managed length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "calculatedAreaTreatedHa", + "type": "computed" + }, + "dataType": "number", + "name": "areaTreatedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "defaultValue": { + "expression": "calculatedLengthTreatedKm", + "type": "computed" + }, + "dataType": "number", + "name": "lengthTreatedKm", + "units": "km", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(calculatedAreaTreatedHa, areaTreatedHa, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(calculatedAreaTreatedHa, areaTreatedHa, 0.1)) or roundTo(areaTreatedHa, 2) != roundTo(areaTreatedInvoicedHa, 2)", + "type": "visible" + } + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "areaTreatedInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaTreatedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "targetDisease", + "description": "", + "validate": "required,maxSize[100]" + }, + { + "dataType": "text", + "name": "managementMethod", + "dwcAttribute": "treatmentMethod", + "constraints": [ + "Biological control agents", + "Fumigation", + "Host destruction", + "Plant disease management - quarantine", + "Plant disease management - treatment", + "Plant disease management - hygiene", + "Positive competition", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherManagementMethod", + "description": "Please specify the management method used if Other (specify in notes) was selected in the Management Method column.", + "behaviour": [ + { + "condition": "managementMethod == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[100]" + }, + { + "dataType": "text", + "name": "treatmentObjective", + "description": "Please start with either part of the field heading [dash]. If reporting on both separate the information with a ';'. (eg. 'Management method -' and a brief description of method being used to fix the area; 'Treatment objective -' and a brief description of how the work will contribute to the area.", + "validate": "required,maxSize[300]" + }, + { + "dataType": "feature", + "name": "offSiteBenefitSites" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(offSiteBenefitSites)", + "type": "computed" + }, + "dataType": "number", + "name": "offSiteBenefitAreaHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "min[0]" + }, + { + "defaultValue": { + "expression": "$geom.lengthKm(offSiteBenefitSites)", + "type": "computed" + }, + "dataType": "number", + "name": "offSiteBenefitLengthKm", + "units": "km", + "decimalPlaces": 3, + "validate": "min[0]" + }, + { + "dataType": "text", + "name": "evidenceOfBenefit", + "validate": "maxSize[300]" + } + ], + "dataType": "list", + "name": "diseaseManagementDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Disease management", + "title": "Managing disease", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "5%", + "source": "initialOrFollowup", + "title": "Initial or follow-up treatment?", + "type": "selectOne" + }, + { + "width": "5%", + "type": "col", + "title": "Site/s where disease managed", + "items": [ + { + "source": "siteTreated", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaTreatedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedLengthTreatedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "Enter the amount you will invoice for during this reporting period.", + "width": "15%", + "type": "col", + "title": "Actual area (ha) treated for disease", + "items": [ + { + "source": "areaTreatedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "lengthTreatedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "15%", + "source": "targetDisease", + "title": "Disease treated", + "type": "text" + }, + { + "width": "15%", + "type": "col", + "title": "Type of management method / treatment", + "items": [ + { + "type": "row", + "items": [ + { + "source": "managementMethod", + "type": "select2" + } + ] + }, + { + "source": "otherManagementMethod", + "placeholder": "Type of management method / treatment (if other)", + "type": "text" + } + ] + }, + { + "width": "12%", + "source": "treatmentObjective", + "title": "Management method / treatment objective", + "type": "textarea" + }, + { + "width": "15%", + "type": "col", + "title": "Please map any off-site area/s if they have also benefitted from this disease management", + "items": [ + { + "source": "offSiteBenefitSites", + "type": "feature" + }, + { + "source": "offSiteBenefitAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "offSiteBenefitLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "evidenceOfBenefit", + "placeholder": "Please provide a description on the evidence available to reflect this benefit", + "type": "textarea" + } + ] + } + ], + "userAddedRows": true, + "source": "diseaseManagementDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesDiseaseManagement", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Negotiations", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "typeOfGroup", + "description": "If 'Other', please include type in 'Objective of negotiations'", + "constraints": [ + "Community", + "Landholders", + "Farmers", + "Traditional owners", + "Agricultural industry group", + "Other" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfGroupsNegotiatedWith", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfIndividualsNegotiatedWith", + "validate": "min[0]" + }, + { + "dataType": "text", + "name": "negotiationObjective", + "description": "Please provide a brief description of negotiations. Separate multiple with a ';'", + "validate": "required,maxSize[300]" + } + ], + "dataType": "list", + "name": "negotiations" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Negotiations", + "title": "Negotiating with the Community, landholders, Traditional Owner groups etc.", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "30%", + "source": "typeOfGroup", + "type": "select2", + "title": "Which sector does the group belong to?" + }, + { + "width": "10%", + "source": "numberOfGroupsNegotiatedWith", + "type": "number", + "title": "Groups negotiated with", + "helpText": "Please note an individual can be considered a group for the purposes of reporting." + }, + { + "width": "60%", + "source": "negotiationObjective", + "type": "textarea", + "rows": 3, + "title": "Objective of negotiation", + "placeholder": "Please include the objectives of the negotation or additional clarifying information" + } + ], + "userAddedRows": true, + "source": "negotiations", + "type": "table" + } + ] + } + ] + }, + "templateName": "statesNegotiations", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Obtaining approvals", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Obtaining relevant approvals", + "modelName": "RLP - Obtaining approvals", + "dataModel": [ + { + "dataType": "number", + "name": "numberApprovalsObtained", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "approvalsObjective", + "validate": "required,maxSize[300]", + "description": "Please list why these approvals were required to be obtained for this program" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "type": "row", + "items": [ + { + "source": "numberApprovalsObtained", + "preLabel": "Number of relevant approvals obtained", + "type": "number", + "css": "span3" + }, + { + "source": "approvalsObjective", + "preLabel": "What were these approvals obtained for?", + "type": "textarea", + "rows": 3, + "css": "span9" + } + ] + } + ], + "type": "section" + } + ] + }, + "templateName": "statesObtainingApprovals", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Pest animal survey", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "baselineOrIndicatorSurvey", + "description": "", + "constraints": [ + "Baseline", + "Indicator" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfPestAnimalSurveys", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "dateRange", + "description": "What time of year (eg. Dates by dd/mm/yyyyy, Months, Season/s)", + "validate": "required,maxSize[100]" + }, + { + "dataType": "feature", + "name": "sitesSurveyed" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesSurveyed)" + }, + "dataType": "number", + "name": "siteCalculatedAreaHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The surveyed area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesSurveyed)", + "type": "computed" + }, + "dataType": "number", + "name": "areaSurveyedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaSurveyedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1)", + "type": "if" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "if" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1) or roundTo(areaSurveyedHa, 2) != roundTo(areaInvoicedHa, 2)", + "type": "if" + } + ], + "validate": "required" + }, + { + "columns": [ + { + "dataType": "species", + "name": "species", + "validate": "required" + }, + { + "dataType": "text", + "name": "surveyTechnique", + "description": "", + "constraints": [ + "Spotlight count", + "Aerial survey", + "DNA sampling", + "Mark-recapture", + "Signs of presence", + "Camera trapping", + "Trap and release", + "Direct observation", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherSurveyTechnique", + "description": "This field may be used to list multiple survey techniques. This list of survey techniques need to be separated with a ';'. You may also identify what/how the survey will capture the pest animal data", + "behaviour": [ + { + "condition": "surveyTechnique == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "individualsOrGroups", + "constraints": [ + "Individuals", + "Groups" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfIndividualsOrGroups", + "validate": "required,min[0]" + } + ], + "dataType": "list", + "name": "pestAnimals" + } + ], + "dataType": "list", + "name": "pestAnimalSurveys" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Pest animal survey", + "title": "Pest animal survey", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "New survey site", + "userAddedRows": true, + "source": "pestAnimalSurveys", + "type": "repeat", + "items": [ + { + "css": "border-bottom", + "type": "row", + "items": [ + { + "preLabel": "Baseline survey or indicator (follow-up) survey?", + "css": "span3", + "source": "baselineOrIndicatorSurvey", + "type": "selectOne" + }, + { + "preLabel": "Number of surveys conducted", + "css": "span3", + "source": "numberOfPestAnimalSurveys", + "type": "number" + }, + { + "preLabel": "Date range", + "css": "span3", + "source": "dateRange", + "type": "text" + } + ] + }, + { + "type": "row", + "items": [ + { + "css": "span3 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s of surveyed pest animals", + "source": "sitesSurveyed", + "type": "feature" + } + ] + }, + { + "readonly": true, + "source": "siteCalculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "css": "span4 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) surveyed for pest animals", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "areaSurveyedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "addRowText": "Add a species", + "columns": [ + { + "width": "40%", + "source": "species", + "title": "Target species recorded", + "type": "speciesSelect" + }, + { + "width": "15%", + "source": "surveyTechnique", + "title": "Survey technique", + "type": "select2" + }, + { + "width": "20%", + "source": "otherSurveyTechnique", + "title": "Survey technique (if Other)", + "type": "text" + }, + { + "width": "15%", + "source": "individualsOrGroups", + "title": "Individuals or groups?", + "type": "selectOne" + }, + { + "width": "10%", + "source": "numberOfIndividualsOrGroups", + "title": "Number of groups / individuals", + "type": "number" + } + ], + "userAddedRows": true, + "source": "pestAnimals", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "Note: to upload results and methodology of survey, refer to the documents tab.", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesPestAnimalSurvey", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Plant survival survey", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "baselineOrIndicatorSurvey", + "description": "", + "constraints": [ + "Baseline", + "Indicator" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfPlantSurvivalSurveys", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "dateRange", + "description": "What time of year (eg. Dates by dd/mm/yyyyy, Months, Season/s)", + "validate": "required,maxSize[100]" + }, + { + "dataType": "feature", + "name": "sitesSurveyed" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesSurveyed)" + }, + "dataType": "number", + "name": "siteCalculatedAreaHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The surveyed area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesSurveyed)", + "type": "computed" + }, + "dataType": "number", + "name": "areaSurveyedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaSurveyedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1)", + "type": "if" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "if" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1) or roundTo(areaSurveyedHa, 2) != roundTo(areaInvoicedHa, 2)", + "type": "if" + } + ], + "validate": "required" + }, + { + "columns": [ + { + "dataType": "species", + "name": "speciesRecorded", + "validate": "required" + }, + { + "dataType": "text", + "name": "surveyTechnique", + "description": "This field may be used to list multiple survey techniques. This list of survey techniques need to be separated with a ';'. You may also identify 'What/how will the survey capture the plant survival data'", + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "individualsOrGroups", + "constraints": [ + "Individuals", + "Groups" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfSurvivingIndividualsOrGroups", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "survivalRate", + "behaviour": [ + { + "condition": "baselineOrIndicatorSurvey == \"Indicator\"", + "type": "enable" + } + ], + "validate": "required,min[0],max[100]" + } + ], + "dataType": "list", + "name": "speciesSurveyed" + } + ], + "dataType": "list", + "name": "plantSurvivalSurveys" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Plant survival survey", + "title": "Plant survival survey", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "Add survey site", + "userAddedRows": true, + "source": "plantSurvivalSurveys", + "type": "repeat", + "items": [ + { + "css": "border-bottom", + "type": "row", + "items": [ + { + "preLabel": "Baseline survey or indicator (follow-up) survey?", + "css": "span3", + "source": "baselineOrIndicatorSurvey", + "type": "selectOne" + }, + { + "preLabel": "Number of plant survival surveys conducted", + "css": "span3", + "source": "numberOfPlantSurvivalSurveys", + "type": "number" + }, + { + "preLabel": "Date range", + "css": "span3", + "source": "dateRange", + "type": "text" + } + ] + }, + { + "type": "row", + "items": [ + { + "css": "span3 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s surveyed for plant survival", + "source": "sitesSurveyed", + "type": "feature" + } + ] + }, + { + "readonly": true, + "source": "siteCalculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "css": "span4 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) surveyed for plant survival", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "areaSurveyedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "addRowText": "Add a species", + "columns": [ + { + "width": "45%", + "source": "speciesRecorded", + "type": "speciesSelect", + "title": "Species recorded" + }, + { + "width": "20%", + "source": "surveyTechnique", + "title": "Survey technique", + "type": "textarea" + }, + { + "width": "15%", + "source": "individualsOrGroups", + "title": "Individuals or groups?", + "type": "selectOne" + }, + { + "width": "10%", + "source": "numberOfSurvivingIndividualsOrGroups", + "title": "Number of individuals or groups surviving", + "type": "number" + }, + { + "width": "10%", + "source": "survivalRate", + "title": "If follow-up (indicator) survey, what is the survival rate (%)", + "type": "number" + } + ], + "userAddedRows": true, + "source": "speciesSurveyed", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesPlantSurvivalSurvey", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Project planning", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Project planning and delivery of documents as required for the delivery of the Project and monitoring", + "modelName": "RLP - Project planning", + "dataModel": [ + { + "dataType": "list", + "name": "documents", + "columns": [ + { + "dataType": "number", + "name": "numberPlanningDocuments", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfDaysAdministeringProjectPlans", + "validate": "required,min[0]", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)" + }, + { + "dataType": "text", + "name": "purposeOfProjectPlans", + "validate": "required,maxSize[300]", + "description": "Please identify why these plans and/or documents were needed" + } + ] + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "type": "table", + "userAddedRows": true, + "source": "documents", + "columns": [ + { + "source": "numberPlanningDocuments", + "title": "Number of planning and delivery documents for delivery of the project and monitoring", + "type": "number", + "width": "15%" + }, + { + "source": "numberOfDaysAdministeringProjectPlans", + "title": "Number of days administering project plans / delivery documents", + "type": "number", + "width": "15%" + }, + { + "source": "purposeOfProjectPlans", + "title": "Purpose of these documents", + "type": "textarea", + "rows": 3, + "width": "70%" + } + ] + } + ], + "type": "section" + } + ] + }, + "templateName": "statesProjectPlanning", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Remediating riparian and aquatic areas", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "sitesRemediated" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesRemediated)" + }, + "dataType": "number", + "name": "calculatedAreaRemediatedHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaRemediatedInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The remediated area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(sitesRemediated)" + }, + "dataType": "number", + "name": "calculatedLengthRemediatedKm", + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthRemediatedInvoicedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The remediated length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "calculatedAreaRemediatedHa", + "type": "computed" + }, + "dataType": "number", + "name": "areaRemediatedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "defaultValue": { + "expression": "calculatedLengthRemediatedKm", + "type": "computed" + }, + "dataType": "number", + "name": "lengthRemediatedKm", + "units": "km", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(calculatedAreaRemediatedHa, areaRemediatedHa, 0.1) and within(calculatedLengthRemediatedKm, lengthRemediatedKm, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(calculatedAreaRemediatedHa, areaRemediatedHa, 0.1) and within(calculatedLengthRemediatedKm, lengthRemediatedKm, 0.1)) or roundTo(areaRemediatedHa, 2) != roundTo(areaRemediatedInvoicedHa, 2) or roundTo(lengthRemediatedKm, 2) != roundTo(lengthRemediatedInvoicedKm, 2)", + "type": "visible" + } + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "areaRemediatedInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaRemediatedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "number", + "name": "lengthRemediatedInvoicedKm", + "units": "km", + "decimalPlaces": 3, + "validate": [ + { + "rule": "min[0]" + }, + { + "param": { + "expression": "lengthRemediatedKm", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "number", + "name": "numberOfStructuresInstalled", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "remediationType", + "description": "", + "constraints": [ + "Access control", + "Bank grooming", + "Flow gauging stations", + "Fords", + "Culverts", + "Revegetation", + "Weirs", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherRemediationType", + "behaviour": [ + { + "condition": "remediationType == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[100]" + }, + { + "dataType": "feature", + "name": "offSiteBenefitSites" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(offSiteBenefitSites)", + "type": "computed" + }, + "dataType": "number", + "name": "offSiteBenefitAreaHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "min[0]" + }, + { + "dataType": "text", + "name": "evidenceOfBenefit", + "validate": "maxSize[300]" + } + ], + "dataType": "list", + "name": "remediationDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Remediating riparian and aquatic areas", + "title": "Remediating riparian and aquatic areas", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "10%", + "source": "initialOrFollowup", + "title": "Initial / Followup control", + "type": "selectOne" + }, + { + "width": "10%", + "type": "col", + "title": "Site/s covered by remediation", + "items": [ + { + "source": "sitesRemediated", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaRemediatedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedLengthRemediatedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "Enter the amount you will invoice for during this reporting period.", + "width": "22%", + "type": "col", + "title": "Actual area (ha) / length (km) being remediated", + "items": [ + { + "source": "areaRemediatedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "lengthRemediatedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "15%", + "source": "numberOfStructuresInstalled", + "type": "number", + "title": "Number of structures installed" + }, + { + "width": "17%", + "type": "col", + "title": "Type of remediation", + "items": [ + { + "type": "row", + "items": [ + { + "source": "remediationType", + "type": "select2" + } + ] + }, + { + "source": "otherRemediationType", + "placeholder": "Type of remediation (if Other)", + "type": "text" + } + ] + }, + { + "width": "22%", + "type": "col", + "title": "Please identify any area/s that have shown evidence of off-site benefits", + "items": [ + { + "source": "offSiteBenefitSites", + "type": "feature" + }, + { + "source": "offSiteBenefitAreaHa", + "title": "Area (ha) evident of improved remediation", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "evidenceOfBenefit", + "placeholder": "Please provide a description on the evidence available to reflect this benefit", + "type": "textarea" + } + ] + } + ], + "userAddedRows": true, + "source": "remediationDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesRemediatingRiparianAndAquaticAreas", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Revegetating habitat", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrMaintenance", + "constraints": [ + "Initial", + "Maintenance" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "sitesRevegetated" + }, + { + "dataType": "number", + "name": "siteCalculatedAreaHa", + "computed": { + "expression": "$geom.areaHa(sitesRevegetated)" + }, + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The revegetated area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "dataType": "number", + "name": "siteCalculatedLengthKm", + "computed": { + "expression": "$geom.lengthKm(sitesRevegetated)" + }, + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthRevegetatedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The revegetated length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "type": "computed", + "expression": "siteCalculatedAreaHa" + }, + "dataType": "number", + "name": "areaRevegetatedHa", + "validate": "required,min[0]", + "decimalPlaces": 3, + "units": "ha" + }, + { + "defaultValue": { + "type": "computed", + "expression": "siteCalculatedLengthKm" + }, + "dataType": "number", + "name": "lengthRevegetatedKm", + "validate": "required,min[0]", + "decimalPlaces": 3, + "units": "km" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "areaRevegetatedHa" + } + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required", + "behaviour": [ + { + "condition": "not within(areaRevegetatedHa, siteCalculatedAreaHa, 0.1)", + "type": "if" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "validate": "required,maxSize[300]", + "behaviour": [ + { + "type": "if", + "condition": "\"Other\" == mappingNotAlignedReason" + } + ] + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "validate": "required", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not within(areaRevegetatedHa, siteCalculatedAreaHa, 0.1) or roundTo(areaRevegetatedHa, 2) != roundTo(areaInvoicedHa, 2)", + "type": "if" + } + ] + }, + { + "dataType": "feature", + "name": "offSiteBenefitSites" + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.areaHa(offSiteBenefitSites)" + }, + "dataType": "number", + "name": "offSiteBenefitAreaHa", + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.areaHa(offSiteBenefitSites)*0.9" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.areaHa(offSiteBenefitSites)*1.1" + } + } + ] + }, + { + "dataType": "text", + "name": "evidenceOfBenefit", + "validate": "maxSize[300]" + }, + { + "columns": [ + { + "dataType": "species", + "name": "species", + "dwcAttribute": "scientificName", + "description": "", + "validate": "required" + }, + { + "dataType": "text", + "name": "typeOfRevegetationActivity", + "validate": "required,maxSize[100]" + }, + { + "dataType": "number", + "name": "numberOfDaysCollectingSeed", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfDaysPropagatingPlants", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "revegetationMethod", + "dwcAttribute": "establishmentMeans", + "description": "If 'Other', please identify in 'Type of revegetation activity' field", + "constraints": [ + "Direct seeding", + "Tubestock planting", + "Both", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "threatenedEcologicalCommunity", + "description": "This free text field allows multiple TECs to be entered. They should be written as listed in EPBC, and separated by ';'", + "validate": "maxSize[100]" + }, + { + "dataType": "text", + "name": "individualsOrKilogramsOfSeed", + "constraints": [ + "Individuals", + "Kilograms of seed" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberPlanted", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "revegetationObjective", + "validate": "required,maxSize[300]" + } + ], + "dataType": "list", + "name": "revegetationDetails" + } + ], + "dataType": "list", + "name": "revegetationArea" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Revegetating habitat", + "title": "Revegetating habitat", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "New area of revegetation", + "userAddedRows": true, + "source": "revegetationArea", + "type": "repeat", + "items": [ + { + "type": "row", + "css": "border-bottom", + "items": [ + { + "preLabel": "Initial or maintenance activity?", + "css": "span3", + "source": "initialOrMaintenance", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "css": "border-bottom", + "items": [ + { + "type": "col", + "css": "span3 col-border-right", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s being revegetated", + "source": "sitesRevegetated", + "type": "feature" + } + ] + }, + { + "source": "siteCalculatedAreaHa", + "type": "number", + "readonly": true, + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "siteCalculatedLengthKm", + "type": "number", + "readonly": true, + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "type": "col", + "css": "span4 col-border-right", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) / length (km) of habitat revegetated", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "areaRevegetatedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "lengthRevegetatedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please map any off-site area/s if they benefitted from this revegetation activity", + "css": "span3", + "source": "offSiteBenefitSites", + "type": "feature" + }, + { + "preLabel": "Area (ha) benefitting from revegetation activity", + "css": "span2", + "source": "offSiteBenefitAreaHa", + "type": "number" + }, + { + "preLabel": "If off-site area was mapped please provide a description on the evidence available to reflect this benefit.", + "css": "span6", + "source": "evidenceOfBenefit", + "type": "textarea" + } + ] + }, + { + "addRowText": "Add a species", + "columns": [ + { + "width": "20%", + "source": "species", + "title": "Species", + "type": "speciesSelect" + }, + { + "width": "5%", + "source": "numberOfDaysCollectingSeed", + "title": "Number of days collecting seed", + "type": "number" + }, + { + "width": "5%", + "source": "numberOfDaysPropagatingPlants", + "title": "Number of days propagating plants", + "type": "number" + }, + { + "width": "15%", + "source": "revegetationMethod", + "title": "Planting method", + "type": "selectOne" + }, + { + "width": "15%", + "source": "typeOfRevegetationActivity", + "title": "Type of revegetation activity", + "type": "text" + }, + { + "width": "15%", + "source": "threatenedEcologicalCommunity", + "title": "Threatened ecological community (if applicable)", + "type": "text" + }, + { + "width": "10%", + "source": "individualsOrKilogramsOfSeed", + "title": "Individuals / kilograms", + "type": "selectOne" + }, + { + "width": "10%", + "source": "numberPlanted", + "title": "Number planted", + "type": "number" + }, + { + "width": "20%", + "source": "revegetationObjective", + "title": "Objective of revegetation activity", + "type": "textarea" + } + ], + "userAddedRows": true, + "source": "revegetationDetails", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesRevegetatingHabitat", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Weed treatment", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "sitesTreated" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesTreated)" + }, + "dataType": "number", + "name": "siteCalculatedAreaHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The treated area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(sitesTreated)" + }, + "dataType": "number", + "name": "siteCalculatedLengthKm", + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthInvoicedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The treated length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesTreated)", + "type": "computed" + }, + "dataType": "number", + "name": "areaTreatedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "defaultValue": { + "expression": "$geom.lengthKm(sitesTreated)", + "type": "computed" + }, + "dataType": "number", + "name": "lengthTreatedKm", + "units": "km", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaTreatedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "number", + "name": "lengthInvoicedKm", + "units": "km", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "lengthTreatedKm", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(areaTreatedHa, siteCalculatedAreaHa, 0.1) and within(lengthTreatedKm, siteCalculatedLengthKm, 0.1))", + "type": "if" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "if" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(areaTreatedHa, siteCalculatedAreaHa, 0.1) and within(lengthTreatedKm, siteCalculatedLengthKm, 0.1)) or roundTo(areaTreatedHa, 2) != roundTo(areaInvoicedHa, 2) or roundTo(lengthTreatedKm, 2) != roundTo(lengthInvoicedKm, 2)", + "type": "if" + } + ], + "validate": "required" + }, + { + "columns": [ + { + "dataType": "species", + "name": "weedTargetSpecies", + "dwcAttribute": "scientificName", + "description": "Weed species targeted for treatment (start typing a scientific or common name for a species)", + "validate": "required" + }, + { + "dataType": "text", + "name": "threatenedEcologicalCommunity", + "validate": "maxSize[100]" + }, + { + "dataType": "text", + "name": "treatmentMethod", + "description": "The primary method used to treat the patch of the target species", + "constraints": [ + "Basal bark spraying", + "Biological agents", + "Cut stump", + "Cut and swab", + "Dozing", + "Felling", + "Fire", + "Foliar spraying", + "Grubbing / chipping", + "Hand pulling", + "Moisture and nutrient control", + "Mowing", + "Overplanting", + "Pushing", + "Slashing", + "Spot spraying", + "Splatter gun", + "Stem injection", + "Stem scraper", + "Wick applicators", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherTreatmentMethod", + "description": "Please specify the method of treatment used if Other was selected in the Type of treatment column.", + "behaviour": [ + { + "condition": "treatmentMethod == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[100]" + }, + { + "dataType": "text", + "name": "treatmentObjective", + "description": "How will the work contribute to protecting the area", + "validate": "required,maxSize[300]" + } + ], + "dataType": "list", + "name": "weedSpeciesTreated" + } + ], + "dataType": "list", + "name": "weedTreatmentSites" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Weed treatment", + "title": "Removing weeds", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "New weed removal site", + "userAddedRows": true, + "source": "weedTreatmentSites", + "type": "repeat", + "items": [ + { + "css": "border-bottom", + "type": "row", + "items": [ + { + "preLabel": "Initial or follow-up treatment", + "css": "span3", + "source": "initialOrFollowup", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "css": "span3 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s where weed treatment was undertaken", + "source": "sitesTreated", + "type": "feature" + } + ] + }, + { + "type": "row", + "items": [ + { + "readonly": true, + "source": "siteCalculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "readonly": true, + "source": "siteCalculatedLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "css": "span4 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) / length (km) treated for weed removal", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "areaTreatedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "lengthTreatedKm", + "type": "number", + "validate": "required", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "columns": [ + { + "width": "20%", + "source": "weedTargetSpecies", + "title": "Target weed species", + "type": "speciesSelect" + }, + { + "width": "22%", + "source": "threatenedEcologicalCommunity", + "title": "Threatened Ecological Community (if applicable)", + "type": "text" + }, + { + "width": "15%", + "source": "treatmentMethod", + "title": "Type of treatment", + "type": "select2" + }, + { + "width": "20%", + "source": "otherTreatmentMethod", + "title": "Type of treatment (if other)", + "type": "text" + }, + { + "width": "23%", + "source": "treatmentObjective", + "title": "Treatment objective", + "type": "textarea" + } + ], + "userAddedRows": true, + "source": "weedSpeciesTreated", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesWeedTreatment", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Seed Collecting - Bushfire Program", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrMaintenance", + "constraints": [ + "Initial", + "Maintenance" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "siteSeedCollected", + "validate": "required" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(siteSeedCollected)", + "type": "computed" + }, + "dataType": "number", + "name": "calculatedAreaHabitatRevegetedHa", + "units": "ha", + "decimalPlaces": 3 + }, + { + "computed": { + "expression": "$geom.lengthKm(siteSeedCollected)" + }, + "dataType": "number", + "name": "calculatedLengthHabitatRevegetedKm", + "units": "km", + "decimalPlaces": 3 + }, + { + "defaultValue": { + "expression": "calculatedAreaHabitatRevegetedHa", + "type": "computed" + }, + "dataType": "number", + "name": "areaHabitatRevegetedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "defaultValue": { + "expression": "calculatedLengthHabitatRevegetedKm", + "type": "computed" + }, + "dataType": "number", + "name": "lengthHabitatRevegetedKm", + "units": "km", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "species", + "name": "species", + "validate": "required" + }, + { + "name": "noOfDaysSeedCollected", + "dataType": "number" + }, + { + "dataType": "text", + "name": "inKgSeedCollected", + "constraints": [ + "Individuals", + "Kilograms" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "amountSeedCollected", + "decimalPlaces": 5 + }, + { + "dataType": "number", + "name": "numberOfSourcePlants" + }, + { + "dataType": "text", + "name": "storingFacility" + }, + { + "dataType": "number", + "name": "noOfPlantsPropogated" + }, + { + "dataType": "text", + "name": "threatEcoCommunity", + "validate": "maxSize[100]" + } + ], + "dataType": "list", + "name": "seedCollectionDetails" + }, + { + "computed": { + "expression": "amountSeedCollected" + }, + "dataType": "number", + "name": "totalSeedCollected" + }, + { + "computed": { + "expression": "numberOfSourcePlants" + }, + "dataType": "number", + "name": "totalPlantsPropogated" + } + ], + "modelName": "Seed Collecting - Bushfire Program", + "title": "Seed Collecting", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "5%", + "source": "initialOrMaintenance", + "title": "Initial or Maintenance activity?", + "type": "selectOne" + }, + { + "width": "5%", + "type": "col", + "title": "Site/s where collection was undertaken", + "items": [ + { + "source": "siteSeedCollected", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaHabitatRevegetedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedLengthHabitatRevegetedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "width": "10%", + "type": "col", + "title": "Area (ha) of habitat revegated", + "items": [ + { + "source": "areaHabitatRevegetedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "width": "10%", + "type": "col", + "title": "Length (km) of habitat revegeted", + "items": [ + { + "source": "lengthHabitatRevegetedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "width": "7%", + "source": "species", + "title": "Species", + "type": "speciesSelect" + }, + { + "width": "7%", + "source": "noOfDaysSeedCollected", + "title": "Number of days collecting Seed", + "type": "number" + }, + { + "width": "7%", + "source": "inKgSeedCollected", + "title": "Individuals / Kilograms collected", + "type": "selectOne" + }, + { + "width": "7%", + "source": "amountSeedCollected", + "title": "Amount collected", + "type": "number" + }, + { + "width": "7%", + "source": "numberOfSourcePlants", + "title": "Number of Source plants", + "type": "number" + }, + { + "width": "12%", + "source": "storingFacility", + "title": "Storing facility", + "type": "textarea" + }, + { + "width": "12%", + "source": "noOfPlantsPropogated", + "title": "Number of plants propogated", + "type": "number" + }, + { + "width": "12%", + "source": "threatEcoCommunity", + "title": "Threatened ecological community (if applicable)", + "type": "textarea" + } + ], + "userAddedRows": true, + "source": "seedCollectionDetails", + "type": "table" + } + ] + } + ] + }, + "templateName": "statesSeedCollecting", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Site preparation", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "feature", + "name": "sitesPrepared" + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesPrepared)", + "type": "computed" + }, + "dataType": "number", + "name": "calculatedAreaPreparedHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaPreparedInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The prepared area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "computed": { + "expression": "$geom.lengthKm(sitesPrepared)" + }, + "dataType": "number", + "name": "calculatedLengthPreparedKm", + "units": "km", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "lengthPreparedKm > 0", + "type": "conditional_validation", + "value": { + "message": "The prepared length must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "calculatedAreaPreparedHa", + "type": "computed" + }, + "dataType": "number", + "name": "areaPreparedHa", + "decimalPlaces": 3, + "units": "ha", + "validate": "required,min[0]" + }, + { + "defaultValue": { + "expression": "calculatedLengthPreparedKm", + "type": "computed" + }, + "dataType": "number", + "name": "lengthPreparedKm", + "units": "km", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(calculatedAreaPreparedHa, areaPreparedHa, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(calculatedAreaPreparedHa, areaPreparedHa, 0.1)) or roundTo(areaPreparedHa, 2) != roundTo(areaPreparedInvoicedHa, 2)", + "type": "visible" + } + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "areaPreparedInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaPreparedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "number", + "name": "numberOfDaysPreparingSite", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)", + "validate": "required,min[0]" + }, + { + "dataType": "stringList", + "name": "industryType", + "constraints": [ + "Broad acre cropping", + "Dairy", + "Environmental", + "Horticulture", + "Grazing", + "Fisheries", + "Aquaculture", + "Other" + ] + }, + { + "dataType": "text", + "name": "actionType", + "description": "", + "constraints": [ + "Basal bark spraying", + "Biological agents", + "Cut stump", + "Cut and swab", + "Dozing", + "Felling", + "Fire", + "Foliar spraying", + "Grubbing/chipping", + "Hand pulling", + "Moisture and nutrient control", + "Mowing", + "Other earthworks", + "Overplanting", + "Pushing", + "Slashing", + "Spot spraying", + "Splatter gun", + "Stem injection", + "Stem scraper", + "Wick applicators", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherActionType", + "description": "This field may be used to list multiple preparation activities. This list of activities need to be separated with a ';'", + "behaviour": [ + { + "condition": "actionType == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[100]" + }, + { + "dataType": "text", + "name": "purposeOfSitePreparation", + "description": "Please provide a brief description of how the work will benefit the area", + "validate": "required" + }, + { + "dataType": "text", + "name": "threatenedEcologicalCommunity", + "description": "This free text field allows multiple TECs to be entered. They should be written as listed in EPBC, and separated by commas", + "validate": "maxSize[100]" + } + ], + "dataType": "list", + "name": "sitePreparationDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Site preparation", + "title": "Site preparation", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "10%", + "type": "col", + "title": "Site/s where preparation was undertaken", + "items": [ + { + "source": "sitesPrepared", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaPreparedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedLengthPreparedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "Enter the amount you will invoice for during this reporting period.", + "width": "15%", + "type": "col", + "title": "Actual area (ha) / length (km) of site preparation", + "items": [ + { + "source": "areaPreparedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "lengthPreparedKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "width": "15%", + "source": "numberOfDaysPreparingSite", + "title": "Number of days in preparing site", + "type": "number" + }, + { + "width": "10%", + "source": "industryType", + "title": "Industry type", + "type": "select2" + }, + { + "width": "16%", + "type": "col", + "title": "Type of action", + "items": [ + { + "type": "row", + "items": [ + { + "source": "actionType", + "type": "select2" + } + ] + }, + { + "source": "otherActionType", + "placeholder": "Type of action (if Other)", + "type": "text" + } + ] + }, + { + "width": "17%", + "source": "purposeOfSitePreparation", + "title": "Aim of site preparation", + "type": "textarea" + }, + { + "width": "17%", + "source": "threatenedEcologicalCommunity", + "title": "Threatened ecological community (if applicable)", + "type": "text" + } + ], + "userAddedRows": true, + "source": "sitePreparationDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesSitePreparation", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Skills and knowledge survey", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Skills and knowledge survey", + "modelName": "RLP - Skills and knowledge survey", + "dataModel": [ + { + "dataType": "list", + "name": "skillsAndKnowledgeSurveys", + "columns": [ + { + "dataType": "text", + "description": "", + "name": "baselineOrIndictorSurvey", + "constraints": [ + "Baseline", + "Indicator" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfSkillsAndKnowledgeSurveys", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "dateRange", + "validate": "required,maxSize[100]", + "description": "What time of year (eg. Dates by dd/mm/yyyyy, Months, Season/s)" + }, + { + "dataType": "number", + "name": "numberOfParticipants", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "surveyTechnique", + "validate": "required,maxSize[300]", + "constraints": [ + "Other" + ], + "description": "What/How will these survey/s capture information" + }, + { + "dataType": "text", + "name": "surveyObjective", + "validate": "required,maxSize[300]", + "description": "How will the information obtained from the surveys be used" + }, + { + "dataType": "number", + "name": "numberOfDaysAdministeringSurveys", + "validate": "required,min[0]", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)" + } + ] + }, + { + "name": "photographicEvidence", + "dataType": "image" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "source": "skillsAndKnowledgeSurveys", + "columns": [ + { + "title": "Baseline survey or indicator (follow-up) survey?", + "source": "baselineOrIndictorSurvey", + "type": "selectOne", + "width": "15%" + }, + { + "title": "Number of skills and knowledge surveys conducted", + "source": "numberOfSkillsAndKnowledgeSurveys", + "type": "number", + "width": "10%" + }, + { + "title": "Date range", + "type": "text", + "source": "dateRange", + "width": "10%" + }, + { + "title": "Number of people completing survey", + "source": "numberOfParticipants", + "type": "number", + "width": "10%" + }, + { + "title": "Survey technique", + "type": "textarea", + "source": "surveyTechnique", + "width": "22%", + "rows": 3 + }, + { + "title": "Survey objective", + "type": "textarea", + "source": "surveyObjective", + "width": "23%", + "rows": 3 + }, + { + "title": "Number of days spent on administering survey/s", + "source": "numberOfDaysAdministeringSurveys", + "type": "number", + "width": "10%" + } + ], + "userAddedRows": true, + "type": "table" + }, + { + "type": "row", + "items": [ + { + "type": "image", + "source": "photographicEvidence", + "preLabel": "Optionally attach photos" + } + ] + } + ], + "type": "section" + } + ] + }, + "templateName": "statesSkillsAndKnowledgeSurvey", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Soil testing", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfSoilTests", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "dateRange", + "description": "What time of year (eg. Dates by dd/mm/yyyyy, Months, Season/s)", + "validate": "required,maxSize[100]" + }, + { + "dataType": "feature", + "name": "sitesTested" + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.areaHa(sitesTested)" + }, + "dataType": "number", + "name": "areaTestedHa", + "units": "Ha", + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.areaHa(sitesTested)*0.9" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.areaHa(sitesTested)*1.1" + } + } + ] + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.lengthKm(sitesTested)" + }, + "dataType": "number", + "name": "lengthTestedKm", + "units": "Km", + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.lengthKm(sitesTested)*0.9", + "errorMessages": "Please Select" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.lengthKm(sitesTested)*1.1" + } + } + ] + }, + { + "defaultValue": { + "type": "computed", + "expression": "areaTestedHa" + }, + "dataType": "number", + "name": "areaTestedChangeHa", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "ha" + }, + { + "defaultValue": { + "type": "computed", + "expression": "lengthTestedKm" + }, + "dataType": "number", + "name": "lengthTestedChangeKm", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "km" + }, + { + "dataType": "text", + "name": "testingTechnique", + "description": "What/How will these tests capture information", + "validate": "required,maxSize[100]" + }, + { + "dataType": "text", + "name": "testingObjective", + "description": "How will the infromation obtained from the tests be used", + "validate": "required,maxSize[300]" + } + ], + "dataType": "list", + "name": "soilTestingDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Soil testing", + "title": "Soil testing", + "viewModel": [ + { + "type": "section", + "items": [ + { + "columns": [ + { + "width": "15%", + "source": "initialOrFollowup", + "title": "Initial or follow-up activity?", + "type": "selectOne" + }, + { + "width": "10%", + "source": "numberOfSoilTests", + "type": "number", + "title": "Number of soil tests conducted in targeted areas" + }, + { + "width": "10%", + "source": "dateRange", + "title": "Date range", + "type": "text" + }, + { + "width": "10%", + "type": "col", + "items": [ + { + "type": "feature", + "source": "sitesTested" + }, + { + "type": "row", + "items": [ + { + "type": "number", + "source": "areaTestedHa", + "displayOptions": { + "displayUnits": true + }, + "readonly": true + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "number", + "source": "lengthTestedKm", + "displayOptions": { + "displayUnits": true + }, + "readonly": true + } + ] + } + ], + "title": "Project site/s where soil tests were conducted" + }, + { + "width": "15%", + "title": "Actual Area (ha) / length (km) where soil tests were conducted", + "helpText": "Manually enter correct figure if different to mapped value.", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "areaTestedChangeHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "lengthTestedChangeKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + } + ] + }, + { + "width": "18%", + "source": "testingTechnique", + "title": "Testing technique", + "type": "textarea" + }, + { + "width": "22%", + "source": "testingObjective", + "title": "Testing objective", + "type": "textarea" + } + ], + "userAddedRows": true, + "source": "soilTestingDetails", + "type": "table" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesSoilTesting", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Emergency Interventions", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "constraints": [ + "Initial", + "Follow-up" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfInterventions", + "validate": "required,min[0]" + }, + { + "dataType": "feature", + "name": "siteOfIntervention" + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.areaHa(siteOfIntervention)" + }, + "dataType": "number", + "name": "areaOfInterventionHa", + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.areaHa(siteOfIntervention)*0.9" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.areaHa(siteOfIntervention)*1.1" + } + } + ] + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.lengthKm(siteOfIntervention)" + }, + "dataType": "number", + "name": "lengthOfInterventionKm", + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.lengthKm(siteOfIntervention)*0.9" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.lengthKm(siteOfIntervention)*1.1" + } + } + ] + }, + { + "dataType": "text", + "name": "purposeOfIntervention", + "description": "This field may be used to list What type of intervention is required. A list of multiple interventions need to be separated with a ';'.", + "validate": "required,maxSize[500]" + }, + { + "columns": [ + { + "dataType": "species", + "name": "species", + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfIndividualsInvolved", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfDaysPerformingInterventions", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)", + "validate": "required,min[0]" + }, + { + "dataType": "feature", + "name": "relocationSite", + "description": "If translocation is required please map site" + }, + { + "defaultValue": { + "type": "computed", + "expression": "$geom.areaHa(relocationSite)" + }, + "dataType": "number", + "name": "areaOfRelocationSiteHa", + "validate": [ + { + "rule": "min", + "param": { + "type": "computed", + "expression": "$geom.areaHa(relocationSite)*0.9" + } + }, + { + "rule": "max", + "param": { + "type": "computed", + "expression": "$geom.areaHa(relocationSite)*1.1" + } + } + ] + }, + { + "dataType": "text", + "name": "comment", + "validate": "maxSize[300]" + } + ], + "dataType": "list", + "name": "interventionSpecies" + } + ], + "dataType": "list", + "name": "interventionDetails" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Emergency Interventions", + "title": "Undertaking emergency interventions to prevent extinctions", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "Add intervention site", + "userAddedRows": true, + "source": "interventionDetails", + "type": "repeat", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Initial or follow-up activity?", + "css": "span3", + "source": "initialOrFollowup", + "type": "selectOne" + }, + { + "preLabel": "Number of interventions", + "css": "span2", + "source": "numberOfInterventions", + "type": "number" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Site/s where emergency interventions were undertaken", + "css": "span3", + "source": "siteOfIntervention", + "type": "feature" + }, + { + "preLabel": "Area (ha) where emergency interventions were undertaken", + "css": "span2", + "source": "areaOfInterventionHa", + "type": "number" + }, + { + "preLabel": "Type and goal or intervention", + "css": "span5", + "source": "purposeOfIntervention", + "type": "textarea", + "rows": 3 + } + ] + }, + { + "columns": [ + { + "width": "30%", + "source": "species", + "title": "Targeted species", + "type": "speciesSelect" + }, + { + "width": "10%", + "source": "numberOfIndividualsInvolved", + "type": "number", + "title": "Number of individuals involved" + }, + { + "width": "10%", + "source": "numberOfDaysPerformingInterventions", + "type": "number", + "title": "Time (days) of intervention" + }, + { + "width": "10%", + "source": "relocationSite", + "type": "feature", + "title": "Site/s where emergency interventions were relocated to" + }, + { + "width": "10%", + "source": "areaOfRelocationSiteHa", + "type": "number", + "title": "Area (ha) where emergency interventions were relocated to" + }, + { + "width": "30%", + "source": "comment", + "type": "textarea", + "title": "Comments", + "rows": 3 + } + ], + "userAddedRows": true, + "source": "interventionSpecies", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesEmergencyInterventions", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Water quality survey", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "baselineOrIndicator", + "description": "", + "constraints": [ + "Baseline", + "Indicator" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfSurveysConducted", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "dateRange", + "description": "What time of year (eg. Dates by dd/mm/yyyyy, Months, Season/s)", + "validate": "required,maxSize[100]" + }, + { + "dataType": "feature", + "name": "sitesSurveyed" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesSurveyed)" + }, + "dataType": "number", + "name": "siteCalculatedAreaHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The surveyed area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesSurveyed)", + "type": "computed" + }, + "dataType": "number", + "name": "areaSurveyedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaSurveyedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1)", + "type": "if" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "if" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1) or roundTo(areaSurveyedHa, 2) != roundTo(areaInvoicedHa, 2)", + "type": "if" + } + ], + "validate": "required" + }, + { + "columns": [ + { + "dataType": "text", + "name": "waterBodyType", + "constraints": [ + "Estuary", + "Freshwater stream", + "Freshwater lake", + "Saline stream", + "Saline lake", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "otherWaterBodyType", + "behaviour": [ + { + "condition": "waterBodyType == \"Other\"", + "type": "enable" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "number", + "name": "numberOfDaysConductingSurveys", + "description": "Number of days should be calculated as number of days by number of people (eg. 4.5 days by 3 people is 13.5 days)", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "surveyTechnique", + "description": "What/How will these survey/s capture information", + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "surveyObjective", + "description": "How will the information obtained from the surveys be used", + "validate": "required,maxSize[300]" + } + ], + "dataType": "list", + "name": "waterBodyDetails" + } + ], + "dataType": "list", + "name": "waterQualitySurveySites" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Water quality survey", + "title": "Water quality survey", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "New survey site", + "userAddedRows": true, + "source": "waterQualitySurveySites", + "type": "repeat", + "items": [ + { + "css": "border-bottom", + "type": "row", + "items": [ + { + "preLabel": "Baseline survey or indicator (follow-up) survey?", + "css": "span3", + "source": "baselineOrIndicator", + "type": "selectOne" + }, + { + "preLabel": "Number of water quality surveys conducted", + "css": "span2", + "source": "numberOfSurveysConducted", + "type": "number" + }, + { + "preLabel": "Date range", + "css": "span4", + "source": "dateRange", + "type": "text" + } + ] + }, + { + "type": "row", + "items": [ + { + "css": "span3 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s where water quality surveys were conducted", + "source": "sitesSurveyed", + "type": "feature" + } + ] + }, + { + "readonly": true, + "source": "siteCalculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "css": "span4 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) covered by water quality surveys", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "areaSurveyedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "columns": [ + { + "width": "15%", + "source": "waterBodyType", + "type": "select2", + "title": "Type of water body" + }, + { + "width": "20%", + "source": "otherWaterBodyType", + "type": "textarea", + "title": "Type of water body (if Other)" + }, + { + "width": "5%", + "source": "numberOfDaysConductingSurveys", + "type": "number", + "title": "Number of days spent on administering survey/s" + }, + { + "width": "30%", + "source": "surveyTechnique", + "title": "Survey technique", + "type": "textarea" + }, + { + "width": "30%", + "source": "surveyObjective", + "title": "Survey objective", + "type": "textarea", + "rows": 3 + } + ], + "userAddedRows": true, + "source": "waterBodyDetails", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesWaterQualitySurvey", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Weed distribution survey", + "optional": true, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "columns": [ + { + "dataType": "text", + "name": "baselineOrIndicator", + "description": "", + "constraints": [ + "Baseline", + "Indicator" + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfSurveysConducted", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "dateRange", + "description": "What time of year (eg. Dates by dd/mm/yyyyy, Months, Season/s)", + "validate": "required,maxSize[100]" + }, + { + "dataType": "feature", + "name": "sitesSurveyed" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesSurveyed)" + }, + "dataType": "number", + "name": "siteCalculatedAreaHa", + "units": "ha", + "decimalPlaces": 3, + "behaviour": [ + { + "condition": "areaInvoicedHa > 0", + "type": "conditional_validation", + "value": { + "message": "The surveyed area must be mapped", + "validate": "required,min[0.0001]" + } + } + ] + }, + { + "defaultValue": { + "expression": "$geom.areaHa(sitesSurveyed)", + "type": "computed" + }, + "dataType": "number", + "name": "areaSurveyedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "areaInvoicedHa", + "units": "ha", + "decimalPlaces": 3, + "validate": [ + { + "rule": "required" + }, + { + "rule": "min[0]" + }, + { + "param": { + "expression": "areaSurveyedHa", + "type": "computed" + }, + "rule": "max" + } + ] + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1)", + "type": "if" + } + ], + "constraints": [ + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "if" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please fill in the Mapped/Actual/Invoice fields before attaching a document here. If those fields match this field will be void.
    If any of these fields differ please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not within(areaSurveyedHa, siteCalculatedAreaHa, 0.1) or roundTo(areaSurveyedHa, 2) != roundTo(areaInvoicedHa, 2)", + "type": "if" + } + ], + "validate": "required" + }, + { + "columns": [ + { + "dataType": "species", + "name": "targetWeedSpecies", + "dwcAttribute": "scientificName", + "validate": "required" + }, + { + "dataType": "text", + "name": "surveyTechnique", + "description": "What/How will these survey/s capture information", + "validate": "required,maxSize[300]" + }, + { + "dataType": "text", + "name": "surveyObjective", + "description": "How will the information obtained from the surveys be used", + "validate": "required,maxSize[300]" + }, + { + "dataType": "number", + "name": "estimatedCoverPercent", + "validate": "required,min[0],max[100]" + } + ], + "dataType": "list", + "name": "weedDistributionSurveyDetails" + } + ], + "dataType": "list", + "name": "weedDistributionSurveySites" + }, + { + "dataType": "image", + "name": "photographicEvidence" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "modelName": "RLP - Weed distribution survey", + "title": "Weed distribution survey", + "viewModel": [ + { + "type": "section", + "items": [ + { + "addRowText": "Add survey site", + "userAddedRows": true, + "source": "weedDistributionSurveySites", + "type": "repeat", + "items": [ + { + "css": "border-bottom", + "type": "row", + "items": [ + { + "preLabel": "Baseline survey or indicator (follow-up) survey?", + "css": "span3", + "source": "baselineOrIndicator", + "type": "selectOne" + }, + { + "preLabel": "Number of weed distribution surveys conducted", + "css": "span2", + "source": "numberOfSurveysConducted", + "type": "number" + }, + { + "preLabel": "Date range", + "css": "span4", + "source": "dateRange", + "type": "text" + } + ] + }, + { + "type": "row", + "items": [ + { + "css": "span3 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Site/s surveyed for weed distribution", + "source": "sitesSurveyed", + "type": "feature" + } + ] + }, + { + "readonly": true, + "source": "siteCalculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "css": "span4 col-border-right", + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "preLabel": "Actual area (ha) surveyed for weed distribution", + "helpText": "Manually enter correct figure for this reporting period if different to mapped value.", + "source": "areaSurveyedHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + } + ] + }, + { + "columns": [ + { + "width": "40%", + "source": "targetWeedSpecies", + "type": "speciesSelect", + "title": "Target weed species recorded" + }, + { + "width": "25%", + "source": "surveyTechnique", + "title": "Survey technique", + "type": "textarea" + }, + { + "width": "25%", + "source": "surveyObjective", + "title": "Survey objective", + "type": "textarea" + }, + { + "width": "10%", + "source": "estimatedCoverPercent", + "title": "Estimated weed cover (%)", + "type": "number", + "rows": 3 + } + ], + "userAddedRows": true, + "source": "weedDistributionSurveyDetails", + "type": "table" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Optionally attach photos", + "source": "photographicEvidence", + "type": "image" + } + ] + } + ] + } + ] + }, + "templateName": "statesWeedDistributionSurvey", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Cultural value survey and/or assessment", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Cultural value survey and/or assessment", + "modelName": "Cultural value survey and or assessment", + "dataModel": [ + { + "dataType": "list", + "name": "culturalValueSurveysAndAssessments", + "columns": [ + { + "dataType": "text", + "name": "typeOfActivity", + "validate": "required", + "constraints": [ + "Survey", + "Assessment", + "Other" + ], + "description": "" + }, + { + "dataType": "text", + "name": "otherActivityType", + "validate": "required,max[300]", + "behaviour": [ + { + "condition": "typeOfActivity == \"Other\"", + "type": "enable_and_clear" + } + ] + }, + { + "dataType": "number", + "name": "numberOfActivitiesConducted", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "surveyObjective", + "validate": "required,maxSize[300]", + "description": "How will the information obtained from the surveys be used" + }, + { + "dataType": "text", + "name": "surveyTechnique", + "validate": "required,maxSize[300]", + "description": "How will the information obtained from the surveys be used" + }, + { + "dataType": "feature", + "name": "surveyArea" + }, + { + "computed": { + "expression": "$geom.areaHa(surveyArea)" + }, + "dataType": "number", + "name": "calculatedAreaHa", + "units": "ha", + "decimalPlaces": 3 + }, + { + "computed": { + "expression": "$geom.lengthKm(surveyArea)" + }, + "dataType": "number", + "name": "calculatedLengthKm", + "units": "km", + "decimalPlaces": 3 + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedAreaHa" + }, + "dataType": "number", + "name": "actualAreaHa", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "ha" + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedLengthKm" + }, + "dataType": "number", + "name": "actualLengthKm", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "km" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(actualAreaHa, calculatedAreaHa, 0.1) and within(actualLengthKm, calculatedLengthKm, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "The site is culturally sensitive", + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(actualAreaHa, calculatedAreaHa, 0.1) and within(actualLengthKm, calculatedLengthKm, 0.1))", + "type": "if" + } + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfDaysAdministeringSurveys", + "validate": "required,min[0]", + "description": "" + }, + { + "dataType": "text", + "name": "dateRange", + "validate": "maxSize[100]", + "description": "" + } + ] + }, + { + "name": "photographicEvidence", + "dataType": "image" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "source": "culturalValueSurveysAndAssessments", + "columns": [ + { + "type": "col", + "width": "15%", + "title": "Type of activity", + "css": "required", + "items": [ + { + "source": "typeOfActivity", + "type": "selectOne" + }, + { + "placeholder": "Type of activity (if Other)", + "source": "otherActivityType", + "type": "text" + } + ] + }, + { + "title": "Number of activities conducted", + "source": "numberOfActivitiesConducted", + "type": "number", + "width": "5%" + }, + { + "title": "Survey/ assessment objective", + "source": "surveyObjective", + "type": "textarea", + "width": "18%", + "helpText": "Survey/ Assessment Objective should outline the aim of the survey/assessment", + "rows": 3 + }, + { + "title": "Survey/ assessment technique", + "source": "surveyTechnique", + "type": "textarea", + "width": "18%", + "helpText": "Survey/Assessment technique refers to the survey design and what information is recorded and how it will be used", + "rows": 3 + }, + { + "width": "10%", + "type": "col", + "title": "Area which has been surveyed/ assessed, where reporting is area based", + "helpText": "Optional for Site Mapping. For sensitive sites, add hectares manually when required and put Site mapping into a document and attach to the field that appears in this column.", + "items": [ + { + "source": "surveyArea", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "May be changed manually if different to the calculated areas", + "width": "10%", + "type": "col", + "title": "Actual length (km) / area (ha) where survey/ assessment has been undertaken", + "items": [ + { + "source": "actualAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "actualLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the actual amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "title": "Number of days spent on undertaking survey/s or assessment/s", + "source": "numberOfDaysAdministeringSurveys", + "type": "number", + "width": "5%" + }, + { + "title": "Date range", + "source": "dateRange", + "type": "text", + "width": "14%", + "helpText": "Refers to when the activity occurred. They can be specific dates, dates ranging from/to, months or seasons" + } + ], + "userAddedRows": true, + "type": "table" + }, + { + "type": "row", + "items": [ + { + "type": "image", + "source": "photographicEvidence", + "preLabel": "Optionally attach photos" + } + ] + } + ], + "type": "section" + } + ] + }, + "templateName": "culturalValueSurveysAndAssessments", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "Cultural Site Management", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Cultural Site Management", + "modelName": "Cultural Site Management", + "dataModel": [ + { + "dataType": "list", + "name": "culturalSites", + "columns": [ + { + "dataType": "text", + "name": "initialOrFollowup", + "validate": "required", + "constraints": [ + "Initial", + "Follow-up" + ] + }, + { + "dataType": "number", + "name": "numberOfSitesWhereWorkHasOccurred", + "validate": "required,maxSize[300]", + "description": "" + }, + { + "dataType": "feature", + "name": "planOrWorkArea" + }, + { + "computed": { + "expression": "$geom.areaHa(planOrWorkArea)" + }, + "dataType": "number", + "name": "calculatedAreaHa", + "units": "ha", + "decimalPlaces": 3 + }, + { + "computed": { + "expression": "$geom.lengthKm(planOrWorkArea)" + }, + "dataType": "number", + "name": "calculatedLengthKm", + "units": "km", + "decimalPlaces": 3 + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedAreaHa" + }, + "dataType": "number", + "name": "actualAreaHa", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "ha" + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedLengthKm" + }, + "dataType": "number", + "name": "actualLengthKm", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "km" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(actualAreaHa, calculatedAreaHa, 0.1) and within(actualLengthKm, calculatedLengthKm, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "The site is culturally sensitive", + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(actualAreaHa, calculatedAreaHa, 0.1) and within(actualLengthKm, calculatedLengthKm, 0.1))", + "type": "if" + } + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "typeOfSite", + "validate": "required,maxSize[300]", + "description": "" + }, + { + "dataType": "text", + "name": "typeOfActivity", + "validate": "required,maxSize[300]", + "description": "" + }, + { + "dataType": "text", + "name": "purposeOfActivity", + "validate": "required", + "description": "" + } + ] + }, + { + "name": "photographicEvidence", + "dataType": "image" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "source": "culturalSites", + "columns": [ + { + "title": "Initial or follow-up", + "source": "initialOrFollowup", + "type": "selectOne", + "width": "15%" + }, + { + "title": "Number of sites where work has occurred", + "source": "numberOfSitesWhereWorkHasOccurred", + "type": "number", + "width": "10%" + }, + { + "width": "10%", + "type": "col", + "title": "Area where cultural site management work or planning has occurred", + "helpText": "Optional for Site Mapping. For sensitive sites, add hectares manually when required and put Site mapping into a document and attach to the field that appears in this column.", + "items": [ + { + "source": "planOrWorkArea", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "May be changed manually if different to the calculated areas", + "width": "10%", + "type": "col", + "title": "Actual length (km) / area (ha) where cultural site management work or planning has occurred", + "items": [ + { + "source": "actualAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "actualLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "title": "Type of site", + "source": "typeOfSite", + "type": "text", + "width": "15%", + "helpText": "Describe the type of cultural site, e.g. midden, rock art site, registered Aboriginal Place" + }, + { + "title": "Type of activity", + "source": "typeOfActivity", + "type": "text", + "width": "20%", + "helpText": "Describe the management actions undertaken" + }, + { + "title": "Purpose of activity", + "source": "purposeOfActivity", + "type": "textarea", + "width": "20%", + "helpText": "Describe why the management work is being undertaken and how it supports the values of the site or place" + } + ], + "userAddedRows": true, + "type": "table" + }, + { + "type": "row", + "items": [ + { + "type": "image", + "source": "photographicEvidence", + "preLabel": "Optionally attach photos" + } + ] + } + ], + "type": "section" + } + ] + }, + "templateName": "culturalSiteManagement", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": null, + "name": "On Country Visits", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "On Country Visits", + "modelName": "On Country Visits", + "dataModel": [ + { + "dataType": "list", + "name": "onCountryVisits", + "columns": [ + { + "dataType": "feature", + "name": "areaOfVisit" + }, + { + "computed": { + "expression": "$geom.areaHa(areaOfVisit)" + }, + "dataType": "number", + "name": "calculatedVisitedAreaHa", + "units": "ha", + "decimalPlaces": 3 + }, + { + "computed": { + "expression": "$geom.lengthKm(areaOfVisit)" + }, + "dataType": "number", + "name": "calculatedVisitedLengthKm", + "units": "km", + "decimalPlaces": 3 + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedVisitedAreaHa" + }, + "dataType": "number", + "name": "actualAreaHa", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "ha" + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedVisitedLengthKm" + }, + "dataType": "number", + "name": "actualLengthKm", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "km" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(actualAreaHa, calculatedVisitedAreaHa, 0.1) and within(actualLengthKm, calculatedVisitedLengthKm, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "The site is culturally sensitive", + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(actualAreaHa, calculatedVisitedAreaHa, 0.1) and within(actualLengthKm, calculatedVisitedLengthKm, 0.1))", + "type": "if" + } + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfVisits", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberIndigenousCommunityInvolved", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "purposeOfVisits", + "validate": "required,maxSize[300]", + "description": "" + }, + { + "dataType": "text", + "name": "activitiesUndertaken", + "validate": "required,maxSize[300]", + "description": "" + }, + { + "dataType": "text", + "name": "dateRange", + "validate": "maxSize[100]", + "description": "" + } + ] + }, + { + "name": "photographicEvidence", + "dataType": "image" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "source": "onCountryVisits", + "columns": [ + { + "width": "12%", + "type": "col", + "title": "Area where the visit has occurred", + "helpText": "Optional for Site Mapping. For sensitive sites, add hectares manually when required and put Site mapping into a document and attach to the field that appears in this column.", + "items": [ + { + "source": "areaOfVisit", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedVisitedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedVisitedLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "May be changed manually if different to the calculated areas", + "width": "13%", + "type": "col", + "title": "Actual length (km) / area (ha) where the visit occurred", + "items": [ + { + "source": "actualAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "actualLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the calculated amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "title": "Number of visits", + "source": "numberOfVisits", + "type": "number", + "width": "10%" + }, + { + "title": "Number of Indigenous community members involved", + "source": "numberIndigenousCommunityInvolved", + "type": "number", + "width": "10%" + }, + { + "title": "Purpose of visits", + "source": "purposeOfVisits", + "type": "textarea", + "width": "20%", + "rows": 3, + "helpText": "Describe how these visits contribute to the project activities and area" + }, + { + "title": "Activities undertaken", + "source": "activitiesUndertaken", + "type": "textarea", + "width": "20", + "rows": 3, + "helpText": "Describe the activities undertaken and how they contribute to the area" + }, + { + "title": "Date range", + "source": "dateRange", + "type": "text", + "width": "15%", + "helpText": "Refers to when the visit/s occurred. They can be specific dates, dates ranging from/to, months or seasons" + } + ], + "userAddedRows": true, + "type": "table" + }, + { + "type": "row", + "items": [ + { + "type": "image", + "source": "photographicEvidence", + "preLabel": "Optionally attach photos" + } + ] + } + ], + "type": "section" + } + ] + }, + "templateName": "onCountryVisits", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": "Cultural Practices", + "name": "Cultural Practices", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Cultural Practices", + "modelName": "Cultural Practices", + "dataModel": [ + { + "dataType": "list", + "name": "culturalPractices", + "columns": [ + { + "dataType": "number", + "name": "numberOfSitesCoveredByCulturalPractice" + }, + { + "dataType": "feature", + "name": "sitesCoveredByCulturalPractice" + }, + { + "computed": { + "expression": "$geom.areaHa(sitesCoveredByCulturalPractice)" + }, + "dataType": "number", + "name": "calculatedAreaHa", + "units": "ha", + "decimalPlaces": 3 + }, + { + "computed": { + "expression": "$geom.lengthKm(sitesCoveredByCulturalPractice)" + }, + "dataType": "number", + "name": "calculatedLengthKm", + "units": "km", + "decimalPlaces": 3 + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedAreaHa" + }, + "dataType": "number", + "name": "actualAreaHa", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "ha" + }, + { + "defaultValue": { + "type": "computed", + "expression": "calculatedLengthKm" + }, + "dataType": "number", + "name": "actualLengthKm", + "validate": "min[0]", + "decimalPlaces": 3, + "units": "km" + }, + { + "dataType": "text", + "name": "mappingNotAlignedReason", + "behaviour": [ + { + "condition": "not (within(actualAreaHa, calculatedAreaHa, 0.1) and within(actualLengthKm, calculatedLengthKm, 0.1))", + "type": "visible" + } + ], + "constraints": [ + "The site is culturally sensitive", + "Mapped area simplifies more complex area/s where work was undertaken during this period", + "Other" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "mappingNotAlignedComments", + "behaviour": [ + { + "condition": "\"Other\" == mappingNotAlignedReason", + "type": "visible" + } + ], + "validate": "required,maxSize[300]" + }, + { + "dataType": "document", + "name": "extraMappingDetails", + "description": "Please attach your organisation's detailed map for the area, covered by this project service - during reporting period (include the scale measure for each map).", + "behaviour": [ + { + "condition": "not (within(actualAreaHa, calculatedAreaHa, 0.1) and within(actualLengthKm, calculatedLengthKm, 0.1))", + "type": "if" + } + ], + "validate": "required" + }, + { + "dataType": "number", + "name": "numberOfCulturalPractices", + "validate": "min[0]" + }, + { + "dataType": "text", + "name": "typeOfCulturalPractice", + "validate": "required,maxSize[300]", + "description": "" + }, + { + "dataType": "number", + "name": "numberOfIndigenousCommunityMembers", + "validate": "required,min[0]" + }, + { + "dataType": "text", + "name": "purposeOfCulturalPractice", + "validate": "required,maxSize[300]", + "description": "" + } + ] + }, + { + "name": "photographicEvidence", + "dataType": "image" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "source": "culturalPractices", + "columns": [ + { + "type": "number", + "source": "numberOfSitesCoveredByCulturalPractice", + "width": "10%", + "title": "Number of sites where cultural practices are conducted" + }, + { + "width": "10%", + "type": "col", + "title": "Site/s covered by cultural practice", + "helpText": "Optional for Site Mapping. For sensitive sites, add hectares manually when required and put Site mapping into a document and attach to the field that appears in this column.", + "items": [ + { + "source": "sitesCoveredByCulturalPractice", + "type": "feature" + }, + { + "readonly": "readonly", + "source": "calculatedAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "readonly": "readonly", + "source": "calculatedLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Please attach mapping details", + "source": "extraMappingDetails", + "type": "document" + } + ] + } + ] + }, + { + "helpText": "May be changed manually if different to the calculated areas", + "width": "10%", + "type": "col", + "title": "Actual area (ha) / length (km) where cultural practices conducted", + "items": [ + { + "source": "actualAreaHa", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "source": "actualLengthKm", + "type": "number", + "displayOptions": { + "displayUnits": true + } + }, + { + "type": "row", + "items": [ + { + "preLabel": "Reason for actual being different to mapped amount", + "source": "mappingNotAlignedReason", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "placeholder": "Please enter the reason/s the mapping didn't align with the invoiced amount", + "source": "mappingNotAlignedComments", + "type": "textarea", + "rows": 5 + } + ] + } + ] + }, + { + "type": "number", + "source": "numberOfCulturalPractices", + "width": "10%", + "title": "Number of cultural practices" + }, + { + "title": "Type of cultural practice", + "source": "typeOfCulturalPractice", + "type": "textarea", + "width": "20%", + "rows": 3, + "helpText": "Describe the type of action undertaken" + }, + { + "title": "Number of Indigenous community members involved", + "source": "numberOfIndigenousCommunityMembers", + "type": "number", + "width": "10%" + }, + { + "title": "Purpose of cultural practice", + "source": "purposeOfCulturalPractice", + "type": "textarea", + "width": "20", + "helpText": "Describe how the cultural practice/s contribute to the area", + "rows": 3 + } + ], + "userAddedRows": true, + "type": "table" + }, + { + "type": "row", + "items": [ + { + "type": "image", + "source": "photographicEvidence", + "preLabel": "Optionally attach photos" + } + ] + } + ], + "type": "section" + } + ] + }, + "templateName": "culturalPractices", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": true, + "modelName": "Developing/updating Guidelines/Protocols/Plans", + "name": "Developing/updating Guidelines/Protocols/Plans", + "optional": true, + "optionalQuestionText": null, + "template": { + "title": "Developing/updating Guidelines/Protocols/Plans", + "modelName": "Developing/updating Guidelines/Protocols/Plans", + "dataModel": [ + { + "dataType": "list", + "name": "guidelinesProtocolsAndPlans", + "columns": [ + { + "dataType": "text", + "name": "developingOrUpdating", + "validate": "required", + "constraints": [ + "Developing", + "Updating" + ] + }, + { + "dataType": "text", + "name": "typeOfDocument", + "validate": "required,maxSize[300]", + "description": "", + "constraints": [ + "Guidelines", + "Protocols", + "Plans" + ] + }, + { + "dataType": "number", + "name": "numberOfDocuments", + "validate": "required,min[0]", + "description": "" + }, + { + "dataType": "text", + "name": "purposeOfDocument", + "validate": "required,min[0]", + "description": "" + } + ] + }, + { + "name": "photographicEvidence", + "dataType": "image" + }, + { + "dataType": "text", + "name": "projectAssuranceDetails", + "description": "" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "Please attach any Evidence of Service Delivery here" + } + ] + } + ], + "viewModel": [ + { + "items": [ + { + "source": "guidelinesProtocolsAndPlans", + "columns": [ + { + "title": "Developing or updating?", + "source": "developingOrUpdating", + "type": "selectOne", + "width": "20%" + }, + { + "title": "Type of document", + "source": "typeOfDocument", + "type": "selectOne", + "width": "20%" + }, + { + "title": "No. of document/guidelines/protocols/plans", + "source": "numberOfDocuments", + "type": "number", + "width": "20%" + }, + { + "title": "Purpose of document", + "source": "purposeOfDocument", + "type": "textarea", + "width": "40%", + "rows": 3, + "helpText": "Please identify what this/these document is and why it/they are needed" + } + ], + "userAddedRows": true, + "type": "table" + } + ], + "type": "section" + } + ] + }, + "templateName": "guidelinesProtocolsAndPlans", + "title": null + }, + { + "class": "au.org.ala.ecodata.FormSection", + "id": null, + "collapsedByDefault": false, + "modelName": null, + "name": "", + "optional": false, + "optionalQuestionText": null, + "template": { + "dataModel": [ + { + "dataType": "stringList", + "validate": "required", + "name": "isExpenditureWithinBudget", + "constraints": [ + "Yes", + "No" + ] + }, + { + "dataType": "stringList", + "validate": "required", + "name": "ifBudgetBeenReceived", + "constraints": [ + "Yes", + "No" + ] + }, + { + "dataType": "text", + "description": "", + "name": "reasonOfOverBudget", + "behaviour": [ + { + "condition": "isExpenditureWithinBudget == \"No\" or ifBudgetBeenReceived == \"No\"", + "type": "enable" + } + ], + "validate": "required,maxSize[1000]" + }, + { + "dataType": "list", + "description": "", + "name": "budgetIssue", + "columns": [ + { + "dataType": "text", + "name": "budgetIssueNature", + "validate": "required,maxSize[1000]" + }, + { + "dataType": "text", + "name": "howTheIssueBeingManaged", + "validate": "required,maxSize[1000]" + }, + { + "dataType": "text", + "name": "projectImplications", + "validate": "required,maxSize[1000]" + } + ] + }, + { + "dataType": "text", + "description": "", + "name": "additionalComments" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "" + } + ] + }, + { + "dataType": "list", + "name": "additionalDocuments", + "columns": [ + { + "dataType": "document", + "name": "additionalAttachments", + "description": "" + } + ] + } + ], + "modelName": "Project Income And Expenditure", + "title": "", + "viewModel": [ + { + "items": [ + { + "source": "

    5. Project Income And Expenditure

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "isExpenditureWithinBudget", + "preLabel": "5.1 Is the project's expenditure proceeding in accordance with the budget, the expected rate of expenditure and within the total project budget?", + "type": "selectOne" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "ifBudgetBeenReceived", + "preLabel": "5.2 If your project budget includes 'Recipient' or 'Other' cash contributions, have they been received and / or been contracted to be received?", + "type": "selectOne" + } + ], + "type": "row" + }, + { + "items": [ + { + "preLabel": "5.3 If you answered 'No' to question 5.1 or 5.2, please explain here: a) the nature of the issues; b) how you are managing (or proposing to manage) the issues, and c) implications for the project.", + "source": "reasonOfOverBudget", + "type": "textarea", + "rows": 3 + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "Only complete if applicable. Note - cash contributions are expected to be provided in line with the MoU, otherwise it constitutes a variation.", + "type": "literal" + } + ], + "type": "row" + }, + { + "columns": [ + { + "source": "", + "type": "literal", + "preLabel": { + "computed": "\\'No. \\' || (index + 1)" + }, + "title": "Issue No." + }, + { + "source": "budgetIssueNature", + "type": "textarea", + "title": "Nature of the budget issue" + }, + { + "source": "howTheIssueBeingManaged", + "type": "textarea", + "title": "How you are managing, or proposing to manage, the issue?" + }, + { + "source": "projectImplications", + "type": "textarea", + "title": "Implications for the project" + } + ], + "userAddedRows": true, + "source": "budgetIssue", + "type": "table" + }, + { + "items": [ + { + "source": "additionalComments", + "preLabel": "5.4 If you have additional comments on the project's income, expenditure or budget, please provide them here.", + "type": "textarea" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "

    Attachments

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "type": "row", + "items": [ + { + "type": "literal", + "source": "

    Supporting Documents

    Please attach relevant supporting documents (e.g. photos, media clips, survey data, information products/publications, etc.) that provide evidence of the project's progress and / or impacts." + } + ] + }, + { + "type": "table", + "source": "assuranceDocuments", + "userAddedRows": true, + "disableTableUpload": true, + "columns": [ + { + "title": "Attached Documents", + "source": "attachments", + "type": "document" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "literal", + "source": "

    Additional Information (optional)

    You may attach other documents relevant to your project for the Department's information." + } + ] + }, + { + "type": "table", + "source": "additionalDocuments", + "userAddedRows": true, + "disableTableUpload": true, + "columns": [ + { + "title": "Attached Documents", + "source": "additionalAttachments", + "type": "document" + } + ] + } + ] + }, + "templateName": "projectIncomeAndExpenditure", + "title": null + } + ], + "status": "active", + "supportsPhotoPoints": false, + "supportsSites": true, + "type": "Report" +} From e81c38263de2c58ee8f9e78372fdf3ce30fa48ac Mon Sep 17 00:00:00 2001 From: temi Date: Thu, 11 Apr 2024 16:36:45 +1000 Subject: [PATCH 56/95] #3049 - made ala harvest selection configurable - added test cases - removed unused code - addressed code review comments --- grails-app/conf/application.groovy | 5 ++-- .../au/org/ala/merit/ProjectController.groovy | 22 ++++---------- .../au/org/ala/merit/ProjectService.groovy | 4 --- grails-app/views/project/_editProject.gsp | 2 ++ .../3.2/insertParatooProtocolConfig.js | 29 ++++++++----------- .../ala/merit/ProjectControllerSpec.groovy | 15 ++++++++++ .../org/ala/merit/ProjectServiceSpec.groovy | 14 +++++++++ 7 files changed, 52 insertions(+), 39 deletions(-) diff --git a/grails-app/conf/application.groovy b/grails-app/conf/application.groovy index 73d2ac621..9b87af79a 100644 --- a/grails-app/conf/application.groovy +++ b/grails-app/conf/application.groovy @@ -1,5 +1,3 @@ -import grails.util.Environment - /******************************************************************************\ * CONFIG MANAGEMENT \******************************************************************************/ @@ -160,6 +158,9 @@ if(!upload.images.path){ if(!app.http.header.userId){ app.http.header.userId = "X-ALA-userId" } +if (!app.enableALAHarvestSetting) { + app.enableALAHarvestSetting = false +} ecodata.baseUrl = "https://ecodata-test.ala.org.au/ws/" // This is for biocollect/ecodata-client-plugin compatibility diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index 9fb867778..f777039ec 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -658,21 +658,6 @@ class ProjectController { projectSummaryReportCommand() } - @PreAuthorise(accessLevel = 'readOnly') - def dataSetSpeciesRecords(String projectId, String dataSetId) { - if (!projectId || !dataSetId) { - render status: 400, text: 'Required params not provided: projectId, dataSetId' - } - else { - def result = projectService.fetchDataSetRecords(projectId, dataSetId) - if (result instanceof Map) { - render status: 500, text: result.error - } else { - render text: result as JSON, contentType: 'application/json' - } - } - } - /** * Accepts a MERI Plan as an attached file and attempts to convert it into a format compatible with * MERIT. @@ -1164,8 +1149,13 @@ class ProjectController { null } - @PreAuthorise + @PreAuthorise(accessLevel = 'editor') def getSpeciesRecordsFromActivity (String activityId) { + if(!activityId) { + render status: HttpStatus.SC_BAD_REQUEST, text: [message: 'Activity ID must be supplied'] as JSON + return + } + render projectService.getSpeciesRecordsFromActivity(activityId) as JSON } diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index e91d0d4d1..8f835b877 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -2153,10 +2153,6 @@ class ProjectService { return project.reports.size() > 0 } - List fetchDataSetRecords (String projectId, String dataSetId) { - webService.getJson(grailsApplication.config.getProperty('ecodata.baseUrl') + "project/$projectId/dataSet/$dataSetId/records") - } - /** * Updates all of the data set summaries for the supplied data set ids with the supplied properties. * @param dataSetIds diff --git a/grails-app/views/project/_editProject.gsp b/grails-app/views/project/_editProject.gsp index b3e146b81..096d8c6cb 100644 --- a/grails-app/views/project/_editProject.gsp +++ b/grails-app/views/project/_editProject.gsp @@ -8,6 +8,7 @@
    +
    @@ -18,6 +19,7 @@
    +
    diff --git a/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js b/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js index 9e5b619fd..09bbf119b 100644 --- a/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js +++ b/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js @@ -20,10 +20,8 @@ var protocols = { "tags": ["survey"], "apiEndpoint": "vegetation-mapping-surveys", "geometryType": "Point", - "geometryPath": "attributes.position", - "startDatePath": "attributes.vegetation_mapping_survey.data.attributes.start_date_time", - "endDatePath": null, - "surveyIdPath": "attributes.vegetation_mapping_survey.data.attributes.surveyId" + "startDatePath": "start_date_time", + "endDatePath": null }, "a9cb9e38-690f-41c9-8151-06108caf539d": { @@ -69,9 +67,8 @@ var protocols = { "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "photopoints-surveys", - "startDatePath": "attributes.start_date_time", - "endDatePath": "attributes.end_date_time", - "surveyIdPath": "attributes.surveyId" + "startDatePath": "start_date_time", + "endDatePath": "end_date_time" }, "2dbb595b-3541-46bd-b200-13db3a823b74": { "name": "Photopoints - Device Panorama", @@ -84,18 +81,16 @@ var protocols = { "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "floristics-veg-survey-fulls", - "startDatePath": "attributes.start_date_time", - "endDatePath": "attributes.end_date_time", - "surveyIdPath": "attributes.surveyId" + "startDatePath": "start_date_time", + "endDatePath": "end_date_time" }, "bbd550c0-04c5-4a8c-ae39-cc748e920fd4": { "name": "Floristics - Standard", "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "floristics-veg-survey-lites", - "startDatePath": "attributes.start_date_time", - "endDatePath": "attributes.end_date_time", - "surveyIdPath": "attributes.surveyId" + "startDatePath": "start_date_time", + "endDatePath": "end_date_time" }, "b92005b0-f418-4208-8671-58993089f587": { "name": "Plant Tissue Vouchering - Enhanced", @@ -144,8 +139,8 @@ var protocols = { "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "basal-area-dbh-measure-surveys", - "startDatePath": "attributes.start_date", - "endDatePath": "attributes.start_date", + "startDatePath": "start_date", + "endDatePath": "start_date", "overrides": { "dataModel": { "floristics-veg-voucher-full.host_species": { @@ -369,8 +364,8 @@ var protocols = { "usesPlotLayout": false, "tags": ["intervention"], "apiEndpoint": "pest-fauna-control-activities", - "startDatePath": "attributes.start_time", - "endDatePath": "attributes.end_time", + "startDatePath": "start_time", + "endDatePath": "end_time", "geometryType": "LineString" }, "228e5e1e-aa9f-47a3-930b-c1468757f81d": { diff --git a/src/test/groovy/au/org/ala/merit/ProjectControllerSpec.groovy b/src/test/groovy/au/org/ala/merit/ProjectControllerSpec.groovy index d51f5afa4..edbc11239 100644 --- a/src/test/groovy/au/org/ala/merit/ProjectControllerSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/ProjectControllerSpec.groovy @@ -947,6 +947,21 @@ class ProjectControllerSpec extends Specification implements ControllerUnitTest< result == null } + def "Get species record for an activity id" (String activityId, int statusCode, int numberOfCalls, def data) { + when: + request.method = 'GET' + controller.getSpeciesRecordsFromActivity (activityId) + + then: + numberOfCalls * projectService.getSpeciesRecordsFromActivity (activityId) >> data + controller.response.status == statusCode + + where: + activityId | statusCode | numberOfCalls | data + null | 400 | 0 | null + "abc" | 200 | 1 | [] + } + private Map stubPublicUser() { userServiceStub.getUser() >> null null diff --git a/src/test/groovy/au/org/ala/merit/ProjectServiceSpec.groovy b/src/test/groovy/au/org/ala/merit/ProjectServiceSpec.groovy index e55feb3e3..64d8a8745 100644 --- a/src/test/groovy/au/org/ala/merit/ProjectServiceSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/ProjectServiceSpec.groovy @@ -57,6 +57,7 @@ class ProjectServiceSpec extends Specification implements ServiceUnitTest> false metadataService.getProgramConfiguration(_,_) >> [reportingPeriod:6, reportingPeriodAlignedToCalendar: true, weekDaysToCompleteReport:43] projectConfigurationService.getProjectConfiguration(_) >> projectConfig @@ -1584,6 +1585,19 @@ class ProjectServiceSpec extends Specification implements ServiceUnitTest> [records:[record], statusCode: HttpStatus.SC_OK] + result == [record + [species: [scientificName: "sc1", commonName: "vn1", outputSpeciesId: "o1", guid: "g1", name: "sc1 (vn1)"]]] + + } + private Map setupActivityModelForFiltering(List services) { Map activityModel = [name:'output', outputs:[]] services.each { From 078a07a45ea9af52ecf5040f106009c06a63fce0 Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 12 Apr 2024 16:39:38 +1000 Subject: [PATCH 57/95] First cut of new pre-pop requirements #3142 --- forms/nht/safAnnualReport.json | 352 ++++++++++++++++-- .../au/org/ala/merit/ProjectController.groovy | 46 ++- .../3.3/createScoresForSafAnnualReport.js | 80 +++- .../ala/merit/ProjectControllerSpec.groovy | 21 ++ 4 files changed, 449 insertions(+), 50 deletions(-) diff --git a/forms/nht/safAnnualReport.json b/forms/nht/safAnnualReport.json index e6ae0dcee..7dcda3adc 100644 --- a/forms/nht/safAnnualReport.json +++ b/forms/nht/safAnnualReport.json @@ -1,40 +1,317 @@ { - "name": "SAF Annual Report", + "name": "NHT SAF Annual Report", "description": null, "type": "Activity", "sections": [ { "collapsedByDefault": false, "modelName": null, - "templateName": "outputReportData", + "templateName": "nhtSafAnnualReport", "optional": false, "optionalQuestionText": null, - "title": "Output report data", + "title": "SAF Annual Report", "collapsibleHeading": null, - "name": "Output report data", + "name": "NHT SAF Annual Report", "description": null, "template": { + "modelName": "NHT SAF Annual Report", + "title": "Sustainable Agriculture Facilitators (SAF) Annual Report", "dataModel": [ { "name": "communicationsDuringPeriod", "dataType": "list", + "allowRowDelete": false, "columns": [ { + "name": "nhtCommunications", "dataType": "text", - "name": "communications" + "constraints": [ + "Yes", + "No" + ], + "readonly": true + }, + { + "dataType": "text", + "name": "yesCommunicationsMaterial", + "readonly": true + }, + { + "dataType": "document", + "name": "attachments" } ] + }, + { + "name": "engagementDetails", + "dataType": "list", + "columns": [ + { + "dataType": "stringList", + "name": "engagementType", + "constraints": [ + "One-on-one technical advice", + "Negotiations with the community, etc.", + "Facilitating/Hosting on-ground trials/demos", + "Hosting workshops", + "Facilitating/Hosting conferences/seminars" + ] + }, + { + "dataType": "text", + "name": "engagementTitle" + }, + { + "dataType": "text", + "name": "engagementPurpose" + }, + { + "dataType": "number", + "name": "engagementNoParticipants" + }, + { + "dataType": "date", + "name": "activityDateFrom" + }, + { + "dataType": "date", + "name": "activityDateTo" + } + ] + }, + { + "name": "projectPlans", + "dataType": "list", + "allowRowDelete": false, + "columns": [ + { + "name": "plansDeveloped", + "dataType": "text", + "constraints": [ + "Yes", + "No" + ], + "readonly": true + }, + { + "dataType": "text", + "name": "planName", + "readonly": true + }, + { + "dataType": "text", + "name": "planPurpose", + "readonly": true + } + ] + }, + { + "name": "planningMeetings", + "dataType": "list", + "allowRowDelete": false, + "columns": [ + { + "name": "meetingDateFrom", + "dataType": "date", + "readonly": true + }, + { + "name": "meetingDateTo", + "dataType": "date", + "readonly": true + }, + { + "dataType": "text", + "name": "meetingName", + "readonly": true + }, + { + "dataType": "text", + "name": "meetingDescription", + "readonly": true + } + ] + }, + { + "dataType": "number", + "name": "numberOfCommunityGroupsSupported", + "validate": "required,min[0]" + }, + { + "dataType": "number", + "name": "numberOfFarmsAdoptingSustainablePractices", + "validate": "required,min[0]" } ], "viewModel": [ + { "type": "table", - "title": "Communications", + "title": "Communications material published during the year", + "source": "communicationsDuringPeriod", + "userAddedRows": true, + "disableTableDownload": true, + "disableTableUpload": true, "columns": [ + { + "type": "selectOne", + "source": "nhtCommunications", + "title": "Communications published?", + "readonly": true, + "width": "10%" + }, { "type": "text", - "source": "yesCommunicationsMaterial" - + "source": "yesCommunicationsMaterial", + "title": "Communications material", + "readonly": true, + "width": "50%" + }, + { + "title": "Attached documents", + "source": "attachments", + "type": "document", + "readonly": true, + "noEdit": true, + "width": "40%" + } + ] + }, + { + "type": "table", + "source": "engagementDetails", + "title": "Community engagement activities undertaken during the year", + "userAddedRows": false, + "disableTableUpload": true, + "columns": [ + { + "source": "engagementType", + "type": "selectOne", + "width": "20%", + "title": "Type", + "readonly": true + }, + { + "source": "engagementTitle", + "type": "text", + "width": "25%", + "title": "Title", + "readonly": true + }, + { + "type": "textarea", + "source": "engagementPurpose", + "width": "25%", + "title": "Purpose", + "rows": 4, + "readonly": true + }, + { + "source": "engagementNoParticipants", + "type": "number", + "width": "10%", + "title": "Number of participants", + "readonly": true + }, + { + "title": "Activity Date from", + "source": "activityDateFrom", + "type": "date", + "width": "10%", + "readonly": true + }, + { + "title": "Activity Date to", + "source": "activityDateTo", + "type": "date", + "width": "10%", + "readonly": true + } + ] + }, + { + "type": "literal", + "source": "

    Coordinate Projects and MERI

    " + }, + { + "type": "table", + "source": "projectPlans", + "title": "Site / Project / Monitoring plans developed during the year", + "userAddedRows": false, + "disableTableUpload": true, + "columns": [ + { + "source": "plansDeveloped", + "type": "selectOne", + "width": "10%", + "title": "Type", + "readonly": true + }, + { + "source": "planName", + "type": "text", + "width": "30%", + "title": "Title", + "readonly": true + }, + { + "source": "planPurpose", + "type": "textarea", + "width": "60%", + "title": "Title", + "readonly": true + } + ] + }, + { + "type": "table", + "source": "planningMeetings", + "title": "Project meetings held during the year", + "userAddedRows": false, + "disableTableUpload": true, + "columns": [ + { + "source": "meetingDateFrom", + "type": "date", + "width": "10%", + "title": "From", + "readonly": true + }, + { + "source": "meetingDateTo", + "type": "date", + "width": "10%", + "title": "To", + "readonly": true + }, + { + "source": "meetingName", + "type": "text", + "width": "30%", + "title": "Name", + "readonly": true + }, + { + "source": "meetingDescription", + "type": "text", + "width": "50%", + "title": "Description", + "readonly": true + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "number", + "source": "numberOfCommunityGroupsSupported", + "preLabel": "Number of community groups supported through the project" + }, + { + "type": "number", + "source": "numberOfFarmsAdoptingSustainablePractices", + "preLabel": "How many farms have adopted sustainable agriculture practices through the project?" } ] } @@ -42,7 +319,7 @@ "pre-populate": [ { "source": { - "url": "/project/agReport/", + "url": "/project/annualReport/", "params": [ { "expression": "owner.projectId", @@ -53,47 +330,52 @@ "expression": "activity.plannedEndDate", "name": "financialYearEndDate", "type": "computed" + }, + { + "name": "scoreIds", + "value": [ + "e7701823-e534-414e-80f5-86f9eecef50c", + "f474c538-c8d7-4431-86c3-741163a50a35", + "06c401d9-1370-48d1-9c30-9a6846128f71", + "c6b2f62b-06c7-4ea6-9cb3-61ce26ab8200" + ] } ] - }, "merge": { "communicationsDuringPeriod": { "keys": [ "yesCommunicationsMaterial" ], - + "addUnmatchedNewRows": true, + "deleteUnmatchedExistingRows": true + }, + "engagementDetails": { + "keys": [ + "engagementTitle" + ], "addUnmatchedNewRows": true, "deleteUnmatchedExistingRows": true } }, "mapping": [ { - "mapping": [ - { - "source-path": "service", - "target": "serviceName" - }, - { - "source-path": "targetMeasure", - "target": "targetMeasure" - }, - { - "source-path": "scoreId", - "target": "scoreId" - }, - { - "source-path": "financialYearTarget", - "target": "annualTarget" - }, - { - "source-path": "financialYearResult", - "target": "result" - } - ], - "source-path": "targets", + "source-path": "e7701823-e534-414e-80f5-86f9eecef50c", "target": "communicationsDuringPeriod" - }] + }, + { + "source-path": "f474c538-c8d7-4431-86c3-741163a50a35", + "target": "engagementDetails" + }, + { + "source-path": "06c401d9-1370-48d1-9c30-9a6846128f71", + "target": "projectPlans" + }, + { + "source-path": "c6b2f62b-06c7-4ea6-9cb3-61ce26ab8200", + "target": "planningMeetings" + } + ] } ] } diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index 31a921ca6..b8421140e 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -1149,18 +1149,44 @@ class ProjectController { null } - def agAnnualReport(String id) { - String url = grailsApplication.config.getProperty('ecodata.baseUrl') + 'project/projectMetrics/' + id - Map params = [approvedOnly:false, scoreIds: [ - 'e7701823-e534-414e-80f5-86f9eecef50c', - 'f474c538-c8d7-4431-86c3-741163a50a35' - ]] + @PreAuthorise(accessLevel = 'editor') + /** + * This method accepts an end date for a financial year and a list of scoreIds and + * returns the requested aggregate data for the year. + * + * This was developed for the SAF Ag Annual report to pull tabular data into + * the report so also flattens the nested Lists that result from the SET score type + * into a single list. + * + */ + def annualReport(String id) { - Map result = webService.doPost(url, params) - if (result.resp) { - result.resp = result.resp.collect{new Score(it)} + String financialYearEndDate = params.financialYearEndDate + List scoreIds = params.getList('scoreIds') + + if (!financialYearEndDate || !scoreIds) { + render status:400, error:'Required parameters not provided' + return } - render result as JSON + + DateTime financialYearStart = DateUtils.alignToFinancialYear(DateUtils.parse(financialYearEndDate)) + String year = financialYearStart.year + " - " + (financialYearStart.year+1) + + + Map result = projectService.scoresByFinancialYear(id, scoreIds) + + List financialYearData = result?.resp?.find{it.group == year}?.results ?: [] + + Map reportData = scoreIds.collectEntries { String scoreId -> + Map scoreResult = financialYearData.find{it.scoreId == scoreId} + def data = scoreResult?.result?.result + if (data instanceof List) { + data = data.flatten() // Collate a List of tables from each report into a flat List for display + } + [(scoreId): data] + } + + render reportData as JSON } private def error(String message, String projectId) { diff --git a/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js b/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js index 06f07b5db..be45889de 100644 --- a/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js +++ b/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js @@ -18,7 +18,7 @@ let scores = [ type: 'filter', property: 'name' }, - childAggregations: [ { property: 'data', type: 'SET' } ] + childAggregations: [{property: 'data', type: 'SET'}] } }, @@ -40,18 +40,88 @@ let scores = [ type: 'filter', property: 'name' }, - childAggregations: [ { property: 'data.engagementDetails', type: 'SET' } ] + childAggregations: [{property: 'data.engagementDetails', type: 'SET'}] + } + }, + + { + scoreId: '06c401d9-1370-48d1-9c30-9a6846128f71', // Deliberately coding the score ids to keep consistency between test & prod + entityTypes: [], + tags: [], + displayType: '', + entity: 'Activity', + outputType: 'NHT - Coordinate', + isOutputTarget: false, + category: 'Annual Reporting', + status: 'active', + label: 'All NHT Coordinate data from the NHT Output report', + description: 'All NHT Coordinate data from the NHT Output report', + configuration: { + filter: { + filterValue: 'NHT - Coordinate', + type: 'filter', + property: 'name' + }, + childAggregations: [{property: 'data', type: 'SET'}] + } + }, + + { + scoreId: 'c6b2f62b-06c7-4ea6-9cb3-61ce26ab8200', // Deliberately coding the score ids to keep consistency between test & prod + entityTypes: [], + tags: [], + displayType: '', + entity: 'Activity', + outputType: 'NHT - Coordinate', + isOutputTarget: false, + category: 'Annual Reporting', + status: 'active', + label: 'All NHT Coordinate planning meetings reporting in the NHT Output report', + description: 'All NHT Coordinate planning meetings reporting in the NHT Output report', + configuration: { + filter: { + filterValue: 'NHT - Coordinate', + type: 'filter', + property: 'name' + }, + childAggregations: [{property: 'data.meetingDetails', type: 'SET'}] + } + }, + + { + scoreId: 'c6b2f62b-06c7-4ea6-9cb3-61ce26ab8200', // Deliberately coding the score ids to keep consistency between test & prod + entityTypes: [], + tags: [], + displayType: '', + entity: 'Activity', + outputType: 'NHT - Coordinate', + isOutputTarget: false, + category: 'Annual Reporting', + status: 'active', + label: 'All NHT Coordinate planning meetings reporting in the NHT Output report', + description: 'All NHT Coordinate planning meetings reporting in the NHT Output report', + configuration: { + filter: { + filterValue: 'NHT - Coordinate', + type: 'filter', + property: 'name' + }, + childAggregations: [ + { + filter: {filterValue: 'Yes', type: 'filter', property: 'data.facilitatedPlanningMeetings'}, + childAggregations: [{property: 'data.meetingDetails', type: 'SET'}] + } + ] } } ]; -for (let i=0; i> resp + response.json == [s1:['a', 'b'], s2:['a', 'b', 'c']] + } + private Map stubPublicUser() { userServiceStub.getUser() >> null null From 9b78ab22bde6f7e3d12fa1cfb082d4c264e64e74 Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 15 Apr 2024 14:38:44 +1000 Subject: [PATCH 58/95] First cut of SAF annual report #3142 --- forms/nht/safAnnualReport.json | 392 ++++++++++++------ .../au/org/ala/merit/ProjectController.groovy | 16 +- .../3.3/createScoresForSafAnnualReport.js | 53 ++- 3 files changed, 333 insertions(+), 128 deletions(-) diff --git a/forms/nht/safAnnualReport.json b/forms/nht/safAnnualReport.json index 7dcda3adc..94be168ab 100644 --- a/forms/nht/safAnnualReport.json +++ b/forms/nht/safAnnualReport.json @@ -22,60 +22,77 @@ "dataType": "list", "allowRowDelete": false, "columns": [ - { - "name": "nhtCommunications", - "dataType": "text", - "constraints": [ - "Yes", - "No" - ], - "readonly": true - }, { "dataType": "text", "name": "yesCommunicationsMaterial", "readonly": true - }, - { - "dataType": "document", - "name": "attachments" } ] }, { - "name": "engagementDetails", + "name": "numberOfCommunicationsMaterialsPublished", + "dataType": "number", + "decimalPlaces": 0, + "computed": { + "expression": "count(communicationsDuringPeriod, \"yesCommunicationsMaterial\")" + } + }, + { + "name": "engagementsByType", "dataType": "list", "columns": [ - { - "dataType": "stringList", - "name": "engagementType", - "constraints": [ - "One-on-one technical advice", - "Negotiations with the community, etc.", - "Facilitating/Hosting on-ground trials/demos", - "Hosting workshops", - "Facilitating/Hosting conferences/seminars" - ] - }, { "dataType": "text", - "name": "engagementTitle" - }, - { - "dataType": "text", - "name": "engagementPurpose" + "name": "engagementType" }, { "dataType": "number", - "name": "engagementNoParticipants" + "name": "numberOfEngagements" }, { - "dataType": "date", - "name": "activityDateFrom" + "dataType": "number", + "name": "numberOfParticipants", + "decimalPlaces": 0, + "computed": { + "expression": "sum(engagementDetails, \"engagementNoParticipants\")" + } }, { - "dataType": "date", - "name": "activityDateTo" + "name": "engagementDetails", + "dataType": "list", + "columns": [ + { + "dataType": "stringList", + "name": "engagementType", + "constraints": [ + "One-on-one technical advice", + "Negotiations with the community, etc.", + "Facilitating/Hosting on-ground trials/demos", + "Hosting workshops", + "Facilitating/Hosting conferences/seminars" + ] + }, + { + "dataType": "text", + "name": "engagementTitle" + }, + { + "dataType": "text", + "name": "engagementPurpose" + }, + { + "dataType": "number", + "name": "engagementNoParticipants" + }, + { + "dataType": "date", + "name": "activityDateFrom" + }, + { + "dataType": "date", + "name": "activityDateTo" + } + ] } ] }, @@ -84,15 +101,6 @@ "dataType": "list", "allowRowDelete": false, "columns": [ - { - "name": "plansDeveloped", - "dataType": "text", - "constraints": [ - "Yes", - "No" - ], - "readonly": true - }, { "dataType": "text", "name": "planName", @@ -105,6 +113,14 @@ } ] }, + { + "dataType": "number", + "name": "numberOfPlans", + "decimalPlaces": 0, + "computed": { + "expression": "count(projectPlans, \"planName\")" + } + }, { "name": "planningMeetings", "dataType": "list", @@ -132,6 +148,14 @@ } ] }, + { + "dataType": "number", + "name": "numberOfMeetings", + "decimalPlaces": 0, + "computed": { + "expression": "count(planningMeetings, \"meetingName\")" + } + }, { "dataType": "number", "name": "numberOfCommunityGroupsSupported", @@ -144,94 +168,169 @@ } ], "viewModel": [ - + { + "type": "row", + "items": [ + { + "type": "literal", + "source": "This section provides a summary of the reported Project Support & Overheads data during the previous finanical year." + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "literal", + "source": "

    Communications

    " + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "type": "number", + "source": "numberOfCommunicationsMaterialsPublished", + "preLabel": "Total number of communications materials published during the year" + } + ] + } + ] + }, { "type": "table", "title": "Communications material published during the year", "source": "communicationsDuringPeriod", - "userAddedRows": true, + "userAddedRows": false, "disableTableDownload": true, "disableTableUpload": true, "columns": [ - { - "type": "selectOne", - "source": "nhtCommunications", - "title": "Communications published?", - "readonly": true, - "width": "10%" - }, { "type": "text", "source": "yesCommunicationsMaterial", "title": "Communications material", "readonly": true, "width": "50%" - }, - { - "title": "Attached documents", - "source": "attachments", - "type": "document", - "readonly": true, - "noEdit": true, - "width": "40%" } ] }, { - "type": "table", - "source": "engagementDetails", - "title": "Community engagement activities undertaken during the year", - "userAddedRows": false, - "disableTableUpload": true, - "columns": [ - { - "source": "engagementType", - "type": "selectOne", - "width": "20%", - "title": "Type", - "readonly": true - }, - { - "source": "engagementTitle", - "type": "text", - "width": "25%", - "title": "Title", - "readonly": true - }, + "type": "row", + "items": [ { - "type": "textarea", - "source": "engagementPurpose", - "width": "25%", - "title": "Purpose", - "rows": 4, - "readonly": true - }, + "type": "literal", + "source": "

    Engagement activities or events, to the Community, which are directly relevant to delivery of Project

    " + } + ] + }, + { + "type": "repeat", + "source": "engagementsByType", + "items": [ { - "source": "engagementNoParticipants", - "type": "number", - "width": "10%", - "title": "Number of participants", - "readonly": true + "type": "row", + "items": [ + { + "type": "text", + "source": "engagementType", + "preLabel": "Type of engagements", + "readonly": true + }, + { + "type": "number", + "source": "numberOfEngagements", + "preLabel": "Number of engagements of this type", + "readonly": true + }, + { + "type": "number", + "source": "numberOfParticipants", + "preLabel": "Total number of participants", + "readonly": true + } + ] }, { - "title": "Activity Date from", - "source": "activityDateFrom", - "type": "date", - "width": "10%", - "readonly": true - }, + "type": "table", + "source": "engagementDetails", + "title": "Community engagement activities undertaken during the year", + "userAddedRows": false, + "disableTableUpload": true, + "columns": [ + { + "source": "engagementType", + "type": "selectOne", + "width": "20%", + "title": "Type", + "readonly": true + }, + { + "source": "engagementTitle", + "type": "text", + "width": "25%", + "title": "Title", + "readonly": true + }, + { + "type": "textarea", + "source": "engagementPurpose", + "width": "25%", + "title": "Purpose", + "rows": 4, + "readonly": true + }, + { + "source": "engagementNoParticipants", + "type": "number", + "width": "10%", + "title": "Number of participants", + "readonly": true + }, + { + "title": "Activity Date from", + "source": "activityDateFrom", + "type": "date", + "width": "10%", + "readonly": true + }, + { + "title": "Activity Date to", + "source": "activityDateTo", + "type": "date", + "width": "10%", + "readonly": true + } + ] + } + ] + }, + { + "type": "row", + "items": [ { - "title": "Activity Date to", - "source": "activityDateTo", - "type": "date", - "width": "10%", - "readonly": true + "type": "literal", + "source": "

    Coordinate Projects and MERI

    " } ] }, { - "type": "literal", - "source": "

    Coordinate Projects and MERI

    " + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "type": "number", + "source": "numberOfPlans", + "preLabel": "Total number of site/ project/ monitoring plans developed" + } + ] + } + ] }, { "type": "table", @@ -240,13 +339,6 @@ "userAddedRows": false, "disableTableUpload": true, "columns": [ - { - "source": "plansDeveloped", - "type": "selectOne", - "width": "10%", - "title": "Type", - "readonly": true - }, { "source": "planName", "type": "text", @@ -263,6 +355,22 @@ } ] }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "type": "number", + "source": "numberOfMeetings", + "preLabel": "Total number of planning meetings" + } + ] + } + + ] + }, { "type": "table", "source": "planningMeetings", @@ -304,14 +412,37 @@ "type": "row", "items": [ { - "type": "number", - "source": "numberOfCommunityGroupsSupported", - "preLabel": "Number of community groups supported through the project" - }, + "type": "literal", + "source": "

    Sustainable agricultural practices

    " + } + ] + }, + { + "type": "row", + "items": [ { - "type": "number", - "source": "numberOfFarmsAdoptingSustainablePractices", - "preLabel": "How many farms have adopted sustainable agriculture practices through the project?" + "type": "literal", + "source": "This section includes questions specific to projects targeting sustainable agriculture related outcomes." + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "type": "number", + "source": "numberOfCommunityGroupsSupported", + "preLabel": "Number of community groups supported through the project" + }, + { + "type": "number", + "source": "numberOfFarmsAdoptingSustainablePractices", + "preLabel": "How many farms have adopted sustainable agriculture practices through the project?" + } + ] } ] } @@ -337,7 +468,8 @@ "e7701823-e534-414e-80f5-86f9eecef50c", "f474c538-c8d7-4431-86c3-741163a50a35", "06c401d9-1370-48d1-9c30-9a6846128f71", - "c6b2f62b-06c7-4ea6-9cb3-61ce26ab8200" + "c6b2f62b-06c7-4ea6-9cb3-61ce26ab8200", + "3117521e-a801-45ef-838f-519c31ca59a2" ] } ] @@ -364,8 +496,22 @@ "target": "communicationsDuringPeriod" }, { - "source-path": "f474c538-c8d7-4431-86c3-741163a50a35", - "target": "engagementDetails" + "source-path": "3117521e-a801-45ef-838f-519c31ca59a2", + "target": "engagementsByType", + "mapping": [ + { + "source-path": "group", + "target": "engagementType" + }, + { + "source-path": "count", + "target": "numberOfEngagements" + }, + { + "source-path": "result", + "target": "engagementDetails" + } + ] }, { "source-path": "06c401d9-1370-48d1-9c30-9a6846128f71", diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index b8421140e..a679f1aaa 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -1179,10 +1179,20 @@ class ProjectController { Map reportData = scoreIds.collectEntries { String scoreId -> Map scoreResult = financialYearData.find{it.scoreId == scoreId} - def data = scoreResult?.result?.result - if (data instanceof List) { - data = data.flatten() // Collate a List of tables from each report into a flat List for display + def data = scoreResult?.result + if (data?.result) { + data = data.result + if (data instanceof List) { + data = data.flatten() // Collate a List of tables from each report into a flat List for display + } + } + else if (data?.groups) { + data = data.groups + data.each { Map group -> + group.result = group.results?[0]?.result + } } + [(scoreId): data] } diff --git a/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js b/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js index be45889de..95ff0c3fd 100644 --- a/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js +++ b/src/main/scripts/releases/3.3/createScoresForSafAnnualReport.js @@ -18,7 +18,15 @@ let scores = [ type: 'filter', property: 'name' }, - childAggregations: [{property: 'data', type: 'SET'}] + childAggregations: [ + { + filter: { + filterValue: 'Yes', + type: 'filter', + property: 'data.nhtCommunications' + }, + childAggregations: [{property: 'data', type: 'SET'}] + }] } }, @@ -43,7 +51,39 @@ let scores = [ childAggregations: [{property: 'data.engagementDetails', type: 'SET'}] } }, + { + scoreId: '3117521e-a801-45ef-838f-519c31ca59a2', // Deliberately coding the score ids to keep consistency between test & prod + entityTypes: [], + tags: [], + displayType: '', + entity: 'Activity', + outputType: 'NHT - Project Engagements', + isOutputTarget: false, + category: 'Annual Reporting', + status: 'active', + label: 'Project engagements by engagement type', + description: 'All the Project engagements from the output report', + configuration: { + filter: { + filterValue: 'NHT - Project Engagements', + type: 'filter', + property: 'name' + }, + childAggregations: [ + { + groups: { + "type": "discrete", + "property": "data.engagementDetails.engagementType" + }, + "childAggregations": [ + {property: 'data.engagementDetails', type: 'SET'} + ] + } + + ] + } + }, { scoreId: '06c401d9-1370-48d1-9c30-9a6846128f71', // Deliberately coding the score ids to keep consistency between test & prod entityTypes: [], @@ -62,7 +102,16 @@ let scores = [ type: 'filter', property: 'name' }, - childAggregations: [{property: 'data', type: 'SET'}] + childAggregations: [ + { + filter: { + filterValue: 'Yes', + type: 'filter', + property: 'data.plansDeveloped' + }, + childAggregations: [ + {property: 'data', type: 'SET'}] + }] } }, From 3d4ec20fcdb4b3bdaa1014da3ebc7adb4161cf18 Mon Sep 17 00:00:00 2001 From: temi Date: Mon, 15 Apr 2024 14:55:03 +1000 Subject: [PATCH 59/95] #3049 - annotated paratoo config with to distinguish species, feature, etc. --- .../3.2/insertParatooProtocolConfig.js | 665 +++++++++++++++++- 1 file changed, 627 insertions(+), 38 deletions(-) diff --git a/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js b/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js index 09bbf119b..19271ec57 100644 --- a/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js +++ b/src/main/scripts/releases/3.2/insertParatooProtocolConfig.js @@ -21,7 +21,7 @@ var protocols = { "apiEndpoint": "vegetation-mapping-surveys", "geometryType": "Point", "startDatePath": "start_date_time", - "endDatePath": null + "endDatePath": "end_date_time" }, "a9cb9e38-690f-41c9-8151-06108caf539d": { @@ -32,25 +32,32 @@ var protocols = { }, "d7179862-1be3-49fc-8ec9-2e219c6f3854": { "name": "Plot Layout and Visit", - "usesPlotLayout": false, + "usesPlotLayout": true, "apiEndpoint": "plot-definition-surveys", - "tags": ["site"] + "tags": ["site"], + "startDatePath": "start_date", + "endDatePath": "end_date" }, "617df00c-0e4f-4267-9efc-9ca9eae19686": { "name": "Plot Description(enhanced)", "apiEndpoint": "plot-description-enhanceds", "usesPlotLayout": true, - "tags": ["site"] + "tags": ["site"], + "startDatePath": "start_date", + "endDatePath": "end_date" }, "dc10f902-e310-45eb-b82a-bebab050b46b": { "name": "Plot Description(standard)", "apiEndpoint": "plot-description-standards", "usesPlotLayout": true, - "tags": ["site"] + "tags": ["site"], + "startDatePath": "start_date", + "endDatePath": "end_date" }, "3cbc5277-45fb-4e7a-8f33-19d9bff4cd78": { "name": "Drone Survey", "usesPlotLayout": false, "tags": ["survey"], - "apiEndpoint": "drone-surveys" + "apiEndpoint": "drone-surveys", + "startDatePath": "date" }, "3d2eaa76-a610-4575-ac30-abf40e57b68a": { "name": "Dev sandbox", "usesPlotLayout": false, "tags": ["development"], @@ -61,72 +68,226 @@ var protocols = { "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "photopoints-surveys", + "startDatePath": "start_date", + "endDatePath": "end_date" }, "383fa013-c52d-4186-911b-35e9b2375653": { "name": "Photopoints - Compact Panorama", "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "photopoints-surveys", - "startDatePath": "start_date_time", - "endDatePath": "end_date_time" + "startDatePath": "start_date", + "endDatePath": "end_date" }, "2dbb595b-3541-46bd-b200-13db3a823b74": { "name": "Photopoints - Device Panorama", "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "photopoints-surveys", + "startDatePath": "start_date", + "endDatePath": "end_date" }, "e15db26f-55de-4459-841b-d7ef87dea5cd": { "name": "Floristics - Enhanced", "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "floristics-veg-survey-fulls", - "startDatePath": "start_date_time", - "endDatePath": "end_date_time" + "startDatePath": "start_date", + "endDatePath": "end_date", + "overrides": { + "dataModel": { + "floristics-veg-voucher-full.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "floristics-veg-voucher-full.host_species": { + "type": "speciesSelect" + } + } + } }, "bbd550c0-04c5-4a8c-ae39-cc748e920fd4": { "name": "Floristics - Standard", "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "floristics-veg-survey-lites", - "startDatePath": "start_date_time", - "endDatePath": "end_date_time" + "startDatePath": "start_date", + "endDatePath": "end_date", + "overrides": { + "dataModel": { + "floristics-veg-virtual-voucher.host_species": { + "dataType": "species" + }, + "floristics-veg-virtual-voucher.voucher_lite.host_species": { + "dataType": "species" + }, + "floristics-veg-virtual-voucher.voucher_full.host_species": { + "dataType": "species" + }, + "floristics-veg-voucher-lite.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "floristics-veg-virtual-voucher.host_species": { + "type": "speciesSelect" + }, + "floristics-veg-virtual-voucher.voucher_lite.host_species": { + "type": "speciesSelect" + }, + "floristics-veg-virtual-voucher.voucher_full.host_species": { + "type": "speciesSelect" + }, + "floristics-veg-voucher-lite.host_species": { + "type": "speciesSelect" + } + } + } }, "b92005b0-f418-4208-8671-58993089f587": { "name": "Plant Tissue Vouchering - Enhanced", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "floristics-veg-genetic-voucher-surveys" + "apiEndpoint": "floristics-veg-genetic-voucher-surveys", + "overrides": { + "dataModel": { + "floristics-veg-genetic-voucher.floristics_voucher.voucher_full.host_species": { + "dataType": "species" + }, + "floristics-veg-genetic-voucher.floristics_voucher.voucher_lite.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "floristics-veg-genetic-voucher.floristics_voucher.voucher_full.host_species": { + "type": "speciesSelect" + }, + "floristics-veg-genetic-voucher.floristics_voucher.voucher_lite.host_species": { + "type": "speciesSelect" + } + } + } }, "f01e0673-a29d-48bb-b6ce-cf1c0f0de345": { "name": "Plant Tissue Vouchering - Standard", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "floristics-veg-genetic-voucher-surveys" + "apiEndpoint": "floristics-veg-genetic-voucher-surveys", + "overrides": { + "dataModel": { + "floristics-veg-genetic-voucher.floristics_voucher.voucher_full.host_species": { + "dataType": "species" + }, + "floristics-veg-genetic-voucher.floristics_voucher.voucher_lite.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "floristics-veg-genetic-voucher.floristics_voucher.voucher_full.host_species": { + "type": "speciesSelect" + }, + "floristics-veg-genetic-voucher.floristics_voucher.voucher_lite.host_species": { + "type": "speciesSelect" + } + } + } }, "93e65339-4bce-4ca1-a323-78977865ef93": { "name": "Cover - Enhanced", "usesPlotLayout": true, "tags": ["survey"], "apiEndpoint": "cover-point-intercept-surveys", + "overrides": { + "dataModel": { + "cover-point-intercept-point.species_intercepts.floristics_voucher_lite.host_species": { + "dataType": "species" + }, + "cover-point-intercept-point.species_intercepts.floristics_voucher_full.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "cover-point-intercept-point.species_intercepts.floristics_voucher_lite.host_species": { + "type": "speciesSelect" + }, + "cover-point-intercept-point.species_intercepts.floristics_voucher_full.host_species": { + "type": "speciesSelect" + } + } + } }, "37a3b018-3779-4c4f-bfb3-d38eb53a2568": { "name": "Cover - Standard", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "cover-point-intercept-surveys" + "apiEndpoint": "cover-point-intercept-surveys", + "overrides": { + "dataModel": { + "cover-point-intercept-point.species_intercepts.floristics_voucher_lite.host_species": { + "dataType": "species" + }, + "cover-point-intercept-point.species_intercepts.floristics_voucher_full.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "cover-point-intercept-point.species_intercepts.floristics_voucher_lite.host_species": { + "type": "speciesSelect" + }, + "cover-point-intercept-point.species_intercepts.floristics_voucher_full.host_species": { + "type": "speciesSelect" + } + } + } }, "8c47b1f8-fc58-4510-a138-e5592edd2dbc": { "name": "Cover + Fire - Enhanced", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "cover-point-intercept-surveys" + "apiEndpoint": "cover-point-intercept-surveys", + "overrides": { + "dataModel": { + "cover-point-intercept-point.species_intercepts.floristics_voucher_lite.host_species": { + "dataType": "species" + }, + "cover-point-intercept-point.species_intercepts.floristics_voucher_full.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "cover-point-intercept-point.species_intercepts.floristics_voucher_lite.host_species": { + "type": "speciesSelect" + }, + "cover-point-intercept-point.species_intercepts.floristics_voucher_full.host_species": { + "type": "speciesSelect" + } + } + } }, "58f2b4a6-6ce1-4364-9bae-f96fc3f86958": { "name": "Cover + Fire - Standard", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "cover-point-intercept-surveys" + "apiEndpoint": "cover-point-intercept-surveys", + "overrides": { + "dataModel": { + "cover-point-intercept-point.species_intercepts.floristics_voucher_lite.host_species": { + "dataType": "species" + }, + "cover-point-intercept-point.species_intercepts.floristics_voucher_full.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "cover-point-intercept-point.species_intercepts.floristics_voucher_lite.host_species": { + "type": "speciesSelect" + }, + "cover-point-intercept-point.species_intercepts.floristics_voucher_full.host_species": { + "type": "speciesSelect" + } + } + } }, "36e9d224-a51f-47ea-9442-865e80144311": { "name": "Fire Survey", @@ -143,18 +304,18 @@ var protocols = { "endDatePath": "start_date", "overrides": { "dataModel": { - "floristics-veg-voucher-full.host_species": { + "basal-area-dbh-measure-observation.floristics_voucher.voucher_full.host_species": { "dataType": "species" }, - "floristics-veg-voucher-lite.host_species": { + "basal-area-dbh-measure-observation.floristics_voucher.voucher_lite.host_species": { "dataType": "species" } }, "viewModel": { - "floristics-veg-voucher-full.host_species": { + "basal-area-dbh-measure-observation.floristics_voucher.voucher_full.host_species": { "type": "speciesSelect" }, - "floristics-veg-voucher-lite.host_species": { + "basal-area-dbh-measure-observation.floristics_voucher.voucher_lite.host_species": { "type": "speciesSelect" } } @@ -164,7 +325,25 @@ var protocols = { "name": "Basal Area - Basal Wedge", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "basal-wedge-surveys" + "apiEndpoint": "basal-wedge-surveys", + "overrides": { + "dataModel": { + "basal-wedge-observation.floristics_voucher.voucher_full.host_species": { + "dataType": "species" + }, + "basal-wedge-observation.floristics_voucher.voucher_lite.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "basal-wedge-observation.floristics_voucher.voucher_full.host_species": { + "type": "speciesSelect" + }, + "basal-wedge-observation.floristics_voucher.voucher_lite.host_species": { + "type": "speciesSelect" + } + } + } }, "6e613128-92e8-4525-854c-4021f1d4d02f": { "name": "Coarse Woody Debris", @@ -176,13 +355,88 @@ var protocols = { "name": "Recruitment - Age Structure", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "recruitment-field-surveys" + "apiEndpoint": "recruitment-field-surveys", + "overrides": { + "dataModel": { + "recruitment-growth-stage.floristics_voucher.voucher_full.host_species": { + "dataType": "species" + }, + "recruitment-growth-stage.floristics_voucher.voucher_lite.host_species": { + "dataType": "species" + }, + "recruitment-sapling-and-seedling-count.juvenile_count": { + "dwcAttribute": "individualCount" + }, + "recruitment-sapling-and-seedling-count.seedling_count": { + "dwcAttribute": "individualCount" + }, + "recruitment-sapling-and-seedling-count.sapling_count": { + "dwcAttribute": "individualCount" + }, + "recruitment-sapling-and-seedling-count.voucher_full.host_species": { + "dataType": "species" + }, + "recruitment-sapling-and-seedling-count.voucher_lite.host_species": { + "dataType": "species" + }, + }, + "viewModel": { + "recruitment-growth-stage.floristics_voucher.voucher_full.host_species": { + "type": "speciesSelect" + }, + "recruitment-growth-stage.floristics_voucher.voucher_lite.host_species": { + "type": "speciesSelect" + }, + "recruitment-sapling-and-seedling-count.voucher_full.host_species": { + "type": "speciesSelect" + }, + "recruitment-sapling-and-seedling-count.voucher_lite.host_species": { + "type": "speciesSelect" + } + } + } }, "db841be3-dfb7-4860-9474-a131f4de5954": { "name": "Recruitment - Survivorship", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "recruitment-survivorship-surveys" + "apiEndpoint": "recruitment-survivorship-surveys", + "overrides": { + "dataModel": { + "recruitment-survivorship-observation.species": { + "dataType": "species" + }, + "recruitment-survivorship-observation.survivor_survey.floristics_voucher.voucher_full.host_species": { + "dataType": "species" + }, + "recruitment-survivorship-observation.survivor_survey.floristics_voucher.voucher_lite.host_species": { + "dataType": "species" + }, + "recruitment-survivorship-survey.floristics_voucher.voucher_full.host_species": { + "dataType": "species" + }, + "recruitment-survivorship-survey.floristics_voucher.voucher_lite.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "recruitment-survivorship-observation.species": { + "type": "speciesSelect" + }, + "recruitment-survivorship-observation.survivor_survey.floristics_voucher.voucher_full.host_species": { + "type": "speciesSelect" + }, + "recruitment-survivorship-observation.survivor_survey.floristics_voucher.voucher_lite.host_species": { + "type": "speciesSelect" + }, + "recruitment-survivorship-survey.floristics_voucher.voucher_full.host_species": { + "type": "speciesSelect" + }, + "recruitment-survivorship-survey.floristics_voucher.voucher_lite.host_species": { + "type": "speciesSelect" + } + } + } }, "1dd7d3ff-11b5-4690-8167-d8fe148656b9": { "name": "Soil Sub-pit and Metagenomics", @@ -215,7 +469,7 @@ var protocols = { "apiEndpoint": "bird-surveys", "overrides": { "dataModel": { - "bird-survey.bird-survey-observation.count": { + "bird-survey-observation.count": { "dwcAttribute": "individualCount" } } @@ -237,13 +491,33 @@ var protocols = { "name": "Invertebrate Fauna - Active Search", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "invertebrate-active-search-surveys" + "apiEndpoint": "invertebrate-active-search-surveys", + "startDatePath": "invertebrate-active-search.start_time", + "endDatePath": "invertebrate-active-search.end_time" }, "7f95710a-2003-4119-a2c6-41ce4e34d12a": { "name": "Condition - Attributes", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "condition-surveys" + "apiEndpoint": "condition-surveys", + "overrides": { + "dataModel": { + "condition-tree-survey.tree_record.species.voucher_full.host_species": { + "dataType": "species" + }, + "condition-tree-survey.tree_record.species.voucher_lite.host_species": { + "dataType": "species" + } + }, + "viewModel": { + "condition-tree-survey.tree_record.species.voucher_full.host_species": { + "type": "speciesSelect" + }, + "condition-tree-survey.tree_record.species.voucher_lite.host_species": { + "type": "speciesSelect" + } + } + } }, "aae4dbd8-845a-406e-b682-ef01c3497711": { "name": "Dev Sandbox Bulk Survey", @@ -255,7 +529,21 @@ var protocols = { "name": "Metadata Collection", "usesPlotLayout": false, "tags": ["survey"], - "apiEndpoint": "new-targeted-surveys" + "apiEndpoint": "new-targeted-surveys", + "startDatePath": "metadata-collection.dataset_time_period.dataset_start_date", + "endDatePath": "metadata-collection.dataset_time_period.dataset_end_date", + "overrides": { + "dataModel": { + "metadata-collection.survey_data.key_target_species": { + "dataType": "species" + } + }, + "viewModel": { + "metadata-collection.survey_data.key_target_species": { + "type": "speciesSelect" + } + } + } }, "949ae38f-c047-42a7-8164-38c24ede35d5": { "name": "Camera Trap Reequipping", @@ -267,7 +555,34 @@ var protocols = { "name": "Fauna Aerial Survey", "usesPlotLayout": false, "tags": ["survey"], - "apiEndpoint": "aerial-surveys" + "apiEndpoint": "aerial-surveys", + "overrides": { + "dataModel": { + "aerial-observation.ferals_aerial_count_survey.available_species.species": { + "dataType": "species" + }, + "aerial-observation.ferals_aerial_count_survey.available_species.count": { + "dwcAttribute": "individualCount" + }, + "aerial-observation.survey.setup_ID.target_species_pest": { + "dataType": "species" + }, + "aerial-observation.survey.setup_ID.wild_dog": { + "dataType": "species" + } + }, + "viewModel": { + "aerial-observation.ferals_aerial_count_survey.available_species.species": { + "type": "speciesSelect" + }, + "aerial-observation.survey.setup_ID.target_species_pest": { + "type": "speciesSelect" + }, + "aerial-observation.survey.setup_ID.wild_dog": { + "type": "speciesSelect" + } + } + } }, "2c5bb8d7-b624-4dc4-93d7-3f1276e65ad5": { "name": "Vertebrate Fauna - Trapping Survey Setup", @@ -339,25 +654,115 @@ var protocols = { "name": "Sign-based Fauna Surveys - Within-plot Belt Transect", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "within-plot-belt-transect-surveys" + "apiEndpoint": "within-plot-belt-transect-surveys", + "overrides": { + "dataModel": { + "within-plot-belt-transect.quadrat.sign_observed.attributable_fauna_species.lut": { + "dataType": "species" + }, + "within-plot-belt-transect.quadrat.sign_observed.count": { + "dwcAttribute": "individualCount" + }, + "within-plot-belt-transect.survey.target_species.lut": { + "dataType": "species" + }, + "within-plot-belt-transect.survey.target_species.other_species.other_species": { + "dataType": "species" + } + }, + "viewModel": { + "within-plot-belt-transect.quadrat.sign_observed.attributable_fauna_species.lut": { + "type": "speciesSelect" + }, + "within-plot-belt-transect.survey.target_species.lut": { + "type": "speciesSelect" + }, + "within-plot-belt-transect.survey.target_species.other_species.other_species": { + "type": "speciesSelect" + } + } + } }, "2cd7b489-b582-41f6-9dcc-264f6ea7801a": { "name": "Sign-based Fauna Surveys - Off-plot Belt Transect", "usesPlotLayout": false, "tags": ["survey"], - "apiEndpoint": "off-plot-belt-transect-surveys" + "apiEndpoint": "off-plot-belt-transect-surveys", + "overrides": { + "dataModel": { + "within-plot-belt-transect.quadrat.sign_observed.attributable_fauna_species.lut": { + "dataType": "species" + }, + "within-plot-belt-transect.quadrat.sign_observed.count": { + "dwcAttribute": "individualCount" + } + }, + "viewModel": { + "within-plot-belt-transect.quadrat.sign_observed.attributable_fauna_species.lut": { + "type": "speciesSelect" + } + } + } }, "0c5d1d14-c71b-467f-aced-abe1c83c15d3": { "name": "Sign-based Fauna - Vehicle Track", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "sign-based-vehicle-track-set-ups" + "apiEndpoint": "sign-based-vehicle-track-set-ups", + "overrides": { + "dataModel": { + "sign-based-vehicle-track-observation.observations.number_of_individuals": { + "dwcAttribute": "individualCount" + }, + "sign-based-vehicle-track-observation.survey.route_taken": { + "dataType": "feature" + }, + "sign-based-vehicle-track-observation.points": { + "dataType": "feature" + } + }, + "viewModel":{ + "sign-based-vehicle-track-observation.survey.route_taken": { + "type": "feature" + }, + "sign-based-vehicle-track-observation.points": { + "type": "feature" + } + } + } }, "a76dac21-94f4-4851-af91-31f6dd00750f": { "name": "Fauna Ground Counts Transects", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "fauna-ground-counts-surveys" + "apiEndpoint": "fauna-ground-counts-surveys", + "overrides": { + "dataModel": { + "fauna-ground-counts-observation.observation.count": { + "dwcAttribute": "individualCount" + }, + "fauna-ground-counts-observation.observation.pest_species": { + "dataType": "species" + }, + "fauna-ground-counts-observation.target_species.lut": { + "dataType": "species" + }, + "fauna-ground-counts-observation.target_species.other_species.other_species": { + "dataType": "species" + } + }, + "viewModel": { + "fauna-ground-counts-observation.observation.pest_species": { + "type": "speciesSelect" + }, + "fauna-ground-counts-observation.target_species.lut": { + "type": "speciesSelect" + }, + "fauna-ground-counts-observation.target_species.other_species.other_species": { + "type": "speciesSelect" + } + } + } }, "80360ceb-bd6d-4ed4-b2ea-9bd45d101d0e": { "name": "Pest Fauna - Control Activities", @@ -372,13 +777,109 @@ var protocols = { "name": "Herbivory and Physical Damage - Active Plot Search", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "herbivory-and-physical-damage-active-search-setups" + "apiEndpoint": "herbivory-and-physical-damage-active-search-setups", + "overrides": { + "dataModel": { + "herbivory-and-physical-damage-active-search-transect.active_search_setup.target_species.lut": { + "dataType": "species" + }, + "herbivory-and-physical-damage-active-search-transect.active_search_setup.target_species.other_species.other_species": { + "dataType": "species" + }, + "herbivory-and-physical-damage-active-search-transect.track_log": { + "dataType": "feature" + }, + "herbivory-and-physical-damage-active-search-transect.hapd_observed.physical_damage_attributable_fauna_species.lut": { + "dataType": "species" + }, + "herbivory-and-physical-damage-active-search-transect.hapd_observed.physical_damage_attributable_fauna_species.other_species.other_species": { + "dataType": "species" + }, + "herbivory-and-physical-damage-active-search-transect.hapd_observed.herbivory_attributable_fauna_species.lut": { + "dataType": "species" + }, + "herbivory-and-physical-damage-active-search-transect.hapd_observed.herbivory_attributable_fauna_species.other_species.other_species": { + "dataType": "species" + } + }, + "viewModel": { + "herbivory-and-physical-damage-active-search-transect.active_search_setup.target_species.lut": { + "type": "speciesSelect" + }, + "herbivory-and-physical-damage-active-search-transect.active_search_setup.target_species.other_species.other_species": { + "type": "speciesSelect" + }, + "herbivory-and-physical-damage-active-search-transect.track_log": { + "type": "feature" + }, + "herbivory-and-physical-damage-active-search-transect.hapd_observed.physical_damage_attributable_fauna_species.lut": { + "type": "speciesSelect" + }, + "herbivory-and-physical-damage-active-search-transect.hapd_observed.physical_damage_attributable_fauna_species.other_species.other_species": { + "type": "speciesSelect" + }, + "herbivory-and-physical-damage-active-search-transect.hapd_observed.herbivory_attributable_fauna_species.lut": { + "type": "speciesSelect" + }, + "herbivory-and-physical-damage-active-search-transect.hapd_observed.herbivory_attributable_fauna_species.other_species.other_species": { + "type": "speciesSelect" + } + } + } }, "cc826a19-a1e7-4dfe-8d6e-f135d258d7f9": { "name": "Sign-based Fauna - Plot Sign Search", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "sign-based-active-plot-search-surveys" + "apiEndpoint": "sign-based-active-plot-search-surveys", + "overrides": { + "dataModel": { + "sign-based-active-plot-search.active_search_survey.target_species.lut": { + "dataType": "species" + }, + "sign-based-active-plot-search.active_search_survey.target_species.other_species.other_species": { + "dataType": "species" + }, + "sign-based-active-plot-search.track_log": { + "dataType": "feature" + }, + "sign-based-active-plot-search.sign.attributable_fauna_species.lut": { + "dataType": "species" + }, + "sign-based-active-plot-search.sign.attributable_fauna_species.count": { + "dwcAttribute": "individualCount" + }, + "sign-based-nearby-track-plot.track_log": { + "dataType": "feature" + }, + "sign-based-nearby-track-plot.sign.attributable_fauna_species.lut": { + "dataType": "species" + }, + "sign-based-nearby-track-plot.sign.count": { + "dwcAttribute": "individualCount" + } + }, + "viewModel": { + "sign-based-active-plot-search.active_search_survey.target_species.lut": { + "type": "speciesSelect" + }, + "sign-based-active-plot-search.active_search_survey.target_species.other_species.other_species": { + "type": "speciesSelect" + }, + "sign-based-active-plot-search.sign.attributable_fauna_species.lut": { + "type": "speciesSelect" + }, + "sign-based-nearby-track-plot.sign.attributable_fauna_species.lut": { + "type": "speciesSelect" + }, + "sign-based-nearby-track-plot.track_log": { + "type": "feature" + }, + "sign-based-active-plot-search.track_log": { + "type": "feature" + } + } + } }, "685b5e9b-20c2-4688-9b04-b6caaf084aad": { "name": "Sign-based Fauna - Track Station", @@ -397,7 +898,28 @@ var protocols = { "name": "Fauna Ground Counts Vantage Point", "usesPlotLayout": true, "tags": ["survey"], - "apiEndpoint": "ground-counts-vantage-point-surveys" + "apiEndpoint": "ground-counts-vantage-point-surveys", + "overrides": { + "dataModel": { + "ground-counts-vantage-point-setup.target_species.lut": { + "dataType": "species" + }, + "ground-counts-vantage-point-setup.target_species.other_species.other_species": { + "dataType": "species" + }, + "ground-counts-vantage-point-setup.observations.count_of_individuals": { + "dwcAttribute": "individualCount" + } + }, + "viewModel": { + "ground-counts-vantage-point-setup.target_species.lut": { + "type": "speciesSelect" + }, + "ground-counts-vantage-point-setup.target_species.other_species.other_species": { + "type": "speciesSelect" + } + } + } }, "06cd903e-b8b3-40a5-add4-f779739cce35": { "name": "Herbivory and Physical Damage - Within-plot Belt Transect", @@ -419,14 +941,81 @@ var protocols = { "dataType": "species" } }, - "viewModel": null + "viewModel": { + "herbivory-and-physical-damage-belt-transect-setup.target_species.lut": { + "type": "speciesSelect" + }, + "herbivory-and-physical-damage-belt-transect-setup.target_species.other_species.other_species": { + "type": "speciesSelect" + }, + "herbivory-and-physical-damage-transect.quadrat.quadrat_observation.herbivory_attributable_fauna_species.lut": { + "type": "speciesSelect" + }, + "herbivory-and-physical-damage-transect.quadrat.quadrat_observation.physical_damage_attributable_fauna_species.lut":{ + "type": "speciesSelect" + } + } } }, "49d02f5d-b148-4b5b-ad6a-90e48c81b294": { "name": "Herbivory and Physical Damage - Off-plot Transect", "usesPlotLayout": false, "tags": ["survey"], - "apiEndpoint": "herbivory-off-plot-belt-transect-setups" + "apiEndpoint": "herbivory-off-plot-belt-transect-setups", + "overrides": { + "dataModel": { + "herbivory-off-plot-belt-transect-setup.target_species.lut": { + "dataType": "species" + }, + "herbivory-off-plot-belt-transect-setup.target_species.other_species.other_species": { + "dataType": "species" + }, + "herbivory-off-plot-transect.quadrat.quadrat_observation.physical_damage_attributable_fauna_species.lut": { + "dataType": "species" + }, + "herbivory-off-plot-transect.quadrat.quadrat_observation.physical_damage_attributable_fauna_species.other_species.other_species":{ + "dataType": "species" + }, + "herbivory-off-plot-transect.quadrat.quadrat_observation.herbivory_attributable_fauna_species.lut": { + "dataType": "species" + }, + "herbivory-off-plot-transect.quadrat.quadrat_observation.herbivory_attributable_fauna_species.other_species.other_species":{ + "dataType": "species" + }, + "herbivory-off-plot-transect.off_plot_setup.target_species.lut": { + "dataType": "species" + }, + "herbivory-off-plot-transect.off_plot_setup.target_species.other_species.other_species":{ + "dataType": "species" + } + }, + "viewModel": { + "herbivory-off-plot-belt-transect-setup.target_species.lut": { + "type": "speciesSelect" + }, + "herbivory-off-plot-belt-transect-setup.target_species.other_species.other_species": { + "type": "speciesSelect" + }, + "herbivory-off-plot-transect.quadrat.quadrat_observation.physical_damage_attributable_fauna_species.lut": { + "type": "speciesSelect" + }, + "herbivory-off-plot-transect.quadrat.quadrat_observation.physical_damage_attributable_fauna_species.other_species.other_species": { + "type": "speciesSelect" + }, + "herbivory-off-plot-transect.quadrat.quadrat_observation.herbivory_attributable_fauna_species.lut": { + "type": "speciesSelect" + }, + "herbivory-off-plot-transect.quadrat.quadrat_observation.herbivory_attributable_fauna_species.other_species.other_species": { + "type": "speciesSelect" + }, + "herbivory-off-plot-transect.off_plot_setup.target_species.lut": { + "type": "speciesSelect" + }, + "herbivory-off-plot-transect.target_species.other_species.other_species": { + "type": "speciesSelect" + } + } + } } }; From fc4d6a2ddaca91d6f09f40917f24afa0500b996f Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 15 Apr 2024 16:36:27 +1000 Subject: [PATCH 60/95] Added debug logging #3142 --- .../controllers/au/org/ala/merit/ProjectController.groovy | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index c42e52da5..310bc6d89 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -1187,6 +1187,8 @@ class ProjectController { List financialYearData = result?.resp?.find{it.group == year}?.results ?: [] + println financialYearData + Map reportData = scoreIds.collectEntries { String scoreId -> Map scoreResult = financialYearData.find{it.scoreId == scoreId} def data = scoreResult?.result @@ -1197,10 +1199,14 @@ class ProjectController { } } else if (data?.groups) { + println "Data before" + println data data = data.groups data.each { Map group -> group.result = group.results?[0]?.result } + println "Data after" + println data } [(scoreId): data] From a4c41ab5ca3a365608b766659b179b09ff8514f8 Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 15 Apr 2024 17:36:11 +1000 Subject: [PATCH 61/95] Added debug logging #3142 --- .../au/org/ala/merit/ProjectController.groovy | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index 310bc6d89..95612246a 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -1192,6 +1192,7 @@ class ProjectController { Map reportData = scoreIds.collectEntries { String scoreId -> Map scoreResult = financialYearData.find{it.scoreId == scoreId} def data = scoreResult?.result + log.warn(data.toString()) if (data?.result) { data = data.result if (data instanceof List) { @@ -1199,14 +1200,14 @@ class ProjectController { } } else if (data?.groups) { - println "Data before" - println data + log.warn( "Data before") + log.warn(data.toString()) data = data.groups data.each { Map group -> group.result = group.results?[0]?.result } - println "Data after" - println data + log.warn "Data after" + log.warn data.toString() } [(scoreId): data] From 7ad4a292f28d33c2d0790e3b4bea3459c7c2379a Mon Sep 17 00:00:00 2001 From: chrisala Date: Mon, 15 Apr 2024 19:15:00 +1000 Subject: [PATCH 62/95] Removed debug logging #3142 --- gradle.properties | 2 +- .../controllers/au/org/ala/merit/ProjectController.groovy | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/gradle.properties b/gradle.properties index 2ce2f2e5b..7781a9e4f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -meritVersion=3.2-SPECIES-SNAPSHOT +meritVersion=3.2-SNAPSHOT grailsVersion=5.3.5 grailsGradlePluginVersion=5.3.0 groovyVersion=3.0.11 diff --git a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy index 95612246a..ef2c75a7f 100644 --- a/grails-app/controllers/au/org/ala/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/merit/ProjectController.groovy @@ -1192,7 +1192,7 @@ class ProjectController { Map reportData = scoreIds.collectEntries { String scoreId -> Map scoreResult = financialYearData.find{it.scoreId == scoreId} def data = scoreResult?.result - log.warn(data.toString()) + if (data?.result) { data = data.result if (data instanceof List) { @@ -1200,14 +1200,10 @@ class ProjectController { } } else if (data?.groups) { - log.warn( "Data before") - log.warn(data.toString()) data = data.groups data.each { Map group -> group.result = group.results?[0]?.result } - log.warn "Data after" - log.warn data.toString() } [(scoreId): data] From 881e469470e0832619c7159bb3165d5d06c1b256 Mon Sep 17 00:00:00 2001 From: chrisala Date: Tue, 16 Apr 2024 10:19:45 +1000 Subject: [PATCH 63/95] Fixed a couple of issues #3142 --- forms/nht/safAnnualReport.json | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/forms/nht/safAnnualReport.json b/forms/nht/safAnnualReport.json index 94be168ab..d0bb92999 100644 --- a/forms/nht/safAnnualReport.json +++ b/forms/nht/safAnnualReport.json @@ -49,17 +49,10 @@ "dataType": "number", "name": "numberOfEngagements" }, - { - "dataType": "number", - "name": "numberOfParticipants", - "decimalPlaces": 0, - "computed": { - "expression": "sum(engagementDetails, \"engagementNoParticipants\")" - } - }, { "name": "engagementDetails", "dataType": "list", + "allowRowDelete": false, "columns": [ { "dataType": "stringList", @@ -93,9 +86,18 @@ "name": "activityDateTo" } ] + }, + { + "dataType": "number", + "name": "numberOfParticipants", + "decimalPlaces": 0, + "computed": { + "expression": "sum(engagementDetails, \"engagementNoParticipants\")" + } } ] }, + { "name": "projectPlans", "dataType": "list", @@ -261,13 +263,6 @@ "userAddedRows": false, "disableTableUpload": true, "columns": [ - { - "source": "engagementType", - "type": "selectOne", - "width": "20%", - "title": "Type", - "readonly": true - }, { "source": "engagementTitle", "type": "text", @@ -278,7 +273,7 @@ { "type": "textarea", "source": "engagementPurpose", - "width": "25%", + "width": "45%", "title": "Purpose", "rows": 4, "readonly": true From 5280153746604cc76bd6762f6b210e6095574ccd Mon Sep 17 00:00:00 2001 From: temi Date: Tue, 16 Apr 2024 11:07:22 +1000 Subject: [PATCH 64/95] #3049 - updated dataset option for addition --- grails-app/views/dataSet/_editDataSet.gsp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/grails-app/views/dataSet/_editDataSet.gsp b/grails-app/views/dataSet/_editDataSet.gsp index 502d8a5fa..6570df479 100644 --- a/grails-app/views/dataSet/_editDataSet.gsp +++ b/grails-app/views/dataSet/_editDataSet.gsp @@ -229,8 +229,10 @@
    From 0e91f7f5eb3623beda95ec1ed524661621e91cf2 Mon Sep 17 00:00:00 2001 From: temi Date: Tue, 16 Apr 2024 11:40:43 +1000 Subject: [PATCH 65/95] #3049 - fixed broken test --- .../groovy/au/org/ala/fieldcapture/DatasetSpec.groovy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/integration-test/groovy/au/org/ala/fieldcapture/DatasetSpec.groovy b/src/integration-test/groovy/au/org/ala/fieldcapture/DatasetSpec.groovy index 8e53ea1e0..dc25a2df2 100644 --- a/src/integration-test/groovy/au/org/ala/fieldcapture/DatasetSpec.groovy +++ b/src/integration-test/groovy/au/org/ala/fieldcapture/DatasetSpec.groovy @@ -49,7 +49,7 @@ class DatasetSpec extends StubbedCasSpec{ dataSet.location = "Location" dataSet.startDate ="21-01-2021" dataSet.endDate ="21-01-2022" - dataSet.addition = "Yes" + dataSet.addition = "Previous project" dataSet.threatenedSpeciesIndex = "Yes" dataSet.publicationUrl = "url" dataSet.format = "JSON" @@ -105,7 +105,7 @@ class DatasetSpec extends StubbedCasSpec{ set.location == "Location" set.startDate =="21-01-2021" set.endDate =="21-01-2022" - set.addition == "Yes" + set.addition == "Previous project" set.threatenedSpeciesIndex == "Yes" set.format == "JSON" set.sensitivities ==["Commercially sensitive", "Ecologically sensitive"] @@ -192,7 +192,7 @@ class DatasetSpec extends StubbedCasSpec{ set.location = "Location" set.startDate ="21-01-2021" set.endDate ="21-01-2022" - set.addition = "Yes" + set.addition = "Previous project" set.threatenedSpeciesIndex = "Yes" set.format = "JSON" set.sensitivities =["Commercially sensitive", "Ecologically sensitive"] From 628ef9ea286aa4e2a7cac1d4e93306b133f13567 Mon Sep 17 00:00:00 2001 From: sal153 Date: Tue, 16 Apr 2024 11:44:16 +1000 Subject: [PATCH 66/95] commit program script updates #3141 --- ...limateSmartAgricultureProgramSubProgram.js | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js b/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js index 42b19f4c6..bbd484941 100644 --- a/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js +++ b/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js @@ -590,38 +590,36 @@ var outcomes = [ { "priorities": [ { - "category": "Climate change adaptation" + "category": "Reduce emissions and build resilience" } ], "targeted": true, - "shortDescription": "Climate change adaptation", + "shortDescription": "Reduce emissions and build resilience", "category": "Threatened Species", "outcome": "1. The agriculture sector is adopting practices to reduce emissions and build resilience to climate change" }, { "priorities": [ { - "category": "Carbon and biodiversity market information" + "category": "Harness carbon and biodiversity incentives" } ], "targeted": true, - "shortDescription": "Carbon and biodiversity market information", + "shortDescription": "Harness carbon and biodiversity incentives", "category": "Threatened Species", "outcome": "2. The agriculture sector is supported to harness carbon and biodiversity incentives and implement industry sustainability frameworks" }, { "priorities": [ { - "category": "Native vegetation and biodiversity on-farm" + "category": "Drive agricultural growth" } ], "targeted": true, - "shortDescription": "Native vegetation and biodiversity on-farm", + "shortDescription": "Drive agricultural growth", "category": "Threatened Species", "outcome": "3. Farmers are supported to drive agricultural growth, while adopting sustainable natural resource management practices that protect and conserve natural capital and biodiversity" }, - - { "category": "Threatened Species", "type": "medium", @@ -656,31 +654,43 @@ var outcomes = [ var priorities = [ { - "category": "Climate change adaptation", + "category": "Reduce emissions and build resilience", + "priority": "Climate change adaptation" + }, + { + "category": "Reduce emissions and build resilience", "priority": "On-farm emissions reduction practices" }, { - "category": "Carbon and biodiversity market information", + "category": "Harness carbon and biodiversity incentives", + "priority": "Carbon and biodiversity market information" + }, + { + "category": "Harness carbon and biodiversity incentives", "priority": "Sustainability framework engagement" }, { - "category": "Carbon and biodiversity market information", + "category": "Harness carbon and biodiversity incentives", "priority": "Market access and traceability" }, { - "category": "Native vegetation and biodiversity on-farm", + "category": "Drive agricultural growth", + "priority": "Native vegetation and biodiversity on-farm" + }, + { + "category": "Drive agricultural growth", "priority": "Soil carbon" }, { - "category": "Native vegetation and biodiversity on-farm", + "category": "Drive agricultural growth", "priority": "Soil erosion" }, { - "category": "Native vegetation and biodiversity on-farm", + "category": "Drive agricultural growth", "priority": "Soil acidification" }, { - "category": "Native vegetation and biodiversity on-farm", + "category": "Drive agricultural growth", "priority": "Sustainable agriculture practices" } ]; From a0095c7bfd70a280d9ef41061610490e5743939c Mon Sep 17 00:00:00 2001 From: sal153 Date: Tue, 16 Apr 2024 11:45:42 +1000 Subject: [PATCH 67/95] commit program script #3148 --- .../releases/3.2/adhoc/createBushBlitzSubProgram.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/scripts/releases/3.2/adhoc/createBushBlitzSubProgram.js b/src/main/scripts/releases/3.2/adhoc/createBushBlitzSubProgram.js index 4d7590c17..7dfd87829 100644 --- a/src/main/scripts/releases/3.2/adhoc/createBushBlitzSubProgram.js +++ b/src/main/scripts/releases/3.2/adhoc/createBushBlitzSubProgram.js @@ -5,6 +5,9 @@ load('../../../utils/program.js'); var config = { "meriPlanContents": [ + { + "template": "indigenousInvolvement" + }, { "template": "programOutcome", "model": { @@ -42,6 +45,14 @@ var config = "placeholder": "Please provide a short description of this project. This project description will be visible on the project overview page in MERIT [Free text; limit response to 1000 characters (approx. 150 words)]" } }, + { + "template": "projectMethodology", + "model": { + "maxSize": "4000", + "tableHeading": "Project delivery assumptions (4000 character limit [approx. 650 words])", + "helpText": "Include all those conditions or factors that are sufficient to guarantee the success of the project, for example, on ground activities were not impacted by adverse weather conditions. Ensure what’s documented here aligns to those assumptions documented within the Project Logic." + } + }, { "template": "projectPartnerships", "model": { @@ -171,7 +182,6 @@ var config = "reportDescriptionFormat": "Progress Report %1d", "reportNameFormat": "Progress Report %1d", "reportingPeriodInMonths": 6, - "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", "minimumReportDurationInDays": 3, "label": "Semester", "category": "Progress Reports", From 2d6c9f35ec783229e957e0b432716eefa511a76d Mon Sep 17 00:00:00 2001 From: sal153 Date: Tue, 16 Apr 2024 11:47:32 +1000 Subject: [PATCH 68/95] commit progress report progress #3149 --- forms/nht/bushBlitzProgressReport.json | 40 ++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/forms/nht/bushBlitzProgressReport.json b/forms/nht/bushBlitzProgressReport.json index 17e700666..58236bef3 100644 --- a/forms/nht/bushBlitzProgressReport.json +++ b/forms/nht/bushBlitzProgressReport.json @@ -153,11 +153,51 @@ "No" ], "validate": "required" + }, + { + "name": "yesProjectContactDetailsChanged", + "dataType": "text", + "behaviour": [ + { + "condition": "projectContactDetailsChanged == \"Yes\"", + "type": "visible" + } + ] } ], "modelName": "Progress Report", "title": "Overview of Project Progress", "viewModel": [ + { + "items": [ + { + "source": "

    Organisation and Contact Details

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "projectContactDetailsChanged", + "preLabel": "Has there been a change to key project contacts or their details?", + "type": "selectOne", + "helpText": "(e.g. Name, position, role, email, telephone or address of key contacts)" + } + ], + "type": "row" + }, + { + "type": "row", + "items": [ + { + "type": "", + "source": "yesProjectContactDetailsChanged", + "preLabel": "If yes, please provide updated details to the department." + } + ] + }, { "items": [ { From 7487a859c7f34b2c590277ff10ed05d50264ce7f Mon Sep 17 00:00:00 2001 From: sal153 Date: Tue, 16 Apr 2024 21:22:48 +1000 Subject: [PATCH 69/95] commit program script #3156 --- ...teFirstNationsDeliveryPartnerSubProgram.js | 1634 +++++++++++++++++ 1 file changed, 1634 insertions(+) create mode 100644 src/main/scripts/releases/3.2/adhoc/createFirstNationsDeliveryPartnerSubProgram.js diff --git a/src/main/scripts/releases/3.2/adhoc/createFirstNationsDeliveryPartnerSubProgram.js b/src/main/scripts/releases/3.2/adhoc/createFirstNationsDeliveryPartnerSubProgram.js new file mode 100644 index 000000000..280d874c5 --- /dev/null +++ b/src/main/scripts/releases/3.2/adhoc/createFirstNationsDeliveryPartnerSubProgram.js @@ -0,0 +1,1634 @@ +load('../../../utils/uuid.js'); +load('../../../utils/audit.js'); +load('../../../utils/program.js'); +var userId = ''; + +const serviceFormName = "NHT Output Report"; +const annualReportFormName = "NHT Annual Report"; +const outcomes1ReportFormName = "NHT Outcomes 1 Report"; +const outcomes2ReportFormName = "NHT Outcomes 2 Report"; + +var config = + { + "meriPlanContents": [ + { + "template": "name", + "model": { + "tableFormatting": true + } + }, + { + "template": "priorityPlace", + "model": { + "priorityPlaceHelpText": "Priority places recognises that some threatened species share the same habitat, and that place-based action can support protection and recovery of more than one species.", + "priorityPlaceLabel": "Does this project directly support a priority place?" + } + }, + { + "template": "indigenousInvolvement" + }, + { + "template": "description", + "model": { + "tableFormatting": true, + "maxSize": "1000", + "placeholder": "Please provide a short description of this project. This project description will be visible on the project overview page in MERIT [Free text; limit response to 1000 characters (approx. 150 words)]" + } + }, + { + "template": "programOutcome", + "model": { + "maximumPriorities": "1000", + "priorityHelpText": "Enter the primary investment priority for the primary outcome, noting only one can be selected." + } + }, + { + "template": "additionalOutcomes", + "model": { + "outcomePriority": "Additional outcome/s", + "helpTextHeading": "If the project is not delivering additional benefits, delete the row using the 'x' in the right-most column.", + "title": "Additional benefits", + "priority": "Additional investment priorities", + "priorityHelpText": "Other investment priorities that will benefit from the project. Delete the row if there are no additional outcomes." + } + }, + { + "template": "outcomeStatements", + "model": { + "outcomeType": "mid", + "helpText": "Projects more than 3 years in duration must set medium-term Project outcomes achievable at project completion. Ensure proposed outcomes are measurable with consideration to the baseline and proposed monitoring regime", + "minimumNumberOfOutcomes": 0, + "subtitle": "Medium-term outcome statement/s", + "title": "Project Outcomes", + "extendedOutcomes": true + } + }, + { + "template": "outcomeStatements", + "model": { + "outcomeType": "short", + "helpText": "Outline the degree of impact having undertaken the services for up to three years. Ensure the outcomes are measurable with consideration to the baseline and proposed monitoring regime", + "subtitle": "Short-term outcome statement/s", + "extendedOutcomes": true + } + }, + { + "template": "extendedKeyThreats", + "model": { + "servicesHelpText": "Project Services/Target measures selected in this section will be pre-populated into the Project services and targets and Project service forecasts tables", + "threatHelpText": "Describe the key threats or key threatening processes to the investment priority", + "evidenceHelpText": "List evidence that will be retained to demonstrate delivery of this service. Refer to Evidence Guide and Project Service Summaries for guidance", + "interventionHelpText": "Describe the proposed method to address the threat or threatening process", + "title": "Key threat(s) and/or key threatening processes" + } + }, + { + "template": "projectMethodology", + "model": { + "helpText": "In addition to listing your project assumptions, please list any nominated project services that will not be charged for.\nInclude all those conditions or factors that are sufficient to guarantee the success of the project, for example, on ground activities were not impacted by adverse weather conditions. Ensure what’s documented here aligns to those assumptions documented within the Project Logic.", + "maxSize": "4000", + "tableHeading": "Project delivery assumptions (4000 character limit [approx. 650 words])" + } + }, + { + "template": "projectPartnerships", + "model": { + "helpTextHeading": "Note: Not limited to key subcontractors.", + "helpTextPartnerName": "Insert name of project partner. To be a project partner, they need to be actively involved in the planning or delivery of the project" + } + }, + { + "template": "extendedBaselineMonitoring", + "model": { + "approachHeading": "Monitoring method", + "indicatorHeading": "Monitoring methodology", + "monitoringServiceHelpText": "Select the relevant Project Services(s)/Target measure(s) that will be used to support ongoing monitoring", + "baselineDataDescriptionHelpText": "Describe the project baseline to be established, or the baseline data that currently exists", + "baselineMethodHelpText": "EMSA modules mandatory unless exemption agreed to by the Department. Where an exemption has been provided the user can then select \"Other\"", + "baselineDataHelpText": "Existing baseline data needs to be based on best practice methods and be compatible with the EMSA protocols.", + "approachHelpText": "EMSA modules mandatory unless exemption agreed to by the Department. Where an exemption has been provided the user can then select \"Other\"", + "titleHelpText": "Describe the Project Baseline(s) and ongoing monitoring which will be used to report progress towards this projects outcome(s). Project Services/Target measures selected in this section will be pre-populated into the Project services and targets and Project service forecasts tables", + "evidenceHelpText": "List evidence that will be retained to demonstrate delivery of this service. Refer to Evidence Guide and Project Service Summaries for guidance", + "baselineServiceHelpText": "Select the relevant Project Service(s)/Target measure(s) that will be used to support the development of the baseline", + "newIndicatorText": "New monitoring indicator" + } + }, + { + "template": "projectReview", + "model": { + "title": "Project review, improvement and evaluation methodology and approach (3000 character limit [approximately 500 words])" + } + }, + { + "template": "nationalAndRegionalPlans", + "model": { + "includeUrl": true, + "headingTitle": "Conservation and management plans" + } + }, + { + "template": "serviceOutcomeTargets", + "model": { + "titleHelpText": "Service and Target measure fields pre-populated through the Project Service/Target Measure/s to address threats field and Monitoring methodology sections", + "title": "Project services and targets", + "serviceName": "Service" + } + }, + { + "template": "serviceForecasts", + "model": { + "titleHelpText": "Service and Target measure fields pre-populated through the Project Service/Target Measure/s to address threats field and Monitoring methodology sections" + }, + "excludedModes": [ + "PRINT" + ] + } + ], + "excludes": [], + "programServiceConfig": { + "serviceFormName": "NHT Output Report", + "programServices": [ + { + "serviceTargets": [ + "c3276929-b8a9-4985-a329-49b86f14018c" + ], + "serviceId": 1 + }, + { + "serviceTargets": [ + "69deaaf9-cdc2-439a-b684-4cffdc7f224e" + ], + "serviceId": 2 + }, + { + "serviceTargets": [ + "f9c85612-602e-465c-89e0-e155b34b1f31" + ], + "serviceId": 3 + }, + { + "serviceTargets": [ + "a9d98baa-b2ab-4428-82cf-d96185e63aa6", + "c4ea5ce3-4a70-4df8-aff7-ffa929e7df61", + "dcf917dc-eaf7-49e2-ae7b-abf65edeedae" + ], + "serviceId": 4 + }, + { + "serviceTargets": [ + "55d76c03-c89d-40fe-867b-93f7a48ff9c1", + "3cbf653f-f74c-4066-81d2-e3f78268185c", + "3855d565-3b77-497b-90af-addb271aa598", + "5dbfb32a-5933-4d8a-9937-41f350fb5f75" + ], + "serviceId": 5 + }, + { + "serviceTargets": [ + "22771c0d-8403-433b-b468-e36dc16a1d21", + "675cc878-eb80-435f-a841-d89b657fb2e3", + "dd9f8fd4-b6c7-4f09-bbbf-5d721afc7677", + "6f3cb6ab-5c6a-49be-9af9-9226fa751725" + ], + "serviceId": 7 + }, + { + "serviceTargets": [ + "e0b4cc3e-e94a-4c97-81dc-a4cb868c2cc3", + "b0bcfc54-76fa-4659-accf-276c18b50c31" + ], + "serviceId": 8 + }, + { + "serviceTargets": [ + "9416c9f4-48ca-4bd1-8822-cd45ebb56c58", + "2409e649-2ee2-47fd-9e76-ef2ffa07a5e7", + "d58f8dba-109d-4179-b130-a888cd3d303c", + "01686d38-9165-4497-9648-627ef81945a7" + ], + "serviceId": 9 + }, + { + "serviceTargets": [ + "0e2f8d61-b7b4-4d2d-b07c-4fc20bbe326a", + "bb506258-e907-43d3-99bd-0fe0400f654e" + ], + "serviceId": 10 + }, + { + "serviceTargets": [ + "3c83e639-9c19-4b31-a86f-9d2d5e78123b", + "e901be5e-8336-432e-b164-f278abd7430b" + ], + "serviceId": 12 + }, + { + "serviceTargets": [ + "5557288b-190e-4a3f-a60b-4bdff6ca8fe8", + "902df7a8-92f6-420d-9544-47d4b8cf31ca" + ], + "serviceId": 13 + }, + { + "serviceTargets": [ + "9deb3edf-50c7-4b04-a1fb-d1451eadf641", + "360c8b86-360c-4ca3-b1aa-626be56f2b11" + ], + "serviceId": 14 + }, + { + "serviceTargets": [ + "7c30bc26-829e-4080-8059-27af9285113b", + "158a5544-78e3-4d00-9f1b-62a85a938268" + ], + "serviceId": 15 + }, + { + "serviceTargets": [ + "4aa201ec-2066-40e1-a457-99daa569c8e2", + "f46f096a-a274-426b-adad-702e7cf8fab7", + "3b1403f3-139a-4206-b325-62ebfe05ddc4", + "7cb13c22-3dcd-43e7-808d-e0e26f5c090d" + ], + "serviceId": 16 + }, + { + "serviceTargets": [ + "5c6db4c1-7fde-452e-8735-e52842fe6217", + "41cb1e2c-59bc-4639-8bf7-fe0f528e006e" + ], + "serviceId": 18 + }, + { + "serviceTargets": [ + "4f71e00a-2d80-488d-9ce4-947e60589149", + "69a2ffba-41e9-406e-8ea4-5bdeee92cbde" + ], + "serviceId": 42 + }, + { + "serviceTargets": [ + "26ea592f-ee39-4e6e-b6af-5b53fb1a5675" + ], + "serviceId": 17 + }, + { + "serviceTargets": [ + "3587a984-68f9-4db3-b5af-49f265d853e0", + "9d2d01be-b517-4be2-a225-8b1c887e016e" + ], + "serviceId": 19 + }, + { + "serviceTargets": [ + "d0516817-5acb-46bd-9871-2696c245bad0", + "7fed132d-6a38-448c-b519-381ab9e1e027", + "e08dda14-360c-4b66-b8c5-eb0269c5aa44", + "f3671aa7-773f-447d-9649-ba7f11dbe97a" + ], + "serviceId": 20 + }, + { + "serviceTargets": [ + "5ab2b539-a5b4-40da-a556-a2c18066345b", + "36410625-05f3-42d3-b04f-a3b268498ee1" + ], + "serviceId": 23 + }, + { + "serviceTargets": [ + "0162246b-13fd-40c9-ae26-fb767eee76f8" + ], + "serviceId": 24 + }, + { + "serviceTargets": [ + "b9e710e4-7dd3-4acc-ac2c-c69f4bcb9787", + "00934509-f102-4d39-a043-7547a8ab9ac8", + "1021bec7-3836-4b33-90b4-76701efd4fe3", + "4dad393e-cbf7-43dd-87bb-62ea8f8afcdd", + "7186117e-ac17-4ed9-8c9c-8ee1c3bf473b" + ], + "serviceId": 26 + }, + { + "serviceTargets": [ + "a516c78d-740f-463b-a1ce-5b02b8c82dd3", + "4cbcb2b5-45cd-42dc-96bf-a9a181a4865b", + "fbc45154-1d60-4f5e-a484-fdff514f9d51", + "85191c99-f56d-46e6-9311-a58c1f37965d" + ], + "serviceId": 27 + }, + { + "serviceTargets": [ + "3cfa82aa-0b38-49c0-be37-0fa61b5b6e3c", + "91e90861-3ba7-4257-a765-6cab24c6f58a" + ], + "serviceId": 28 + }, + { + "serviceTargets": [ + "96be68cf-783d-452a-b8fd-3832163f95db", + "e70c70fd-4f31-41dc-a4b4-07f79efc3055" + ], + "serviceId": 29 + }, + { + "serviceTargets": [ + "598bd978-0907-4cad-a7a6-ec5a8a8bbdc4", + "d29bd931-1dd1-47c4-b456-c175099ff1df" + ], + "serviceId": 30 + }, + { + "serviceTargets": [ + "6db1ebd7-92c5-49f2-98b7-2faa700fd752", + "524d93b4-5cd1-4d0d-b1f8-d393028220ad" + ], + "serviceId": 31 + }, + { + "serviceTargets": [ + "8040931a-2e6c-41be-9e92-f1035093b2ac", + "5d652e6e-b719-45bf-8ae6-e9f293c24a92" + ], + "serviceId": 32 + }, + { + "serviceTargets": [ + "f74182bd-7a53-4157-aeb9-eda281bb0234", + "e7b7bb1e-66c2-4140-90f9-9534aa46ffa3" + ], + "serviceId": 33 + }, + { + "serviceTargets": [ + "15615a70-ee60-46b8-b5e9-b33d4d88de6b", + "d8dc153b-da23-4f7b-947a-89bc98338d6d", + "5f762c6d-4f42-4458-9855-03c6896959c1", + "5885f105-fc7d-43fd-8c26-c72938a95b76" + ], + "serviceId": 34 + }, + { + "serviceTargets": [ + "dea1ff8b-f4eb-4987-8073-500bbbf97fcd", + "fba17df1-d5cb-4643-987f-0626055b3c78" + ], + "serviceId": 35 + }, + { + "serviceTargets": [ + "3ec07754-4a7a-46fb-a76d-553921781716", + "fbc2dab8-7454-40f9-94f6-6bf258fcefff", + "7186e284-0cb2-418e-a8cc-4343eb618140", + "c7d0963e-2847-4f5f-8a1c-e149dfa4c9d1" + ], + "serviceId": 36 + }, + { + "serviceTargets": [ + "3d06b150-bb86-47dc-8ad8-c33a51c3e3b3" + ], + "serviceId": 43 + }, + { + "serviceTargets": [ + "b8304577-afd8-45e0-8ef4-b71ae10998f5" + ], + "serviceId": 44 + } + ] + }, + "visibility": "public", + "declarationPageType": "rdpReportDeclaration", + "requiresActivityLocking": true, + "supportsMeriPlanComparison": true, + "projectTemplate": "rlp", + "activityPeriodDescriptor": "Outputs report #", + "requireMeritAdminToReturnMeriPlan": true, + "emailTemplates": { + "reportSubmittedEmailTemplate": "RLP_REPORT_SUBMITTED_EMAIL_TEMPLATE", + "reportReturnedEmailTemplate": "RLP_REPORT_RETURNED_EMAIL_TEMPLATE", + "planApprovedEmailTemplate": "RLP_PLAN_APPROVED_EMAIL_TEMPLATE", + "planReturnedEmailTemplate": "RLP_PLAN_RETURNED_EMAIL_TEMPLATE", + "reportApprovedEmailTemplate": "RLP_REPORT_APPROVED_EMAIL_TEMPLATE", + "planSubmittedEmailTemplate": "RLP_PLAN_SUBMITTED_EMAIL_TEMPLATE" + }, + "meriPlanTemplate": "configurableMeriPlan", + "riskAndThreatTypes": [ + "Performance", + "People resources", + "Financial", + "External stakeholders", + "Natural Environment" + ], + "projectReports": [ + { + "reportType": "Activity", + "reportDescriptionFormat": "Year %5$s - %6$s %7$d Outputs Report", + "reportNameFormat": "Year %5$s - %6$s %7$d Outputs Report", + "reportingPeriodInMonths": 3, + "description": "", + "minimumReportDurationInDays": 1, + "label": "Quarter", + "reportsAlignedToCalendar": true, + "category": "Outputs Reporting", + "activityType": "NHT Output Report", + "canSubmitDuringReportingPeriod": true + }, + { + "firstReportingPeriodEnd": "2025-06-30T14:00:00Z", + "reportType": "Administrative", + "reportDescriptionFormat": "Annual Progress Report %2$tY - %3$tY for %4$s", + "reportNameFormat": "Annual Progress Report %2$tY - %3$tY", + "reportingPeriodInMonths": 12, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "minimumReportDurationInDays": 1, + "label": "Annual", + "category": "Annual Progress Reporting", + "activityType": "NHT Annual Report" + }, + { + "reportDescriptionFormat": "Outcomes Report 1 for %4$s", + "reportingPeriodInMonths": 36, + "multiple": false, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "maximumOwnerDurationInMonths": 35, + "label": "Outcomes Report 1", + "alignToOwnerStart": true, + "reportType": "Single", + "minimumOwnerDurationInMonths": null, + "reportNameFormat": "Outcomes Report 1", + "alignToOwnerEnd": true, + "category": "Outcomes Report 1", + "reportsAlignedToCalendar": false, + "activityType": "NHT Outcomes 1 Report" + }, + { + "reportType": "Single", + "reportDescriptionFormat": "Outcomes Report 1 for %4$s", + "minimumOwnerDurationInMonths": 36, + "reportNameFormat": "Outcomes Report 1", + "reportingPeriodInMonths": 24, + "multiple": false, + "maximumOwnerDurationInMonths": 47, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "label": "Outcomes Report 1", + "category": "Outcomes Report 1", + "activityType": "NHT Outcomes 1 Report" + }, + { + "reportType": "Single", + "reportDescriptionFormat": "Outcomes Report 1 for %4$s", + "minimumOwnerDurationInMonths": 48, + "reportNameFormat": "Outcomes Report 1", + "reportingPeriodInMonths": 36, + "multiple": false, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "calendarAlignmentMonth": 7, + "label": "Outcomes Report 1", + "category": "Outcomes Report", + "reportsAlignedToCalendar": true, + "activityType": "NHT Outcomes 1 Report" + }, + { + "reportType": "Single", + "reportDescriptionFormat": "Outcomes Report 2 for %4$s", + "minimumOwnerDurationInMonths": 36, + "reportNameFormat": "Outcomes Report 2", + "multiple": false, + "alignToOwnerEnd": true, + "description": "This report is still being developed. _Please do not commence reporting until the new report is ready for use._", + "label": "Outcomes Report 2", + "category": "Outcomes Report 2", + "activityType": "NHT Outcomes 2 Report", + "alignToOwnerStart": true + } + ], + "keyThreatCodes": [ + "Climate Change - Changed flooding regime", + "Climate Change - Changed rainfall patterns", + "Climate Change - Sea level rises", + "Climate Change - Unexpected seasonal/temperature extremes", + "Disconnection from Country - Altered/disrupted connection with land and sea country", + "Disconnection from Country - Altered or disrupted First Nations engagement/leadership in caring for land and sea country", + "Disconnection from Country - Altered or disrupted transfer of First Nations knowledge systems", + "Disconnection from Country - Inadequate recognition of Traditional knowledge and practices", + "Disengagement of community - Community are not informed and are not engaged in managing the environment", + "Disease/pathogens - Areas that are infected", + "Disease/pathogens - Possible infection of disease free areas", + "Fire - Inappropriate fire regime", + "Fire - Lack of protection for ecological assets during fire control activities", + "Genetics - Bottleneck/inbreeding", + "Habitat loss - Breeding place disturbance", + "Habitat loss - Dieback/senescence", + "Habitat loss - Feeding habitat loss/interference", + "Habitat loss - Habitat fragmentation", + "Habitat loss - Land clearing", + "Habitat loss - Loss of critical ecosystem service supporting habitat", + "Human interference - Fish and harvesting aquatic resources (commercial)", + "Human interference - Flow-on effects of housing development", + "Human interference - Illegal activities", + "Human interference - Industrial development", + "Human interference - Land use intensification", + "Human interference - Recreational fishing", + "Human interference - Recreational pressures", + "Human interference - Road/vehicle strike", + "Land management practices - Changes to hydrology and aquatic systems", + "Land management practices - Domestic grazing/stock impacts", + "Land management practices - Excess recharge of groundwater", + "Land management practices - Excess use (or over-use) of surface water or groundwater resources", + "Land management practices - Excessive fertiliser use", + "Land management practices - Inappropriate ground cover management", + "Land management practices - Runoff", + "Native fauna - Competition", + "Native fauna - Predation", + "Pest - Competition/exclusion", + "Pest - Disease transmission", + "Pest - Habitat degradation", + "Pest - Introduction of new pest animals", + "Pest - Predation", + "Pollution - Chemical", + "Pollution - Eutrophication/algal blooms", + "Pollution - Inappropriate waste disposal", + "Pollution - Sediment ", + "Population size/range - Low habitat area", + "Population size/range - Low population numbers", + "Weeds - Competition", + "Weeds - Introduction of new weed", + "Weeds - Spread of weeds from surrounding areas" + ], + "navigationMode": "returnToProject", + "priorityPlaces": [ + "Australian Alps – NSW/ACT/VIC", + "Brigalow Country – QLD", + "Bruny Island – TAS", + "Christmas Island – External Territory", + "Eastern Forests of Far North Queensland – QLD", + "Fitz-Stirlings – WA", + "French Island – VIC", + "Giant Kelp Ecological Community – TAS", + "Greater Blue Mountains – NSW", + "Kakadu & West Arnhem – NT", + "Kangaroo Island – SA", + "MacDonnell Ranges – NT", + "Mallee Birds Ecological Community – VIC/SA/NSW", + "Midlands region of central Tasmanian – TAS", + "Norfolk Island – External Territory", + "Raine Island – Queensland", + "Remnant WA Wheatbelt Woodlands – WA", + "South East Coastal Ranges – NSW/VIC", + "Southern Plains, including the Western Victorian volcanic plain and karst springs – VIC/SA", + "Yampi Sounds and surrounds – WA" + ], + "supportsParatoo": true, + "supportsMeriPlanHistory": true + }; + + +var outcomes = [ + { + "priorities": [ + { + "category": "Threatened Species" + } + ], + "targeted": true, + "shortDescription": "EPBC Species", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Long term): Threatened Species (TS) - The trajectory of species targeted under the Threatened Species Action Plan 2022-2032 and other EPBC Act listed Species is improved" + }, + { + "priorities": [ + { + "category": "Threatened Species" + } + ], + "targeted": true, + "shortDescription": "New extinctions", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Long term): Threatened Species (TS) - New extinctions of plants and animals are prevented" + }, + { + "priorities": [ + { + "category": "Threatened Ecological Communities" + } + ], + "targeted": true, + "shortDescription": "Threatened Ecological Communities", + "category": "Threatened Ecological Communities", + "outcome": "1. Species and Landscapes (Long term): Threatened Ecological Communities (TECs) and priority places - The condition of targeted EPBC Act listed Threatened Ecological Communities and identified priority places under the Threatened Species Action Plan 2022-2032 is improved" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened species - Targeted threatened species (TS) are on track for improved trajectory" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened species - Species at high risk of imminent extinction are identified and supported to persist" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened species - Priority species are being assisted to strengthen reliance and adaptive capacity for climate change" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened species - Increased leadership and/or participation of First Nations people in the management and recovery of threatened species" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened Ecological Communities and priority places - The implementation of priority actions is leading to an improvement in the condition of targeted TECs and priority places" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened Ecological Communities and priority places - Resilience to climate change and extreme events has been increased" + }, + { + "category": "Threatened Species", + "type": "medium", + "outcome": "1. Species and Landscapes (Medium term): Threatened Ecological Communities and priority places - Increased leadership and/or participation of First Nations people in the management and recovery of threatened ecological communities and priority places" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Managing Threats - Pest predator an competitor species have been controlled or are under active, long-term control programs" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Managing Threats - Threats from disease have been contained, reduced or excluded" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Land management practices have improved" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Quality of (TS/TECs) habitat has improved" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Area/Extent of (TS/TECs) habitat has increased" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Increased connectivity between patches" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Improving habitat - Quality of breeding and foraging habitat is improved " + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Creating insurance populations - Existing populations have been protected" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Creating insurance populations - Re-introductions have enhanced wild populations" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): Climate adaption and resilience - Climate change resilience and adaptive capacity actions underway" + }, + { + "type": "short", + "category": "Threatened Species", + "outcome": "1. Species and Landscapes (Short term): First Nations People and community involvement - First Nations people are leading and/or participating in recovery activities" + } +]; + +var priorities = [ + { + "category": "Ramsar", + "priority": "Ginini Flats Wetland Complex" + }, + { + "category": "Threatened Species", + "priority": "Anthochaera phrygia (Regent Honeyeater)" + }, + { + "category": "Threatened Species", + "priority": "Bettongia gaimardi (Tasmanian Bettong, Eastern Bettong)" + }, + { + "category": "Threatened Species", + "priority": "Botaurus poiciloptilus (Australasian Bittern)" + }, + { + "category": "Threatened Species", + "priority": "Lathamus discolor (Swift Parrot)" + }, + { + "category": "Threatened Species", + "priority": "Rutidosis leptorrhynchoides (Button Wrinklewort)" + }, + { + "category": "Threatened Species", + "priority": "Swainsona recta (Small Purple-pea, Mountain Swainson-pea, Small Purple Pea)" + }, + { + "category": "Threatened Ecological Communities", + "priority": "Alpine Sphagnum Bogs and Associated Fens" + }, + { + "category": "Threatened Ecological Communities", + "priority": "Natural Temperate Grassland of the South Eastern Highlands" + }, + { + "category": "Threatened Ecological Communities", + "priority": "White Box-Yellow Box-Blakely's Red Gum Grassy Woodland and Derived Native Grassland" + }, + { + "category": "Soil Quality", + "priority": "Soil acidification" + }, + { + "category": "Soil Quality", + "priority": "Soil Carbon priority" + }, + { + "category": "Soil Quality", + "priority": "Hillslope erosion priority" + }, + { + "category": "Soil Quality", + "priority": "Wind erosion priority" + }, + { + "category": "Land Management", + "priority": "Soil acidification" + }, + { + "category": "Land Management", + "priority": "Soil carbon" + }, + { + "category": "Land Management", + "priority": "Hillslope erosion" + }, + { + "category": "Land Management", + "priority": "Wind erosion" + }, + { + "category": "Land Management", + "priority": "Native vegetation and biodiversity on-farm" + }, + { + "category": "Sustainable Agriculture", + "priority": "Climate change adaptation" + }, + { + "category": "Sustainable Agriculture", + "priority": "Market traceability" + }, + { + "category": "Threatened Species", + "priority": "Dasyurus viverrinus (Eastern Quoll)" + }, + { + "category": "Bushfires", + "priority": "Herbivore and/or predator control" + }, + { + "category": "Bushfires", + "priority": "Weed control and/or revegetation" + }, + { + "category": "Bushfires", + "priority": "Fire management and planning" + }, + { + "category": "Bushfires", + "priority": "Species and ecological community specific interventions" + }, + { + "category": "Bushfires", + "priority": "Traditional Owner led healing of country" + }, + { + "category": "Bushfires", + "priority": "Erosion control" + }, + { + "category": "Bushfires", + "priority": "Refugia management" + }, + { + "category": "Threatened Ecological Community", + "priority": "Alpine Sphagnum Bogs and Associated Fens" + }, + { + "category": "Threatened Ecological Community", + "priority": "Ecological vegetation classes (EVC) dominated by fire sensitive eucalypt species" + }, + { + "category": "Threatened Ecological Community", + "priority": "Ecological vegetation classes dominated by callitris pine" + }, + { + "category": "Threatened Ecological Community", + "priority": "Montane Peatlands and Swamps of the New England Tableland, NSW North Coast, Sydney Basin, South East Corner, South Eastern Highlands and Australian Alps bioregions" + }, + { + "category": "Threatened Ecological Community", + "priority": "Podocarpus heathland" + }, + { + "category": "Threatened Ecological Community", + "priority": "Kosciuszko-Namadgi Alpine Ash Moist Grassy Forest" + }, + { + "category": "Threatened Ecological Community", + "priority": "Jounama Snow Gum Shrub Woodland" + }, + { + "category": "Threatened Ecological Community", + "priority": "Alpine Snow Gum Woodland" + }, + { + "category": "Threatened Ecological Community", + "priority": "Black Sallee Woodland" + }, + { + "category": "Threatened Ecological Community", + "priority": "White Box-Yellow Box-Blakely's Red Gum Grassy Woodland and Derived Native Grassland" + }, + { + "category": "Threatened Ecological Community", + "priority": "Natural Temperate Grassland of the South Eastern Highlands" + }, + { + "category": "Threatened Ecological Community", + "priority": "Alpine Teatree shrubland" + }, + { + "category": "Threatened Ecological Community", + "priority": "Kosciuszko Flanks Moist Gully Forest" + }, + { + "category": "Threatened Ecological Community", + "priority": "Kosciuszko Snow Gum-Mountain Gum Moist Forest" + }, + { + "category": "Threatened Ecological Community", + "priority": "Kosciuszko Western Flanks Moist Shrub Forest" + }, + { + "category": "Threatened Ecological Community", + "priority": "Kosciuszko Eastern Slopes Mountain Gum Forest" + }, + { + "category": "Threatened Ecological Community", + "priority": "Namadgi Subalpine Rocky Shrubland" + }, + { + "category": "Threatened Ecological Community", + "priority": "Kybeyan Montane Heath" + }, + { + "category": "Threatened Ecological Community", + "priority": "Eucalyptus niphophila woodlands (Alpine Snow Gum Woodland)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Potorous longipes (Long-footed Potoroo)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Antechinus mimetes (Dusky Antechinus)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Ornithorhynchus anatinus (Platypus)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Phascolarctos cinereus (Koala)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Potorous tridactylus (Long-nosed Potoroo)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Pseudomys novaehollandiae (New Holland Mouse, Pookila)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Petrogale penicillata (Brush-tailed Rock-wallaby)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Pteropus poliocephalus (Grey-headed Flying-fox)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Menura novaehollandiae (Superb Lyrebird)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Callocephalon fimbriatum (Gang-gang Cockatoo)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Pycnoptilus floccosus (Pilotbird)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Cyclodomorphs praealtus (Alpine She-oak Skink)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Litoria spenceri (Spotted Tree Frog)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Pseudophryne corroboree (Southern Corroboree Frog)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Pseudophryne pengilleyi (Northern Corroboree Frog)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Climacteris erythrops (Red-browed Treecreeper)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Anthochaera phrygia (Regent Honeyeater)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Monarcha melanopsis (Black-faced Monarch)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Calyptorhynchs lathami (Glossy Black-Cockatoo (eastern))" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Galaxias rostratus (Flathead Galaxias, Beaked Minnow, Dargo Galaxias)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Pseudemoia cryodroma (Alpine Bog Skink)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Liopholis guthega (Guthega Skink)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Pseudemoia rawlinsoni (Glossy Grass Skink, Swampland Cool-skink)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Eulamprus typmanum (Southern Water-skink)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Petauroides volans (Greater Glider)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Dasyurus maculatus maculatus (Spotted-tailed Quoll)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Dasyornis brachypterus (Eastern Bristlebird)" + }, + { + "category": "Additional Priority Species", + "priority": "Dasyurus maculatus (Spot-tailed Quoll)" + }, + { + "category": "Additional Priority Species", + "priority": "Mastacomys fuscus mordicus (Broad-toothed Rat)" + }, + { + "category": "Additional Priority Species", + "priority": "Miniopterus orianae oceanensis (Eastern Bentwing Bat)" + }, + { + "category": "Additional Priority Species", + "priority": "Petaurus norfolcensis (Squirrel Glider)" + }, + { + "category": "Additional Priority Species", + "priority": "Petauroides volans (Southern Greater Glider)" + }, + { + "category": "Additional Priority Species", + "priority": "Potorous longipes (Long-footed Potoroo)" + }, + { + "category": "Additional Priority Species", + "priority": "Pseudomys fumeus (Smoky Mouse)" + }, + { + "category": "Additional Priority Species", + "priority": "Crinia sloanei (Sloanes Froglet)" + }, + { + "category": "Additional Priority Species", + "priority": "Litoria booroolongensis (Booroolong Tree Frog)" + }, + { + "category": "Additional Priority Species", + "priority": "Litoria verreauxii alpina (Alpine Tree Frog)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Macquaria australasica (Macquarie Perch)" + }, + { + "category": "Additional Priority Species", + "priority": "Galaxias tantangara (Stocky Galaxias)" + }, + { + "category": "Additional Priority Species", + "priority": "Gadopsis bispinosus (Two-spined Blackfish)" + }, + { + "category": "Additional Priority Species", + "priority": "Dasyurus maculatus maculatus (Spotted-tailed Quoll)" + }, + { + "category": "Additional Priority Species", + "priority": "Petaurus australis (Yellow-bellied Glider)" + }, + { + "category": "Priority Vertebrate Animals", + "priority": "Petaurus australis (Yellow-bellied Glider)" + }, + { + "category": "Additional Priority Species", + "priority": "Callocephalon fimbriatum (Gang gang Cockatoo)" + }, + { + "category": "Additional Priority Species", + "priority": "Climacteris picumnus victoriae (Brown Treecreeper)" + }, + { + "category": "Additional Priority Species", + "priority": "Melithreptus gularis (Black-chinned Honeyeater)" + }, + { + "category": "Additional Priority Species", + "priority": "Neophema pulchella (Turquoise Parrot)" + }, + { + "category": "Additional Priority Species", + "priority": "Ninox connivens (Barking Owl)" + }, + { + "category": "Additional Priority Species", + "priority": "Petauroides volans (Greater Glider)" + }, + { + "category": "Additional Priority Species", + "priority": "Ninox strenua (Powerful Owl)" + }, + { + "category": "Additional Priority Species", + "priority": "Stagonopleura guttata (Diamond Firetail)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Xenica Oreixenica lathalis theddora (Alpine Silver)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Hedleyropa yarrangobillyensis (Yarrangobilly Pinwheel Snail)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Buburra jeanae (leaf beetle)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Canthocamptus longipes (harpactacoid copepod)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Euastacus crassus. (Alpine crayfish)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Euastacus diversus (Orbost Spiny Crayfish)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Euastacus rieki (Riek's Crayfish)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Thaumatoperia alpina (Alpine Stonefly)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Castiarina flavoviridis (jewel beetle)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Austrochloritis kosciuszkoensis (Koscuiszko Bristle Snail)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Austrorhytida glaciamans (Koscuiszko Carnivorous Snail)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Diphyoropa illustra (Lakes Entrance Pinwheel Snail)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Oreixenica latialis (Small Alpine Xenica)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Austroaeschna flavomaculata (Alpine Darner)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Paralaoma annabelli (Prickle Pinhead Snail)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Oreixenica orichora (Spotted Alpine Xenica)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Castiarina kershawi (jewel beetle)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Oreixenica correae (Orange Alpine Xenica; Correa Brown)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Aulacopris reichei (Beetle)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Temognatha grandis (jewel beetle)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Leptoperla cacuminis (Mount Kosciusko Wingless Stonefly)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Asteron grayi (Spider, harvestman or pseudoscorpion)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Molycria mammosa (Spider, harvestman or pseudoscorpion -)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Storenosoma terraneum (Spider, harvestman or pseudoscorpion -)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Acanthaeschna victoria (Thylacine Darner)" + }, + { + "category": "Priority Invertebrate Species", + "priority": "Austropetalia patricia (Waterfall Redspot)" + }, + { + "category": "Priority Plants", + "priority": "Grevillea jephcottii (Pine Mountain Grevillea)" + }, + { + "category": "Priority Plants", + "priority": "Grevillea oxyantha subsp. ecarinata " + }, + { + "category": "Priority Plants", + "priority": "Olearia stenophylla " + }, + { + "category": "Priority Plants", + "priority": "Prasophyllum bagoense (Bago Leek-orchid)" + }, + { + "category": "Priority Plants", + "priority": "Eucalyptus forresterae (Brumby Sallee)" + }, + { + "category": "Priority Plants", + "priority": "Pomaderris helianthemifolia " + }, + { + "category": "Priority Plants", + "priority": "Prasophyllum keltonii (Kelton’s Leek-orchid)" + }, + { + "category": "Priority Plants", + "priority": "Pterostylis oreophila (Blue-tongue Greenhood)" + }, + { + "category": "Priority Plants", + "priority": "Gentianella sylvicola " + }, + { + "category": "Priority Plants", + "priority": "Pultenaea vrolandii " + }, + { + "category": "Priority Plants", + "priority": "Zieria citriodora (Lemon-scented Zieria)" + }, + { + "category": "Priority Plants", + "priority": "Tetratheca subaphylla (Leafless Pinkbells)" + }, + { + "category": "Priority Plants", + "priority": "Cardamine tryssa (Dainty Bitter-cress)" + }, + { + "category": "Priority Plants", + "priority": "Prostanthera walteri (Blotchy Mintbush)" + }, + { + "category": "Priority Plants", + "priority": "Galium roddii " + }, + { + "category": "Priority Plants", + "priority": "Dampiera fusca (Kydra Dampiera)" + }, + { + "category": "Priority Plants", + "priority": "Prostanthera stenophylla " + }, + { + "category": "Priority Plants", + "priority": "Philotheca myoporoides subsp. brevipedunculata " + }, + { + "category": "Priority Plants", + "priority": "Callistemon subulatus (Dwarf Bottlebrush)" + }, + { + "category": "Priority Plants", + "priority": "Dillwynia brunioides " + }, + { + "category": "Priority Plants", + "priority": "Eucalyptus fraxinoides (White Mountain Ash, White Ash)" + }, + { + "category": "Priority Plants", + "priority": "Eucalyptus elaeophloia (Nunniong Gum)" + }, + { + "category": "Priority Plants", + "priority": "Grevillea macleayana (Jervis Bay Grevillea)" + }, + { + "category": "Priority Plants", + "priority": "Deyeuxia talariata" + }, + { + "category": "Additional Priority Plants", + "priority": "Acacia blayana (Blay’s Wattle)" + }, + { + "category": "Additional Priority Plants", + "priority": "Acacia covenyi " + }, + { + "category": "Additional Priority Plants", + "priority": "Acacia mabellae " + }, + { + "category": "Additional Priority Plants", + "priority": "Acacia phlebophylla (Mount Buffalo Wattle)" + }, + { + "category": "Additional Priority Plants", + "priority": "Acacia phasmoides (Phantom Wattle)" + }, + { + "category": "Additional Priority Plants", + "priority": "Acacia saliciformis " + }, + { + "category": "Additional Priority Plants", + "priority": "Acacia trachyphloia " + }, + { + "category": "Additional Priority Plants", + "priority": "Almalea capitata (Slender Parrot Pea)" + }, + { + "category": "Additional Priority Plants", + "priority": "Banksia canei (Mountain Banksia)" + }, + { + "category": "Additional Priority Plants", + "priority": "Botrychium lunaria (Moonwort)" + }, + { + "category": "Additional Priority Plants", + "priority": "Caladenia montana (Mountain Spider Orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Calochilus sandrae (Brownish Beard Orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Calochilus saprophyticus (Leafless Beard Orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Cassinia heleniae " + }, + { + "category": "Additional Priority Plants", + "priority": "Cassinia venusta " + }, + { + "category": "Additional Priority Plants", + "priority": "Cassytha phaeolasia " + }, + { + "category": "Additional Priority Plants", + "priority": "Celmisia sp pulchella (A snow daisy)" + }, + { + "category": "Additional Priority Plants", + "priority": "Dampiera fusca (Kydra Dampiera)" + }, + { + "category": "Additional Priority Plants", + "priority": "Daviesia nova-anglica " + }, + { + "category": "Additional Priority Plants", + "priority": "Deyeuxia reflexa " + }, + { + "category": "Additional Priority Plants", + "priority": "Dillwynia palustris " + }, + { + "category": "Additional Priority Plants", + "priority": "Discaria nitida (Leafy Anchor Plant)" + }, + { + "category": "Additional Priority Plants", + "priority": "Diuris ochroma (Pale Golden Moths)" + }, + { + "category": "Additional Priority Plants", + "priority": "Eucalyptus cinerea subsp. triplex " + }, + { + "category": "Additional Priority Plants", + "priority": "Eucalyptus forresterae " + }, + { + "category": "Additional Priority Plants", + "priority": "Euphrasia scabra (Rough Eyebright)" + }, + { + "category": "Additional Priority Plants", + "priority": "Galium roddii " + }, + { + "category": "Additional Priority Plants", + "priority": "Genoplesium vernale (East Lynne Midge Orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Gentiana baeuerlenii (Baeuerlen's Gentian)" + }, + { + "category": "Additional Priority Plants", + "priority": "Gentianella muelleriana subsp. jingerensis (Mueller’s Snow-gentian)" + }, + { + "category": "Additional Priority Plants", + "priority": "Geranium sessiliflorum " + }, + { + "category": "Additional Priority Plants", + "priority": "Goodenia glomerata " + }, + { + "category": "Additional Priority Plants", + "priority": "Grevillea imberbis " + }, + { + "category": "Additional Priority Plants", + "priority": "Grevillea alpivaga (Buffalo Grevillea)" + }, + { + "category": "Additional Priority Plants", + "priority": "Grevillea macleayana " + }, + { + "category": "Additional Priority Plants", + "priority": "Grevillea neurophylla subsp fluviatilis " + }, + { + "category": "Additional Priority Plants", + "priority": "Grevillea neurophylla subsp neurophylla " + }, + { + "category": "Additional Priority Plants", + "priority": "Grevillea oxyantha subsp. ecarinata " + }, + { + "category": "Additional Priority Plants", + "priority": "Grevillea ramosissima subsp hypargyrea (Fan Grevillea)" + }, + { + "category": "Additional Priority Plants", + "priority": "Grevillea victoriae subsp nivalis " + }, + { + "category": "Additional Priority Plants", + "priority": "Grevillea willisii (Omeo Grevillea)" + }, + { + "category": "Additional Priority Plants", + "priority": "Hakea macraeana " + }, + { + "category": "Additional Priority Plants", + "priority": "Leionema lamprophyllum subsp obovatum (Shiny Phebalium)" + }, + { + "category": "Additional Priority Plants", + "priority": "Leptospermum namadgiensis (Namadgi Tea Tree)" + }, + { + "category": "Additional Priority Plants", + "priority": "Logania granitica (Mountain Logania)" + }, + { + "category": "Additional Priority Plants", + "priority": "Leucochrysum albicans var. tricolor (Hoary Sunray)" + }, + { + "category": "Additional Priority Plants", + "priority": "Lobelia gelida (Snow Pratia)" + }, + { + "category": "Additional Priority Plants", + "priority": "Olearia sp Rhizomatica " + }, + { + "category": "Additional Priority Plants", + "priority": "Olearia stenophylla " + }, + { + "category": "Additional Priority Plants", + "priority": "Parantennaria uniceps " + }, + { + "category": "Additional Priority Plants", + "priority": "Persoonia chamaepitys " + }, + { + "category": "Additional Priority Plants", + "priority": "Persoonia mollis subsp. mollis " + }, + { + "category": "Additional Priority Plants", + "priority": "Persoonia procumbens " + }, + { + "category": "Additional Priority Plants", + "priority": "Pimelea bracteata " + }, + { + "category": "Additional Priority Plants", + "priority": "Pomaderris cotoneaster (Cotoneaster Pomaderris)" + }, + { + "category": "Additional Priority Plants", + "priority": "Pomaderris gilmourii (Grey Deua Pomaderris)" + }, + { + "category": "Additional Priority Plants", + "priority": "Pomaderris phylicifolia subsp. phylicifolia " + }, + { + "category": "Additional Priority Plants", + "priority": "Prostanthera monticola (Buffalo Mint Bush)" + }, + { + "category": "Additional Priority Plants", + "priority": "Prasophyllum canaliculatum (Summer Leek Orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Prasophyllum innubum (Brandy Marys leek orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Prasophyllum keltonii (Kelton's Leek Orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Prasophyllum venustum (Charming Leek Orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Prasophyllum viriosum (Stocky Leek Orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Prostanthera decussata " + }, + { + "category": "Additional Priority Plants", + "priority": "Prostanthera stenophylla " + }, + { + "category": "Additional Priority Plants", + "priority": "Prostanthera walteri " + }, + { + "category": "Additional Priority Plants", + "priority": "Pterostylis oreophila (Blue-tongued Greenhood / Kiandra Greenhood)" + }, + { + "category": "Additional Priority Plants", + "priority": "Pultenaea polifolia (Dusky Bush-pea)" + }, + { + "category": "Additional Priority Plants", + "priority": "Pultenaea vrolandii (Cupped Bush-pea)" + }, + { + "category": "Additional Priority Plants", + "priority": "Rutidosis leiolepis (Monaro Golden Daisy)" + }, + { + "category": "Additional Priority Plants", + "priority": "Sannantha crenulate (Fern-leaf Baeckea)" + }, + { + "category": "Additional Priority Plants", + "priority": "Tetratheca subaphylla " + }, + { + "category": "Additional Priority Plants", + "priority": "Thesium austral (Austral Toadflax)" + }, + { + "category": "Additional Priority Plants", + "priority": "Thynninorchis huntianus (Elbow Orchid)" + }, + { + "category": "Additional Priority Plants", + "priority": "Viola improcera (Dwarf Violet)" + } +]; + +//Create the parent program +let programName = "Natural Heritage Trust"; +var parent = createOrFindProgram(programName); +var subprograms = ["First Nations Delivery Partner"] + +subprograms.forEach(function (subProgram){ + createOrFindProgram(subProgram, parent._id); +}); + +subprograms.forEach(function (subprogram){ + var program = db.program.find({name: subprogram}); + while(program.hasNext()){ + var p = program.next(); + print("sub program ID: " + p.programId) + db.program.updateOne({programId:p.programId}, {$set:{config:config, outcomes:outcomes, priorities:priorities}}); + useNhtServiceLabels(p.name); + } +}); + From 8557d44546c9f97225baced12871f3396940ee9a Mon Sep 17 00:00:00 2001 From: sal153 Date: Tue, 16 Apr 2024 21:23:43 +1000 Subject: [PATCH 70/95] refactored file name #3141 --- ...amSubProgram.js => createClimateSmartAgricultureSubProgram.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/scripts/releases/3.2/adhoc/{createClimateSmartAgricultureProgramSubProgram.js => createClimateSmartAgricultureSubProgram.js} (100%) diff --git a/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js b/src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureSubProgram.js similarity index 100% rename from src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureProgramSubProgram.js rename to src/main/scripts/releases/3.2/adhoc/createClimateSmartAgricultureSubProgram.js From 4c002325721576867cd50fc2f090121316a80d4f Mon Sep 17 00:00:00 2001 From: temi Date: Wed, 17 Apr 2024 10:54:24 +1000 Subject: [PATCH 71/95] #3049 - sorting project outcomes so that comparison will return expected result --- .../ala/merit/reports/NHTOutputReportLifecycleListener.groovy | 2 +- .../merit/reports/NhtOutputReportLifecycleListenerSpec.groovy | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/groovy/au/org/ala/merit/reports/NHTOutputReportLifecycleListener.groovy b/src/main/groovy/au/org/ala/merit/reports/NHTOutputReportLifecycleListener.groovy index 198037720..825fadf42 100644 --- a/src/main/groovy/au/org/ala/merit/reports/NHTOutputReportLifecycleListener.groovy +++ b/src/main/groovy/au/org/ala/merit/reports/NHTOutputReportLifecycleListener.groovy @@ -28,7 +28,7 @@ class NHTOutputReportLifecycleListener extends ReportLifecycleListener { // This is a side effect and a workaround for the problem that selected outcomes // are an array and the knockout binding doesn't support arrays as a value. if (it.projectOutcomes) { - it.outcomesLabel = new ArrayList(it.projectOutcomes).join(',') + it.outcomesLabel = new ArrayList(it.projectOutcomes.sort()).join(',') } it.progress == ActivityService.PROGRESS_FINISHED } diff --git a/src/test/groovy/au/org/ala/merit/reports/NhtOutputReportLifecycleListenerSpec.groovy b/src/test/groovy/au/org/ala/merit/reports/NhtOutputReportLifecycleListenerSpec.groovy index 7756f3bc7..f5b4ae1de 100644 --- a/src/test/groovy/au/org/ala/merit/reports/NhtOutputReportLifecycleListenerSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/reports/NhtOutputReportLifecycleListenerSpec.groovy @@ -41,7 +41,7 @@ class NhtOutputReportLifecycleListenerSpec extends Specification { List dataSets = [[dataSetId:'d1', progress:ActivityService.PROGRESS_FINISHED, projectOutcomes:['a','b','c']], [dataSetId:'d2', progress:ActivityService.PROGRESS_FINISHED, projectOutcomes:['d','e','f']], [dataSetId:'d3', progress:ActivityService.PROGRESS_STARTED, projectOutcomes:['g','h','i']], - [dataSetId:'d4', progress:ActivityService.PROGRESS_FINISHED, projectOutcomes:['j','k','l']]] + [dataSetId:'d4', progress:ActivityService.PROGRESS_FINISHED, projectOutcomes:['l','j','k']]] Map project = [custom:[dataSets:dataSets]] Map report = [:] List protocols = [[name:'test', externalId:'e1']] @@ -53,6 +53,7 @@ class NhtOutputReportLifecycleListenerSpec extends Specification { 1 * projectService.listProjectProtocols(project) >> protocols project.custom.dataSets.size() == 3 project.custom.dataSets*.dataSetId == ['d1','d2','d4'] + project.custom.dataSets[2].outcomesLabel == 'j,k,l' } def "It will return a list of investment priorities from the MERI plan"() { From 62e73adf2eacd5d32ce254efd0ab76a37bff1cf9 Mon Sep 17 00:00:00 2001 From: sal153 Date: Wed, 17 Apr 2024 14:49:44 +1000 Subject: [PATCH 72/95] commit final report progress #3151 --- forms/nht/bushBlitzFinalReport.json | 841 ++++++++++++++++++++++++++++ 1 file changed, 841 insertions(+) create mode 100644 forms/nht/bushBlitzFinalReport.json diff --git a/forms/nht/bushBlitzFinalReport.json b/forms/nht/bushBlitzFinalReport.json new file mode 100644 index 000000000..8d09efb00 --- /dev/null +++ b/forms/nht/bushBlitzFinalReport.json @@ -0,0 +1,841 @@ +{ + "name": "Bush Blitz Final Report", + "type": "Report", + "sections": [ + { + "name": "Project Final Report", + "optionalQuestionText": null, + "optional": false, + "collapsedByDefault": false, + "templateName": "project_final_report", + "template": { + "modelName": "Project Final Report", + "dataModel": [ + { + "dataType": "text", + "name": "executiveSummary", + "validate": "required" + }, + { + "dataType": "stringList", + "name": "isEachTargetAchieved", + "constraints": [ + "Yes", + "No" + ] + }, + { + "dataType": "stringList", + "name": "objectivesFullyAchieved", + "constraints": [ + "Yes", + "No" + ] + }, + { + "dataType": "list", + "name": "projectOutcomes", + "allowRowDelete": "false", + "columns": [ + { + "dataType": "text", + "name": "outcomeStatement" + }, + { + "dataType": "text", + "name": "achievement", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "text", + "name": "monitoringIndicator", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "text", + "name": "basedRating", + "constraints": [ + "Achieved (100%)", + "Significantly achieved (76-99%)", + "Satisfactorily achieved (51-75%)", + "Partially achieved (26-50%)", + "Inadequately achieved (1-25%)", + "Not achieved (0%)", + "Unable to rate" + ], + "validate": "required" + } + ] + }, + { + "columns": [ + { + "dataType": "text", + "name": "serviceName" + }, + { + "dataType": "text", + "name": "targetMeasure", + "description": "The output target measure to be adjusted." + }, + { + "dataType": "text", + "name": "scoreId", + "description": "Identifier for the target measure" + }, + { + "dataType": "text", + "name": "projectTarget" + }, + { + "dataType": "text", + "name": "delivered" + }, + { + "dataType": "text", + "name": "actualTotalDeliveredIfDifferent", + "behaviour": [ + { + "condition": "delivered > projectTarget", + "type": "enable_and_clear" + } + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "reasonTargetNotMet", + "behaviour": [ + { + "condition": "delivered < projectTarget", + "type": "enable_and_clear" + } + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "sitesAvailable", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "dataType": "feature", + "name": "serviceMappedArea", + "behaviour": [ + { + "condition": "sitesAvailable == \"Yes\"", + "type": "enable" + } + ] + }, + { + "computed": { + "expression": "$geom.areaHa(serviceMappedArea)" + }, + "dataType": "number", + "decimalPlaces": 3, + "name": "serviceCalculatedAreaHa", + "units": "ha" + }, + { + "computed": { + "expression": "$geom.lengthKm(serviceMappedArea)" + }, + "dataType": "number", + "decimalPlaces": 3, + "name": "serviceCalculatedLengthKm", + "units": "km" + }, + { + "dataType": "text", + "name": "targetMeasure", + "description": "The output target measure to be adjusted." + }, + { + "dataType": "text", + "name": "scoreId", + "description": "Identifier for the target measure" + }, + { + "dataType": "stringList", + "name": "assets", + "constraints": [ + "Australasian Bittern Botaurus poiciloptilus", + "Black-eared Miner Manorina melanotis", + "Carnaby's Cockatoo Calyptorhynchus latirostris", + "Christmas Island Goshawk Accipiter hiogaster natalis", + "Eastern Curlew Numenius madagascariensis", + "Golden-shouldered Parrot, Alwal Psephotus chrysopterygius", + "Hooded Plover (eastern) Thinornis cucullatus cucullatus", + "King Island Brown Thornbill Acanthiza pusilla archibaldi" + ], + "validate": "required" + }, + { + "dataType": "date", + "name": "activityStartDate", + "description": "", + "validate": "required" + }, + { + "dataType": "date", + "name": "activityEndDate", + "description": "", + "validate": "required" + } + ], + "dataType": "list", + "allowRowDelete": "false", + "name": "projectTargets" + }, + { + "dataType": "list", + "name": "projectMonitorings", + "allowRowDelete": "false", + "columns": [ + { + "dataType": "text", + "name": "monitoringIndicator" + }, + { + "dataType": "text", + "name": "monitoringApproach" + }, + { + "dataType": "text", + "name": "monitoringOutcome", + "validate": "required,maxSize[5000]" + } + ] + }, + { + "dataType": "list", + "name": "projectSpatialStrategy", + "allowRowDelete": "false", + "columns": [ + { + "dataType": "stringList", + "name": "assets", + "constraints": [ + "Australasian Bittern Botaurus poiciloptilus", + "Black-eared Miner Manorina melanotis", + "Carnaby's Cockatoo Calyptorhynchus latirostris", + "Christmas Island Goshawk Accipiter hiogaster natalis", + "Eastern Curlew Numenius madagascariensis", + "Golden-shouldered Parrot, Alwal Psephotus chrysopterygius", + "Hooded Plover (eastern) Thinornis cucullatus cucullatus", + "King Island Brown Thornbill Acanthiza pusilla archibaldi" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "strategyUsed", + "validate": "required,maxSize[5000]" + } + ] + }, + { + "dataType": "text", + "name": "effectivenessOfProjectMethodology", + "validate": "required,maxSize[5000]", + "constraints": [ + "Yes", + "No" + ] + }, + { + "dataType": "text", + "name": "otherOutcomesAchieved", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "text", + "name": "speciesSummary", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "text", + "name": "projectContributionsSummary", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "text", + "name": "monitoringSummary", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "text", + "name": "otherComments", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "text", + "name": "additionalComments", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "list", + "name": "assuranceDocuments", + "columns": [ + { + "dataType": "document", + "name": "attachments", + "description": "" + } + ] + }, + { + "dataType": "list", + "name": "additionalDocuments", + "columns": [ + { + "dataType": "document", + "name": "additionalAttachments", + "description": "" + } + ] + }, + { + "dataType": "list", + "description": "", + "name": "goodNewsStories", + "columns": [ + { + "dataType": "text", + "description": "", + "name": "storyDetails", + "validate": "required,maxSize[5000]" + }, + { + "dataType": "image", + "name": "photo" + } + ] + }, + { + "dataType": "list", + "name": "riskManagement", + "allowRowDelete": "false", + "columns": [ + { + "dataType": "text", + "name": "riskType", + "constraints": [ + "Performance", + "Work Health and Safety", + "People resources", + "Financial", + "External stakeholders", + "Natural environment" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "effectivenessRating", + "constraints": [ + "Severe", + "High", + "Medium", + "Low" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "effectivenessOfRiskManagement", + "validate": "required,maxSize[5000]" + } + ] + }, + { + "dataType": "text", + "name": "projectContactDetailsChanged", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + } + ], + "viewModel": [ + { + "items": [ + { + "source": "

    Executive Summary

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Provide an executive summary of the project’s overall achievements against the project milestones, objectives and outcomes outlined in the Project MoU and MERI Plan, including achievements against the project’s key performance indicators.", + "source": "executiveSummary", + "type": "textarea", + "rows": 3 + } + ] + }, + { + "items": [ + { + "source": "

    1. Project Outputs

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "isEachTargetAchieved", + "preLabel": "1.1 Did you achieve the target for each activity listed in the MERI Plan?", + "type": "selectOne" + } + ], + "type": "row" + }, + { + "disableTableUpload": true, + "columns": [ + { + "source": "", + "type": "literal", + "width": "5%", + "preLabel": { + "computed": "\\'No. \\' || (index + 1)" + }, + "title": "Activity No." + }, + { + "readonly": true, + "width": "13%", + "source": "serviceName", + "type": "textarea", + "rows": 3, + "title": "Activity" + }, + { + "readonly": true, + "width": "10%", + "source": "targetMeasure", + "type": "textarea", + "rows": 3, + "title": "Target measure" + }, + { + "readonly": true, + "width": "6%", + "source": "projectTarget", + "type": "text", + "rows": 1, + "title": "Total to be delivered" + }, + { + "width": "6%", + "source": "delivered", + "type": "text", + "rows": 2, + "title": "Total delivered" + }, + { + "width": "15%", + "source": "reasonTargetNotMet", + "type": "textarea", + "rows": 3, + "title": "Explanation if target not fully delivered. No response is required if the target was reached or exceeded." + } + ], + "userAddedRows": true, + "source": "projectTargets", + "title": "If you have answered no¸ please list the activity, target measure and target, the amount you delivered and explain why the target was not reached.
    Refer to the Activities and Targets Table in the MERI Plan", + "type": "table" + }, + + + { + "items": [ + { + "source": "

    2. Project Outcomes

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "2.1 Briefly describe the achievements that have been made against each outcome statement in the MERI Plan.", + "type": "literal" + } + ], + "type": "row" + }, + { + "source": "projectOutcomes", + "title": "Where possible, please reference the project monitoring indicators that are listed in the MERI Plan to support your response. Any supporting information (e.g. report, photos) can be uploaded as attachments to this report via the Admin tab > Documents sub-tab of MERIT. Where supporting evidence contains sensitive or confidential information, please forward it to the department’s Project Manager by email.", + "type": "table", + "userAddedRows": true, + "columns": [ + { + "source": "", + "type": "literal", + "width": "5%", + "preLabel": { + "computed": "\\'No. \\' || (index + 1)" + }, + "title": "Outcome No." + }, + { + "type": "textarea", + "source": "outcomeStatement", + "title": "Outcome", + "rows": 5, + "width": "30%", + "readonly": true + }, + { + "type": "textarea", + "source": "monitoringIndicator", + "title": "Monitoring Indicator", + "rows": 5, + "width": "25%" + }, + { + "type": "textarea", + "source": "achievement", + "title": "Achievement/s", + "rows": 5, + "width": "25%" + }, + { + "width": "15%", + "source": "basedRating", + "title": "Rating based on the effectiveness evaluation criteria", + "type": "select2" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "otherOutcomesAchieved", + "type": "textarea", + "rows": 5, + "preLabel": "2.2 Provide a brief summary of other outcomes achieved for this project that you wish to highlight, such as other environmental or social outcomes (e.g. engagement with Traditional Owners, landholders and local community, the contribution of partners, the generation/use of new technology).
    As part of your response, you may wish to describe any unexpected or unintended outcomes.", + "helpText": "" + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "speciesSummary", + "type": "textarea", + "rows": 5, + "preLabel": "2.3 Please summarise a) what new species data has been collected during the project, b) the locations, organisations and/or databases where it has been lodged, and c) the extent to which it has been made publicly accessible." + } + ] + }, + { + "type": "row", + "items": [ + { + "source": "projectContributionsSummary", + "type": "textarea", + "rows": 5, + "preLabel": "Please summarise a) the project’s contribution toward improving our knowledge of Australian species and their taxonomy and, b) the contribution the project has made (or is in the process of making) to the published scientific literature on Australian species." + } + ] + }, + { + "items": [ + { + "source": "

    3. Monitoring, Evaluation and Project Learnings

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "type": "row", + "items": [ + { + "preLabel": "3.1 Please briefly summarise:
    a) Environmental outcomes and project actions, such as the impact and legacy of the project on each of the assets targeted.
    b) Cultural outcomes such as improved health and abundance of culturally significant species, prevention of hot wildfire damage to cultural sites and sharing of cultural knowledge with the community.
    c) Social outcomes, such as engagement with Indigenous Owners, landholders and local community.", + "source": "monitoringSummary", + "type": "textarea", + "helpText": "", + "rows": 3 + } + ] + }, + { + "items": [ + { + "source": "

    4. Other Comments

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "type": "row", + "items": [ + { + "preLabel": "(Please provide any further comments you may wish to make on the project and / or programme here)", + "source": "otherComments", + "type": "textarea", + "helpText": "", + "rows": 3 + } + ] + }, + { + "items": [ + { + "source": "

    Project Acquittal

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "

    5. Project Income and Expenditure

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "objectivesFullyAchieved", + "preLabel": "5.1 Has your project fully achieved the objectives for which it was funded and have all funds been spent?", + "type": "selectOne" + } + ], + "type": "row" + }, + { + "items": [ + { + "source": "If 'No', please contact the Department prior to completing and submitting your final report.", + "type": "literal" + } + ], + "type": "row" + }, + { + "type": "row", + "items": [ + { + "preLabel": "5.2 If you have additional comments on the project's income, expenditure or budget, please provide them here.", + "source": "additionalComments", + "type": "textarea", + "helpText": "", + "rows": 3 + } + ] + }, + { + "items": [ + { + "source": "

    Attachments

    ", + "type": "literal" + } + ], + "type": "row" + }, + { + "type": "row", + "items": [ + { + "type": "literal", + "source": "

    Supporting Documents

    Please attach relevant supporting documents (e.g. photos, media clips, survey data, information products/publications, etc.) that provide evidence of the project's progress and / or impacts." + } + ] + }, + { + "type": "table", + "source": "assuranceDocuments", + "userAddedRows": true, + "disableTableUpload": true, + "columns": [ + { + "title": "Attached Documents", + "source": "attachments", + "type": "document" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "literal", + "source": "

    Additional Information (optional)

    You may attach other documents relevant to your project for the Department's information." + } + ] + }, + { + "type": "table", + "source": "additionalDocuments", + "userAddedRows": true, + "disableTableUpload": true, + "columns": [ + { + "title": "Attached Documents", + "source": "additionalAttachments", + "type": "document" + } + ] + } + ], + "pre-populate": [ + { + "source": { + "context-path": "owner" + }, + "merge": { + "projectOutcomes": { + "deleteUnmatchedExistingRows": true, + "addUnmatchedNewRows": true, + "keys": [ + "outcomeStatement" + ] + } + }, + "mapping": [ + { + "target": "projectOutcomes", + "mapping": [ + { + "target": "outcomeStatement", + "source-path": "description" + } + ], + "source-path": "custom.details.outcomes.shortTermOutcomes" + }, + { + "target": "projOutcomes", + "mapping": [ + { + "target": "outcomeStatement", + "source-path": "description" + } + ], + "source-path": "custom.details.outcomes.shortTermOutcomes" + }, + { + "target": "projectMonitorings", + "mapping": [ + { + "target": "monitoringIndicator", + "source-path": "data1" + }, + { + "target": "monitoringApproach", + "source-path": "data2" + } + ], + "source-path": "custom.details.objectives.rows" + } + ] + }, + { + "mapping": [ + { + "mapping": [ + { + "source-path": "service", + "target": "serviceName" + }, + { + "source-path": "targetMeasure", + "target": "targetMeasure" + }, + { + "source-path": "scoreId", + "target": "scoreId" + }, + { + "source-path": "projectTarget", + "target": "projectTarget" + }, + { + "source-path": "result", + "target": "delivered" + } + ], + "source-path": "targets", + "target": "projectTargets" + } + ], + "merge": { + "projectTargets": { + "keys": [ + "serviceName", + "targetMeasure" + ], + "projectTarget": { + "replaceExisting": true + }, + "delivered": { + "replaceExisting": true + }, + "sort": [ + "service", + "outputTargetMeasure" + ], + "addUnmatchedNewRows": true, + "deleteUnmatchedExistingRows": true + } + }, + "source": { + "params": [ + { + "expression": "owner.projectId", + "name": "id", + "type": "computed" + }, + { + "name": "missedTargetsOnly", + "value": false + }, + { + "name": "onlyNonZeroTargets", + "value": true + }, + { + "name": "approvedDataOnly", + "value": false + } + ], + "url": "/project/projectTargetsAndScores/" + } + } + ], + "title": "Project Final Report" + } + } + ], + "formVersion": 1, + "category": null, + "status": "active", + "gmsId": null, + "supportsSites": false, + "supportsPhotoPoints": false, + "minOptionalSectionsCompleted": 1 +} \ No newline at end of file From 53d9a5868dad9eaa603992b3860cc04d255f3629 Mon Sep 17 00:00:00 2001 From: temi Date: Thu, 18 Apr 2024 13:43:51 +1000 Subject: [PATCH 73/95] #3049 - filter out non-survey dataset --- grails-app/services/au/org/ala/merit/ProjectService.groovy | 4 ++-- src/test/groovy/au/org/ala/merit/ProjectServiceSpec.groovy | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/grails-app/services/au/org/ala/merit/ProjectService.groovy b/grails-app/services/au/org/ala/merit/ProjectService.groovy index 8f835b877..d02a4dbea 100644 --- a/grails-app/services/au/org/ala/merit/ProjectService.groovy +++ b/grails-app/services/au/org/ala/merit/ProjectService.groovy @@ -27,6 +27,7 @@ class ProjectService { static final String ACTIVE = 'active' static final String OTHER_EMSA_MODULE = 'Other' + static final String PARATOO_FORM_TAG_SURVEY = 'survey' static dateWithTime = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss") static dateWithTimeFormat2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss") @@ -61,12 +62,11 @@ class ProjectService { } void filterDataSetSummaries(List dataSetSummaries) { - List protocolNamesToHide = grailsApplication.config.getProperty('hidden.dataSet.protocols', List.class, ['Plot Selection', 'Plot Layout and Visit']) List forms = activityService.monitoringProtocolForms() dataSetSummaries.removeAll { Map dataSetSummary -> Map protocolForm = forms.find{it.externalId == dataSetSummary.protocol} - protocolForm && (protocolForm.name in protocolNamesToHide) + (protocolForm != null) && (!protocolForm.tags.contains(PARATOO_FORM_TAG_SURVEY)) } } diff --git a/src/test/groovy/au/org/ala/merit/ProjectServiceSpec.groovy b/src/test/groovy/au/org/ala/merit/ProjectServiceSpec.groovy index 64d8a8745..4144637a1 100644 --- a/src/test/groovy/au/org/ala/merit/ProjectServiceSpec.groovy +++ b/src/test/groovy/au/org/ala/merit/ProjectServiceSpec.groovy @@ -1579,7 +1579,7 @@ class ProjectServiceSpec extends Specification implements ServiceUnitTest> [[externalId:'1', name:"Plot Selection"], [externalId:'2', name: "Plot Layout and Visit"]] + 1 * activityService.monitoringProtocolForms() >> [[externalId:'1', name:"Plot Selection", tags: ["site"]], [externalId:'2', name: "Plot Layout and Visit", tags: ["site"]], [externalId:'3', name: "Not a plot selection", tags: ["survey"]]] and: dataSets.size() == 1 dataSets[0].name == 'Not a plot selection' From 27a3e102c35f718d5407eed7f7fd9acaa1a022e6 Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 19 Apr 2024 13:58:26 +1000 Subject: [PATCH 74/95] Implements #3159 --- .../other/regionalCapacityServicesReport.json | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/forms/other/regionalCapacityServicesReport.json b/forms/other/regionalCapacityServicesReport.json index 1220ffc38..692c0f401 100644 --- a/forms/other/regionalCapacityServicesReport.json +++ b/forms/other/regionalCapacityServicesReport.json @@ -342,6 +342,16 @@ ], "dataType": "list", "name": "communicationMaterialLinkList" + }, + { + "name": "communicationsMaterialAttachments", + "dataType": "list", + "columns": [ + { + "name": "communicationsMaterialAttachment", + "dataType": "document" + } + ] } ], "modelName": "Regional capacity services - reporting", @@ -752,6 +762,19 @@ "source": "communicationMaterialLinkList", "title": "Q11a. If yes, please provide link or copy of the material (one row per item)*", "type": "table" + }, + { + "type": "table", + "source": "communicationsMaterialAttachments", + "userAddedRows": true, + "disableTableUpload": true, + "columns": [ + { + "title": "Attached communication material", + "source": "communicationsMaterialAttachment", + "type": "document" + } + ] } ] } From 5231f9f91bf57673fde2822b68bbe67e32ed2044 Mon Sep 17 00:00:00 2001 From: chrisala Date: Fri, 19 Apr 2024 16:07:06 +1000 Subject: [PATCH 75/95] First cut of #3157 and #3150 --- grails-app/assets/javascripts/meriplan.js | 76 ++++++++++++++----- .../assets/javascripts/projectService.js | 11 +++ .../project/meriPlan/_extendedKeyThreats.gsp | 2 +- 3 files changed, 70 insertions(+), 19 deletions(-) diff --git a/grails-app/assets/javascripts/meriplan.js b/grails-app/assets/javascripts/meriplan.js index 1121b1947..b9330a28d 100644 --- a/grails-app/assets/javascripts/meriplan.js +++ b/grails-app/assets/javascripts/meriplan.js @@ -11,25 +11,29 @@ function MERIPlan(project, projectService, config) { var restored = JSON.parse(savedProjectCustomDetails); var localSave = amplify.store(config.meriStorageKey + "-updated"); $('#restoredData').show(); - if (restored.custom) { - project.custom.details = restored.custom.details; - } - if (restored.outputTargets) { - project.outputTargets = restored.outputTargets; - } - if (restored.risks) { - project.risks = restored.risks; - } + if (!projectService.isProjectDetailsLocked()) { + if (restored.custom) { + project.custom.details = restored.custom.details; + } + if (restored.outputTargets) { + project.outputTargets = restored.outputTargets; + } - var message = "Important

    You have unsaved MERI Plan changes for this project.

    "; - if (localSave && serverUpdate) { - var saved = moment(localSave); - message += "

    Your unsaved changes were made on " + saved.format("LLLL") + "

    The changes we loaded from the server when this page was refreshed were made at " + moment(serverUpdate).format("LLLL") + "

    "; - } - message += "

    Please review the changes then press the 'Save changes' button at the bottom of the page if you want to keep your unsaved changes or the 'Cancel' button if you want to discard your changes.

    "; + var message = "Important

    You have unsaved MERI Plan changes for this project.

    "; + if (localSave && serverUpdate) { + var saved = moment(localSave); + message += "

    Your unsaved changes were made on " + saved.format("LLLL") + "

    The changes we loaded from the server when this page was refreshed were made at " + moment(serverUpdate).format("LLLL") + "

    "; + } + message += "

    Please review the changes then press the 'Save changes' button at the bottom of the page if you want to keep your unsaved changes or the 'Cancel' button if you want to discard your changes.

    "; - bootbox.alert(message); + bootbox.alert(message); + } + else { + amplify.store(config.meriStorageKey, null); + var message = "The MERI plan for this project has been locked for editing by another user. Any unsaved changes you have made have been discarded."; + bootbox.alert(message); + } } } ReadOnlyMeriPlan.apply(this, [project, projectService, config]); @@ -392,9 +396,34 @@ function MERIPlan(project, projectService, config) { self.removeMonitoringIndicator = function(row) { self.meriPlan().monitoring.removeRow(row); } + + /** + * Returns true if any Key Threat has an associated target measure that is produced by a survey service. + * The purpose of this method is to disallow the removal of all baselines if the project is delivering survey services. + */ + self.keyThreatsIncludesSurveyTargetMeasures = function() { + return _.find(self.meriPlan().threats.rows() || [], function(keyThreat) { + var scoreIds = keyThreat.relatedTargetMeasures(); + for (var i=0; i 0) { + return self.allTargetMeasures; + } + else { // To report against a survey (baseline/indicator) target measure, a related baseline is required. + return _.filter(self.allTargetMeasures, function(targetMeasure) { + return !projectService.isSurveyTargetMeasure(targetMeasure.score); + }); + } + }; self.monitoringTargetMeasures = _.filter(self.allTargetMeasures, function(targetMeasure) { - return targetMeasure.score.tags && targetMeasure.score.tags.indexOf('Indicator') >= 0; + return projectService.isMonitoringTargetMeasure(targetMeasure.score); }); self.baselineTargetMeasures = _.filter(self.allTargetMeasures, function(targetMeasure) { - return targetMeasure.score.tags && targetMeasure.score.tags.indexOf('Baseline') >= 0; + return projectService.isBaselineTargetMeasure(targetMeasure.score); }); /** * This function allows the UI to convert an array of scoreIds into the same labels diff --git a/grails-app/assets/javascripts/projectService.js b/grails-app/assets/javascripts/projectService.js index 042bfce99..1464da883 100644 --- a/grails-app/assets/javascripts/projectService.js +++ b/grails-app/assets/javascripts/projectService.js @@ -407,4 +407,15 @@ function ProjectService(project, options) { var url = config.monitoringProtocolsUrl; return $.get(url); } + + self.isMonitoringTargetMeasure = function(score) { + return score.tags && score.tags.indexOf('Indicator') >= 0; + }; + self.isBaselineTargetMeasure = function(score) { + return score.tags && score.tags.indexOf('Baseline') >= 0; + }; + self.isSurveyTargetMeasure = function(score) { + return self.isMonitoringTargetMeasure(score) || self.isBaselineTargetMeasure(score); + }; + }; diff --git a/grails-app/views/project/meriPlan/_extendedKeyThreats.gsp b/grails-app/views/project/meriPlan/_extendedKeyThreats.gsp index f16b99383..9c2810807 100644 --- a/grails-app/views/project/meriPlan/_extendedKeyThreats.gsp +++ b/grails-app/views/project/meriPlan/_extendedKeyThreats.gsp @@ -45,7 +45,7 @@ + data-bind="options:$root.keyThreatsTargetMeasures(), optionsText:'label', optionsValue:'scoreId', multiSelect2:{preserveColumnWidth:20, value:relatedTargetMeasures}, disable: $root.isProjectDetailsLocked()">