This is an automated email from the ASF dual-hosted git repository. awasum pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/fineract-cn-reporting.git
commit 8eba0c024926f7294f2336659338f6922f4f090d Author: Awasum Yannick <[email protected]> AuthorDate: Mon Aug 21 08:47:19 2017 +0100 Add displayable fields, customer query, office query and deposit account query for savings accounts --- .../TestSavingListReportSpecification.java | 21 +++ .../SavingListReportSpecification.java | 195 ++++++++++++++++++--- 2 files changed, 188 insertions(+), 28 deletions(-) diff --git a/component-test/src/main/java/io/mifos/reporting/TestSavingListReportSpecification.java b/component-test/src/main/java/io/mifos/reporting/TestSavingListReportSpecification.java new file mode 100644 index 0000000..4627617 --- /dev/null +++ b/component-test/src/main/java/io/mifos/reporting/TestSavingListReportSpecification.java @@ -0,0 +1,21 @@ +package io.mifos.reporting; + +import io.mifos.reporting.api.v1.domain.ReportDefinition; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +public class TestSavingListReportSpecification extends AbstractReportingSpecificationTest { + public TestSavingListReportSpecification() { + super(); + } + + @Test + public void shouldReturnReportDefinition() { + final List<ReportDefinition> reportDefinitions = super.testSubject.fetchReportDefinitions("Deposit"); + Assert.assertTrue( + reportDefinitions.stream().anyMatch(reportDefinition -> reportDefinition.getIdentifier().equals("Listing")) + ); + } +} diff --git a/service/src/main/java/io/mifos/reporting/service/internal/specification/SavingListReportSpecification.java b/service/src/main/java/io/mifos/reporting/service/internal/specification/SavingListReportSpecification.java index 1c6fdf0..8496a04 100644 --- a/service/src/main/java/io/mifos/reporting/service/internal/specification/SavingListReportSpecification.java +++ b/service/src/main/java/io/mifos/reporting/service/internal/specification/SavingListReportSpecification.java @@ -2,40 +2,49 @@ package io.mifos.reporting.service.internal.specification; import io.mifos.reporting.api.v1.domain.*; import io.mifos.reporting.service.ServiceConstants; -import io.mifos.reporting.service.spi.Report; -import io.mifos.reporting.service.spi.ReportSpecification; +import io.mifos.reporting.service.spi.*; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import javax.persistence.EntityManager; +import javax.persistence.Query; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; -@Report(category = "Saving", identifier = "Listing") -public class SavingListReportSpecification implements ReportSpecification{ - private static final String SAVING_ACCOUNT = "Saving account"; +@Report(category = "Deposit", identifier = "Listing") +public class SavingListReportSpecification implements ReportSpecification { + private static final String CUSTOMER = "Customer"; + private static final String FIRST_NAME = "First name"; + private static final String MIDDLE_NAME = "Middle name"; + private static final String LAST_NAME = "Last name"; private static final String EMPLOYEE = "Employee"; - //private static final String OFFICE = "Office"; - private static final String DATE_RANGE = "Date range"; + private static final String ACCOUNT_NUMBER = "Account number"; + private static final String ACCOUNT_TYPE = "Account type"; + private static final String STATE = "State"; + private static final String OFFICE = "Office"; + private static final String DATE_RANGE = "Date created"; private final EntityManager entityManager; private final Logger logger; private final HashMap<String, String> customerColumnMapping = new HashMap<>(); - private final HashMap<String, String> savingAccountColumnMapping = new HashMap<>(); - // private final HashMap<String, String> officeColumnMapping = new HashMap<>(); + private final HashMap<String, String> accountColumnMapping = new HashMap<>(); + private final HashMap<String, String> officeColumnMapping = new HashMap<>(); private final HashMap<String, String> employeeColumnMapping = new HashMap<>(); private final HashMap<String, String> allColumnMapping = new HashMap<>(); @Autowired - public SavingListReportSpecification(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger, final EntityManager entityManager){ + public SavingListReportSpecification(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger, final EntityManager entityManager) { this.entityManager = entityManager; this.logger = logger; + this.initializeMapping(); } @@ -53,37 +62,161 @@ public class SavingListReportSpecification implements ReportSpecification{ @Override public ReportPage generateReport(ReportRequest reportRequest, int pageIndex, int size) { + final ReportDefinition reportDefinition = this.getReportDefinition(); + this.logger.info("Generating report {0} ", reportDefinition.getIdentifier()); + + final ReportPage reportPage = new ReportPage(); + reportPage.setName(reportDefinition.getName()); + reportPage.setDescription(reportDefinition.getDescription()); + reportPage.setHeader(this.createHeader(reportRequest.getDisplayableFields())); + + final Query depositAccountQuery = this.entityManager.createNativeQuery(this.buildAccountQuery(reportRequest, pageIndex, size)); + + final List<?> depositAccountResultList = depositAccountQuery.getResultList(); + reportPage.setRows(this.buildRows(reportRequest, depositAccountResultList)); + + return null; + } + + private List<Row> buildRows(ReportRequest reportRequest, List<?> customerResultList) { return null; } + private List<QueryParameter> buildQueryParameters() { + return Arrays.asList( + QueryParameterBuilder.create(DATE_RANGE, Type.DATE).operator(QueryParameter.Operator.BETWEEN).build(), + QueryParameterBuilder.create(STATE, Type.TEXT).operator(QueryParameter.Operator.IN).build() + ); + } + @Override public void validate(ReportRequest reportRequest) throws IllegalArgumentException { + final ArrayList<String> unknownFields = new ArrayList<>(); + reportRequest.getQueryParameters().forEach(queryParameter -> { + if (!this.allColumnMapping.keySet().contains(queryParameter.getName())) { + unknownFields.add(queryParameter.getName()); + } + }); + + reportRequest.getDisplayableFields().forEach(displayableField -> { + if (!this.allColumnMapping.keySet().contains(displayableField.getName())) { + unknownFields.add(displayableField.getName()); + } + }); + + if (!unknownFields.isEmpty()) { + throw new IllegalArgumentException( + "Unspecified fields requested: " + unknownFields.stream().collect(Collectors.joining(", ")) + ); + } } - public String buildSavingAccountQuery(){ + private void initializeMapping() { + this.customerColumnMapping.put(CUSTOMER, "cst.identifier"); + this.customerColumnMapping.put(FIRST_NAME, "cst.given_name"); + this.customerColumnMapping.put(MIDDLE_NAME, "cst.middle_name"); + this.customerColumnMapping.put(LAST_NAME, "cst.surname"); + + this.officeColumnMapping.put(OFFICE, "cst.assigned_office"); + + this.employeeColumnMapping.put(EMPLOYEE, "pi.created_by"); - return "SELECT ... FROM shed_product_instances pi"; + this.accountColumnMapping.put(ACCOUNT_NUMBER, "pi.customer_identifier, pi.account_identifier"); + this.accountColumnMapping.put(STATE, " pi.a_state"); + this.accountColumnMapping.put(ACCOUNT_TYPE, "pi.product_definition_id"); + this.accountColumnMapping.put(DATE_RANGE, "pi.created_on"); + this.allColumnMapping.putAll(customerColumnMapping); + this.allColumnMapping.putAll(officeColumnMapping); + this.allColumnMapping.putAll(employeeColumnMapping); + this.allColumnMapping.putAll(accountColumnMapping); } - public String buildCustomerQuery(){ + private String buildAccountQuery(final ReportRequest reportRequest, int pageIndex, int size) { + final StringBuilder query = new StringBuilder("SELECT "); + + final List<DisplayableField> displayableFields = reportRequest.getDisplayableFields(); + final ArrayList<String> columns = new ArrayList<>(); + displayableFields.forEach(displayableField -> { + final String column = this.accountColumnMapping.get(displayableField.getName()) + + this.employeeColumnMapping.get(displayableField.getName()); + if (column != null) { + columns.add(column); + } + }); + + query.append(columns.stream().collect(Collectors.joining(", "))) + .append(" FROM ") + .append("shed_product_instances pi "); + final List<QueryParameter> queryParameters = reportRequest.getQueryParameters(); + if (!queryParameters.isEmpty()) { + final ArrayList<String> criteria = new ArrayList<>(); + queryParameters.forEach(queryParameter -> { + if (queryParameter.getValue() != null && !queryParameter.getValue().isEmpty()) { + criteria.add( + CriteriaBuilder.buildCriteria(this.accountColumnMapping.get(queryParameter.getName()), queryParameter) + ); + criteria.add( + CriteriaBuilder.buildCriteria(this.employeeColumnMapping.get(queryParameter.getName()), queryParameter) + ); + } + }); + + if (!criteria.isEmpty()) { + query.append(" WHERE "); + query.append(criteria.stream().collect(Collectors.joining(" AND "))); + } + + } + query.append(" ORDER BY pi.customer_identifier"); + + query.append(" LIMIT "); + query.append(size); + if (pageIndex > 0) { + query.append(" OFFSET "); + query.append(size * pageIndex); + } + + return query.toString(); + + // return "SELECT ... FROM shed_product_instances pi"; - return null; } - private void initializeMapping(){ - this.customerColumnMapping.put(CUSTOMER, "cst.identifier, cst.given_name, cst.middle_name, " + - "cst.surname, cst.assigned_office"); - this.employeeColumnMapping.put(EMPLOYEE, "pi.created_by"); - this.savingAccountColumnMapping.put(SAVING_ACCOUNT, "pi.customer_identifier, pi.product_definition_id, pi.account_identifier, pi.a_state"); - this.savingAccountColumnMapping.put(DATE_RANGE, "pi.created_on"); + private String buildCustomerQuery(final ReportRequest reportRequest, final String customerIdentifier) { + final List<DisplayableField> displayableFields = reportRequest.getDisplayableFields(); + final ArrayList<String> columns = new ArrayList<>(); + displayableFields.forEach(displayableField -> { + final String column = this.customerColumnMapping.get(displayableField.getName()); + if (column != null) { + columns.add(column); + } + }); + return "SELECT " + columns.stream().collect(Collectors.joining(", ")) + " " + + "FROM maat_customers cst " + + "LEFT JOIN shed_product_instances pi on cst.identifier = pi.customer_identifier " + + "WHERE pi.customer_identifier ='" + customerIdentifier + "' " + + "ORDER BY cst.identifier"; + } - this.allColumnMapping.putAll(customerColumnMapping); - this.allColumnMapping.putAll(employeeColumnMapping); - this.allColumnMapping.putAll(savingAccountColumnMapping); + private String buildOfficeQuery(final ReportRequest reportRequest, final String customerIdentifier) { + final List<DisplayableField> displayableFields = reportRequest.getDisplayableFields(); + final ArrayList<String> columns = new ArrayList<>(); + displayableFields.forEach(displayableField -> { + final String column = this.officeColumnMapping.get(displayableField.getName()); + if (column != null) { + columns.add(column); + } + }); + + return "SELECT " + columns.stream().collect(Collectors.joining(", ")) + " " + + "FROM maat_customers cst " + + "WHERE cst.identifier ='" + customerIdentifier + "' " + + "ORDER BY cst.identifier"; } + private Header createHeader(final List<DisplayableField> displayableFields) { final Header header = new Header(); header.setColumnNames( @@ -98,12 +231,18 @@ public class SavingListReportSpecification implements ReportSpecification{ private List<DisplayableField> buildDisplayableFields() { - return null; - } - - private List<QueryParameter> buildQueryParameters(){ + return Arrays.asList( + DisplayableFieldBuilder.create(CUSTOMER, Type.TEXT).mandatory().build(), + DisplayableFieldBuilder.create(FIRST_NAME, Type.TEXT).build(), + DisplayableFieldBuilder.create(MIDDLE_NAME, Type.TEXT).build(), + DisplayableFieldBuilder.create(LAST_NAME, Type.TEXT).build(), + DisplayableFieldBuilder.create(ACCOUNT_NUMBER, Type.TEXT).mandatory().build(), + DisplayableFieldBuilder.create(EMPLOYEE, Type.TEXT).mandatory().build(), + DisplayableFieldBuilder.create(OFFICE, Type.TEXT).mandatory().build(), + DisplayableFieldBuilder.create(DATE_RANGE, Type.TEXT).build() + ); - return null; } + }
