From d3eed8d57db2625e34e0fe9e7e1e745a51908beb Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 19 Aug 2018 18:17:51 +0530 Subject: [PATCH 1/2] Added total outstanding amount to loan repayment workbook --- .../constants/LoanRepaymentConstants.java | 33 +++++---- .../LoanRepaymentWorkbookPopulator.java | 68 ++++++++++++------- 2 files changed, 63 insertions(+), 38 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/constants/LoanRepaymentConstants.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/constants/LoanRepaymentConstants.java index 4a35d9461..8fe2c6f36 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/constants/LoanRepaymentConstants.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/constants/LoanRepaymentConstants.java @@ -26,19 +26,22 @@ public class LoanRepaymentConstants { public static final int LOAN_ACCOUNT_NO_COL = 3;//D public static final int PRODUCT_COL = 4;//E public static final int PRINCIPAL_COL = 5;//F - public static final int AMOUNT_COL = 6;//G - public static final int REPAID_ON_DATE_COL = 7;//H - public static final int REPAYMENT_TYPE_COL = 8;//I - public static final int ACCOUNT_NO_COL = 9;//J - public static final int CHECK_NO_COL = 10;//K - public static final int ROUTING_CODE_COL = 11;//L - public static final int RECEIPT_NO_COL = 12;//M - public static final int BANK_NO_COL = 13;//N - public static final int STATUS_COL = 14;//O - public static final int LOOKUP_CLIENT_NAME_COL = 15;//P - public static final int LOOKUP_CLIENT_EXTERNAL_ID = 16;//Q - public static final int LOOKUP_ACCOUNT_NO_COL = 17;//R - public static final int LOOKUP_PRODUCT_COL = 18;//S - public static final int LOOKUP_PRINCIPAL_COL = 19;//T - public static final int LOOKUP_LOAN_DISBURSEMENT_DATE_COL = 20;//U + public static final int TOTAL_OUTSTANDING_AMOUNT_COL=6; + public static final int LOAN_DISBURSEMENT_DATE_COL=7; + public static final int AMOUNT_COL = 8;//G + public static final int REPAID_ON_DATE_COL = 9;//H + public static final int REPAYMENT_TYPE_COL = 10;//I + public static final int ACCOUNT_NO_COL = 11;//J + public static final int CHECK_NO_COL = 12;//K + public static final int ROUTING_CODE_COL = 13;//L + public static final int RECEIPT_NO_COL = 14;//M + public static final int BANK_NO_COL = 15;//N + public static final int STATUS_COL = 16;//O + public static final int LOOKUP_CLIENT_NAME_COL = 17;//P + public static final int LOOKUP_CLIENT_EXTERNAL_ID = 18;//Q + public static final int LOOKUP_ACCOUNT_NO_COL = 19;//R + public static final int LOOKUP_PRODUCT_COL = 20;//S + public static final int LOOKUP_PRINCIPAL_COL = 21;//T + public static final int LOOKUP_TOTAL_OUTSTANDING_AMOUNT_COL=22; + public static final int LOOKUP_LOAN_DISBURSEMENT_DATE_COL = 23;//U } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/loanrepayment/LoanRepaymentWorkbookPopulator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/loanrepayment/LoanRepaymentWorkbookPopulator.java index 04646fbcc..adf9b6782 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/loanrepayment/LoanRepaymentWorkbookPopulator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/loanrepayment/LoanRepaymentWorkbookPopulator.java @@ -45,7 +45,7 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { private Map clientIdToClientExternalId; public LoanRepaymentWorkbookPopulator(List loans, OfficeSheetPopulator officeSheetPopulator, - ClientSheetPopulator clientSheetPopulator, ExtrasSheetPopulator extrasSheetPopulator) { + ClientSheetPopulator clientSheetPopulator, ExtrasSheetPopulator extrasSheetPopulator) { this.allloans = loans; this.officeSheetPopulator = officeSheetPopulator; this.clientSheetPopulator = clientSheetPopulator; @@ -62,7 +62,7 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { setClientIdToClientExternalId(); populateLoansTable(loanRepaymentSheet,dateFormat); setRules(loanRepaymentSheet,dateFormat); - setDefaults(loanRepaymentSheet); + setDefaults(loanRepaymentSheet,dateFormat); } private void setClientIdToClientExternalId() { @@ -70,27 +70,41 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { Listallclients=clientSheetPopulator.getClients(); for (ClientData client: allclients) { if (client.getExternalId()!=null) - clientIdToClientExternalId.put(client.getId(),client.getExternalId()); + clientIdToClientExternalId.put(client.getId(),client.getExternalId()); } } - private void setDefaults(Sheet worksheet) { - for (Integer rowNo = 1; rowNo < 3000; rowNo++) { - Row row = worksheet.getRow(rowNo); - if (row == null) - row = worksheet.createRow(rowNo); - writeFormula(LoanRepaymentConstants.CLIENT_EXTERNAL_ID, row, - "IF(ISERROR(VLOOKUP($B"+(rowNo+1)+",$P$2:$Q$"+(allloans.size()+1)+",2,FALSE))," + - "\"\",(VLOOKUP($B"+(rowNo+1)+",$P$2:$Q$"+(allloans.size()+1)+",2,FALSE)))"); - writeFormula(LoanRepaymentConstants.PRODUCT_COL, row, - "IF(ISERROR(VLOOKUP($D" + (rowNo + 1) + ",$R$2:$T$" + (allloans.size() + 1) - + ",2,FALSE)),\"\",VLOOKUP($D" + (rowNo + 1) + ",$R$2:$T$" + (allloans.size() + 1) - + ",2,FALSE))"); - writeFormula(LoanRepaymentConstants.PRINCIPAL_COL, row, - "IF(ISERROR(VLOOKUP($D" + (rowNo + 1) + ",$R$2:$T$" + (allloans.size() + 1) - + ",3,FALSE)),\"\",VLOOKUP($D" + (rowNo + 1) + ",$R$2:$T$" + (allloans.size() + 1) - + ",3,FALSE))"); - } + private void setDefaults(Sheet worksheet,String dateFormat) { + for (Integer rowNo = 1; rowNo < 3000; rowNo++) { + Row row = worksheet.getRow(rowNo); + if (row == null) + row = worksheet.createRow(rowNo); + writeFormula(LoanRepaymentConstants.CLIENT_EXTERNAL_ID, row, + "IF(ISERROR(VLOOKUP($B"+(rowNo+1)+",$R$2:$S$"+(allloans.size()+1)+",2,FALSE))," + + "\"\",(VLOOKUP($B"+(rowNo+1)+",$R$2:$S$"+(allloans.size()+1)+",2,FALSE)))"); + writeFormula(LoanRepaymentConstants.PRODUCT_COL, row, + "IF(ISERROR(VLOOKUP($D" + (rowNo + 1) + ",$T$2:$X$" + (allloans.size() + 1) + + ",2,FALSE)),\"\",VLOOKUP($D" + (rowNo + 1) + ",$T$2:$X$" + (allloans.size() + 1) + + ",2,FALSE))"); + writeFormula(LoanRepaymentConstants.PRINCIPAL_COL, row, + "IF(ISERROR(VLOOKUP($D" + (rowNo + 1) + ",$T$2:$X$" + (allloans.size() + 1) + + ",3,FALSE)),\"\",VLOOKUP($D" + (rowNo + 1) + ",$T$2:$X$" + (allloans.size() + 1) + + ",3,FALSE))"); + writeFormula(LoanRepaymentConstants.TOTAL_OUTSTANDING_AMOUNT_COL, row, + "IF(ISERROR(VLOOKUP($D" + (rowNo + 1) + ",$T$2:$X$" + (allloans.size() + 1) + + ",4,FALSE)),\"\",VLOOKUP($D" + (rowNo + 1) + ",$T$2:$X$" + (allloans.size() + 1) + + ",4,FALSE))"); + + writeFormula(LoanRepaymentConstants.LOAN_DISBURSEMENT_DATE_COL, row, + "IF(ISERROR(VLOOKUP($D" + (rowNo + 1) + ",$T$2:$X$" + (allloans.size() + 1) + + ",5,FALSE)),\"\",VLOOKUP($D" + (rowNo + 1) + ",$T$2:$X$" + (allloans.size() + 1) + + ",5,FALSE))"); + Workbook workbook=worksheet.getWorkbook(); + CellStyle dateCellStyle = workbook.createCellStyle(); + short df = workbook.createDataFormat().getFormat(dateFormat); + dateCellStyle.setDataFormat(df); + row.getCell(LoanRepaymentConstants.LOAN_DISBURSEMENT_DATE_COL).setCellStyle(dateCellStyle); + } } private void setRules(Sheet worksheet,String dateFormat) { @@ -117,7 +131,7 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { DataValidationConstraint paymentTypeConstraint = validationHelper.createFormulaListConstraint("PaymentTypes"); DataValidationConstraint repaymentDateConstraint = validationHelper.createDateConstraint( DataValidationConstraint.OperatorType.BETWEEN, - "=VLOOKUP($D1,$R$2:$U$" + (allloans.size() + 1) + ",4,FALSE)", "=TODAY()", dateFormat); + "=VLOOKUP($D1,$T$2:$X$" + (allloans.size() + 1) + ",4,FALSE)", "=TODAY()", dateFormat); DataValidation officeValidation = validationHelper.createValidation(officeNameConstraint, officeNameRange); DataValidation clientValidation = validationHelper.createValidation(clientNameConstraint, clientNameRange); @@ -182,13 +196,13 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { } } - // Account Number Named after Clients + // Account Number Named after Clients for (int j = 0; j < clientsWithActiveLoans.size(); j++) { Name name = loanRepaymentWorkbook.createName(); name.setNameName("Account_" + clientsWithActiveLoans.get(j).replaceAll(" ", "_") + "_" + clientIdsWithActiveLoans.get(j) + "_"); name.setRefersToFormula( - TemplatePopulateImportConstants.LOAN_REPAYMENT_SHEET_NAME+"!$R$" + clientNameToBeginEndIndexes.get(clientsWithActiveLoans.get(j))[0] + ":$R$" + TemplatePopulateImportConstants.LOAN_REPAYMENT_SHEET_NAME+"!$T$" + clientNameToBeginEndIndexes.get(clientsWithActiveLoans.get(j))[0] + ":$T$" + clientNameToBeginEndIndexes.get(clientsWithActiveLoans.get(j))[1]); } @@ -216,6 +230,8 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { writeString(LoanRepaymentConstants.LOOKUP_ACCOUNT_NO_COL, row, Long.parseLong(loan.getAccountNo())+"-"+loan.getStatusStringValue()); writeString(LoanRepaymentConstants.LOOKUP_PRODUCT_COL, row, loan.getLoanProductName()); writeDouble(LoanRepaymentConstants.LOOKUP_PRINCIPAL_COL, row, loan.getPrincipal().doubleValue()); + if (loan.getTotalOutstandingAmount() != null) + writeBigDecimal(LoanRepaymentConstants.LOOKUP_TOTAL_OUTSTANDING_AMOUNT_COL, row, loan.getTotalOutstandingAmount()); if (loan.getDisbursementDate() != null) { try { date = inputFormat.parse(loan.getDisbursementDate().toString()); @@ -237,6 +253,8 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { worksheet.setColumnWidth(LoanRepaymentConstants.LOAN_ACCOUNT_NO_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); worksheet.setColumnWidth(LoanRepaymentConstants.PRODUCT_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); worksheet.setColumnWidth(LoanRepaymentConstants.PRINCIPAL_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); + worksheet.setColumnWidth(LoanRepaymentConstants.TOTAL_OUTSTANDING_AMOUNT_COL,TemplatePopulateImportConstants.MEDIUM_COL_SIZE); + worksheet.setColumnWidth(LoanRepaymentConstants.LOAN_DISBURSEMENT_DATE_COL,TemplatePopulateImportConstants.MEDIUM_COL_SIZE); worksheet.setColumnWidth(LoanRepaymentConstants.AMOUNT_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); worksheet.setColumnWidth(LoanRepaymentConstants.REPAID_ON_DATE_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); worksheet.setColumnWidth(LoanRepaymentConstants.REPAYMENT_TYPE_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); @@ -250,6 +268,7 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { worksheet.setColumnWidth(LoanRepaymentConstants.LOOKUP_ACCOUNT_NO_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); worksheet.setColumnWidth(LoanRepaymentConstants.LOOKUP_PRODUCT_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); worksheet.setColumnWidth(LoanRepaymentConstants.LOOKUP_PRINCIPAL_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); + worksheet.setColumnWidth(LoanRepaymentConstants.LOOKUP_TOTAL_OUTSTANDING_AMOUNT_COL,TemplatePopulateImportConstants.LARGE_COL_SIZE); worksheet.setColumnWidth(LoanRepaymentConstants.LOOKUP_LOAN_DISBURSEMENT_DATE_COL, TemplatePopulateImportConstants.SMALL_COL_SIZE); writeString(LoanRepaymentConstants.OFFICE_NAME_COL, rowHeader, "Office Name*"); writeString(LoanRepaymentConstants.CLIENT_NAME_COL, rowHeader, "Client Name*"); @@ -257,6 +276,8 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { writeString(LoanRepaymentConstants.LOAN_ACCOUNT_NO_COL, rowHeader, "Loan Account No.*"); writeString(LoanRepaymentConstants.PRODUCT_COL, rowHeader, "Product Name"); writeString(LoanRepaymentConstants.PRINCIPAL_COL, rowHeader, "Principal"); + writeString(LoanRepaymentConstants.TOTAL_OUTSTANDING_AMOUNT_COL,rowHeader,"Total Outstanding Amount"); + writeString(LoanRepaymentConstants.LOAN_DISBURSEMENT_DATE_COL,rowHeader,"Loan Disbursement Date"); writeString(LoanRepaymentConstants.AMOUNT_COL, rowHeader, "Amount Repaid*"); writeString(LoanRepaymentConstants.REPAID_ON_DATE_COL, rowHeader, "Date*"); writeString(LoanRepaymentConstants.REPAYMENT_TYPE_COL, rowHeader, "Type*"); @@ -270,6 +291,7 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { writeString(LoanRepaymentConstants.LOOKUP_ACCOUNT_NO_COL, rowHeader, "Lookup Account"); writeString(LoanRepaymentConstants.LOOKUP_PRODUCT_COL, rowHeader, "Lookup Product"); writeString(LoanRepaymentConstants.LOOKUP_PRINCIPAL_COL, rowHeader, "Lookup Principal"); + writeString(LoanRepaymentConstants.LOOKUP_TOTAL_OUTSTANDING_AMOUNT_COL,rowHeader,"Lookup Total Outstanding amount"); writeString(LoanRepaymentConstants.LOOKUP_LOAN_DISBURSEMENT_DATE_COL, rowHeader, "Lookup Loan Disbursement Date"); } From 7a77cfd193d90a4fd25c53d21f9d0ff2613185ef Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 21 Aug 2018 22:41:54 +0530 Subject: [PATCH 2/2] Fixing loan summary null pointer --- .../portfolio/loanaccount/data/LoanAccountData.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanAccountData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanAccountData.java index 0432cbbb2..4f88adaa1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanAccountData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanAccountData.java @@ -1806,7 +1806,10 @@ public class LoanAccountData { } public BigDecimal getTotalOutstandingAmount() { - return this.summary.getTotalOutstanding(); + if(this.summary!=null) + return this.summary.getTotalOutstanding(); + else + return null; } public boolean isInterestRecalculationEnabled() { @@ -1871,4 +1874,5 @@ public class LoanAccountData { public String getStatusStringValue(){ return this.status.value(); } + }