diff --git a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/indicator/manager/IndicatorManagerService.java b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/indicator/manager/IndicatorManagerService.java index bad04679b80..e67ae5f76df 100644 --- a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/indicator/manager/IndicatorManagerService.java +++ b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/indicator/manager/IndicatorManagerService.java @@ -46,7 +46,7 @@ public class IndicatorManagerService { private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy"); - public static final String FILTER_BY_PROGRAM = "Filter By Program"; + public static final String FILTER_BY_PROGRAM = "Filter by Program"; public static final String FILTER_BY_SECTOR = "Filter By Sector"; diff --git a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/settings/SettingsConstants.java b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/settings/SettingsConstants.java index 6264e3ea473..cc460beb867 100644 --- a/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/settings/SettingsConstants.java +++ b/amp/src/main/java/org/digijava/kernel/ampapi/endpoints/settings/SettingsConstants.java @@ -109,7 +109,7 @@ public class SettingsConstants { put(YEAR_ALL, "All"); put(PROGRAM_SETTINGS, "Program Settings"); put(INDICATOR_FILTER_BY_SECTOR, "Filter By Sector"); - put(INDICATOR_FILTER_BY_PROGRAM, "Filter By Program"); + put(INDICATOR_FILTER_BY_PROGRAM, "Filter by Program"); put(NUMBER_OF_INDICATORS_IN_DASHBOARD, "Number of indicators in M&E Dashboard"); put(SORT_COLUMN, GlobalSettingsConstants.DEFAULT_RESOURCES_SORT_COLUMN); put(MAXIMUM_FILE_SIZE, GlobalSettingsConstants.CR_MAX_FILE_SIZE ); diff --git a/amp/src/main/java/org/digijava/module/aim/action/dataimporter/util/ImporterUtil.java b/amp/src/main/java/org/digijava/module/aim/action/dataimporter/util/ImporterUtil.java index 60443eb52c8..60ef8bd186c 100644 --- a/amp/src/main/java/org/digijava/module/aim/action/dataimporter/util/ImporterUtil.java +++ b/amp/src/main/java/org/digijava/module/aim/action/dataimporter/util/ImporterUtil.java @@ -9,8 +9,6 @@ import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; -import org.dgfoundation.amp.ar.ArConstants; -import org.dgfoundation.amp.ar.ColumnConstants; import org.dgfoundation.amp.ar.ARUtil; import org.digijava.kernel.ampapi.endpoints.activity.ActivityImportRules; import org.digijava.kernel.ampapi.endpoints.activity.ActivityInterchangeUtils; @@ -26,7 +24,6 @@ import org.digijava.module.aim.dbentity.*; import org.digijava.module.aim.util.CurrencyUtil; import org.digijava.module.aim.util.DbUtil; -import org.digijava.module.aim.util.FeaturesUtil; import org.digijava.module.aim.util.ProgramUtil; import org.digijava.module.aim.util.SectorUtil; import org.digijava.module.aim.util.TeamUtil; @@ -338,7 +335,7 @@ private static String getFundingDate(String dateString) { } if (dateString != null && dateString.trim().matches("\\d{4}")) { int year = Integer.parseInt(dateString.trim()); - return LocalDate.of(year, 12, 31).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + return LocalDate.of(year, 1, 1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); } LocalDate date = LocalDate.now(); if (isCommonDateFormat(dateString)) { @@ -651,6 +648,32 @@ private static boolean transactionExists(List transactions, Transac ); } + private static Set mergeFundingsByDonor(Set fundings) { + if (fundings == null || fundings.size() <= 1) return fundings; + Map merged = new LinkedHashMap<>(); + for (Funding f : fundings) { + String key = f.getDonor_organization_id() + "|" + + f.getSource_role() + "|" + + f.getType_of_assistance() + "|" + + f.getFinancing_instrument(); + Funding existing = merged.get(key); + if (existing == null) { + merged.put(key, f); + } else { + for (Transaction t : f.getCommitments()) { + if (!transactionExists(existing.getCommitments(), t)) existing.getCommitments().add(t); + } + for (Transaction t : f.getDisbursements()) { + if (!transactionExists(existing.getDisbursements(), t)) existing.getDisbursements().add(t); + } + for (Transaction t : f.getExpenditures()) { + if (!transactionExists(existing.getExpenditures(), t)) existing.getExpenditures().add(t); + } + } + } + return new LinkedHashSet<>(merged.values()); + } + /** * Creates a corresponding disbursement transaction for each commitment transaction. * The disbursement will have the same amount, currency, and date as the commitment. @@ -965,6 +988,7 @@ public static Long importTheData(ImportDataModel importDataModel, Session sessio objectMapper.configure(ESCAPE_NON_ASCII, false); // Disable escaping of non-ASCII characters during serialization objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); + importDataModel.setFundings(mergeFundingsByDonor(importDataModel.getFundings())); pruneParentLocationsWhenChildPresent(importDataModel, session); normalizeLocationPercentages(importDataModel); Map map = objectMapper diff --git a/amp/src/main/webapp/WEB-INF/jsp/aim/view/dataImporter.jsp b/amp/src/main/webapp/WEB-INF/jsp/aim/view/dataImporter.jsp index 16ade5b9122..6d9e25003f7 100644 --- a/amp/src/main/webapp/WEB-INF/jsp/aim/view/dataImporter.jsp +++ b/amp/src/main/webapp/WEB-INF/jsp/aim/view/dataImporter.jsp @@ -6,6 +6,7 @@ <digi:trn>Data Importer</digi:trn> + @@ -108,9 +109,14 @@ function toggleUploadSection() { var hasMappings = $('#selected-pairs-table-body tr').length > 0; - $('#data-upload-section').toggle(hasMappings); $('#config-empty-note').toggle(!hasMappings); - toggleDefaultLocationFallback(); + if (hasMappings) { + $('#tab-upload-btn').removeClass('disabled-tab'); + $('#next-to-upload-btn').prop('disabled', false); + } else { + $('#tab-upload-btn').addClass('disabled-tab'); + $('#next-to-upload-btn').prop('disabled', true); + } } function hasMappedProjectLocationField() { @@ -166,6 +172,13 @@ toggleUploadSection(); } + function switchImporterTab(tabId) { + $('.tab-pane').hide(); + $('.tab-item').removeClass('active'); + $('#' + tabId).show(); + $('[data-tab="' + tabId + '"]').addClass('active'); + } + function revealConfigWorkspace() { document.getElementById('otherComponents').removeAttribute('hidden'); $('#add-field').show(); @@ -173,6 +186,9 @@ $('#selected-field').show(); initializeSelectControls(); toggleUploadSection(); + $('#tab-mapping-btn').removeClass('disabled-tab'); + $('#next-to-map-btn').prop('disabled', false); + switchImporterTab('tab-mapping-pane'); } function replaceLastOccurrence(inputString, search, replacement) { @@ -646,18 +662,18 @@