FINERACT-2202: Bulk import fix

This commit is contained in:
danielales2541
2025-05-22 10:37:36 +02:00
committed by Adam Saghy
parent 5cd604df43
commit 24145ae308
21 changed files with 198 additions and 58 deletions
@@ -116,7 +116,7 @@ public final class CalendarData implements Serializable {
this.dateFormat = dateFormat;
this.locale = locale;
this.description = "";
this.typeId = "1";
this.typeId = "4";
this.id = null;
this.calendarInstanceId = null;
this.entityId = null;
@@ -269,7 +269,7 @@ public final class ClientData implements Comparable<ClientData>, Serializable {
this.clientNonPersonConstitutionOptions = null;
this.clientNonPersonMainBusinessLineOptions = null;
this.clientLegalFormOptions = null;
this.clientNonPersonDetails = null;
this.clientNonPersonDetails = clientNonPersonDetails;
this.isAddressEnabled = null;
this.datatables = null;
this.familyMemberOptions = null;
@@ -72,7 +72,7 @@ public final class SavingsAccountTransactionData implements Serializable {
private final LocalDate submittedOnDate;
private final boolean interestedPostedAsOn;
private final String submittedByUsername;
private final String note;
private String note;
private final boolean isManualTransaction;
private final Boolean isReversal;
private final Long originalTransactionId;
@@ -255,8 +255,8 @@ public final class SavingsAccountTransactionData implements Serializable {
}
public static SavingsAccountTransactionData importInstance(BigDecimal transactionAmount, LocalDate transactionDate, Long paymentTypeId,
String accountNumber, String checkNumber, String routingCode, String receiptNumber, String bankNumber, Long savingsAccountId,
SavingsAccountTransactionEnumData transactionType, Integer rowIndex, String locale, String dateFormat) {
String accountNumber, String checkNumber, String routingCode, String receiptNumber, String bankNumber, String note,
Long savingsAccountId, SavingsAccountTransactionEnumData transactionType, Integer rowIndex, String locale, String dateFormat) {
SavingsAccountTransactionData data = createImport(transactionType, null, savingsAccountId, accountNumber, transactionDate,
transactionAmount, false, transactionDate, false, false);
data.rowIndex = rowIndex;
@@ -265,6 +265,7 @@ public final class SavingsAccountTransactionData implements Serializable {
data.routingCode = routingCode;
data.receiptNumber = receiptNumber;
data.bankNumber = bankNumber;
data.note = note;
data.locale = locale;
data.dateFormat = dateFormat;
return data;
@@ -38,10 +38,11 @@ public final class TransactionConstants {
public static final int ROUTING_CODE_COL = 11;
public static final int RECEIPT_NO_COL = 12;
public static final int BANK_NO_COL = 13;
public static final int STATUS_COL = 14;
public static final int LOOKUP_CLIENT_NAME_COL = 15;
public static final int LOOKUP_ACCOUNT_NO_COL = 16;
public static final int LOOKUP_PRODUCT_COL = 17;
public static final int LOOKUP_OPENING_BALANCE_COL = 18;
public static final int LOOKUP_SAVINGS_ACTIVATION_DATE_COL = 19;
public static final int NOTE_COL = 14;
public static final int STATUS_COL = 15;
public static final int LOOKUP_CLIENT_NAME_COL = 16;
public static final int LOOKUP_ACCOUNT_NO_COL = 17;
public static final int LOOKUP_PRODUCT_COL = 18;
public static final int LOOKUP_OPENING_BALANCE_COL = 19;
public static final int LOOKUP_SAVINGS_ACTIVATION_DATE_COL = 20;
}
@@ -89,9 +89,9 @@ public class ClientEntityImportHandler implements ImportHandler {
officeId = null;
}
String staffName = ImportHandlerUtils.readAsString(ClientEntityConstants.STAFF_NAME_COL, row);
Long staffId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.STAFF_SHEET_NAME), staffName);
if (staffId == 0L) {
staffId = null;
Long staffId = null;
if (staffName != null) {
staffId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.STAFF_SHEET_NAME), staffName);
}
LocalDate incorportionDate = ImportHandlerUtils.readAsDate(ClientEntityConstants.INCOPORATION_DATE_COL, row);
LocalDate incorporationTill = ImportHandlerUtils.readAsDate(ClientEntityConstants.INCOPORATION_VALID_TILL_COL, row);
@@ -90,9 +90,9 @@ public class ClientPersonImportHandler implements ImportHandler {
officeId = null;
}
String staffName = ImportHandlerUtils.readAsString(ClientPersonConstants.STAFF_NAME_COL, row);
Long staffId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.STAFF_SHEET_NAME), staffName);
if (staffId == 0L) {
staffId = null;
Long staffId = null;
if (staffName != null) {
staffId = ImportHandlerUtils.getIdByName(workbook.getSheet(TemplatePopulateImportConstants.STAFF_SHEET_NAME), staffName);
}
ExternalId externalId = externalIdFactory.create(ImportHandlerUtils.readAsString(ClientPersonConstants.EXTERNAL_ID_COL, row));
LocalDate submittedOn = ImportHandlerUtils.readAsDate(ClientPersonConstants.SUBMITTED_ON_COL, row);
@@ -110,8 +110,9 @@ public class FixedDepositTransactionImportHandler implements ImportHandler {
String routingCode = ImportHandlerUtils.readAsString(TransactionConstants.ROUTING_CODE_COL, row);
String receiptNumber = ImportHandlerUtils.readAsString(TransactionConstants.RECEIPT_NO_COL, row);
String bankNumber = ImportHandlerUtils.readAsString(TransactionConstants.BANK_NO_COL, row);
String note = ImportHandlerUtils.readAsString(TransactionConstants.NOTE_COL, row);
return SavingsAccountTransactionData.importInstance(amount, transactionDate, paymentTypeId, accountNumber, checkNumber, routingCode,
receiptNumber, bankNumber, savingsAccountId, savingsAccountTransactionEnumData, row.getRowNum(), locale, dateFormat);
receiptNumber, bankNumber, note, savingsAccountId, savingsAccountTransactionEnumData, row.getRowNum(), locale, dateFormat);
}
@@ -244,11 +244,20 @@ public class GroupImportHandler implements ImportHandler {
gsonBuilder.registerTypeAdapter(LocalDate.class, new DateSerializer(dateFormat, meetings.get(rowIndex).getLocale()));
gsonBuilder.registerTypeAdapter(EnumOptionData.class, new EnumOptionDataValueSerializer());
CalendarData modifiedCalendarData = new CalendarData(calendarData.getTitle(), calendarData.getDescription(),
calendarData.getStartDate(), calendarData.isRepeating(), calendarData.getFrequency(), calendarData.getInterval(),
calendarData.getRepeatsOnDay(), calendarData.getDateFormat(), calendarData.getLocale(), calendarData.getTypeId());
String payload;
CalendarData modifiedCalendarData;
if (calendarData.isRepeating() == false) {
modifiedCalendarData = new CalendarData(calendarData.getTitle(), calendarData.getDescription(), calendarData.getStartDate(),
calendarData.isRepeating(), null, calendarData.getInterval(), calendarData.getRepeatsOnDay(),
calendarData.getDateFormat(), calendarData.getLocale(), calendarData.getTypeId());
String payload = gsonBuilder.create().toJson(modifiedCalendarData);
} else {
modifiedCalendarData = new CalendarData(calendarData.getTitle(), calendarData.getDescription(), calendarData.getStartDate(),
calendarData.isRepeating(), calendarData.getFrequency(), calendarData.getInterval(), calendarData.getRepeatsOnDay(),
calendarData.getDateFormat(), calendarData.getLocale(), calendarData.getTypeId());
}
payload = gsonBuilder.create().toJson(modifiedCalendarData);
CommandWrapper commandWrapper = new CommandWrapper(result.getOfficeId(), result.getGroupId(), result.getClientId(),
result.getLoanId(), result.getSavingsId(), null, null, null, null, null, payload, result.getTransactionId(),
@@ -106,8 +106,9 @@ public class RecurringDepositTransactionImportHandler implements ImportHandler {
String routingCode = ImportHandlerUtils.readAsString(TransactionConstants.ROUTING_CODE_COL, row);
String receiptNumber = ImportHandlerUtils.readAsString(TransactionConstants.RECEIPT_NO_COL, row);
String bankNumber = ImportHandlerUtils.readAsString(TransactionConstants.BANK_NO_COL, row);
String note = ImportHandlerUtils.readAsString(TransactionConstants.NOTE_COL, row);
return SavingsAccountTransactionData.importInstance(amount, transactionDate, paymentTypeId, accountNumber, checkNumber, routingCode,
receiptNumber, bankNumber, savingsAccountId, savingsAccountTransactionEnumData, row.getRowNum(), locale, dateFormat);
receiptNumber, bankNumber, note, savingsAccountId, savingsAccountTransactionEnumData, row.getRowNum(), locale, dateFormat);
}
@@ -109,8 +109,9 @@ public class SavingsTransactionImportHandler implements ImportHandler {
String routingCode = ImportHandlerUtils.readAsString(TransactionConstants.ROUTING_CODE_COL, row);
String receiptNumber = ImportHandlerUtils.readAsString(TransactionConstants.RECEIPT_NO_COL, row);
String bankNumber = ImportHandlerUtils.readAsString(TransactionConstants.BANK_NO_COL, row);
String note = ImportHandlerUtils.readAsString(TransactionConstants.NOTE_COL, row);
return SavingsAccountTransactionData.importInstance(amount, transactionDate, paymentTypeId, accountNumber, checkNumber, routingCode,
receiptNumber, bankNumber, savingsAccountId, savingsAccountTransactionEnumData, row.getRowNum(), locale, dateFormat);
receiptNumber, bankNumber, note, savingsAccountId, savingsAccountTransactionEnumData, row.getRowNum(), locale, dateFormat);
}
@@ -217,16 +217,32 @@ public class ChartOfAccountsWorkbook extends AbstractWorkbookPopulator {
List<String> accountNameAndTagAr = Splitter.on('-').splitToList(accountNameandTag);
writeString(ChartOfAcountsConstants.LOOKUP_ACCOUNT_NAME_COL, row, accountNameAndTagAr.get(0));
writeString(ChartOfAcountsConstants.LOOKUP_ACCOUNT_ID_COL, row, accountNameAndTagAr.get(1));
writeString(ChartOfAcountsConstants.LOOKUP_TAG_COL, row, accountNameAndTagAr.get(2));
writeString(ChartOfAcountsConstants.LOOKUP_TAG_ID_COL, row, accountNameAndTagAr.get(3));
if (accountNameAndTagAr.get(2).equals("null")) {
writeString(ChartOfAcountsConstants.LOOKUP_TAG_COL, row, "");
} else {
writeString(ChartOfAcountsConstants.LOOKUP_TAG_COL, row, accountNameAndTagAr.get(2));
}
if (accountNameAndTagAr.get(3).equals("0")) {
writeString(ChartOfAcountsConstants.LOOKUP_TAG_ID_COL, row, "");
} else {
writeString(ChartOfAcountsConstants.LOOKUP_TAG_ID_COL, row, accountNameAndTagAr.get(3));
}
rowIndex++;
} else {
row = chartOfAccountsSheet.createRow(rowIndex);
List<String> accountNameAndTagAr = Splitter.on('-').splitToList(accountNameandTag);
writeString(ChartOfAcountsConstants.LOOKUP_ACCOUNT_NAME_COL, row, accountNameAndTagAr.get(0));
writeString(ChartOfAcountsConstants.LOOKUP_ACCOUNT_ID_COL, row, accountNameAndTagAr.get(1));
writeString(ChartOfAcountsConstants.LOOKUP_TAG_COL, row, accountNameAndTagAr.get(2));
writeString(ChartOfAcountsConstants.LOOKUP_TAG_ID_COL, row, accountNameAndTagAr.get(3));
if (accountNameAndTagAr.get(2).equals("null")) {
writeString(ChartOfAcountsConstants.LOOKUP_TAG_COL, row, "");
} else {
writeString(ChartOfAcountsConstants.LOOKUP_TAG_COL, row, accountNameAndTagAr.get(2));
}
if (accountNameAndTagAr.get(3).equals("0")) {
writeString(ChartOfAcountsConstants.LOOKUP_TAG_ID_COL, row, "");
} else {
writeString(ChartOfAcountsConstants.LOOKUP_TAG_ID_COL, row, accountNameAndTagAr.get(3));
}
rowIndex++;
}
}
@@ -94,6 +94,8 @@ public class ClientEntityWorkbookPopulator extends AbstractWorkbookPopulator {
setFormatActivationAndSubmittedDate(row, ClientEntityConstants.ACTIVATION_DATE_COL, dateCellStyle);
setFormatActivationAndSubmittedDate(row, ClientEntityConstants.SUBMITTED_ON_COL, dateCellStyle);
setFormatActivationAndSubmittedDate(row, ClientEntityConstants.INCOPORATION_VALID_TILL_COL, dateCellStyle);
setFormatActivationAndSubmittedDate(row, ClientEntityConstants.INCOPORATION_DATE_COL, dateCellStyle);
}
}
@@ -221,7 +223,7 @@ public class ClientEntityWorkbookPopulator extends AbstractWorkbookPopulator {
writeString(ClientEntityConstants.CLIENT_CLASSIFICATION_COL, rowHeader, "Client Classification ");
writeString(ClientEntityConstants.INCOPORATION_NUMBER_COL, rowHeader, "Incorporation Number");
writeString(ClientEntityConstants.MAIN_BUSINESS_LINE, rowHeader, "Main Business Line");
writeString(ClientEntityConstants.CONSTITUTION_COL, rowHeader, "Constitution");
writeString(ClientEntityConstants.CONSTITUTION_COL, rowHeader, "Constitution*");
writeString(ClientEntityConstants.REMARKS_COL, rowHeader, "Remarks");
writeString(ClientEntityConstants.EXTERNAL_ID_COL, rowHeader, "External ID ");
writeString(ClientEntityConstants.SUBMITTED_ON_COL, rowHeader, "Submitted On Date");
@@ -32,7 +32,10 @@ import org.apache.fineract.portfolio.savings.data.SavingsAccountData;
import org.apache.poi.hssf.usermodel.HSSFDataValidationHelper;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
@@ -68,6 +71,7 @@ public class FixedDepositTransactionWorkbookPopulator extends AbstractWorkbookPo
populateSavingsTable(savingsTransactionSheet, dateFormat);
setRules(savingsTransactionSheet, dateFormat);
setDefaults(savingsTransactionSheet);
setTextFormatStyle(workbook, savingsTransactionSheet, TransactionConstants.SAVINGS_ACCOUNT_NO_COL);
}
private void setDefaults(Sheet worksheet) {
@@ -77,11 +81,33 @@ public class FixedDepositTransactionWorkbookPopulator extends AbstractWorkbookPo
row = worksheet.createRow(rowNo);
}
writeFormula(TransactionConstants.PRODUCT_COL, row,
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",2,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",2,FALSE))");
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$R$2:$S$" + (savingsAccounts.size() + 1) + ",2,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$R$2:$T$" + (savingsAccounts.size() + 1) + ",2,FALSE))");
writeFormula(TransactionConstants.OPENING_BALANCE_COL, row,
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",3,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",3,FALSE))");
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$R$2:$T$" + (savingsAccounts.size() + 1) + ",3,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$R$2:$T$" + (savingsAccounts.size() + 1) + ",3,FALSE))");
}
}
private void setTextFormatStyle(Workbook workbook, Sheet worksheet, int... textCols) {
CellStyle textCellStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
short textFmt = createHelper.createDataFormat().getFormat("@");
textCellStyle.setDataFormat(textFmt);
for (int rowIndex = 1; rowIndex < SpreadsheetVersion.EXCEL97.getMaxRows(); rowIndex++) {
Row row = worksheet.getRow(rowIndex);
if (row == null) {
row = worksheet.createRow(rowIndex);
}
for (int col : textCols) {
Cell cell = row.getCell(col);
if (cell == null) {
cell = row.createCell(col);
}
cell.setCellType(CellType.STRING);
cell.setCellStyle(textCellStyle);
}
}
}
@@ -113,7 +139,7 @@ public class FixedDepositTransactionWorkbookPopulator extends AbstractWorkbookPo
DataValidationConstraint paymentTypeConstraint = validationHelper.createFormulaListConstraint("PaymentTypes");
DataValidationConstraint transactionDateConstraint = validationHelper.createDateConstraint(
DataValidationConstraint.OperatorType.BETWEEN,
"=DATEVALUE(VLOOKUP($C1,$Q$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat);
"=DATEVALUE(VLOOKUP($C1,$R$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat);
DataValidation officeValidation = validationHelper.createValidation(officeNameConstraint, officeNameRange);
DataValidation clientValidation = validationHelper.createValidation(clientNameConstraint, clientNameRange);
@@ -179,8 +205,8 @@ public class FixedDepositTransactionWorkbookPopulator extends AbstractWorkbookPo
for (int j = 0; j < clientsWithActiveSavings.size(); j++) {
Name name = savingsTransactionWorkbook.createName();
setSanitized(name, "Account_" + clientsWithActiveSavings.get(j) + "_" + clientIdsWithActiveSavings.get(j) + "_");
name.setRefersToFormula(TemplatePopulateImportConstants.FIXED_DEPOSIT_TRANSACTION_SHEET_NAME + "!$Q$"
+ clientNameToBeginEndIndexes.get(clientsWithActiveSavings.get(j))[0] + ":$Q$"
name.setRefersToFormula(TemplatePopulateImportConstants.FIXED_DEPOSIT_TRANSACTION_SHEET_NAME + "!$R$"
+ clientNameToBeginEndIndexes.get(clientsWithActiveSavings.get(j))[0] + ":$R$"
+ clientNameToBeginEndIndexes.get(clientsWithActiveSavings.get(j))[1]);
}
@@ -233,6 +259,7 @@ public class FixedDepositTransactionWorkbookPopulator extends AbstractWorkbookPo
worksheet.setColumnWidth(TransactionConstants.RECEIPT_NO_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.ROUTING_CODE_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.BANK_NO_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.NOTE_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.LOOKUP_CLIENT_NAME_COL, 5000);
worksheet.setColumnWidth(TransactionConstants.LOOKUP_ACCOUNT_NO_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.LOOKUP_PRODUCT_COL, 3000);
@@ -252,6 +279,7 @@ public class FixedDepositTransactionWorkbookPopulator extends AbstractWorkbookPo
writeString(TransactionConstants.RECEIPT_NO_COL, rowHeader, "Receipt No");
writeString(TransactionConstants.ROUTING_CODE_COL, rowHeader, "Routing Code");
writeString(TransactionConstants.BANK_NO_COL, rowHeader, "Bank No");
writeString(TransactionConstants.NOTE_COL, rowHeader, "Note");
writeString(TransactionConstants.LOOKUP_CLIENT_NAME_COL, rowHeader, "Lookup Client");
writeString(TransactionConstants.LOOKUP_ACCOUNT_NO_COL, rowHeader, "Lookup Account");
writeString(TransactionConstants.LOOKUP_PRODUCT_COL, rowHeader, "Lookup Product");
@@ -207,7 +207,7 @@ public class GroupsWorkbookPopulator extends AbstractWorkbookPopulator {
DataValidationConstraint submittedOnDateConstraint = validationHelper
.createDateConstraint(DataValidationConstraint.OperatorType.LESS_OR_EQUAL, "=TODAY()", null, dateFormat);
DataValidationConstraint meetingStartDateConstraint = validationHelper
.createDateConstraint(DataValidationConstraint.OperatorType.BETWEEN, "=$G1", "=TODAY()", dateFormat);
.createDateConstraint(DataValidationConstraint.OperatorType.BETWEEN, "=$H1", "=TODAY()", dateFormat);
DataValidationConstraint repeatsConstraint = validationHelper.createExplicitListConstraint(
new String[] { TemplatePopulateImportConstants.FREQUENCY_DAILY, TemplatePopulateImportConstants.FREQUENCY_WEEKLY,
TemplatePopulateImportConstants.FREQUENCY_MONTHLY, TemplatePopulateImportConstants.FREQUENCY_YEARLY });
@@ -261,6 +261,15 @@ public class GroupsWorkbookPopulator extends AbstractWorkbookPopulator {
Name repeatsOnWeekly = centerWorkbook.createName();
repeatsOnWeekly.setNameName("Weekly_Days");
repeatsOnWeekly.setRefersToFormula(TemplatePopulateImportConstants.GROUP_SHEET_NAME + "!$IV$2:$IV$8");
Name repeatsOnDaily = centerWorkbook.createName();
repeatsOnDaily.setNameName("Daily_Days");
repeatsOnDaily.setRefersToFormula(TemplatePopulateImportConstants.GROUP_SHEET_NAME + "!$IV$2:$IV$8");
Name repeatOnYearly = centerWorkbook.createName();
repeatOnYearly.setNameName("Yearly_Days");
repeatOnYearly.setRefersToFormula(TemplatePopulateImportConstants.GROUP_SHEET_NAME + "!$IV$2:$IV$8");
Name repeatsOnMonthly = centerWorkbook.createName();
repeatsOnMonthly.setNameName("Monthly_Days");
repeatsOnMonthly.setRefersToFormula(TemplatePopulateImportConstants.GROUP_SHEET_NAME + "!$IV$2:$IV$8");
// Staff Names for each office & center Names for each office
for (Integer i = 0; i < offices.size(); i++) {
@@ -32,7 +32,10 @@ import org.apache.fineract.portfolio.savings.data.SavingsAccountData;
import org.apache.poi.hssf.usermodel.HSSFDataValidationHelper;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
@@ -69,6 +72,7 @@ public class RecurringDepositTransactionWorkbookPopulator extends AbstractWorkbo
populateSavingsTable(savingsTransactionSheet, dateFormat);
setRules(savingsTransactionSheet, dateFormat);
setDefaults(savingsTransactionSheet);
setTextFormatStyle(workbook, savingsTransactionSheet, TransactionConstants.SAVINGS_ACCOUNT_NO_COL);
}
private void setDefaults(Sheet worksheet) {
@@ -78,11 +82,33 @@ public class RecurringDepositTransactionWorkbookPopulator extends AbstractWorkbo
row = worksheet.createRow(rowNo);
}
writeFormula(TransactionConstants.PRODUCT_COL, row,
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",2,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",2,FALSE))");
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$R$2:$S$" + (savingsAccounts.size() + 1) + ",2,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$R$2:$T$" + (savingsAccounts.size() + 1) + ",2,FALSE))");
writeFormula(TransactionConstants.OPENING_BALANCE_COL, row,
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",3,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",3,FALSE))");
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$R$2:$T$" + (savingsAccounts.size() + 1) + ",3,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$R$2:$T$" + (savingsAccounts.size() + 1) + ",3,FALSE))");
}
}
private void setTextFormatStyle(Workbook workbook, Sheet worksheet, int... textCols) {
CellStyle textCellStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
short textFmt = createHelper.createDataFormat().getFormat("@");
textCellStyle.setDataFormat(textFmt);
for (int rowIndex = 1; rowIndex < SpreadsheetVersion.EXCEL97.getMaxRows(); rowIndex++) {
Row row = worksheet.getRow(rowIndex);
if (row == null) {
row = worksheet.createRow(rowIndex);
}
for (int col : textCols) {
Cell cell = row.getCell(col);
if (cell == null) {
cell = row.createCell(col);
}
cell.setCellType(CellType.STRING);
cell.setCellStyle(textCellStyle);
}
}
}
@@ -114,7 +140,7 @@ public class RecurringDepositTransactionWorkbookPopulator extends AbstractWorkbo
DataValidationConstraint paymentTypeConstraint = validationHelper.createFormulaListConstraint("PaymentTypes");
DataValidationConstraint transactionDateConstraint = validationHelper.createDateConstraint(
DataValidationConstraint.OperatorType.BETWEEN,
"=DATEVALUE(VLOOKUP($C1,$Q$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat);
"=DATEVALUE(VLOOKUP($C1,$R$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat);
DataValidation officeValidation = validationHelper.createValidation(officeNameConstraint, officeNameRange);
DataValidation clientValidation = validationHelper.createValidation(clientNameConstraint, clientNameRange);
@@ -180,8 +206,8 @@ public class RecurringDepositTransactionWorkbookPopulator extends AbstractWorkbo
for (int j = 0; j < clientsWithActiveSavings.size(); j++) {
Name name = savingsTransactionWorkbook.createName();
setSanitized(name, "Account_" + clientsWithActiveSavings.get(j) + "_" + clientIdsWithActiveSavings.get(j) + "_");
name.setRefersToFormula(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME + "!$Q$"
+ clientNameToBeginEndIndexes.get(clientsWithActiveSavings.get(j))[0] + ":$Q$"
name.setRefersToFormula(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME + "!$R$"
+ clientNameToBeginEndIndexes.get(clientsWithActiveSavings.get(j))[0] + ":$R$"
+ clientNameToBeginEndIndexes.get(clientsWithActiveSavings.get(j))[1]);
}
@@ -234,6 +260,7 @@ public class RecurringDepositTransactionWorkbookPopulator extends AbstractWorkbo
worksheet.setColumnWidth(TransactionConstants.RECEIPT_NO_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.ROUTING_CODE_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.BANK_NO_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.NOTE_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.LOOKUP_CLIENT_NAME_COL, 5000);
worksheet.setColumnWidth(TransactionConstants.LOOKUP_ACCOUNT_NO_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.LOOKUP_PRODUCT_COL, 3000);
@@ -253,6 +280,7 @@ public class RecurringDepositTransactionWorkbookPopulator extends AbstractWorkbo
writeString(TransactionConstants.RECEIPT_NO_COL, rowHeader, "Receipt No");
writeString(TransactionConstants.ROUTING_CODE_COL, rowHeader, "Routing Code");
writeString(TransactionConstants.BANK_NO_COL, rowHeader, "Bank No");
writeString(TransactionConstants.NOTE_COL, rowHeader, "Note");
writeString(TransactionConstants.LOOKUP_CLIENT_NAME_COL, rowHeader, "Lookup Client");
writeString(TransactionConstants.LOOKUP_ACCOUNT_NO_COL, rowHeader, "Lookup Account");
writeString(TransactionConstants.LOOKUP_PRODUCT_COL, rowHeader, "Lookup Product");
@@ -32,7 +32,10 @@ import org.apache.fineract.portfolio.savings.data.SavingsAccountData;
import org.apache.poi.hssf.usermodel.HSSFDataValidationHelper;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
@@ -68,6 +71,7 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula
populateSavingsTable(savingsTransactionSheet, dateFormat);
setRules(savingsTransactionSheet, dateFormat);
setDefaults(savingsTransactionSheet);
setTextFormatStyle(workbook, savingsTransactionSheet, TransactionConstants.SAVINGS_ACCOUNT_NO_COL);
}
private void setDefaults(Sheet worksheet) {
@@ -77,11 +81,33 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula
row = worksheet.createRow(rowNo);
}
writeFormula(TransactionConstants.PRODUCT_COL, row,
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",2,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",2,FALSE))");
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$R$2:$S$" + (savingsAccounts.size() + 1) + ",2,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$R$2:$T$" + (savingsAccounts.size() + 1) + ",2,FALSE))");
writeFormula(TransactionConstants.OPENING_BALANCE_COL, row,
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",3,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$Q$2:$S$" + (savingsAccounts.size() + 1) + ",3,FALSE))");
"IF(ISERROR(VLOOKUP($C" + (rowNo + 1) + ",$R$2:$T$" + (savingsAccounts.size() + 1) + ",3,FALSE)),\"\",VLOOKUP($C"
+ (rowNo + 1) + ",$R$2:$T$" + (savingsAccounts.size() + 1) + ",3,FALSE))");
}
}
private void setTextFormatStyle(Workbook workbook, Sheet worksheet, int... textCols) {
CellStyle textCellStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
short textFmt = createHelper.createDataFormat().getFormat("@");
textCellStyle.setDataFormat(textFmt);
for (int rowIndex = 1; rowIndex < SpreadsheetVersion.EXCEL97.getMaxRows(); rowIndex++) {
Row row = worksheet.getRow(rowIndex);
if (row == null) {
row = worksheet.createRow(rowIndex);
}
for (int col : textCols) {
Cell cell = row.getCell(col);
if (cell == null) {
cell = row.createCell(col);
}
cell.setCellType(CellType.STRING);
cell.setCellStyle(textCellStyle);
}
}
}
@@ -113,7 +139,7 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula
DataValidationConstraint paymentTypeConstraint = validationHelper.createFormulaListConstraint("PaymentTypes");
DataValidationConstraint transactionDateConstraint = validationHelper.createDateConstraint(
DataValidationConstraint.OperatorType.BETWEEN,
"=DATEVALUE(VLOOKUP($C1,$Q$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat);
"=DATEVALUE(VLOOKUP($C1,$R$2:$T$" + (savingsAccounts.size() + 1) + ",4,FALSE))", "=TODAY()", dateFormat);
DataValidation officeValidation = validationHelper.createValidation(officeNameConstraint, officeNameRange);
DataValidation clientValidation = validationHelper.createValidation(clientNameConstraint, clientNameRange);
@@ -179,8 +205,8 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula
for (int j = 0; j < clientsWithActiveSavings.size(); j++) {
Name name = savingsTransactionWorkbook.createName();
setSanitized(name, "Account_" + clientsWithActiveSavings.get(j) + "_" + clientIdsWithActiveSavings.get(j) + "_");
name.setRefersToFormula(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME + "!$Q$"
+ clientNameToBeginEndIndexes.get(clientsWithActiveSavings.get(j))[0] + ":$Q$"
name.setRefersToFormula(TemplatePopulateImportConstants.SAVINGS_TRANSACTION_SHEET_NAME + "!$R$"
+ clientNameToBeginEndIndexes.get(clientsWithActiveSavings.get(j))[0] + ":$R$"
+ clientNameToBeginEndIndexes.get(clientsWithActiveSavings.get(j))[1]);
}
@@ -235,6 +261,7 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula
worksheet.setColumnWidth(TransactionConstants.RECEIPT_NO_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.ROUTING_CODE_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.BANK_NO_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.NOTE_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.LOOKUP_CLIENT_NAME_COL, 5000);
worksheet.setColumnWidth(TransactionConstants.LOOKUP_ACCOUNT_NO_COL, 3000);
worksheet.setColumnWidth(TransactionConstants.LOOKUP_PRODUCT_COL, 3000);
@@ -254,6 +281,7 @@ public class SavingsTransactionsWorkbookPopulator extends AbstractWorkbookPopula
writeString(TransactionConstants.RECEIPT_NO_COL, rowHeader, "Receipt No");
writeString(TransactionConstants.ROUTING_CODE_COL, rowHeader, "Routing Code");
writeString(TransactionConstants.BANK_NO_COL, rowHeader, "Bank No");
writeString(TransactionConstants.NOTE_COL, rowHeader, "Note");
writeString(TransactionConstants.LOOKUP_CLIENT_NAME_COL, rowHeader, "Lookup Client");
writeString(TransactionConstants.LOOKUP_ACCOUNT_NO_COL, rowHeader, "Lookup Account");
writeString(TransactionConstants.LOOKUP_PRODUCT_COL, rowHeader, "Lookup Product");
@@ -31,6 +31,7 @@ import org.apache.fineract.portfolio.savings.data.SavingsProductData;
import org.apache.poi.hssf.usermodel.HSSFDataValidationHelper;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
@@ -158,6 +159,7 @@ public class SavingsWorkbookPopulator extends AbstractWorkbookPopulator {
dateCellStyle.setDataFormat(df);
for (Integer rowNo = 1; rowNo < 1000; rowNo++) {
Row row = worksheet.createRow(rowNo);
setFormatStyle(worksheet, row);
writeFormula(SavingsConstants.CURRENCY_COL, row, "IF(ISERROR(INDIRECT(CONCATENATE(\"Currency_\",$D" + (rowNo + 1)
+ "))),\"\",INDIRECT(CONCATENATE(\"Currency_\",$D" + (rowNo + 1) + ")))");
writeFormula(SavingsConstants.DECIMAL_PLACES_COL, row, "IF(ISERROR(INDIRECT(CONCATENATE(\"Decimal_Places_\",$D" + (rowNo + 1)
@@ -190,6 +192,18 @@ public class SavingsWorkbookPopulator extends AbstractWorkbookPopulator {
}
}
private void setFormatStyle(Sheet worksheet, Row row) {
Workbook workbook = worksheet.getWorkbook();
CellStyle dateCellStyle = workbook.createCellStyle();
short df = workbook.createDataFormat().getFormat("dd/MM/yyyy");
dateCellStyle.setDataFormat(df);
Cell submittedOnCell = row.getCell(SavingsConstants.SUBMITTED_ON_DATE_COL);
if (submittedOnCell == null) {
submittedOnCell = row.createCell(SavingsConstants.SUBMITTED_ON_DATE_COL);
}
submittedOnCell.setCellStyle(dateCellStyle);
}
private void setRules(Sheet worksheet, String dateFormat) {
CellRangeAddressList officeNameRange = new CellRangeAddressList(1, SpreadsheetVersion.EXCEL97.getLastRowIndex(),
SavingsConstants.OFFICE_NAME_COL, SavingsConstants.OFFICE_NAME_COL);
@@ -265,8 +265,8 @@ public final class ClientDataValidator {
if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.constitutionIdParamName, element)) {
final Integer constitution = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(ClientApiConstants.constitutionIdParamName,
element);
baseDataValidator.reset().parameter(ClientApiConstants.constitutionIdParamName).value(constitution).ignoreIfNull()
.integerGreaterThanZero();
baseDataValidator.reset().parameter(ClientApiConstants.constitutionIdParamName).value(constitution).integerGreaterThanZero()
.notBlank();
}
if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.mainBusinessLineIdParamName, element)) {
@@ -561,8 +561,8 @@ public final class ClientDataValidator {
atLeastOneParameterPassedForUpdate = true;
final Integer constitutionId = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(ClientApiConstants.constitutionIdParamName,
element);
baseDataValidator.reset().parameter(ClientApiConstants.constitutionIdParamName).value(constitutionId).ignoreIfNull()
.integerGreaterThanZero();
baseDataValidator.reset().parameter(ClientApiConstants.constitutionIdParamName).value(constitutionId).integerGreaterThanZero()
.notBlank();
}
if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.mainBusinessLineIdParamName, element)) {
@@ -66,7 +66,8 @@ public class DepositAccountTransactionDataValidator {
transactionAmountParamName, paymentTypeIdParamName, transactionAccountNumberParamName, checkNumberParamName,
routingCodeParamName, receiptNumberParamName, bankNumberParamName, DepositsApiConstants.amountParamName,
DepositsApiConstants.accountIdParamName, DepositsApiConstants.dateParamName, DepositsApiConstants.submittedOnDateParamName,
DepositsApiConstants.lienTransaction, DepositsApiConstants.isManualTransaction, DepositsApiConstants.chargesPaidByData));
DepositsApiConstants.lienTransaction, DepositsApiConstants.isManualTransaction, DepositsApiConstants.chargesPaidByData,
DepositsApiConstants.accountNoParamName, DepositsApiConstants.noteParamName));
private static final Set<String> DEPOSIT_ACCOUNT_RECOMMENDED_DEPOSIT_AMOUNT_UPDATE_REQUEST_DATA_PARAMETERS = new HashSet<>(
Arrays.asList(DepositsApiConstants.localeParamName, DepositsApiConstants.dateFormatParamName,
@@ -50,7 +50,7 @@ public class SavingsAccountConstant extends SavingsApiConstants {
dateFormatParamName, transactionDateParamName, transactionAmountParamName, paymentTypeIdParamName,
transactionAccountNumberParamName, checkNumberParamName, routingCodeParamName, receiptNumberParamName, bankNumberParamName,
retailEntriesParamName, childAccountIdParamName, noteParamName, amountParamName, dateParamName, isManualTransaction,
lienTransaction, chargesPaidByData, submittedOnDateParamName, accountIdParamName));
lienTransaction, chargesPaidByData, submittedOnDateParamName, accountIdParamName, accountNoParamName));
protected static final Set<String> SAVINGS_ACCOUNT_TRANSACTION_RESPONSE_DATA_PARAMETERS = new HashSet<>(
Arrays.asList(idParamName, accountNoParamName));
@@ -186,7 +186,7 @@ public class SavingsAccountDataValidator {
if (lockinPeriodFrequency != null) {
final Integer lockinPeriodFrequencyType = this.fromApiJsonHelper
.extractIntegerSansLocaleNamed(lockinPeriodFrequencyTypeParamName, element);
baseDataValidator.reset().parameter(lockinPeriodFrequencyTypeParamName).value(lockinPeriodFrequencyType).notNull()
baseDataValidator.reset().parameter(lockinPeriodFrequencyTypeParamName).value(lockinPeriodFrequencyType).ignoreIfNull()
.inMinMaxRange(0, 3);
}
}