diff --git a/amp/src/main/java/org/dgfoundation/amp/ar/ColumnConstants.java b/amp/src/main/java/org/dgfoundation/amp/ar/ColumnConstants.java index 49f3e44508f..2dc15aba5d7 100644 --- a/amp/src/main/java/org/dgfoundation/amp/ar/ColumnConstants.java +++ b/amp/src/main/java/org/dgfoundation/amp/ar/ColumnConstants.java @@ -328,7 +328,6 @@ public class ColumnConstants { public static final String PROPOSED_START_DATE = "Proposed Start Date"; public static final String PURPOSE = "Purpose"; public static final String RATIFICATION_DATE = "Loan Ratification Date"; - public static final String REGIONAL_REGION = "Regional Region"; public static final String REGIONAL_GROUP = "Regional Group"; public static final String REGIONAL_GROUP_GROUP = "Regional Group Group"; public static final String REGIONAL_GROUP_DEPARTMENT_DIVISION = "Regional Group Department/Division"; @@ -336,6 +335,7 @@ public class ColumnConstants { public static final String REGIONAL_OBSERVATIONS_ACTORS = "Regional Observations Actors"; public static final String REGIONAL_OBSERVATIONS_DATE = "Regional Observations Date"; public static final String REGIONAL_OBSERVATIONS_MEASURES = "Regional Observations Measures Taken"; + public static final String REGIONAL_REGION = "Regional Region"; public static final String REPORTING_SYSTEM = "Reporting System"; public static final String RESPONSIBLE_ORGANIZATION = "Responsible Organization"; diff --git a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/reports/designer/ReportManager.java b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/reports/designer/ReportManager.java index f8d7414f921..9de96e5fdc0 100644 --- a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/reports/designer/ReportManager.java +++ b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/reports/designer/ReportManager.java @@ -39,6 +39,8 @@ import static java.lang.Boolean.TRUE; import static org.dgfoundation.amp.ar.ColumnConstants.PROJECT_TITLE; +import static org.dgfoundation.amp.ar.ColumnConstants.LOCATION_ADM_LEVEL_1; +import static org.dgfoundation.amp.ar.ColumnConstants.REGIONAL_REGION; import static org.dgfoundation.amp.newreports.AmountsUnits.getAmountCode; import static org.digijava.kernel.ampapi.endpoints.reports.designer.ReportDesignerErrors.REPORT_NOT_FOUND; import static org.digijava.kernel.ampapi.endpoints.settings.SettingsUtils.getReportSettings; @@ -87,6 +89,8 @@ public ReportManager createOrUpdateReport(ReportRequest reportRequest, final Lon this.reportRequest = reportRequest; this.report = reportId == null ? new AmpReports() : getReportById(reportId); + remapSaveRegionalColumns(reportRequest); + initValidators(); validate(); @@ -352,10 +356,86 @@ private Set getReportMeasures(final List measures) { return reportMeasures; } + private void remapSaveRegionalColumns(final ReportRequest req) { + if (req.getColumns() == null || req.getColumns().isEmpty() || req.getType() == null) { + return; + } + ReportType type; + try { + type = ReportType.fromString(req.getType()); + } catch (IllegalArgumentException e) { + return; + } + if (!type.isRegional()) { + return; + } + AmpColumns adm1 = getAmpColumnByName(LOCATION_ADM_LEVEL_1); + if (adm1 == null) { + return; + } + if (!req.getColumns().contains(adm1.getColumnId())) { + return; + } + AmpColumns regionalRegion = getAmpColumnByName(REGIONAL_REGION); + if (regionalRegion == null) { + return; + } + List remapped = new ArrayList<>(req.getColumns()); + for (int i = 0; i < remapped.size(); i++) { + if (adm1.getColumnId().equals(remapped.get(i))) { + remapped.set(i, regionalRegion.getColumnId()); + } + } + req.setColumns(remapped); + + // Also remap in hierarchies if present + if (req.getHierarchies() != null && req.getHierarchies().contains(adm1.getColumnId())) { + List remappedHierarchies = new ArrayList<>(req.getHierarchies()); + for (int i = 0; i < remappedHierarchies.size(); i++) { + if (adm1.getColumnId().equals(remappedHierarchies.get(i))) { + remappedHierarchies.set(i, regionalRegion.getColumnId()); + } + } + req.setHierarchies(remappedHierarchies); + } + } + + private Set remapRegionalColumns(final AmpReports ampReport) { + if (ReportType.fromLong(ampReport.getType()).isRegional()) { + AmpColumns adm1 = null; + Set remapped = new LinkedHashSet<>(); + for (AmpReportColumn rc : ampReport.getColumns()) { + if (REGIONAL_REGION.equals(rc.getColumn().getColumnName())) { + if (adm1 == null) { + adm1 = getAmpColumnByName(LOCATION_ADM_LEVEL_1); + } + if (adm1 != null) { + AmpReportColumn replacement = new AmpReportColumn(); + replacement.setColumn(adm1); + replacement.setOrderId(rc.getOrderId()); + replacement.setLevel(rc.getLevel()); + remapped.add(replacement); + continue; + } + } + remapped.add(rc); + } + return remapped; + } + return ampReport.getColumns(); + } + private AmpColumns getAmpColumnById(final Long columnId) { return PersistenceManager.getSession().get(AmpColumns.class, columnId); } + private AmpColumns getAmpColumnByName(final String columnName) { + return (AmpColumns) PersistenceManager.getSession() + .createQuery("from " + AmpColumns.class.getName() + " where columnName = :name") + .setParameter("name", columnName) + .uniqueResult(); + } + private AmpMeasures getAmpMeasureById(final Long columnId) { return PersistenceManager.getSession().get(AmpMeasures.class, columnId); } @@ -430,7 +510,7 @@ private Report convertAmpReportsToReport(final AmpReports ampReport) { } report.setMeasures(ampReport.getMeasures()); - report.setColumns(ampReport.getColumns()); + report.setColumns(remapRegionalColumns(ampReport)); report.setHierarchies(ampReport.getHierarchies()); AmpARFilterConverter arFilterConverter = new AmpARFilterConverter(buildFilterFromSource(ampReport));