diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/domain/Report.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/domain/Report.java index fba14beae..d67aebc7f 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/domain/Report.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/domain/Report.java @@ -28,6 +28,8 @@ import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidation import org.mifosplatform.infrastructure.core.exception.PlatformDataIntegrityException; import org.springframework.data.jpa.domain.AbstractPersistable; +import com.google.gson.JsonArray; + @Entity @Table(name = "stretchy_report", uniqueConstraints = { @UniqueConstraint(columnNames = { "report_name" }, name = "unq_report_name") }) public class Report extends AbstractPersistable { @@ -58,7 +60,7 @@ public class Report extends AbstractPersistable { private String reportSql; @LazyCollection(LazyCollectionOption.FALSE) - @OneToMany(cascade = CascadeType.ALL, mappedBy = "report", orphanRemoval = true) + @OneToMany(cascade = CascadeType.ALL, mappedBy = "report") private Set reportParameterUsages = null; public static Report fromJson( @@ -174,6 +176,14 @@ public class Report extends AbstractPersistable { this.reportSql = StringUtils.defaultIfEmpty(newValue, null); } + final String reportParametersParamName = "reportParameters"; + if (command.hasParameter(reportParametersParamName)) { + JsonArray jsonArray = command.arrayOfParameterNamed(reportParametersParamName); + if (jsonArray != null) { + actualChanges.put(reportParametersParamName, command.jsonFragment(reportParametersParamName)); + } + } + validate(); if (!actualChanges.isEmpty()) { @@ -272,4 +282,26 @@ public class Report extends AbstractPersistable { return reportName; } + public Set getReportParameterUsages() { + return reportParameterUsages; + } + + public boolean update( + final Set newReportParameterUsages) { + if (newReportParameterUsages == null) + return false; + + boolean updated = false; + if (this.reportParameterUsages != null) { + + if (!(this.reportParameterUsages.equals(newReportParameterUsages))) { + updated = true; + this.reportParameterUsages = newReportParameterUsages; + } + } else { + updated = true; + this.reportParameterUsages = newReportParameterUsages; + } + return updated; + } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/domain/ReportParameterUsage.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/domain/ReportParameterUsage.java index 4c1ef0970..673e8e2f2 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/domain/ReportParameterUsage.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/domain/ReportParameterUsage.java @@ -45,5 +45,13 @@ public class ReportParameterUsage extends AbstractPersistable { public void setReport(Report report) { this.report = report; } + + public void setParameter(ReportParameter parameter) { + this.parameter = parameter; + } + + public void setReportParameterName(String reportParameterName) { + this.reportParameterName = reportParameterName; + } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReportWritePlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReportWritePlatformServiceImpl.java index 11d4b520b..0bda9c035 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReportWritePlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/dataqueries/service/ReportWritePlatformServiceImpl.java @@ -71,11 +71,16 @@ public class ReportWritePlatformServiceImpl implements this.fromApiJsonDeserializer.validate(command.json()); - final Set reportParameterUsages = assembleSetOfReportParameterUsages(command); - final Report report = Report.fromJson(reportParameterUsages, command); - for (ReportParameterUsage rpu : reportParameterUsages) { - rpu.setReport(report); - } + final Set reportParameterUsages = assembleSetOfReportParameterUsages( + null, command); + final Report report = Report.fromJson(reportParameterUsages, + command); + if (reportParameterUsages != null) { + for (ReportParameterUsage rpu : reportParameterUsages) { + rpu.setReport(report); + } + } + final Permission permission = new Permission("report", report.getReportName(), "READ"); this.reportRepository.save(report); @@ -106,6 +111,16 @@ public class ReportWritePlatformServiceImpl implements } final Map changes = report.update(command); + + if (changes.containsKey("reportParameters")) { + final Set reportParameterUsages = assembleSetOfReportParameterUsages( + report, command); + boolean updated = report.update(reportParameterUsages); + if (!updated) { + changes.remove("reportParameters"); + } + } + if (!changes.isEmpty()) { this.reportRepository.saveAndFlush(report); } @@ -133,11 +148,12 @@ public class ReportWritePlatformServiceImpl implements "error.msg.cant.delete.core.report", "Core Reports Can't be Deleted", ""); } - - final Permission permission = this.permissionRepository.findOneByCode("READ" + "_" + report.getReportName()); + final Permission permission = this.permissionRepository + .findOneByCode("READ" + "_" + report.getReportName()); if (permission == null) { - throw new PermissionNotFoundException("READ" + "_" + report.getReportName()); + throw new PermissionNotFoundException("READ" + "_" + + report.getReportName()); } this.reportRepository.delete(report); @@ -170,35 +186,92 @@ public class ReportWritePlatformServiceImpl implements + realCause.getMessage()); } - private Set assembleSetOfReportParameterUsages(final JsonCommand command) { + private Set assembleSetOfReportParameterUsages( + final Report report, final JsonCommand command) { - final Set reportParameterUsages = new HashSet(); + if (command.parameterExists("reportParameters")) { + Set reportParameterUsages = new HashSet(); + JsonArray reportParametersArray = command + .arrayOfParameterNamed("reportParameters"); + if (reportParametersArray != null) { + for (int i = 0; i < reportParametersArray.size(); i++) { + final JsonObject jsonObject = reportParametersArray.get(i) + .getAsJsonObject(); + Long id = null; + ReportParameter parameter = null; + String reportParameterName = null; - if (command.parameterExists("reportParameters")) { - JsonArray reportParametersArray = command.arrayOfParameterNamed("reportParameters"); - if (reportParametersArray != null) { - for (int i = 0; i < reportParametersArray.size(); i++) { + if (jsonObject.has("parameterId")) { + final Long parameterId = jsonObject.get("parameterId") + .getAsLong(); + parameter = this.reportParameterRepository + .findOne(parameterId); + if (parameter == null) { + throw new ReportParameterNotFoundException( + parameterId); + } + } else { + throw new PlatformDataIntegrityException( + "error.msg.parameter.id.mandatory.in.report.parameter", + "parameterId column is mandatory in Report Parameter Entry"); + } - final JsonObject jsonObject = reportParametersArray.get(i).getAsJsonObject(); - if (jsonObject.has("id")) { - Long id = null; - final String idStr = jsonObject.get("id").getAsString(); - if (!(idStr.equals(""))) id = Long.parseLong(idStr); - - final Long parameterId = jsonObject.get("parameterId").getAsLong(); - final ReportParameter parameter = this.reportParameterRepository.findOne(parameterId); - if (parameter == null) { - throw new ReportParameterNotFoundException(parameterId); - } - final String reportParameterName = jsonObject.get("reportParameterName").getAsString(); - reportParameterUsages.add(new ReportParameterUsage(null, parameter, reportParameterName)); - } - } - } - } + if (jsonObject.has("reportParameterName")) { + reportParameterName = jsonObject.get( + "reportParameterName").getAsString(); + } - return reportParameterUsages; - } - + ReportParameterUsage reportParameterUsage = null; + if (report == null) { + reportParameterUsage = new ReportParameterUsage(report, + parameter, reportParameterName); + } else { + if (jsonObject.has("id")) { + final String idStr = jsonObject.get("id") + .getAsString(); + if (!(idStr.equals(""))) + id = Long.parseLong(idStr); + } + if (id == null) { + reportParameterUsage = new ReportParameterUsage( + report, parameter, reportParameterName); + } else { + reportParameterUsage = rpuById(report, id); + + if (reportParameterUsage == null) { + throw new PlatformDataIntegrityException( + "error.msg.supplied.parameter.id.doesnt.exist", + "Supplied parameterId column doesn't Exist", + id); + } + + if (parameter != null) + reportParameterUsage.setParameter(parameter); + + if (reportParameterName != null) + reportParameterUsage + .setReportParameterName(reportParameterName); + } + } + + reportParameterUsages.add(reportParameterUsage); + } + return reportParameterUsages; + } else + return null; + } else + return null; + } + + private ReportParameterUsage rpuById(final Report report, final Long id) { + + for (ReportParameterUsage rpu : report.getReportParameterUsages()) { + if (rpu.getId().equals(id)) + return rpu; + } + + return null; + + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java index d1e781211..c6be7c80a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanproduct/domain/LoanProduct.java @@ -238,9 +238,8 @@ public class LoanProduct extends AbstractPersistable { if (command.hasParameter(chargesParamName)) { JsonArray jsonArray = command.arrayOfParameterNamed(chargesParamName); if (jsonArray != null) { - + actualChanges.put(chargesParamName, command.jsonFragment(chargesParamName)); } - actualChanges.put(chargesParamName, command.jsonFragment(chargesParamName)); } return actualChanges;