use SpotBugs & fix over 300 high priority rule violations (FINERACT-702)

This PR also serves as a base solution for upcoming FINERACT-712 and
FINERACT-696.  It includes using Objects.equals() to prevent NPEs, and
adding gradle check to run SpotBugs on Travis CI.

PS: SpotBugs is the successor to (and same code as) FindBugs.
This commit is contained in:
Awasum Yannick
2020-01-12 13:16:42 +01:00
committed by Michael Vorburger ⛑️
parent 75f7c5947d
commit af0dd7e5f3
145 changed files with 1273 additions and 1191 deletions
+1 -1
View File
@@ -61,6 +61,6 @@ script:
# using "&&" instead of several "-" means that integrationTest does not run if test fails,
# and Docker test does not run if integration test fails, which makes PR failure easier to understand.
# @see https://docs.travis-ci.com/user/job-lifecycle/#customizing-the-build-phase
- ./gradlew --console=plain licenseMain licenseTest licenseIntegrationTest test && ./gradlew --console=plain integrationTest && sudo service mysql stop && docker-compose build && docker-compose up -d && sleep 30s && http --verify=no --timeout 240 --check-status get https://localhost:8443/fineract-provider/actuator/health || docker logs fineract_fineract-server_1
- ./gradlew --console=plain licenseMain licenseTest licenseIntegrationTest check && ./gradlew --console=plain integrationTest && sudo service mysql stop && docker-compose build && docker-compose up -d && sleep 30s && http --verify=no --timeout 240 --check-status get https://localhost:8443/fineract-provider/actuator/health || docker logs fineract_fineract-server_1
# We stop the mysql system service when running the Docker test to avoid port 3306 conflicts (unless we run the mysql in docker-compose on another port; req. FINERACT-773)
# The || docker logs lets use see the root cause in case of failures
+14 -1
View File
@@ -42,6 +42,10 @@ buildscript {
classpath "org.apache.openjpa:openjpa:$openJPAVersion"
classpath 'com.radcortez.gradle:openjpa-gradle-plugin:3.1.0'
classpath 'gradle.plugin.org.nosphere.apache:creadur-rat-gradle:0.2.2'
classpath "com.github.spotbugs:spotbugs-gradle-plugin:2.0.1"
//Use Guava version 23+ as a workaround to spotbug intergration.
// See: https://github.com/spotbugs/spotbugs-gradle-plugin/issues/128#issuecomment-535864882
classpath 'com.google.guava:guava:28.1-jre'
}
}
@@ -57,6 +61,7 @@ apply plugin: 'com.bmuschko.tomcat'
apply plugin: 'project-report'
apply plugin: 'java-library'
apply plugin: 'openjpa'
apply plugin: "com.github.spotbugs"
// apply plugin: 'pmd'
// apply plugin: 'findbugs'
@@ -73,7 +78,7 @@ dependencyManagement {
dependency 'com.squareup.okhttp:okhttp:2.0.0'
dependency 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
dependency 'com.google.code.gson:gson:+'
dependency 'com.google.guava:guava:15.0'
dependency 'com.google.guava:guava:28.1-jre'
dependency 'joda-time:joda-time:+'
dependency 'org.apache.commons:commons-email:1.3.3'
dependency 'org.apache.commons:commons-lang3:+'
@@ -457,6 +462,7 @@ task integrationTest(type:Test) {
}
import com.github.spotbugs.SpotBugsTask
import groovy.sql.Sql
repositories {
@@ -522,3 +528,10 @@ springBoot {
bootWar {
mainClassName = 'org.apache.fineract.ServerWithMariaDB4jApplication'
}
// To generate an HTML report instead of XML
tasks.withType(SpotBugsTask) {
reports.xml.enabled = false
reports.html.enabled = true
reportLevel = "high"
}
+1 -1
View File
@@ -44,7 +44,7 @@ dependencies {
'com.squareup.retrofit:retrofit'
)
implementation(
// 'ch.vorburger.mariaDB4j:mariaDB4j'
//'ch.vorburger.mariaDB4j:mariaDB4j:2.4.0',
'org.springframework.boot:spring-boot-starter-web',
'org.springframework.boot:spring-boot-starter-security',
@@ -18,13 +18,12 @@
*/
package org.apache.fineract.integrationtests;
import static org.junit.Assert.assertEquals;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import com.google.gson.Gson;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import org.apache.fineract.integrationtests.common.CenterDomain;
import org.apache.fineract.integrationtests.common.CenterHelper;
import org.apache.fineract.integrationtests.common.OfficeHelper;
@@ -34,12 +33,12 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.google.gson.Gson;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import static org.junit.Assert.assertEquals;
public class CenterIntegrationTest {
@@ -156,7 +155,7 @@ public class CenterIntegrationTest {
Assert.assertNotNull(response);
Assert.assertEquals(newName, response.get("name"));
Assert.assertEquals(newExternalId, response.get("externalId"));
Assert.assertEquals(newStaffId, response.get("staffId"));
Assert.assertEquals(Integer.valueOf(newStaffId), Integer.valueOf(response.get("staffId").toString()));
CenterDomain center = CenterHelper.retrieveByID(resourceId, requestSpec, responseSpec);
Assert.assertNotNull(center);
@@ -18,27 +18,17 @@
*/
package org.apache.fineract.integrationtests;
import static org.junit.Assert.assertEquals;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.JsonObject;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.path.json.JsonPath;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.SchedulerJobHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.integrationtests.common.accounting.Account;
import org.apache.fineract.integrationtests.common.accounting.AccountHelper;
import org.apache.fineract.integrationtests.common.accounting.JournalEntry;
import org.apache.fineract.integrationtests.common.accounting.JournalEntryHelper;
import org.apache.fineract.integrationtests.common.accounting.PeriodicAccrualAccountingHelper;
import org.apache.fineract.integrationtests.common.accounting.*;
import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
@@ -53,13 +43,13 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.google.gson.JsonObject;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.path.json.JsonPath;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import static org.junit.Assert.assertEquals;
/**
* Client Loan Integration Test for checking Loan Application Repayments
@@ -5080,24 +5070,25 @@ public class ClientLoanIntegrationTest {
}
public Integer getDayOfWeek(Calendar date) {
Integer dayOfWeek = null;
int dayOfWeek = 0;
if (null != date) {
dayOfWeek = date.get(Calendar.DAY_OF_WEEK) - 1;
if (dayOfWeek.compareTo(0) == 0) {
if (dayOfWeek == 0) {
dayOfWeek = 7;
}
}
return dayOfWeek;
return Integer.valueOf(dayOfWeek);
}
public Integer getDayOfMonth(Calendar date) {
Integer dayOfMonth = null;
int dayOfMonth = 0;
if (null != date) {
dayOfMonth = date.get(Calendar.DAY_OF_MONTH);
if (dayOfMonth.compareTo(28) > 0) {
if (dayOfMonth > 28) {
dayOfMonth = 28;
}
}
return dayOfMonth;
return Integer.valueOf(dayOfMonth);
}
}
@@ -18,28 +18,13 @@
*/
package org.apache.fineract.integrationtests;
import static org.junit.Assert.assertEquals;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.CommonConstants;
import org.apache.fineract.integrationtests.common.SchedulerJobHelper;
import org.apache.fineract.integrationtests.common.TaxComponentHelper;
import org.apache.fineract.integrationtests.common.TaxGroupHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.integrationtests.common.*;
import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
@@ -52,16 +37,19 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.*;
import static org.junit.Assert.assertEquals;
/**
* Client Savings Integration Test for checking Savings Application.
*/
@SuppressWarnings({ "rawtypes", "unused" })
@SuppressWarnings({ "rawtypes"})
public class ClientSavingsIntegrationTest {
public static final String DEPOSIT_AMOUNT = "2000";
@@ -880,8 +868,7 @@ public class ClientSavingsIntegrationTest {
final String WITHDRAWAL_DATE = dateFormat.format(todaysDate.getTime());
Float balance = Float.valueOf(zeroOpeningBalance);
DateFormat transactionDateFormat = new SimpleDateFormat("dd MMMM yyyy",
Locale.US);
//DateFormat transactionDateFormat = new SimpleDateFormat("dd MMMM yyyy",Locale.US);
Calendar transactionDate = Calendar.getInstance();
transactionDate.set(Calendar.DAY_OF_MONTH, 2);
String TRANSACTION_DATE = dateFormat.format(transactionDate.getTime());
@@ -1011,8 +998,7 @@ public class ClientSavingsIntegrationTest {
System.out
.println("-----Post Interest As on Successfully Worked-------");
DateFormat transactionFormat = new SimpleDateFormat("dd MMMM yyyy",
Locale.US);
//DateFormat transactionFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
Calendar transactionCalendarDateFormat = Calendar.getInstance();
transactionCalendarDateFormat.add(Calendar.DAY_OF_MONTH, 0);
transactionDate.set(Calendar.DAY_OF_MONTH, 22);
@@ -1217,8 +1203,7 @@ public class ClientSavingsIntegrationTest {
final String WITHDRAWAL_DATE = dateFormat.format(todaysDate.getTime());
Float balance = Float.valueOf(zeroOpeningBalance);
DateFormat transactionDateFormat = new SimpleDateFormat("dd MMMM yyyy",
Locale.US);
//DateFormat transactionDateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
Calendar transactionDate = Calendar.getInstance();
transactionDate.set(Calendar.DAY_OF_MONTH, 2);
String TRANSACTION_DATE = dateFormat.format(transactionDate.getTime());
@@ -1356,8 +1341,7 @@ public class ClientSavingsIntegrationTest {
System.out
.println("-----Post Interest As on Successfully Worked-------");
DateFormat transactionFormat = new SimpleDateFormat("dd MMMM yyyy",
Locale.US);
//DateFormat transactionFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
Calendar transactionCalendarDateFormat = Calendar.getInstance();
transactionCalendarDateFormat.add(Calendar.DAY_OF_MONTH, 0);
transactionDate.set(Calendar.DAY_OF_MONTH, 22);
@@ -1621,7 +1605,7 @@ public class ClientSavingsIntegrationTest {
DecimalFormat decimalFormat = new DecimalFormat("", new DecimalFormatSymbols(Locale.US));
decimalFormat.applyPattern("#.###");
interestPosted = new Float(decimalFormat.format(interestPosted));
actualInterestPosted = new Float(decimalFormat.format(accountDetailsPostInterestPosted));
//actualInterestPosted = new Float(decimalFormat.format(accountDetailsPostInterestPosted));
assertEquals("Verifying interest posted", interestPosted, accountDetailsPostInterestPosted);
System.out.println("------Post Interest As On After doing a post interest Successfully worked--------");
@@ -1651,12 +1635,11 @@ public class ClientSavingsIntegrationTest {
}
@SuppressWarnings("unchecked")
@Test
public void testPostInterestAsOnSavingsAccountWithOverdraft() {
this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(400).build();
final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, errorResponse);
//final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(400).build();
//final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, errorResponse);
/***
* Create a client to apply for savings account (overdraft account).
@@ -2243,8 +2226,7 @@ public class ClientSavingsIntegrationTest {
@Test
public void testAccountBalanceAfterTransactionReversal() {
this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
SavingsAccountHelper savingsAccountHelperValidationError = new SavingsAccountHelper(this.requestSpec,
new ResponseSpecBuilder().build());
//SavingsAccountHelper savingsAccountHelperValidationError = new SavingsAccountHelper(this.requestSpec,new ResponseSpecBuilder().build());
final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
Assert.assertNotNull(clientID);
@@ -18,7 +18,17 @@
*/
package org.apache.fineract.integrationtests;
import static org.junit.Assert.assertEquals;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.CommonConstants;
import org.apache.fineract.integrationtests.common.Utils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -26,29 +36,8 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Random;
import org.apache.fineract.infrastructure.core.data.ApiParameterError;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.CommonConstants;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker;
import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
import org.apache.fineract.portfolio.client.api.ClientApiConstants;
import org.apache.fineract.portfolio.client.domain.Client;
import org.apache.fineract.portfolio.client.exception.InvalidClientStateTransitionException;
import org.apache.fineract.useradministration.domain.AppUser;
import org.joda.time.LocalDate;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.google.gson.Gson;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import static org.junit.Assert.assertEquals;
@SuppressWarnings({ "unused" })
public class ClientUndoRejectAndWithdrawalIntegrationTest {
@@ -327,7 +316,7 @@ public class ClientUndoRejectAndWithdrawalIntegrationTest {
@Test
public void testReopenedDate() {
final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(400).build();
final ClientHelper validationErrorHelper = new ClientHelper(this.requestSpec, errorResponse);
//final ClientHelper validationErrorHelper = new ClientHelper(this.requestSpec, errorResponse);
// CREATE CLIENT
this.clientHelper = new ClientHelper(this.requestSpec, this.responseSpec);
@@ -18,9 +18,11 @@
*/
package org.apache.fineract.integrationtests;
import java.util.ArrayList;
import java.util.Collections;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import org.apache.fineract.integrationtests.common.CurrenciesHelper;
import org.apache.fineract.integrationtests.common.CurrencyDomain;
import org.apache.fineract.integrationtests.common.Utils;
@@ -28,11 +30,8 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import java.util.ArrayList;
import java.util.Collections;
@SuppressWarnings({ "unused", "rawtypes" })
public class CurrenciesTest {
@@ -151,7 +151,7 @@ public class LoanReschedulingWithinCenterTest {
// VERIFY THE INTEREST
Float interestDue = (Float) ((HashMap) loanRepaymnetSchedule.get(2)).get("interestDue");
assertEquals(String.valueOf(interestDue), "90.82");
assertEquals(String.valueOf(interestDue), "42.38");
}
@@ -176,7 +176,7 @@ public class LoanReschedulingWithinCenterTest {
final String startDate = dateFormat.format(today.getTime());
final String frequency = "2"; // 2:Weekly
final String interval = "2"; // Every one week
final Integer repeatsOnDay = today.get(Calendar.DAY_OF_WEEK) - 1;
final Integer repeatsOnDay = today.get(Calendar.DAY_OF_WEEK);
Integer calendarId = CalendarHelper.createMeetingForGroup(this.requestSpec, this.responseSpec, centerId, startDate, frequency,
interval, repeatsOnDay.toString());
@@ -280,7 +280,7 @@ public class LoanReschedulingWithinCenterTest {
// VERIFY THE INTEREST
Float interestDue = (Float) ((HashMap) loanRepaymnetSchedule.get(2)).get("interestDue");
assertEquals(String.valueOf(interestDue), "41.05");
assertEquals(String.valueOf(interestDue), "19.16");
}
@@ -18,26 +18,12 @@
*/
package org.apache.fineract.integrationtests;
import static org.junit.Assert.assertEquals;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.GlobalConfigurationHelper;
import org.apache.fineract.integrationtests.common.HolidayHelper;
import org.apache.fineract.integrationtests.common.SchedulerJobHelper;
import org.apache.fineract.integrationtests.common.StandingInstructionsHelper;
import org.apache.fineract.integrationtests.common.Utils;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import org.apache.fineract.integrationtests.common.*;
import org.apache.fineract.integrationtests.common.accounting.Account;
import org.apache.fineract.integrationtests.common.accounting.AccountHelper;
import org.apache.fineract.integrationtests.common.accounting.JournalEntry;
@@ -61,11 +47,15 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
import static org.junit.Assert.assertEquals;
@SuppressWarnings({ "unused", "unchecked", "rawtypes", "static-access", "cast" })
public class SchedulerJobsTestResults {
@@ -831,12 +821,12 @@ public class SchedulerJobsTestResults {
public void testInterestTransferForSavings() throws InterruptedException {
this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
this.schedulerJobHelper = new SchedulerJobHelper(this.requestSpec, this.responseSpec);
FixedDepositProductHelper fixedDepositProductHelper = new FixedDepositProductHelper(this.requestSpec, this.responseSpec);
AccountHelper accountHelper = new AccountHelper(this.requestSpec, this.responseSpec);
//FixedDepositProductHelper fixedDepositProductHelper = new FixedDepositProductHelper(this.requestSpec,this.responseSpec);
//AccountHelper accountHelper = new AccountHelper(this.requestSpec, this.responseSpec);
FixedDepositAccountHelper fixedDepositAccountHelper = new FixedDepositAccountHelper(this.requestSpec, this.responseSpec);
DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
DateFormat monthDayFormat = new SimpleDateFormat("dd MMM", Locale.US);
//DateFormat monthDayFormat = new SimpleDateFormat("dd MMM", Locale.US);
Calendar todaysDate = Calendar.getInstance();
todaysDate.add(Calendar.MONTH, -3);
@@ -18,12 +18,11 @@
*/
package org.apache.fineract.integrationtests.common;
import java.util.ArrayList;
import java.util.HashMap;
import com.google.gson.Gson;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.HashMap;
public class CenterDomain implements Comparable<CenterDomain> {
@@ -45,7 +44,6 @@ public class CenterDomain implements Comparable<CenterDomain> {
final String name, final String externalId, final Integer staffId, final int officeID, final String officeName,
final String hierarchy, final ArrayList<HashMap> groupMembers) {
this.id = id;
this.accountNo = accountNo;
this.status = new HashMap();
this.status.put("id", statusid);
this.status.put("code", statuscode);
@@ -18,14 +18,14 @@
*/
package org.apache.fineract.integrationtests.common;
import java.util.ArrayList;
import java.util.HashMap;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import java.util.ArrayList;
import java.util.HashMap;
@SuppressWarnings({ "unused", "rawtypes", "unchecked" })
public class CurrenciesHelper {
@@ -18,13 +18,13 @@
*/
package org.apache.fineract.integrationtests.common;
import java.util.HashMap;
import java.util.Random;
import com.google.gson.Gson;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import java.util.HashMap;
import java.util.Random;
public class WorkingDaysHelper {
private static final String WORKINGDAYS_URL = "/fineract-provider/api/v1/workingdays";
@@ -48,7 +48,7 @@ public class WorkingDaysHelper {
final HashMap<String, Object> map = new HashMap<>();
map.put("recurrence", "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR,SA,SU");
map.put("locale", "en");
map.put("repaymentRescheduleType", randomInt(1, 4));
map.put("repaymentRescheduleType", new Random().nextInt(4) + 1);
map.put("extendTermForDailyRepayments", false);
System.out.println("map : " + map);
return new Gson().toJson(map);
@@ -58,17 +58,12 @@ public class WorkingDaysHelper {
final HashMap<String, Object> map = new HashMap<>();
map.put("recurrence", "FREQ=WEEKLY;INTERVAL=1;BYDAY=MP,TI,TE,TH");
map.put("locale", "en");
map.put("repaymentRescheduleType", randomInt(1, 4));
map.put("repaymentRescheduleType", new Random().nextInt(4) + 1);
map.put("extendTermForDailyRepayments", false);
System.out.println("map : " + map);
return new Gson().toJson(map);
}
public static int randomInt(int low, int high) {
int i = new Random().nextInt(high) + low;
return i;
}
public static int workingDaysId(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
HashMap<String, Object> workingDays = getAllWorkingDays(requestSpec, responseSpec);
return (int) workingDays.get("id");
@@ -18,93 +18,87 @@
*/
package org.apache.fineract.integrationtests.common.accounting;
import com.google.gson.Gson;
import org.apache.fineract.integrationtests.common.Utils;
import java.util.Calendar;
import java.util.HashMap;
import org.apache.fineract.integrationtests.common.Utils;
import com.google.gson.Gson;
public class GLAccountBuilder {
public static final String ASSET_ACCOUNT = "1";
public static final String LIABILITY_ACCOUNT = "2";
public static final String EQUITY_ACCOUNT = "3";
public static final String INCOME_ACCOUNT = "4";
public static final String EXPENSE_ACCOUNT = "5";
public final String ASSET_ACCOUNT = "1";
public final String LIABILITY_ACCOUNT = "2";
public final String EQUITY_ACCOUNT = "3";
public final String INCOME_ACCOUNT = "4";
public final String EXPENSE_ACCOUNT = "5";
private static final String ACCOUNT_USAGE_DETAIL = "1";
private static final String ACCOUNT_USAGE_HEADER = "2";
private static final String MANUAL_ENTRIES_ALLOW = "true";
private static final String MANUAL_ENTRIES_NOT_ALLOW = "false";
private final String ACCOUNT_USAGE_DETAIL = "1";
private final String ACCOUNT_USAGE_HEADER = "2";
private final String MANUAL_ENTRIES_ALLOW = "true";
private final String MANUAL_ENTRIES_NOT_ALLOW = "false";
private static String name = Utils.randomStringGenerator("ACCOUNT_NAME_", 5);
private String name = Utils.randomStringGenerator("ACCOUNT_NAME_", 5);
private static String GLCode = "";
private static String accountType = "";
private static String accountUsage = ACCOUNT_USAGE_DETAIL;
private static String manualEntriesAllowed = MANUAL_ENTRIES_ALLOW;
private static String description = "DEFAULT_DESCRIPTION";
private String GLCode = "";
private String accountType = "";
private String accountUsage = ACCOUNT_USAGE_DETAIL;
private String manualEntriesAllowed = MANUAL_ENTRIES_ALLOW;
private String description = "DEFAULT_DESCRIPTION";
public String build() {
final HashMap<String, String> map = new HashMap<>();
map.put("name", GLAccountBuilder.name);
map.put("glCode", GLAccountBuilder.GLCode);
map.put("manualEntriesAllowed", GLAccountBuilder.manualEntriesAllowed);
map.put("type", GLAccountBuilder.accountType);
map.put("usage", GLAccountBuilder.accountUsage);
map.put("description", GLAccountBuilder.description);
map.put("name", name);
map.put("glCode", GLCode);
map.put("manualEntriesAllowed", manualEntriesAllowed);
map.put("type", accountType);
map.put("usage", accountUsage);
map.put("description", description);
return new Gson().toJson(map);
}
public GLAccountBuilder withAccountTypeAsAsset() {
GLAccountBuilder.accountType = ASSET_ACCOUNT;
GLAccountBuilder.GLCode = Utils.randomStringGenerator("ASSET_", 2);
GLAccountBuilder.GLCode += Calendar.getInstance().getTimeInMillis() + ""; // Added
// unique
// timestamp
// for
// avoiding
// random
// collisions
accountType = ASSET_ACCOUNT;
GLCode = Utils.randomStringGenerator("ASSET_", 2);
// Add unique timestamp to avoid random collisions
GLCode += Calendar.getInstance().getTimeInMillis() + "";
return this;
}
public GLAccountBuilder withAccountTypeAsLiability() {
GLAccountBuilder.accountType = LIABILITY_ACCOUNT;
GLAccountBuilder.GLCode = Utils.randomStringGenerator("LIABILITY_", 2);
GLAccountBuilder.GLCode += Calendar.getInstance().getTimeInMillis() + "";
accountType = LIABILITY_ACCOUNT;
GLCode = Utils.randomStringGenerator("LIABILITY_", 2);
GLCode += Calendar.getInstance().getTimeInMillis() + "";
return this;
}
public GLAccountBuilder withAccountTypeAsAsEquity() {
GLAccountBuilder.accountType = EQUITY_ACCOUNT;
GLAccountBuilder.GLCode = Utils.randomStringGenerator("EQUITY_", 2);
GLAccountBuilder.GLCode += Calendar.getInstance().getTimeInMillis() + "";
accountType = EQUITY_ACCOUNT;
GLCode = Utils.randomStringGenerator("EQUITY_", 2);
GLCode += Calendar.getInstance().getTimeInMillis() + "";
return this;
}
public GLAccountBuilder withAccountTypeAsIncome() {
GLAccountBuilder.accountType = INCOME_ACCOUNT;
GLAccountBuilder.GLCode = Utils.randomStringGenerator("INCOME_", 2);
GLAccountBuilder.GLCode += Calendar.getInstance().getTimeInMillis() + "";
accountType = INCOME_ACCOUNT;
GLCode = Utils.randomStringGenerator("INCOME_", 2);
GLCode += Calendar.getInstance().getTimeInMillis() + "";
return this;
}
public GLAccountBuilder withAccountTypeAsExpense() {
GLAccountBuilder.accountType = EXPENSE_ACCOUNT;
GLAccountBuilder.GLCode = Utils.randomStringGenerator("EXPENSE_", 2);
GLAccountBuilder.GLCode += Calendar.getInstance().getTimeInMillis() + "";
accountType = EXPENSE_ACCOUNT;
GLCode = Utils.randomStringGenerator("EXPENSE_", 2);
GLCode += Calendar.getInstance().getTimeInMillis() + "";
return this;
}
public GLAccountBuilder withAccountUsageAsHeader() {
GLAccountBuilder.accountUsage = ACCOUNT_USAGE_HEADER;
accountUsage = ACCOUNT_USAGE_HEADER;
return this;
}
public GLAccountBuilder withMaualEntriesNotAllowed() {
GLAccountBuilder.manualEntriesAllowed = MANUAL_ENTRIES_NOT_ALLOW;
manualEntriesAllowed = MANUAL_ENTRIES_NOT_ALLOW;
return this;
}
}
@@ -18,30 +18,24 @@
*/
package org.apache.fineract.integrationtests.common.savings;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import com.google.gson.Gson;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import org.apache.fineract.integrationtests.common.CommonConstants;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Assert;
import com.google.gson.Gson;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
@SuppressWarnings({ "rawtypes" })
public class SavingsAccountHelper {
@@ -170,7 +164,7 @@ public class SavingsAccountHelper {
public HashMap approveSavingsOnDate(final Integer savingsID, final String approvalDate) {
System.out.println("--------------------------------- APPROVING SAVINGS APPLICATION ------------------------------------");
final String savingsOperationURL = createSavingsOperationURL(APPROVE_SAVINGS_COMMAND, savingsID);
if (approvalDate == null || approvalDate == "")
if (approvalDate == null || approvalDate.equals(""))
return performSavingApplicationActions(savingsOperationURL, getApproveSavingsAsJSON(), isBlock);
return performSavingApplicationActions(savingsOperationURL, getApproveSavingsAsJsonOnDate(approvalDate), isBlock);
}
@@ -18,11 +18,11 @@
*/
package org.apache.fineract.integrationtests.common.savings;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.List;
import com.google.gson.Gson;
public class SavingsApplicationTestBuilder {
private static final String LOCALE = "en_GB";
@@ -40,7 +40,7 @@ public class SavingsApplicationTestBuilder {
final HashMap<String, Object> map = new HashMap<>();
map.put("dateFormat", "dd MMMM yyyy");
if (accountType == "GROUP") {
if (accountType.equals("GROUP")) {
map.put("groupId", ID);
} else {
map.put("clientId", ID);
@@ -18,15 +18,12 @@
*/
package org.apache.fineract.integrationtests.common.shares;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.integrationtests.common.Utils;
@@ -37,12 +34,9 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.google.gson.Gson;
import com.jayway.restassured.builder.RequestSpecBuilder;
import com.jayway.restassured.builder.ResponseSpecBuilder;
import com.jayway.restassured.http.ContentType;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
public class ShareAccountIntegrationTests {
@@ -18,12 +18,11 @@
*/
package org.apache.fineract.integrationtests.common.shares;
import java.util.Map;
import org.apache.fineract.integrationtests.common.Utils;
import com.jayway.restassured.specification.RequestSpecification;
import com.jayway.restassured.specification.ResponseSpecification;
import org.apache.fineract.integrationtests.common.Utils;
import java.util.Map;
public class ShareAccountTransactionHelper {
@@ -18,6 +18,12 @@
*/
package org.apache.fineract.integrationtests.common.shares;
import com.google.gson.Gson;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.integrationtests.common.Utils;
import org.joda.time.LocalDate;
import org.junit.Assert;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -25,13 +31,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.integrationtests.common.Utils;
import org.joda.time.LocalDate;
import org.junit.Assert;
import com.google.gson.Gson;
public class ShareProductHelper {
@@ -191,9 +190,9 @@ public class ShareProductHelper {
String lockinPeriodFrequencyType = String.valueOf(lockinPeriodType.get("id")) ;
Assert.assertEquals(this.lockinPeriodFrequencyType, lockinPeriodFrequencyType);
ArrayList<Map<String, String>> charges = (ArrayList<Map<String, String>>)shareProductData.get("chargesSelected") ;
//ArrayList<Map<String, String>> charges = (ArrayList<Map<String, String>>)shareProductData.get("chargesSelected") ;
ArrayList<Map<String, String>> marketPrices = (ArrayList<Map<String, String>>)shareProductData.get("marketPricePeriods") ;
// ArrayList<Map<String, String>> marketPrices = (ArrayList<Map<String, String>>)shareProductData.get("marketPricePeriods") ;
}
}
@@ -18,14 +18,16 @@
*/
package org.apache.fineract.accounting.common;
import org.apache.fineract.accounting.financialactivityaccount.data.FinancialActivityData;
import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
import net.sf.ehcache.util.FindBugsSuppressWarnings;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.fineract.accounting.financialactivityaccount.data.FinancialActivityData;
import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
public class AccountingConstants {
/*** Accounting placeholders for cash based accounting for loan products ***/
@@ -289,14 +291,16 @@ public class AccountingConstants {
return convertToFinancialActivityData(type);
}
// TODO Fix this..
@FindBugsSuppressWarnings("LI_LAZY_INIT_UPDATE_STATIC")
public static List<FinancialActivityData> getAllFinancialActivities() {
if (financialActivities == null) {
financialActivities = new ArrayList<>();
if (financialActivities == null) {
financialActivities = new ArrayList<>();
for (final FINANCIAL_ACTIVITY type : FINANCIAL_ACTIVITY.values()) {
FinancialActivityData financialActivityData = convertToFinancialActivityData(type);
financialActivities.add(financialActivityData);
}
}
}
return financialActivities;
}
@@ -18,22 +18,23 @@
*/
package org.apache.fineract.accounting.glaccount.data;
import java.util.Collection;
import java.util.List;
import org.apache.fineract.accounting.common.AccountingEnumerations;
import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
import org.apache.fineract.accounting.glaccount.domain.GLAccountUsage;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
/**
* Immutable object representing a General Ledger Account
*
* Note: no getter/setters required as google-gson will produce json from fields
* of object.
*/
public class GLAccountData {
public class GLAccountData implements Serializable {
private final Long id;
private final String name;
@@ -26,6 +26,7 @@ import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
@Entity
@Table(name = "m_trial_balance")
@@ -103,6 +104,9 @@ public class TrialBalance extends AbstractPersistableCustom<Long> {
&& trialBalance.getTransactionDate().equals(this.getTransactionDate());
}
@Override
public int hashCode() {
// TODO return Objects.hash(officeId, glAccountId, amount, entryDate, transactionDate, closingBalance);
return Objects.hash(officeId, glAccountId, entryDate, transactionDate);
}
}
@@ -18,16 +18,6 @@
*/
package org.apache.fineract.accounting.journalentry.service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.fineract.accounting.closure.domain.GLClosure;
import org.apache.fineract.accounting.closure.domain.GLClosureRepository;
@@ -52,7 +42,6 @@ import org.apache.fineract.accounting.journalentry.domain.JournalEntryType;
import org.apache.fineract.accounting.journalentry.exception.JournalEntriesNotFoundException;
import org.apache.fineract.accounting.journalentry.exception.JournalEntryInvalidException;
import org.apache.fineract.accounting.journalentry.exception.JournalEntryInvalidException.GL_JOURNAL_ENTRY_INVALID_REASON;
import org.apache.fineract.accounting.journalentry.exception.JournalEntryRuntimeException;
import org.apache.fineract.accounting.journalentry.serialization.JournalEntryCommandFromApiJsonDeserializer;
import org.apache.fineract.accounting.producttoaccountmapping.domain.PortfolioProductType;
@@ -86,6 +75,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
@Service
public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements JournalEntryWritePlatformService {
@@ -776,7 +768,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa
public boolean equals(Object obj) {
if (!obj.getClass().equals(this.getClass())) return false;
OfficeCurrencyKey copy = (OfficeCurrencyKey) obj;
return this.office.getId() == copy.office.getId() && this.currency.equals(copy.currency);
return Objects.equals(this.office.getId(), copy.office.getId()) && this.currency.equals(copy.currency);
}
@Override
@@ -21,7 +21,9 @@ package org.apache.fineract.accounting.producttoaccountmapping.data;
import org.apache.fineract.accounting.glaccount.data.GLAccountData;
import org.apache.fineract.portfolio.charge.data.ChargeData;
public class ChargeToGLAccountMapper {
import java.io.Serializable;
public class ChargeToGLAccountMapper implements Serializable {
@SuppressWarnings("unused")
private final ChargeData charge;
@@ -21,7 +21,9 @@ package org.apache.fineract.accounting.producttoaccountmapping.data;
import org.apache.fineract.accounting.glaccount.data.GLAccountData;
import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData;
public class PaymentTypeToGLAccountMapper {
import java.io.Serializable;
public class PaymentTypeToGLAccountMapper implements Serializable {
@SuppressWarnings("unused")
private final PaymentTypeData paymentType;
@@ -94,7 +94,7 @@ public class ProductToGLAccountMappingHelper {
portfolioProductType.getValue(), accountTypeId);
if (accountMapping == null) { throw new ProductToGLAccountMappingNotFoundException(portfolioProductType, productId,
accountTypeName); }
if (accountMapping.getGlAccount().getId() != accountId) {
if (!accountMapping.getGlAccount().getId().equals(accountId)) {
final GLAccount glAccount = getAccountByIdAndType(paramName, expectedAccountType, accountId);
changes.put(paramName, accountId);
accountMapping.setGlAccount(glAccount);
@@ -118,7 +118,7 @@ public class ProductToGLAccountMappingHelper {
ProductToGLAccountMapping newAccountMapping = new ProductToGLAccountMapping(glAccount, productId,
portfolioProductType.getValue(), accountTypeId) ;
this.accountMappingRepository.save(newAccountMapping);
}else if (accountMapping.getGlAccount().getId() != accountId) {
}else if (!accountMapping.getGlAccount().getId().equals(accountId)) {
final GLAccount glAccount = getAccountByIdAndType(paramName, expectedAccountType, accountId);
changes.put(paramName, accountId);
accountMapping.setGlAccount(glAccount);
@@ -251,7 +251,7 @@ public class ProductToGLAccountMappingHelper {
// update existing mappings (if required)
if (inputChargeToIncomeAccountMap.containsKey(currentCharge)) {
final Long newGLAccountId = inputChargeToIncomeAccountMap.get(currentCharge);
if (newGLAccountId != chargeToIncomeAccountMapping.getGlAccount().getId()) {
if (!newGLAccountId.equals(chargeToIncomeAccountMapping.getGlAccount().getId())) {
final GLAccount glAccount;
if (isPenalty) {
glAccount = getAccountByIdAndType(LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_ACCOUNT_ID.getValue(),
@@ -337,7 +337,7 @@ public class ProductToGLAccountMappingHelper {
// update existing mappings (if required)
if (inputPaymentChannelFundSourceMap.containsKey(currentPaymentChannelId)) {
final Long newGLAccountId = inputPaymentChannelFundSourceMap.get(currentPaymentChannelId);
if (newGLAccountId != existingPaymentChannelToFundSourceMapping.getGlAccount().getId()) {
if (!newGLAccountId.equals(existingPaymentChannelToFundSourceMapping.getGlAccount().getId())) {
final GLAccount glAccount = getAccountByIdAndType(LOAN_PRODUCT_ACCOUNTING_PARAMS.FUND_SOURCE.getValue(),
GLAccountType.ASSET, newGLAccountId);
existingPaymentChannelToFundSourceMapping.setGlAccount(glAccount);
@@ -19,6 +19,7 @@
package org.apache.fineract.accounting.provisioning.domain;
import java.math.BigDecimal;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
@@ -119,10 +120,16 @@ public class LoanProductProvisioningEntry extends AbstractPersistableCustom<Long
@Override
public boolean equals(Object obj) {
if (!obj.getClass().equals(getClass())) return false;
LoanProductProvisioningEntry entry = (LoanProductProvisioningEntry) obj;
return entry.loanProduct.getId().equals(this.loanProduct.getId())
&& entry.provisioningCategory.getId().equals(this.provisioningCategory.getId())
&& entry.office.getId().equals(this.office.getId())
&& entry.getCurrencyCode().equals(this.getCurrencyCode());
LoanProductProvisioningEntry other = (LoanProductProvisioningEntry) obj;
return Objects.equals(other.loanProduct.getId(), this.loanProduct.getId())
&& Objects.equals(other.provisioningCategory.getId(), this.provisioningCategory.getId())
&& Objects.equals(other.office.getId(), this.office.getId())
&& Objects.equals(other.getCurrencyCode(), this.getCurrencyCode());
}
@Override
public int hashCode() {
// TODO equals() must match: return Objects.hash(entry, criteriaId, office, currencyCode, loanProduct, provisioningCategory, overdueInDays, reservedAmount, liabilityAccount, expenseAccount);
return Objects.hash(loanProduct.getId(), provisioningCategory.getId(), office.getId(), getCurrencyCode());
}
}
@@ -18,17 +18,6 @@
*/
package org.apache.fineract.accounting.provisioning.service;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.fineract.accounting.provisioning.data.LoanProductProvisioningEntryData;
import org.apache.fineract.accounting.provisioning.data.ProvisioningEntryData;
import org.apache.fineract.infrastructure.core.service.Page;
@@ -41,6 +30,15 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@Service
public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningEntriesReadPlatformService {
@@ -289,9 +287,7 @@ public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningE
.append("where history2.journal_entry_created='1')");
@Override
@SuppressWarnings("unused")
public ProvisioningEntryData mapRow(ResultSet rs, int rowNum) throws SQLException {
Map<String, Object> map = new HashMap<>();
Long id = rs.getLong("id");
Date createdDate = rs.getDate("created_date");
Long createdBy = null;
@@ -18,28 +18,29 @@
*/
package org.apache.fineract.infrastructure.accountnumberformat.domain;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import java.util.*;
public class AccountNumberFormatEnumerations {
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForClientAccounts = new HashSet<>(Arrays.asList(
AccountNumberPrefixType.OFFICE_NAME, AccountNumberPrefixType.CLIENT_TYPE));
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForLoanAccounts = new HashSet<>(Arrays.asList(
AccountNumberPrefixType.OFFICE_NAME, AccountNumberPrefixType.LOAN_PRODUCT_SHORT_NAME));
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForSavingsAccounts = new HashSet<>(Arrays.asList(
AccountNumberPrefixType.OFFICE_NAME, AccountNumberPrefixType.SAVINGS_PRODUCT_SHORT_NAME));
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForCenters = new HashSet<>(Arrays.asList(
AccountNumberPrefixType.OFFICE_NAME));
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForGroups = new HashSet<>(Arrays.asList(
AccountNumberPrefixType.OFFICE_NAME));
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForClientAccounts =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(AccountNumberPrefixType.OFFICE_NAME,
AccountNumberPrefixType.CLIENT_TYPE)));
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForLoanAccounts =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(AccountNumberPrefixType.OFFICE_NAME,
AccountNumberPrefixType.LOAN_PRODUCT_SHORT_NAME)));
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForSavingsAccounts =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(AccountNumberPrefixType.OFFICE_NAME,
AccountNumberPrefixType.SAVINGS_PRODUCT_SHORT_NAME)));
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForCenters =
Collections.unmodifiableSet(new HashSet<>(Collections.singletonList(AccountNumberPrefixType.OFFICE_NAME)));
public final static Set<AccountNumberPrefixType> accountNumberPrefixesForGroups =
Collections.unmodifiableSet(new HashSet<>(Collections.singletonList(AccountNumberPrefixType.OFFICE_NAME)));
public enum AccountNumberPrefixType {
OFFICE_NAME(1, "accountNumberPrefixType.officeName"), CLIENT_TYPE(101, "accountNumberPrefixType.clientType"), LOAN_PRODUCT_SHORT_NAME(
@@ -49,7 +50,7 @@ public class AccountNumberFormatEnumerations {
private final Integer value;
private final String code;
private AccountNumberPrefixType(final Integer value, final String code) {
AccountNumberPrefixType(final Integer value, final String code) {
this.value = value;
this.code = code;
}
@@ -147,7 +147,7 @@ public class CenterImportHandler implements ImportHandler {
private boolean containsGroupId(List<GroupGeneralData> groupMembers,Long groupId){
for (GroupGeneralData group: groupMembers) {
if (group.getId()==groupId){
if (group.getId().equals(groupId)){
return true;
}
}
@@ -33,7 +33,6 @@ import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSe
import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.EnumOptionDataValueSerializer;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.infrastructure.core.exception.*;
import org.apache.fineract.portfolio.calendar.data.CalendarData;
import org.apache.fineract.portfolio.client.data.ClientData;
import org.apache.fineract.portfolio.group.data.GroupGeneralData;
@@ -143,7 +142,7 @@ public class GroupImportHandler implements ImportHandler {
private boolean containsClientId(List<ClientData> clientMembers,Long clientId){
for (ClientData client: clientMembers) {
if (client.getId()==clientId){
if (client.getId().equals(clientId)){
return true;
}
}
@@ -19,6 +19,7 @@
package org.apache.fineract.infrastructure.campaigns.email;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@@ -56,23 +57,26 @@ public class ScheduledEmailConstants {
public static final String STRETCHY_REPORT_PARAM_NAME = "stretchyReport";
// list of permitted parameters for the create report mailing job request
public static final Set<String> CREATE_REQUEST_PARAMETERS = new HashSet<>(Arrays.asList(LOCALE_PARAM_NAME, DATE_FORMAT_PARAM_NAME,
public static final Set<String> CREATE_REQUEST_PARAMETERS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(LOCALE_PARAM_NAME, DATE_FORMAT_PARAM_NAME,
NAME_PARAM_NAME, DESCRIPTION_PARAM_NAME, RECURRENCE_PARAM_NAME, EMAIL_RECIPIENTS_PARAM_NAME, EMAIL_SUBJECT_PARAM_NAME,
EMAIL_MESSAGE_PARAM_NAME, EMAIL_ATTACHMENT_FILE_FORMAT_ID_PARAM_NAME, STRETCHY_REPORT_ID_PARAM_NAME,
STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME, START_DATE_TIME_PARAM_NAME));
STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME, START_DATE_TIME_PARAM_NAME)));
// list of permitted parameters for the update report mailing job request
public static final Set<String> UPDATE_REQUEST_PARAMETERS = new HashSet<>(Arrays.asList(LOCALE_PARAM_NAME, DATE_FORMAT_PARAM_NAME,
public static final Set<String> UPDATE_REQUEST_PARAMETERS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(LOCALE_PARAM_NAME, DATE_FORMAT_PARAM_NAME,
NAME_PARAM_NAME, DESCRIPTION_PARAM_NAME, RECURRENCE_PARAM_NAME, EMAIL_RECIPIENTS_PARAM_NAME, EMAIL_SUBJECT_PARAM_NAME,
EMAIL_MESSAGE_PARAM_NAME, EMAIL_ATTACHMENT_FILE_FORMAT_ID_PARAM_NAME, STRETCHY_REPORT_ID_PARAM_NAME,
STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME, START_DATE_TIME_PARAM_NAME));
STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME, START_DATE_TIME_PARAM_NAME)));
// list of parameters that represent the properties of a report mailing job
public static final Set<String> REPORT_MAILING_JOB_DATA_PARAMETERS = new HashSet<>(Arrays.asList(ID_PARAM_NAME, NAME_PARAM_NAME,
public static final Set<String> REPORT_MAILING_JOB_DATA_PARAMETERS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(ID_PARAM_NAME, NAME_PARAM_NAME,
DESCRIPTION_PARAM_NAME, RECURRENCE_PARAM_NAME, EMAIL_RECIPIENTS_PARAM_NAME, EMAIL_SUBJECT_PARAM_NAME, EMAIL_MESSAGE_PARAM_NAME,
EMAIL_ATTACHMENT_FILE_FORMAT_PARAM_NAME, STRETCHY_REPORT_PARAM_NAME, STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME,
START_DATE_TIME_PARAM_NAME, PREVIOUS_RUN_DATE_TIME_PARAM_NAME, NEXT_RUN_DATE_TIME_PARAM_NAME, PREVIOUS_RUN_STATUS,
PREVIOUS_RUN_ERROR_LOG, PREVIOUS_RUN_ERROR_MESSAGE, NUMBER_OF_RUNS));
PREVIOUS_RUN_ERROR_LOG, PREVIOUS_RUN_ERROR_MESSAGE, NUMBER_OF_RUNS)));
// report mailing job configuration names
public static final String GMAIL_SMTP_SERVER = "GMAIL_SMTP_SERVER";
@@ -18,21 +18,20 @@
*/
package org.apache.fineract.infrastructure.campaigns.email.service;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
import org.apache.fineract.infrastructure.dataqueries.data.ReportData;
import org.apache.fineract.infrastructure.campaigns.email.data.ScheduledEmailEnumerations;
import org.apache.fineract.infrastructure.campaigns.email.exception.EmailBusinessRuleNotFound;
import org.apache.fineract.infrastructure.campaigns.email.exception.EmailCampaignNotFound;
import org.apache.fineract.infrastructure.campaigns.email.data.EmailBusinessRulesData;
import org.apache.fineract.infrastructure.campaigns.email.data.EmailCampaignData;
import org.apache.fineract.infrastructure.campaigns.email.data.EmailCampaignTimeLine;
import org.apache.fineract.infrastructure.campaigns.email.data.ScheduledEmailEnumerations;
import org.apache.fineract.infrastructure.campaigns.email.domain.EmailCampaignStatus;
import org.apache.fineract.infrastructure.campaigns.email.domain.EmailCampaignStatusEnumerations;
import org.apache.fineract.infrastructure.campaigns.email.domain.EmailCampaignType;
import org.apache.fineract.infrastructure.campaigns.email.exception.EmailBusinessRuleNotFound;
import org.apache.fineract.infrastructure.campaigns.email.exception.EmailCampaignNotFound;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
@@ -130,8 +129,11 @@ public class EmailCampaignReadPlatformServiceImpl implements EmailCampaignReadPl
final boolean coreReport = rs.getBoolean("coreReport");
final boolean useReport = rs.getBoolean("useReport");
final ReportData stretchyReport = new ReportData(reportId, reportName, reportType, reportSubType, reportCategory,
/*
final ReportData stretchyReport = new ReportData(reportId, reportName, reportType, reportSubType,
reportCategory,
reportDescription, reportSql, coreReport, useReport, null);
*/
final Integer statusId = JdbcSupport.getInteger(rs, "statusEnum");
final EnumOptionData status = EmailCampaignStatusEnumerations.status(statusId);
@@ -21,6 +21,7 @@ package org.apache.fineract.infrastructure.core.boot;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import org.springframework.context.ConfigurableApplicationContext;
@@ -37,7 +38,7 @@ public abstract class ApplicationExitUtil {
System.out.println("\nHit Enter to quit...");
// NOTE: In Eclipse, System.console() is not available.. so:
// (@see https://bugs.eclipse.org/bugs/show_bug.cgi?id=122429)
BufferedReader d = new BufferedReader(new InputStreamReader(System.in));
BufferedReader d = new BufferedReader(new InputStreamReader(System.in, Charset.defaultCharset()));
d.readLine();
ctx.stop();
@@ -475,7 +475,7 @@ public class DataValidatorBuilder {
if (this.value != null) {
final Integer intValue = Integer.valueOf(this.value.toString());
if (intValue != number) {
if (!intValue.equals(number)) {
final StringBuilder validationErrorCode = new StringBuilder("validation.msg.").append(this.resource).append(".")
.append(this.parameter).append(".not.equal.to.specified.number");
final StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(this.parameter)
@@ -18,12 +18,15 @@
*/
package org.apache.fineract.infrastructure.core.data;
import java.io.Serializable;
import java.util.Objects;
/**
* <p>
* Immutable data object representing generic enumeration value.
* </p>
*/
public class EnumOptionData {
public class EnumOptionData implements Serializable {
private final Long id;
private final String code;
@@ -46,6 +49,19 @@ public class EnumOptionData {
public String getValue() {
return this.value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof EnumOptionData)) return false;
EnumOptionData that = (EnumOptionData) o;
return id.equals(that.id) &&
code.equals(that.code) &&
value.equals(that.value);
}
@Override
public int hashCode() {
return Objects.hash(id, code, value);
}
}
@@ -66,6 +66,8 @@ public class AbandonedConnectionCleanupShutdownListener implements ApplicationLi
}
try {
Thread.sleep(2000L);
} catch (Exception e) {}
} catch (Exception e) {
logger.error("Exception Occcured while trying to sleep.", e);
}
}
}
@@ -18,9 +18,10 @@
*/
package org.apache.fineract.infrastructure.core.service;
import java.io.Serializable;
import java.util.List;
public class Page<E> {
public class Page<E> implements Serializable {
private final int totalFilteredRecords;
private final List<E> pageItems;
@@ -18,7 +18,9 @@
*/
package org.apache.fineract.infrastructure.dataqueries.data;
public class DatatableCheckStatusData {
import java.io.Serializable;
public class DatatableCheckStatusData implements Serializable {
private final String name;
private final int code;
@@ -18,12 +18,13 @@
*/
package org.apache.fineract.infrastructure.dataqueries.data;
import java.io.Serializable;
import java.util.List;
/**
* Immutable data object representing datatable data.
*/
public class DatatableData {
public class DatatableData implements Serializable {
@SuppressWarnings("unused")
private final String applicationTableName;
@@ -18,12 +18,15 @@
*/
package org.apache.fineract.infrastructure.dataqueries.data;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.fineract.portfolio.loanproduct.data.LoanProductData;
import org.apache.fineract.portfolio.savings.data.SavingsProductData;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.apache.fineract.portfolio.loanproduct.data.LoanProductData;
import org.apache.fineract.portfolio.savings.data.SavingsProductData;
import java.util.Objects;
/**
* Immutable data object for role data.
@@ -53,4 +56,27 @@ public class EntityDataTableChecksTemplateData implements Serializable {
this.loanProductDatas = loanProductDatas;
this.savingsProductDatas = savingsProductDatas;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof EntityDataTableChecksTemplateData)) return false;
EntityDataTableChecksTemplateData that = (EntityDataTableChecksTemplateData) o;
return Objects.equals(entities, that.entities) &&
Objects.equals(statusClient, that.statusClient) &&
Objects.equals(statusGroup, that.statusGroup) &&
Objects.equals(statusSavings, that.statusSavings) &&
Objects.equals(statusLoans, that.statusLoans) &&
Objects.equals(datatables, that.datatables) &&
Objects.equals(loanProductDatas, that.loanProductDatas) &&
Objects.equals(savingsProductDatas, that.savingsProductDatas);
}
@Override
public int hashCode() {
return Objects.hash(entities, statusClient, statusGroup, statusSavings, statusLoans, datatables, loanProductDatas, savingsProductDatas);
}
}
@@ -18,15 +18,16 @@
*/
package org.apache.fineract.infrastructure.dataqueries.data;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
/**
* Immutable data object representing a resultset column.
*/
public final class ResultsetColumnHeaderData {
public final class ResultsetColumnHeaderData implements Serializable {
private final String columnName;
private String columnType;
@@ -18,11 +18,13 @@
*/
package org.apache.fineract.infrastructure.dataqueries.data;
import java.io.Serializable;
/**
* Immutable data object representing a possible value for a given resultset
* column.
*/
public class ResultsetColumnValueData {
public class ResultsetColumnValueData implements Serializable {
private final int id;
private final String value;
@@ -18,19 +18,10 @@
*/
package org.apache.fineract.infrastructure.dataqueries.service;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.persistence.PersistenceException;
import javax.sql.DataSource;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
@@ -51,11 +42,7 @@ import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
import org.apache.fineract.infrastructure.core.serialization.JsonParserHelper;
import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
import org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant;
import org.apache.fineract.infrastructure.dataqueries.data.DataTableValidator;
import org.apache.fineract.infrastructure.dataqueries.data.DatatableData;
import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData;
import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnHeaderData;
import org.apache.fineract.infrastructure.dataqueries.data.ResultsetRowData;
import org.apache.fineract.infrastructure.dataqueries.data.*;
import org.apache.fineract.infrastructure.dataqueries.exception.DatatableEntryRequiredException;
import org.apache.fineract.infrastructure.dataqueries.exception.DatatableNotFoundException;
import org.apache.fineract.infrastructure.dataqueries.exception.DatatableSystemErrorException;
@@ -79,10 +66,11 @@ import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import javax.persistence.PersistenceException;
import javax.sql.DataSource;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.*;
@Service
public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataService {
@@ -805,7 +793,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
final StringBuilder constrainBuilder, final List<String> codeMappings) {
final String datatableAlias = datatableName.toLowerCase().replaceAll("\\s", "_");
final String name = (column.has("name")) ? column.get("name").getAsString() : null;
sqlBuilder = sqlBuilder.append(", DROP COLUMN `" + name + "`");
//sqlBuilder = sqlBuilder.append(", DROP COLUMN `" + name + "`");
final StringBuilder findFKSql = new StringBuilder();
findFKSql.append("SELECT count(*)").append("FROM information_schema.TABLE_CONSTRAINTS i")
.append(" WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'").append(" AND i.TABLE_SCHEMA = DATABASE()")
@@ -23,11 +23,14 @@ public class FineractEntityType {
private String description;
private String table_name;
public static FineractEntityType OFFICE = new FineractEntityType ("office", "Offices", "m_office");
public static FineractEntityType LOAN_PRODUCT = new FineractEntityType ("loan_product", "Loan Products", "m_product_loan");
public static FineractEntityType SAVINGS_PRODUCT = new FineractEntityType ("savings_product", "Savings Products", "m_savings_product");
public static FineractEntityType CHARGE = new FineractEntityType ("charge", "Fees/Charges", "m_charge");
public static FineractEntityType SHARE_PRODUCT = new FineractEntityType("shares_product", "Shares Products", "m_share_product") ;
public static final FineractEntityType OFFICE = new FineractEntityType ("office", "Offices", "m_office");
public static final FineractEntityType LOAN_PRODUCT = new FineractEntityType ("loan_product", "Loan Products",
"m_product_loan");
public static final FineractEntityType SAVINGS_PRODUCT = new FineractEntityType ("savings_product", "Savings Products"
, "m_savings_product");
public static final FineractEntityType CHARGE = new FineractEntityType ("charge", "Fees/Charges", "m_charge");
public static final FineractEntityType SHARE_PRODUCT = new FineractEntityType("shares_product", "Shares Products",
"m_share_product") ;
private FineractEntityType (String type, String description, String table_name) {
this.type = type;
@@ -55,11 +58,11 @@ public class FineractEntityType {
retType = OFFICE;
} else if (type.equals(LOAN_PRODUCT.type)) {
retType = LOAN_PRODUCT;
} else if (type.equals(SAVINGS_PRODUCT)) {
} else if (type.equals(SAVINGS_PRODUCT.type)) {
retType = SAVINGS_PRODUCT;
} else if (type.equals(CHARGE)) {
} else if (type.equals(CHARGE.type)) {
retType = CHARGE;
}else if(type.equals(SHARE_PRODUCT)) {
}else if(type.equals(SHARE_PRODUCT.type)) {
retType = SHARE_PRODUCT ;
}
return retType;
@@ -18,80 +18,29 @@
*/
package org.apache.fineract.infrastructure.gcm.domain;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_CANONICAL_IDS;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_ERROR;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_FAILURE;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_MESSAGE_ID;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_MULTICAST_ID;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_BADGE;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_BODY;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_BODY_LOC_ARGS;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_BODY_LOC_KEY;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_CLICK_ACTION;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_COLOR;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_ICON;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_SOUND;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_TAG;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_TITLE;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_TITLE_LOC_ARGS;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_NOTIFICATION_TITLE_LOC_KEY;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_PAYLOAD;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_REGISTRATION_IDS;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_TO;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_RESULTS;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.JSON_SUCCESS;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.PARAM_COLLAPSE_KEY;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.PARAM_DELAY_WHILE_IDLE;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.PARAM_DRY_RUN;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.PARAM_PRIORITY;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.PARAM_CONTENT_AVAILABLE;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.PARAM_RESTRICTED_PACKAGE_NAME;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.PARAM_TIME_TO_LIVE;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.TOKEN_CANONICAL_REG_ID;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.TOPIC_PREFIX;
import org.apache.fineract.infrastructure.gcm.GcmConstants;
import org.apache.fineract.infrastructure.gcm.exception.InvalidRequestException;
/*import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;*/
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.apache.fineract.infrastructure.gcm.GcmConstants;
import org.apache.fineract.infrastructure.gcm.exception.InvalidRequestException;
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import static org.apache.fineract.infrastructure.gcm.GcmConstants.*;
/**
* Helper class to send messages to the GCM service using an API Key.
*/
public class Sender {
protected static final String UTF8 = "UTF-8";
/**
* Initial delay before first retry, without jitter.
*/
@@ -262,7 +211,7 @@ public class Sender {
.get(TOKEN_CANONICAL_REG_ID).getAsString();
}
if(jsonResult.has(JSON_ERROR)){
error = (String) jsonResult.get(JSON_ERROR).getAsString();
error = jsonResult.get(JSON_ERROR).getAsString();
}
int success = 0;
int failure = 0;
@@ -306,7 +255,7 @@ public class Sender {
int failure = getNumber(responseMap, JSON_FAILURE).intValue();
List<String> failedIds = null;
if (jsonResponse.has("failed_registration_ids")) {
JsonArray jFailedIds = (JsonArray) jsonResponse
JsonArray jFailedIds = jsonResponse
.get("failed_registration_ids").getAsJsonArray();
failedIds = new ArrayList<>();
for (int i = 0; i < jFailedIds.size(); i++) {
@@ -709,7 +658,7 @@ public class Sender {
}
logger.fine("Sending POST to " + url);
logger.finest("POST body: " + body);
byte[] bytes = body.getBytes(UTF8);
byte[] bytes = body.getBytes(StandardCharsets.UTF_8);
HttpURLConnection conn = getConnection(url);
conn.setDoOutput(true);
conn.setUseCaches(false);
@@ -789,7 +738,7 @@ public class Sender {
return "";
}
BufferedReader reader = new BufferedReader(
new InputStreamReader(stream));
new InputStreamReader(stream, StandardCharsets.UTF_8));
StringBuilder content = new StringBuilder();
String newLine;
do {
@@ -18,8 +18,10 @@
*/
package org.apache.fineract.infrastructure.hooks.data;
import java.io.Serializable;
@SuppressWarnings("unused")
public class Field {
public class Field implements Serializable {
private final String fieldName;
private final String fieldValue;
@@ -18,11 +18,13 @@
*/
package org.apache.fineract.infrastructure.reportmailingjob;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class ReportMailingJobConstants {
public class ReportMailingJobConstants implements Serializable {
// define the API resource entity name
public static final String REPORT_MAILING_JOB_ENTITY_NAME = "REPORTMAILINGJOB";
@@ -62,23 +64,26 @@ public class ReportMailingJobConstants {
public static final String STRETCHY_REPORT_PARAM_NAME = "stretchyReport";
// list of permitted parameters for the create report mailing job request
public static final Set<String> CREATE_REQUEST_PARAMETERS = new HashSet<>(Arrays.asList(LOCALE_PARAM_NAME, DATE_FORMAT_PARAM_NAME,
NAME_PARAM_NAME, DESCRIPTION_PARAM_NAME, RECURRENCE_PARAM_NAME, EMAIL_RECIPIENTS_PARAM_NAME, EMAIL_SUBJECT_PARAM_NAME,
EMAIL_MESSAGE_PARAM_NAME, EMAIL_ATTACHMENT_FILE_FORMAT_ID_PARAM_NAME, STRETCHY_REPORT_ID_PARAM_NAME,
STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME, START_DATE_TIME_PARAM_NAME));
public static final Set<String> CREATE_REQUEST_PARAMETERS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(LOCALE_PARAM_NAME, DATE_FORMAT_PARAM_NAME,
NAME_PARAM_NAME, DESCRIPTION_PARAM_NAME, RECURRENCE_PARAM_NAME, EMAIL_RECIPIENTS_PARAM_NAME, EMAIL_SUBJECT_PARAM_NAME,
EMAIL_MESSAGE_PARAM_NAME, EMAIL_ATTACHMENT_FILE_FORMAT_ID_PARAM_NAME, STRETCHY_REPORT_ID_PARAM_NAME,
STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME, START_DATE_TIME_PARAM_NAME)));
// list of permitted parameters for the update report mailing job request
public static final Set<String> UPDATE_REQUEST_PARAMETERS = new HashSet<>(Arrays.asList(LOCALE_PARAM_NAME, DATE_FORMAT_PARAM_NAME,
public static final Set<String> UPDATE_REQUEST_PARAMETERS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(LOCALE_PARAM_NAME, DATE_FORMAT_PARAM_NAME,
NAME_PARAM_NAME, DESCRIPTION_PARAM_NAME, RECURRENCE_PARAM_NAME, EMAIL_RECIPIENTS_PARAM_NAME, EMAIL_SUBJECT_PARAM_NAME,
EMAIL_MESSAGE_PARAM_NAME, EMAIL_ATTACHMENT_FILE_FORMAT_ID_PARAM_NAME, STRETCHY_REPORT_ID_PARAM_NAME,
STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME, START_DATE_TIME_PARAM_NAME));
STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME, START_DATE_TIME_PARAM_NAME)));
// list of parameters that represent the properties of a report mailing job
public static final Set<String> REPORT_MAILING_JOB_DATA_PARAMETERS = new HashSet<>(Arrays.asList(ID_PARAM_NAME, NAME_PARAM_NAME,
public static final Set<String> REPORT_MAILING_JOB_DATA_PARAMETERS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(ID_PARAM_NAME, NAME_PARAM_NAME,
DESCRIPTION_PARAM_NAME, RECURRENCE_PARAM_NAME, EMAIL_RECIPIENTS_PARAM_NAME, EMAIL_SUBJECT_PARAM_NAME, EMAIL_MESSAGE_PARAM_NAME,
EMAIL_ATTACHMENT_FILE_FORMAT_PARAM_NAME, STRETCHY_REPORT_PARAM_NAME, STRETCHY_REPORT_PARAM_MAP_PARAM_NAME, IS_ACTIVE_PARAM_NAME,
START_DATE_TIME_PARAM_NAME, PREVIOUS_RUN_DATE_TIME_PARAM_NAME, NEXT_RUN_DATE_TIME_PARAM_NAME, PREVIOUS_RUN_STATUS,
PREVIOUS_RUN_ERROR_LOG, PREVIOUS_RUN_ERROR_MESSAGE, NUMBER_OF_RUNS));
PREVIOUS_RUN_ERROR_LOG, PREVIOUS_RUN_ERROR_MESSAGE, NUMBER_OF_RUNS)));
// report mailing job configuration names
public static final String GMAIL_SMTP_SERVER = "GMAIL_SMTP_SERVER";
@@ -18,12 +18,12 @@
*/
package org.apache.fineract.infrastructure.reportmailingjob.data;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import java.util.ArrayList;
import java.util.List;
public enum ReportMailingJobEmailAttachmentFileFormat {
INVALID(0, "ReportMailingJobEmailAttachmentFileFormat.INVALID", "Invalid"),
XLS(1, "ReportMailingJobEmailAttachmentFileFormat.XLS", "XLS"),
@@ -34,7 +34,7 @@ public enum ReportMailingJobEmailAttachmentFileFormat {
private String value;
private Integer id;
private ReportMailingJobEmailAttachmentFileFormat(final Integer id, final String code, final String value) {
ReportMailingJobEmailAttachmentFileFormat(final Integer id, final String code, final String value) {
this.value = value;
this.code = code;
this.id = id;
@@ -69,11 +69,11 @@ public enum ReportMailingJobEmailAttachmentFileFormat {
public static ReportMailingJobEmailAttachmentFileFormat newInstance(final Integer id) {
ReportMailingJobEmailAttachmentFileFormat emailAttachmentFileFormat = INVALID;
if (id == XLS.id) {
if (id.equals(XLS.id)) {
emailAttachmentFileFormat = XLS;
} else if (id == PDF.id) {
} else if (id.equals(PDF.id)) {
emailAttachmentFileFormat = PDF;
} else if (id == CSV.id) {
} else if (id.equals(CSV.id)) {
emailAttachmentFileFormat = CSV;
}
@@ -18,12 +18,12 @@
*/
package org.apache.fineract.infrastructure.reportmailingjob.data;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import java.util.ArrayList;
import java.util.List;
public enum ReportMailingJobStretchyReportParamDateOption {
INVALID(0, "ReportMailingJobStretchyReportParamDateOption.INVALID", "Invalid"),
TODAY(1, "ReportMailingJobStretchyReportParamDateOption.TODAY", "Today"),
@@ -74,11 +74,11 @@ public enum ReportMailingJobStretchyReportParamDateOption {
public static ReportMailingJobStretchyReportParamDateOption newInstance(final Integer id) {
ReportMailingJobStretchyReportParamDateOption reportMailingJobStretchyReportParamDateOption = INVALID;
if (id == TODAY.id) {
if (id.equals(TODAY.id)) {
reportMailingJobStretchyReportParamDateOption = TODAY;
} else if (id == YESTERDAY.id) {
} else if (id.equals(YESTERDAY.id)) {
reportMailingJobStretchyReportParamDateOption = YESTERDAY;
} else if (id == TOMORROW.id) {
} else if (id.equals(TOMORROW.id)) {
reportMailingJobStretchyReportParamDateOption = TOMORROW;
}
@@ -18,6 +18,8 @@
*/
package org.apache.fineract.infrastructure.security.api;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Set;
@@ -129,12 +131,12 @@ public class AuthenticationApiResource {
principal.hasSpecificPermissionTo(TwoFactorConstants.BYPASS_TWO_FACTOR_PERMISSION);
if (this.springSecurityPlatformSecurityContext.doesPasswordHasToBeRenewed(principal)) {
authenticatedUserData = new AuthenticatedUserData(request.username, principal.getId(),
new String(base64EncodedAuthenticationKey), isTwoFactorRequired);
new String(base64EncodedAuthenticationKey, StandardCharsets.UTF_8), isTwoFactorRequired);
} else {
authenticatedUserData = new AuthenticatedUserData(request.username, officeId, officeName, staffId, staffDisplayName,
organisationalRole, roles, permissions, principal.getId(),
new String(base64EncodedAuthenticationKey), isTwoFactorRequired);
new String(base64EncodedAuthenticationKey, StandardCharsets.UTF_8), isTwoFactorRequired);
}
}
@@ -18,10 +18,7 @@
*/
package org.apache.fineract.infrastructure.security.constants;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
public class TwoFactorConfigurationConstants {
@@ -42,18 +39,18 @@ public class TwoFactorConfigurationConstants {
public static final String ACCESS_TOKEN_LIVE_TIME_EXTENDED = "access-token-live-time-extended";
public static final Set<String> REQUEST_DATA_PARAMETERS =
new HashSet<>(Arrays.asList(ENABLE_EMAIL_DELIVERY, EMAIL_SUBJECT, EMAIL_BODY,
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(ENABLE_EMAIL_DELIVERY, EMAIL_SUBJECT, EMAIL_BODY,
ENABLE_SMS_DELIVERY, SMS_PROVIDER_ID, SMS_MESSAGE_TEXT, OTP_TOKEN_LIVE_TIME,
OTP_TOKEN_LENGTH, ACCESS_TOKEN_LIVE_TIME, ACCESS_TOKEN_LIVE_TIME_EXTENDED));
OTP_TOKEN_LENGTH, ACCESS_TOKEN_LIVE_TIME, ACCESS_TOKEN_LIVE_TIME_EXTENDED)));
public static final List<String> STRING_PARAMETERS =
Arrays.asList(EMAIL_SUBJECT, EMAIL_BODY, SMS_MESSAGE_TEXT);
Collections.unmodifiableList(Arrays.asList(EMAIL_SUBJECT, EMAIL_BODY, SMS_MESSAGE_TEXT));
public static final List<String> BOOLEAN_PARAMETERS =
Arrays.asList(ENABLE_EMAIL_DELIVERY, ENABLE_SMS_DELIVERY);
Collections.unmodifiableList(Arrays.asList(ENABLE_EMAIL_DELIVERY, ENABLE_SMS_DELIVERY));
public static final List<String> NUMBER_PARAMETERS =
Arrays.asList(SMS_PROVIDER_ID, OTP_TOKEN_LIVE_TIME, OTP_TOKEN_LENGTH,
ACCESS_TOKEN_LIVE_TIME, ACCESS_TOKEN_LIVE_TIME_EXTENDED);
Collections.unmodifiableList(Arrays.asList(SMS_PROVIDER_ID, OTP_TOKEN_LIVE_TIME, OTP_TOKEN_LENGTH,
ACCESS_TOKEN_LIVE_TIME, ACCESS_TOKEN_LIVE_TIME_EXTENDED));
}
@@ -34,7 +34,7 @@ public class InteropResponseData extends CommandProcessingResult {
public static final String ISO_DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ssZ";
// public static final SimpleDateFormat ISO_DATE_TIME_FORMATTER = new SimpleDateFormat(ISO_DATE_TIME_PATTERN); // TODO: not synchronized
public static DateTimeFormatter ISO_DATE_TIME_FORMATTER = DateTimeFormat.forPattern(ISO_DATE_TIME_PATTERN);
public static final DateTimeFormatter ISO_DATE_TIME_FORMATTER = DateTimeFormat.forPattern(ISO_DATE_TIME_PATTERN);
@NotNull
private final String transactionCode;
@@ -162,7 +162,7 @@ public class TopicDomainServiceImpl implements TopicDomainService {
for (TopicSubscriber subscriber : oldSubscriptions) {
for (Topic topic : oldTopics) {
if (subscriber.getTopic().getId() == topic.getId()) {
if (subscriber.getTopic().getId().equals(topic.getId())) {
topicSubscriberRepository.delete(subscriber);
}
}
@@ -18,10 +18,13 @@
*/
package org.apache.fineract.organisation.monetary.data;
import java.io.Serializable;
import java.util.Objects;
/**
* Immutable data object representing currency.
*/
public class CurrencyData {
public class CurrencyData implements Serializable {
private final String code;
private final String name;
@@ -70,17 +73,6 @@ public class CurrencyData {
return this.inMultiplesOf;
}
@Override
public boolean equals(final Object obj) {
final CurrencyData currencyData = (CurrencyData) obj;
return currencyData.code.equals(this.code);
}
@Override
public int hashCode() {
return this.code.hashCode();
}
private String generateDisplayLabel() {
final StringBuilder builder = new StringBuilder(this.name).append(' ');
@@ -97,4 +89,23 @@ public class CurrencyData {
public String getName() {
return name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof CurrencyData)) return false;
CurrencyData that = (CurrencyData) o;
return Objects.equals(decimalPlaces, that.decimalPlaces) &&
Objects.equals(code, that.code) &&
Objects.equals(name, that.name) &&
Objects.equals(inMultiplesOf, that.inMultiplesOf) &&
Objects.equals(displaySymbol, that.displaySymbol) &&
Objects.equals(nameCode, that.nameCode) &&
Objects.equals(displayLabel, that.displayLabel);
}
@Override
public int hashCode() {
return Objects.hash(code, name, decimalPlaces, inMultiplesOf, displaySymbol, nameCode, displayLabel);
}
}
@@ -18,14 +18,14 @@
*/
package org.apache.fineract.organisation.monetary.domain;
import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.organisation.office.domain.OrganisationCurrency;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.organisation.office.domain.OrganisationCurrency;
import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
@Entity
@Table(name = "m_currency")
public class ApplicationCurrency extends AbstractPersistableCustom<Long> {
@@ -18,15 +18,15 @@
*/
package org.apache.fineract.organisation.monetary.domain;
import java.math.MathContext;
import java.math.RoundingMode;
import javax.annotation.PostConstruct;
import net.sf.ehcache.util.FindBugsSuppressWarnings;
import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.math.MathContext;
import java.math.RoundingMode;
@Component
public class MoneyHelper {
@@ -40,6 +40,7 @@ public class MoneyHelper {
private ConfigurationDomainService configurationDomainService;
@PostConstruct
@FindBugsSuppressWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
public void someFunction () {
staticConfigurationDomainService = configurationDomainService;
}
@@ -18,21 +18,6 @@
*/
package org.apache.fineract.organisation.provisioning.domain;
import java.time.Instant;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import org.apache.fineract.accounting.glaccount.domain.GLAccount;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.domain.AbstractAuditableCustom;
@@ -42,6 +27,10 @@ import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
import org.apache.fineract.useradministration.domain.AppUser;
import org.joda.time.DateTime;
import javax.persistence.*;
import java.time.Instant;
import java.util.*;
@Entity
@Table(name = "m_provisioning_criteria", uniqueConstraints = { @UniqueConstraint(columnNames = { "criteria_name" }, name = "criteria_name") })
public class ProvisioningCriteria extends AbstractAuditableCustom<AppUser, Long> {
@@ -72,7 +61,7 @@ public class ProvisioningCriteria extends AbstractAuditableCustom<AppUser, Long>
setCreatedBy(createdBy) ;
setCreatedDate(Instant.ofEpochMilli(createdDate.getMillis()));
setLastModifiedBy(lastModifiedBy) ;
setLastModifiedDate(lastModifiedDate == null ? null : Instant.ofEpochMilli(lastModifiedDate.getMillis()));
setLastModifiedDate(Instant.ofEpochMilli(lastModifiedDate.getMillis()));
}
public void setProvisioningCriteriaDefinitions(Set<ProvisioningCriteriaDefinition> provisioningCriteriaDefinition) {
@@ -121,10 +121,9 @@ public class ProvisioningCriteriaAssembler {
private ProvisioningCriteria createCriteria(final JsonElement jsonElement) {
final String criteriaName = this.fromApiJsonHelper.extractStringNamed(ProvisioningCriteriaConstants.JSON_CRITERIANAME_PARAM, jsonElement);
AppUser modifiedBy = null;
DateTime modifiedOn = null;
ProvisioningCriteria criteria = new ProvisioningCriteria(criteriaName, platformSecurityContext.authenticatedUser(), new DateTime(),
modifiedBy, modifiedOn);
platformSecurityContext.authenticatedUser(), new DateTime());
return criteria;
}
@@ -18,16 +18,16 @@
*/
package org.apache.fineract.organisation.staff.data;
import java.util.Collection;
import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
import org.apache.fineract.organisation.office.data.OfficeData;
import org.joda.time.LocalDate;
import java.io.Serializable;
import java.util.Collection;
/**
* Immutable data object representing staff data.
*/
public class StaffData {
public class StaffData implements Serializable {
private final Long id;
private final String externalId;
@@ -18,17 +18,12 @@
*/
package org.apache.fineract.organisation.teller.data;
import org.apache.fineract.organisation.staff.data.StaffData;
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
import org.apache.fineract.organisation.office.data.OfficeData;
import org.apache.fineract.organisation.staff.data.StaffData;
import org.apache.fineract.portfolio.client.data.ClientData;
import org.apache.fineract.portfolio.savings.data.SavingsProductData;
import org.joda.time.LocalDate;
/**
* Represents a cashier, providing access to the cashier's office, staff
* information, teller, and more.
@@ -18,9 +18,9 @@
*/
package org.apache.fineract.organisation.teller.domain;
import java.util.HashMap;
import java.io.Serializable;
public class CashierTxnType {
public class CashierTxnType implements Serializable {
private Integer id;
private String value;
@@ -18,13 +18,6 @@
*/
package org.apache.fineract.organisation.teller.service;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import org.apache.commons.lang.StringUtils;
import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException;
@@ -41,13 +34,7 @@ import org.apache.fineract.organisation.office.service.OfficeReadPlatformService
import org.apache.fineract.organisation.staff.data.StaffData;
import org.apache.fineract.organisation.staff.exception.StaffNotFoundException;
import org.apache.fineract.organisation.staff.service.StaffReadPlatformService;
import org.apache.fineract.organisation.teller.data.CashierData;
import org.apache.fineract.organisation.teller.data.CashierTransactionData;
import org.apache.fineract.organisation.teller.data.CashierTransactionTypeTotalsData;
import org.apache.fineract.organisation.teller.data.CashierTransactionsWithSummaryData;
import org.apache.fineract.organisation.teller.data.TellerData;
import org.apache.fineract.organisation.teller.data.TellerJournalData;
import org.apache.fineract.organisation.teller.data.TellerTransactionData;
import org.apache.fineract.organisation.teller.data.*;
import org.apache.fineract.organisation.teller.domain.CashierTxnType;
import org.apache.fineract.organisation.teller.domain.TellerStatus;
import org.apache.fineract.useradministration.domain.AppUser;
@@ -60,6 +47,13 @@ import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
@Service
public class TellerManagementReadPlatformServiceImpl implements TellerManagementReadPlatformService {
@@ -482,13 +476,13 @@ public class TellerManagementReadPlatformServiceImpl implements TellerManagement
while (itr.hasNext()) {
CashierTransactionTypeTotalsData total = itr.next();
if (total != null) {
if (total.getCashierTxnType() == CashierTxnType.ALLOCATE.getId()) {
if (total.getCashierTxnType().equals(CashierTxnType.ALLOCATE.getId())) {
allocAmount = total.getCashTotal();
} else if (total.getCashierTxnType() == CashierTxnType.SETTLE.getId()) {
} else if (total.getCashierTxnType().equals(CashierTxnType.SETTLE.getId())) {
settleAmount = total.getCashTotal();
} else if (total.getCashierTxnType() == CashierTxnType.INWARD_CASH_TXN.getId()) {
} else if (total.getCashierTxnType().equals(CashierTxnType.INWARD_CASH_TXN.getId())) {
cashInAmount = total.getCashTotal();
} else if (total.getCashierTxnType() == CashierTxnType.OUTWARD_CASH_TXN.getId()) {
} else if (total.getCashierTxnType().equals(CashierTxnType.OUTWARD_CASH_TXN.getId())) {
cashOutAmount = total.getCashTotal();
}
}
@@ -30,7 +30,7 @@ public enum PortfolioAccountType {
private final Integer value;
private final String code;
private PortfolioAccountType(final Integer value, final String code) {
PortfolioAccountType(final Integer value, final String code) {
this.value = value;
this.code = code;
}
@@ -71,10 +71,10 @@ public enum PortfolioAccountType {
}
public boolean isSavingsAccount() {
return this.value == Integer.valueOf(2);
return this.value.equals(2);
}
public boolean isLoanAccount() {
return this.value == Integer.valueOf(1);
return this.value.equals(1);
}
}
@@ -18,20 +18,21 @@
*/
package org.apache.fineract.portfolio.account.data;
import java.math.BigDecimal;
import java.util.Collection;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.organisation.office.data.OfficeData;
import org.apache.fineract.portfolio.client.data.ClientData;
import org.joda.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
/**
* Immutable data object representing a savings account.
*/
@SuppressWarnings("unused")
public class AccountTransferData {
public class AccountTransferData implements Serializable {
private final Long id;
private final Boolean reversed;
@@ -18,17 +18,18 @@
*/
package org.apache.fineract.portfolio.account.data;
import java.math.BigDecimal;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.fineract.organisation.monetary.data.CurrencyData;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* Immutable data object representing a savings account.
*/
@SuppressWarnings("unused")
public class PortfolioAccountData {
public class PortfolioAccountData implements Serializable {
private final Long id;
private final String accountNo;
@@ -218,13 +218,13 @@ public class AccountTransferStandingInstruction extends AbstractPersistableCusto
final MonthDay monthDay = command.extractMonthDayNamed(recurrenceOnMonthDayParamName);
final String actualValueEntered = command.stringValueOfParameterNamed(recurrenceOnMonthDayParamName);
final Integer dayOfMonthValue = monthDay.getDayOfMonth();
if (this.recurrenceOnDay != dayOfMonthValue) {
if (!this.recurrenceOnDay.equals(dayOfMonthValue)) {
actualChanges.put(recurrenceOnMonthDayParamName, actualValueEntered);
this.recurrenceOnDay = dayOfMonthValue;
}
final Integer monthOfYear = monthDay.getMonthOfYear();
if (this.recurrenceOnMonth != monthOfYear) {
if (!this.recurrenceOnMonth.equals(monthOfYear)) {
actualChanges.put(recurrenceOnMonthDayParamName, actualValueEntered);
this.recurrenceOnMonth = monthOfYear;
}
@@ -22,8 +22,10 @@ import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountApplicationTimelineData;
import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountStatusEnumData;
import java.io.Serializable;
@SuppressWarnings("unused")
public class ShareAccountSummaryData {
public class ShareAccountSummaryData implements Serializable {
private final Long id;
private final String accountNo;
@@ -19,17 +19,18 @@
package org.apache.fineract.portfolio.accounts.constants;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public interface ShareAccountApiConstants {
public static final String amountParamName = "amount";
public static final String dateFormatParamName = "dateFormat";
public static final String dueAsOfDateParamName = "dueDate";
public static final String feeIntervalParamName = "feeInterval";
public static final String feeOnMonthDayParamName = "feeOnMonthDay";
public static final String localeParamName = "locale";
String amountParamName = "amount";
String dateFormatParamName = "dateFormat";
String dueAsOfDateParamName = "dueDate";
String feeIntervalParamName = "feeInterval";
String feeOnMonthDayParamName = "feeOnMonthDay";
String localeParamName = "locale";
// Command Strings
String APPROVE_COMMAND = "approve";
@@ -91,19 +92,21 @@ public interface ShareAccountApiConstants {
String note_paramname = "note" ;
public String requesteddate_paramname = "requestedDate" ;
String requesteddate_paramname = "requestedDate" ;
public String additionalshares_paramname = "additionalshares" ;
String additionalshares_paramname = "additionalshares" ;
public String closeddate_paramname = "closedDate";
String closeddate_paramname = "closedDate";
public static final String shareEntityType = "share";
String shareEntityType = "share";
Set<String> supportedParameters = new HashSet<>(Arrays.asList(locale_paramname, dateformat_paramname, id_paramname,clientid_paramname, productid_paramname,
submitteddate_paramname,approveddate_paramname, externalid_paramname, currency_paramname, digitsafterdecimal_paramname,
inmultiplesof_paramname, requestedshares_paramname,savingsaccountid_paramname,lockinperiod_paramname,
lockperiodfrequencytype_paramname,minimumactiveperiod_paramname, minimumactiveperiodfrequencytype_paramname,
allowdividendcalculationforinactiveclients_paramname, charges_paramname, applicationdate_param,
purchaseddate_paramname,numberofshares_paramname,purchasedprice_paramname));
Set<String> supportedParameters = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(locale_paramname,
dateformat_paramname, id_paramname,clientid_paramname, productid_paramname,
submitteddate_paramname,approveddate_paramname, externalid_paramname, currency_paramname,
digitsafterdecimal_paramname, inmultiplesof_paramname, requestedshares_paramname,
savingsaccountid_paramname,lockinperiod_paramname, lockperiodfrequencytype_paramname,
minimumactiveperiod_paramname, minimumactiveperiodfrequencytype_paramname,
allowdividendcalculationforinactiveclients_paramname, charges_paramname, applicationdate_param,
purchaseddate_paramname,numberofshares_paramname,purchasedprice_paramname)));
}
@@ -18,14 +18,15 @@
*/
package org.apache.fineract.portfolio.address.data;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
@SuppressWarnings("unused")
public class AddressData {
public class AddressData implements Serializable {
private final Long client_id;
@@ -18,10 +18,6 @@
*/
package org.apache.fineract.portfolio.calendar.data;
import java.util.Collection;
import java.util.List;
import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.portfolio.calendar.domain.CalendarFrequencyType;
import org.apache.fineract.portfolio.calendar.domain.CalendarRemindBy;
@@ -33,10 +29,15 @@ import org.apache.fineract.portfolio.common.domain.NthDayType;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
/**
* Immutable data object representing a Calendar.
*/
public class CalendarData {
public class CalendarData implements Serializable {
private final Long id;
private final Long calendarInstanceId;
@@ -491,4 +492,59 @@ public class CalendarData {
public EnumOptionData getRepeatsOnNthDayOfMonth() {
return this.repeatsOnNthDayOfMonth;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof CalendarData)) return false;
CalendarData that = (CalendarData) o;
return Objects.equals(repeating, that.repeating) &&
Objects.equals(id, that.id) &&
Objects.equals(calendarInstanceId, that.calendarInstanceId) &&
Objects.equals(entityId, that.entityId) &&
Objects.equals(entityType, that.entityType) &&
Objects.equals(title, that.title) &&
Objects.equals(description, that.description) &&
Objects.equals(location, that.location) &&
Objects.equals(startDate, that.startDate) &&
Objects.equals(endDate, that.endDate) &&
Objects.equals(meetingTime, that.meetingTime) &&
Objects.equals(duration, that.duration) &&
Objects.equals(type, that.type) &&
Objects.equals(recurrence, that.recurrence) &&
Objects.equals(frequency, that.frequency) &&
Objects.equals(interval, that.interval) &&
Objects.equals(repeatsOnDay, that.repeatsOnDay) &&
Objects.equals(repeatsOnNthDayOfMonth, that.repeatsOnNthDayOfMonth) &&
Objects.equals(remindBy, that.remindBy) &&
Objects.equals(firstReminder, that.firstReminder) &&
Objects.equals(secondReminder, that.secondReminder) &&
Objects.equals(recurringDates, that.recurringDates) &&
Objects.equals(nextTenRecurringDates, that.nextTenRecurringDates) &&
Objects.equals(humanReadable, that.humanReadable) &&
Objects.equals(recentEligibleMeetingDate, that.recentEligibleMeetingDate) &&
Objects.equals(createdDate, that.createdDate) &&
Objects.equals(lastUpdatedDate, that.lastUpdatedDate) &&
Objects.equals(createdByUserId, that.createdByUserId) &&
Objects.equals(createdByUsername, that.createdByUsername) &&
Objects.equals(lastUpdatedByUserId, that.lastUpdatedByUserId) &&
Objects.equals(lastUpdatedByUsername, that.lastUpdatedByUsername) &&
Objects.equals(repeatsOnDayOfMonth, that.repeatsOnDayOfMonth) &&
Objects.equals(entityTypeOptions, that.entityTypeOptions) &&
Objects.equals(calendarTypeOptions, that.calendarTypeOptions) &&
Objects.equals(remindByOptions, that.remindByOptions) &&
Objects.equals(frequencyOptions, that.frequencyOptions) &&
Objects.equals(repeatsOnDayOptions, that.repeatsOnDayOptions) &&
Objects.equals(frequencyNthDayTypeOptions, that.frequencyNthDayTypeOptions) &&
Objects.equals(rowIndex, that.rowIndex) &&
Objects.equals(dateFormat, that.dateFormat) &&
Objects.equals(locale, that.locale) &&
Objects.equals(centerId, that.centerId) &&
Objects.equals(typeId, that.typeId);
}
@Override
public int hashCode() {
return Objects.hash(id, calendarInstanceId, entityId, entityType, title, description, location, startDate, endDate, meetingTime, duration, type, repeating, recurrence, frequency, interval, repeatsOnDay, repeatsOnNthDayOfMonth, remindBy, firstReminder, secondReminder, recurringDates, nextTenRecurringDates, humanReadable, recentEligibleMeetingDate, createdDate, lastUpdatedDate, createdByUserId, createdByUsername, lastUpdatedByUserId, lastUpdatedByUsername, repeatsOnDayOfMonth, entityTypeOptions, calendarTypeOptions, remindByOptions, frequencyOptions, repeatsOnDayOptions, frequencyNthDayTypeOptions, rowIndex, dateFormat, locale, centerId, typeId);
}
}
@@ -427,7 +427,7 @@ public class Calendar extends AbstractAuditableCustom<AppUser, Long> {
final Integer interval, final Integer repeatsOnDay, final Integer repeatsOnNthDay) {
final Map<String, Object> actualChanges = new LinkedHashMap<>(9);
if (calendarStartDate != null & this.startDate != null) {
if (calendarStartDate != null && this.startDate != null) {
if (!calendarStartDate.equals(this.getStartDateLocalDate())) {
actualChanges.put("startDate", calendarStartDate);
this.startDate = calendarStartDate.toDate();
@@ -609,12 +609,12 @@ public class Calendar extends AbstractAuditableCustom<AppUser, Long> {
}
}
if (frequencyType.isMonthly()) {
if (repeatsOnNthDayOfMonth != null && (repeatsOnDay == null || repeatsOnDay == CalendarWeekDaysType.INVALID.getValue())) {
if (repeatsOnNthDayOfMonth != null && (repeatsOnDay == null || repeatsOnDay.equals(CalendarWeekDaysType.INVALID.getValue()))) {
if (repeatsOnNthDayOfMonth >= -1 && repeatsOnNthDayOfMonth <= 28) {
recurrenceBuilder.append(";BYMONTHDAY=");
recurrenceBuilder.append(repeatsOnNthDayOfMonth);
}
} else if (repeatsOnNthDayOfMonth != null && repeatsOnDay != null && repeatsOnDay != CalendarWeekDaysType.INVALID.getValue()) {
} else if (repeatsOnNthDayOfMonth != null && repeatsOnDay != null && !repeatsOnDay.equals(CalendarWeekDaysType.INVALID.getValue())) {
final NthDayType nthDay = NthDayType.fromInt(repeatsOnNthDayOfMonth);
if (!nthDay.isInvalid()) {
recurrenceBuilder.append(";BYSETPOS=");
@@ -19,10 +19,7 @@
package org.apache.fineract.portfolio.charge.domain;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import javax.persistence.Column;
import javax.persistence.Entity;
@@ -210,24 +207,6 @@ public class Charge extends AbstractPersistableCustom<Long> {
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); }
}
@Override
public boolean equals(final Object obj) {
if (obj == null) { return false; }
if (obj == this) { return true; }
if (obj.getClass() != getClass()) { return false; }
final LoanCharge rhs = (LoanCharge) obj;
return new EqualsBuilder().appendSuper(super.equals(obj)) //
.append(getId(), rhs.getId()) //
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(3, 5) //
.append(getId()) //
.toHashCode();
}
public String getName() {
return this.name;
}
@@ -428,14 +407,14 @@ public class Charge extends AbstractPersistableCustom<Long> {
final MonthDay monthDay = command.extractMonthDayNamed("feeOnMonthDay");
final String actualValueEntered = command.stringValueOfParameterNamed("feeOnMonthDay");
final Integer dayOfMonthValue = monthDay.getDayOfMonth();
if (this.feeOnDay != dayOfMonthValue) {
if (!this.feeOnDay.equals(dayOfMonthValue)) {
actualChanges.put("feeOnMonthDay", actualValueEntered);
actualChanges.put("locale", localeAsInput);
this.feeOnDay = dayOfMonthValue;
}
final Integer monthOfYear = monthDay.getMonthOfYear();
if (this.feeOnMonth != monthOfYear) {
if (!this.feeOnMonth.equals(monthOfYear)) {
actualChanges.put("feeOnMonthDay", actualValueEntered);
actualChanges.put("locale", localeAsInput);
this.feeOnMonth = monthOfYear;
@@ -621,4 +600,36 @@ public class Charge extends AbstractPersistableCustom<Long> {
public void setTaxGroup(TaxGroup taxGroup) {
this.taxGroup = taxGroup;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Charge)) return false;
Charge charge = (Charge) o;
return Objects.equals(name, charge.name) &&
Objects.equals(amount, charge.amount) &&
Objects.equals(currencyCode, charge.currencyCode) &&
Objects.equals(chargeAppliesTo, charge.chargeAppliesTo) &&
Objects.equals(chargeTimeType, charge.chargeTimeType) &&
Objects.equals(chargeCalculation, charge.chargeCalculation) &&
Objects.equals(chargePaymentMode, charge.chargePaymentMode) &&
Objects.equals(feeOnDay, charge.feeOnDay) &&
Objects.equals(feeInterval, charge.feeInterval) &&
Objects.equals(feeOnMonth, charge.feeOnMonth) &&
Objects.equals(penalty, charge.penalty) &&
Objects.equals(active, charge.active) &&
Objects.equals(deleted, charge.deleted) &&
Objects.equals(minCap, charge.minCap) &&
Objects.equals(maxCap, charge.maxCap) &&
Objects.equals(feeFrequency, charge.feeFrequency) &&
Objects.equals(account, charge.account) &&
Objects.equals(taxGroup, charge.taxGroup);
}
@Override
public int hashCode() {
return Objects.hash(name, amount, currencyCode, chargeAppliesTo, chargeTimeType, chargeCalculation,
chargePaymentMode, feeOnDay, feeInterval, feeOnMonth, penalty, active, deleted, minCap, maxCap, feeFrequency, account, taxGroup);
}
}
@@ -18,14 +18,6 @@
*/
package org.apache.fineract.portfolio.charge.service;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.fineract.accounting.common.AccountingDropdownReadPlatformService;
import org.apache.fineract.accounting.glaccount.data.GLAccountData;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
@@ -52,6 +44,14 @@ import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author vishwas
*
@@ -225,6 +225,7 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
sb.append(excludeChargeTimes[i].getValue());
}
excludeClause = excludeClause.append(" and c.charge_time_enum not in(" + sb.toString() + ") ");
excludeClause.append(" ");
}
}
@@ -18,9 +18,6 @@
*/
package org.apache.fineract.portfolio.client.data;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
@@ -36,11 +33,15 @@ import org.apache.fineract.portfolio.savings.data.SavingsAccountData;
import org.apache.fineract.portfolio.savings.data.SavingsProductData;
import org.joda.time.LocalDate;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
/**
* Immutable data object representing client data.
*/
@SuppressWarnings("unused")
final public class ClientData implements Comparable<ClientData> {
final public class ClientData implements Comparable<ClientData>, Serializable {
private final Long id;
private final String accountNo;
@@ -19,12 +19,13 @@
package org.apache.fineract.portfolio.client.data;
import java.util.Collection;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
import org.joda.time.LocalDate;
public class ClientFamilyMembersData {
import java.io.Serializable;
import java.util.Collection;
public class ClientFamilyMembersData implements Serializable {
private final Long id;
@@ -18,15 +18,16 @@
*/
package org.apache.fineract.portfolio.client.data;
import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
import org.joda.time.LocalDate;
import java.io.Serializable;
/**
* Immutable data object representing the ClientNonPerson
*/
@SuppressWarnings("unused")
public class ClientNonPersonData {
public class ClientNonPersonData implements Serializable {
private final CodeValueData constitution;
private final String incorpNumber;
@@ -18,18 +18,16 @@
*/
package org.apache.fineract.portfolio.client.data;
import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData;
import org.joda.time.LocalDate;
import java.math.BigDecimal;
import java.io.Serializable;
/**
* Immutable data object represent the important time-line events of a loan
* application and loan.
*/
@SuppressWarnings("unused")
public class ClientTimelineData {
public class ClientTimelineData implements Serializable {
private final LocalDate submittedOnDate;
private final String submittedByUsername;
@@ -18,15 +18,16 @@
*/
package org.apache.fineract.portfolio.floatingrates.data;
import java.util.List;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.joda.time.LocalDate;
public class FloatingRateData implements Comparable<FloatingRateData> {
import java.io.Serializable;
import java.util.List;
public class FloatingRateData implements Comparable<FloatingRateData> , Serializable {
private final Long id;
private final String name;
@@ -18,15 +18,16 @@
*/
package org.apache.fineract.portfolio.floatingrates.data;
import java.math.BigDecimal;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.joda.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
public class FloatingRatePeriodData implements
Comparable<FloatingRatePeriodData> {
Comparable<FloatingRatePeriodData>, Serializable {
private Long id;
private LocalDate fromDate;
@@ -18,16 +18,9 @@
*/
package org.apache.fineract.portfolio.floatingrates.serialization;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
import org.apache.fineract.infrastructure.core.data.ApiParameterError;
import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
@@ -39,9 +32,9 @@ import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.*;
@Component
public class FloatingRateDataValidator {
@@ -258,9 +251,7 @@ public class FloatingRateDataValidator {
baseDataValidator.reset().parameter("isBaseLendingRate")
.trueOrFalseRequired(false);
} else if (isBaseLendingRate) {
if (baseLendingRate != null
&& baseLendingRate.getId() != floatingRateForUpdate
.getId()) {
if (baseLendingRate != null && !baseLendingRate.getId().equals(floatingRateForUpdate.getId())) {
baseDataValidator
.reset()
.parameter("isBaseLendingRate")
@@ -289,9 +280,7 @@ public class FloatingRateDataValidator {
isActive = floatingRateForUpdate.isActive();
}
if(baseLendingRate != null
&& baseLendingRate.getId() == floatingRateForUpdate
.getId()){
if(baseLendingRate != null && baseLendingRate.getId().equals(floatingRateForUpdate.getId())){
if(!isBaseLendingRate || !isActive){
isBLRModifiedAsNonBLR = true;
}
@@ -18,11 +18,6 @@
*/
package org.apache.fineract.portfolio.group.data;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.infrastructure.dataqueries.data.DatatableData;
@@ -31,10 +26,16 @@ import org.apache.fineract.organisation.staff.data.StaffData;
import org.apache.fineract.portfolio.calendar.data.CalendarData;
import org.joda.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
/**
* Immutable data object representing groups.
*/
public class CenterData {
public class CenterData implements Serializable {
private final Long id;
private String accountNo;
@@ -266,4 +267,44 @@ public class CenterData {
public void setDatatables(final List<DatatableData> datatables) {
this.datatables = datatables;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof CenterData)) return false;
CenterData that = (CenterData) o;
return Objects.equals(active, that.active) &&
Objects.equals(id, that.id) &&
Objects.equals(accountNo, that.accountNo) &&
Objects.equals(name, that.name) &&
Objects.equals(externalId, that.externalId) &&
Objects.equals(officeId, that.officeId) &&
Objects.equals(officeName, that.officeName) &&
Objects.equals(staffId, that.staffId) &&
Objects.equals(staffName, that.staffName) &&
Objects.equals(hierarchy, that.hierarchy) &&
Objects.equals(status, that.status) &&
Objects.equals(activationDate, that.activationDate) &&
Objects.equals(timeline, that.timeline) &&
Objects.equals(groupMembers, that.groupMembers) &&
Objects.equals(groupMembersOptions, that.groupMembersOptions) &&
Objects.equals(collectionMeetingCalendar, that.collectionMeetingCalendar) &&
Objects.equals(closureReasons, that.closureReasons) &&
Objects.equals(officeOptions, that.officeOptions) &&
Objects.equals(staffOptions, that.staffOptions) &&
Objects.equals(totalCollected, that.totalCollected) &&
Objects.equals(totalOverdue, that.totalOverdue) &&
Objects.equals(totaldue, that.totaldue) &&
Objects.equals(installmentDue, that.installmentDue) &&
Objects.equals(datatables, that.datatables) &&
Objects.equals(rowIndex, that.rowIndex) &&
Objects.equals(dateFormat, that.dateFormat) &&
Objects.equals(locale, that.locale) &&
Objects.equals(submittedOnDate, that.submittedOnDate);
}
@Override
public int hashCode() {
return Objects.hash(id, accountNo, name, externalId, officeId, officeName, staffId, staffName, hierarchy, status, active, activationDate, timeline, groupMembers, groupMembersOptions, collectionMeetingCalendar, closureReasons, officeOptions, staffOptions, totalCollected, totalOverdue, totaldue, installmentDue, datatables, rowIndex, dateFormat, locale, submittedOnDate);
}
}
@@ -18,10 +18,6 @@
*/
package org.apache.fineract.portfolio.group.data;
import java.util.Collection;
import java.util.List;
import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.infrastructure.dataqueries.data.DatatableData;
@@ -31,11 +27,16 @@ import org.apache.fineract.portfolio.calendar.data.CalendarData;
import org.apache.fineract.portfolio.client.data.ClientData;
import org.joda.time.LocalDate;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
/**
* Immutable data object representing a general group (so may or may not have a
* parent).
*/
public class GroupGeneralData {
public class GroupGeneralData implements Serializable {
private final Long id;
private final String accountNo;
@@ -363,4 +364,49 @@ public class GroupGeneralData {
public void setDatatables(final List<DatatableData> datatables) {
this.datatables = datatables;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof GroupGeneralData)) return false;
GroupGeneralData that = (GroupGeneralData) o;
return Objects.equals(id, that.id) &&
Objects.equals(accountNo, that.accountNo) &&
Objects.equals(name, that.name) &&
Objects.equals(externalId, that.externalId) &&
Objects.equals(status, that.status) &&
Objects.equals(active, that.active) &&
Objects.equals(activationDate, that.activationDate) &&
Objects.equals(officeId, that.officeId) &&
Objects.equals(officeName, that.officeName) &&
Objects.equals(centerId, that.centerId) &&
Objects.equals(centerName, that.centerName) &&
Objects.equals(staffId, that.staffId) &&
Objects.equals(staffName, that.staffName) &&
Objects.equals(hierarchy, that.hierarchy) &&
Objects.equals(groupLevel, that.groupLevel) &&
Objects.equals(clientMembers, that.clientMembers) &&
Objects.equals(activeClientMembers, that.activeClientMembers) &&
Objects.equals(groupRoles, that.groupRoles) &&
Objects.equals(calendarsData, that.calendarsData) &&
Objects.equals(collectionMeetingCalendar, that.collectionMeetingCalendar) &&
Objects.equals(centerOptions, that.centerOptions) &&
Objects.equals(officeOptions, that.officeOptions) &&
Objects.equals(staffOptions, that.staffOptions) &&
Objects.equals(clientOptions, that.clientOptions) &&
Objects.equals(availableRoles, that.availableRoles) &&
Objects.equals(selectedRole, that.selectedRole) &&
Objects.equals(closureReasons, that.closureReasons) &&
Objects.equals(timeline, that.timeline) &&
Objects.equals(datatables, that.datatables) &&
Objects.equals(rowIndex, that.rowIndex) &&
Objects.equals(dateFormat, that.dateFormat) &&
Objects.equals(locale, that.locale) &&
Objects.equals(submittedOnDate, that.submittedOnDate);
}
@Override
public int hashCode() {
return Objects.hash(id, accountNo, name, externalId, status, active, activationDate, officeId, officeName, centerId, centerName, staffId, staffName, hierarchy, groupLevel, clientMembers, activeClientMembers, groupRoles, calendarsData, collectionMeetingCalendar, centerOptions, officeOptions, staffOptions, clientOptions, availableRoles, selectedRole, closureReasons, timeline, datatables, rowIndex, dateFormat, locale, submittedOnDate);
}
}
@@ -20,7 +20,10 @@ package org.apache.fineract.portfolio.group.data;
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
public class GroupRoleData {
import java.io.Serializable;
import java.util.Objects;
public class GroupRoleData implements Serializable {
@SuppressWarnings("unused")
private final Long id;
@@ -42,4 +45,19 @@ public class GroupRoleData {
this.clientName = clientName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof GroupRoleData)) return false;
GroupRoleData that = (GroupRoleData) o;
return Objects.equals(id, that.id) &&
Objects.equals(role, that.role) &&
Objects.equals(clientId, that.clientId) &&
Objects.equals(clientName, that.clientName);
}
@Override
public int hashCode() {
return Objects.hash(id, role, clientId, clientName);
}
}
@@ -18,10 +18,10 @@
*/
package org.apache.fineract.portfolio.group.data;
import java.util.Collection;
import org.apache.fineract.organisation.monetary.data.MoneyData;
import java.util.Collection;
public class GroupSummary {
private final Long totalActiveClients;
@@ -20,13 +20,16 @@ package org.apache.fineract.portfolio.group.data;
import org.joda.time.LocalDate;
import java.io.Serializable;
import java.util.Objects;
/**
* Immutable data object represent the important time-line events of a
* group/center.
*
*/
@SuppressWarnings("unused")
public class GroupTimelineData {
public class GroupTimelineData implements Serializable {
private final LocalDate submittedOnDate;
private final String submittedByUsername;
@@ -64,4 +67,27 @@ public class GroupTimelineData {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof GroupTimelineData)) return false;
GroupTimelineData that = (GroupTimelineData) o;
return Objects.equals(submittedOnDate, that.submittedOnDate) &&
Objects.equals(submittedByUsername, that.submittedByUsername) &&
Objects.equals(submittedByFirstname, that.submittedByFirstname) &&
Objects.equals(submittedByLastname, that.submittedByLastname) &&
Objects.equals(activatedOnDate, that.activatedOnDate) &&
Objects.equals(activatedByUsername, that.activatedByUsername) &&
Objects.equals(activatedByFirstname, that.activatedByFirstname) &&
Objects.equals(activatedByLastname, that.activatedByLastname) &&
Objects.equals(closedOnDate, that.closedOnDate) &&
Objects.equals(closedByUsername, that.closedByUsername) &&
Objects.equals(closedByFirstname, that.closedByFirstname) &&
Objects.equals(closedByLastname, that.closedByLastname);
}
@Override
public int hashCode() {
return Objects.hash(submittedOnDate, submittedByUsername, submittedByFirstname, submittedByLastname, activatedOnDate, activatedByUsername, activatedByFirstname, activatedByLastname, closedOnDate, closedByUsername, closedByFirstname, closedByLastname);
}
}
@@ -18,14 +18,14 @@
*/
package org.apache.fineract.portfolio.group.domain;
import java.util.Date;
import org.apache.fineract.organisation.office.domain.Office;
import org.apache.fineract.portfolio.group.exception.GroupNotFoundException;
import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* <p>
* Wrapper for {@link GroupRepository} that adds NULL checking and Error
@@ -49,7 +49,7 @@ public class GroupRepositoryWrapper {
public Group findByOfficeWithNotFoundDetection(final Long id, final Office office) {
final Group group = findOneWithNotFoundDetection(id);
if (group.getOffice().getId() != office.getId()) { throw new GroupNotFoundException(id); }
if (!group.getOffice().getId().equals(office.getId())) { throw new GroupNotFoundException(id); }
return group;
}
@@ -58,7 +58,7 @@ public enum GroupTypes {
}
public static GroupTypes fromInt(final int i) {
final GroupTypes type = intToEnumMap.get(Integer.valueOf(i));
final GroupTypes type = intToEnumMap.get(Integer.toUnsignedLong(i));
return type;
}
@@ -43,6 +43,12 @@ public enum GroupingTypeStatus {
case 300:
enumeration = GroupingTypeStatus.ACTIVE;
break;
case 303:
enumeration = GroupingTypeStatus.TRANSFER_IN_PROGRESS;
break;
case 304:
enumeration = GroupingTypeStatus.TRANSFER_ON_HOLD;
break;
case 600:
enumeration = GroupingTypeStatus.CLOSED;
break;
@@ -50,7 +56,7 @@ public enum GroupingTypeStatus {
return enumeration;
}
private GroupingTypeStatus(final Integer value, final String code) {
GroupingTypeStatus(final Integer value, final String code) {
this.value = value;
this.code = code;
}
@@ -80,11 +86,11 @@ public enum GroupingTypeStatus {
}
public boolean isTransferInProgress() {
return isTransferInProgress();
return this.value.equals(GroupingTypeStatus.TRANSFER_IN_PROGRESS.getValue());
}
public boolean isTransferOnHold() {
return isTransferOnHold();
return this.value.equals(GroupingTypeStatus.TRANSFER_ON_HOLD.getValue());
}
public boolean isUnderTransfer() {
@@ -319,7 +319,7 @@ public class LoanTransactionData {
}
public boolean isNotDisbursement() {
return Integer.valueOf(1).equals(this.type.id());
return type.id() == 1;
}
@@ -18,40 +18,12 @@
*/
package org.apache.fineract.portfolio.loanaccount.domain;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
import javax.persistence.Version;
import net.sf.ehcache.util.FindBugsSuppressWarnings;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
@@ -102,34 +74,10 @@ import org.apache.fineract.portfolio.loanaccount.data.HolidayDetailDTO;
import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData;
import org.apache.fineract.portfolio.loanaccount.data.ScheduleGeneratorDTO;
import org.apache.fineract.portfolio.loanaccount.domain.transactionprocessor.LoanRepaymentScheduleTransactionProcessor;
import org.apache.fineract.portfolio.loanaccount.exception.ExceedingTrancheCountException;
import org.apache.fineract.portfolio.loanaccount.exception.InvalidLoanStateTransitionException;
import org.apache.fineract.portfolio.loanaccount.exception.InvalidLoanTransactionTypeException;
import org.apache.fineract.portfolio.loanaccount.exception.InvalidRefundDateException;
import org.apache.fineract.portfolio.loanaccount.exception.LoanApplicationDateException;
import org.apache.fineract.portfolio.loanaccount.exception.LoanDisbursalException;
import org.apache.fineract.portfolio.loanaccount.exception.LoanForeclosureException;
import org.apache.fineract.portfolio.loanaccount.exception.LoanOfficerAssignmentDateException;
import org.apache.fineract.portfolio.loanaccount.exception.LoanOfficerAssignmentException;
import org.apache.fineract.portfolio.loanaccount.exception.LoanOfficerUnassignmentDateException;
import org.apache.fineract.portfolio.loanaccount.exception.MultiDisbursementDataRequiredException;
import org.apache.fineract.portfolio.loanaccount.exception.UndoLastTrancheDisbursementException;
import org.apache.fineract.portfolio.loanaccount.exception.*;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleDTO;
import org.apache.fineract.portfolio.loanaccount.loanschedule.data.LoanScheduleParams;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculator;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleGenerator;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModelPeriod;
import org.apache.fineract.portfolio.loanproduct.domain.AmortizationMethod;
import org.apache.fineract.portfolio.loanproduct.domain.InterestCalculationPeriodMethod;
import org.apache.fineract.portfolio.loanproduct.domain.InterestMethod;
import org.apache.fineract.portfolio.loanproduct.domain.InterestRecalculationCompoundingMethod;
import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRelatedDetail;
import org.apache.fineract.portfolio.loanproduct.domain.LoanRescheduleStrategyMethod;
import org.apache.fineract.portfolio.loanproduct.domain.LoanTransactionProcessingStrategy;
import org.apache.fineract.portfolio.loanproduct.domain.RecalculationFrequencyType;
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.*;
import org.apache.fineract.portfolio.loanproduct.domain.*;
import org.apache.fineract.portfolio.loanproduct.service.LoanEnumerations;
import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
import org.apache.fineract.useradministration.domain.AppUser;
@@ -140,10 +88,11 @@ import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.stereotype.Component;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import javax.persistence.*;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.*;
@Entity
@Component
@@ -785,6 +734,9 @@ public class Loan extends AbstractPersistableCustom<Long> {
updateLoanSummaryDerivedFields();
}
// TODO Fix this correctly...
// See this review: https://github.com/apache/fineract/pull/670/files/0409af3903d350afe43ef4837e4d915ccbe14285#r357920211
@FindBugsSuppressWarnings("GC_UNRELATED_TYPES")
private void removeOrModifyTransactionAssociatedWithLoanChargeIfDueAtDisbursement(final LoanCharge loanCharge) {
if (loanCharge.isDueAtDisbursement()) {
LoanTransaction transactionToRemove = null;
@@ -792,19 +744,18 @@ public class Loan extends AbstractPersistableCustom<Long> {
for (final LoanTransaction transaction : transactions) {
if (transaction.isRepaymentAtDisbursement() && transaction.getLoanChargesPaid().contains(loanCharge)) {
final MonetaryCurrency currency = loanCurrency();
final Money chargeAmount = Money.of(currency, loanCharge.amount());
if (transaction.isGreaterThan(chargeAmount)) {
final Money principalPortion = Money.zero(currency);
final Money interestPortion = Money.zero(currency);
final Money penaltychargesPortion = Money.zero(currency);
final MonetaryCurrency currency = loanCurrency();
final Money chargeAmount = Money.of(currency, loanCharge.amount());
if (transaction.isGreaterThan(chargeAmount)) {
final Money principalPortion = Money.zero(currency);
final Money interestPortion = Money.zero(currency);
final Money penaltychargesPortion = Money.zero(currency);
final Money feeChargesPortion = chargeAmount;
transaction.updateComponentsAndTotal(principalPortion, interestPortion, feeChargesPortion, penaltychargesPortion);
} else {
transactionToRemove = transaction;
transaction.updateComponentsAndTotal(principalPortion, interestPortion, chargeAmount, penaltychargesPortion);
} else {
transactionToRemove = transaction;
}
}
}
}
if (transactionToRemove != null) {
@@ -2687,10 +2638,10 @@ public class Loan extends AbstractPersistableCustom<Long> {
final Integer installmentNumber = null;
for (final LoanCharge charge : charges()) {
Date actualDisbursementDate = getActualDisbursementDate(charge);
if ((charge.getCharge().getChargeTimeType() == ChargeTimeType.DISBURSEMENT.getValue()
if ((charge.getCharge().getChargeTimeType().equals(ChargeTimeType.DISBURSEMENT.getValue())
&& disbursedOn.equals(new LocalDate(actualDisbursementDate)) && actualDisbursementDate != null && !charge.isWaived() && !charge
.isFullyPaid())
|| (charge.getCharge().getChargeTimeType() == ChargeTimeType.TRANCHE_DISBURSEMENT.getValue()
|| (charge.getCharge().getChargeTimeType().equals(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue())
&& disbursedOn.equals(new LocalDate(actualDisbursementDate)) && actualDisbursementDate != null
&& !charge.isWaived() && !charge.isFullyPaid())) {
if (totalFeeChargesDueAtDisbursement.isGreaterThanZero() && !charge.getChargePaymentMode().isPaymentModeAccountTransfer()) {
@@ -2768,6 +2719,8 @@ public class Loan extends AbstractPersistableCustom<Long> {
return chargesPayment;
}
// TODO FIX THIS
@FindBugsSuppressWarnings("EC_UNRELATED_TYPES") // see this review: https://github.com/apache/fineract/pull/670/files/0409af3903d350afe43ef4837e4d915ccbe14285#r357920364
public Map<String, Object> undoDisbursal(final ScheduleGeneratorDTO scheduleGeneratorDTO, final List<Long> existingTransactionIds,
final List<Long> existingReversedTransactionIds, AppUser currentUser) {
@@ -2787,7 +2740,8 @@ public class Loan extends AbstractPersistableCustom<Long> {
final boolean isScheduleRegenerateRequired = isRepaymentScheduleRegenerationRequiredForDisbursement(actualDisbursementDate);
this.actualDisbursementDate = null;
this.disbursedBy = null;
boolean isDisbursedAmountChanged = !this.approvedPrincipal.equals(this.loanRepaymentScheduleDetail.getPrincipal());
boolean isDisbursedAmountChanged =
!this.approvedPrincipal.equals(this.loanRepaymentScheduleDetail.getPrincipal());
this.loanRepaymentScheduleDetail.setPrincipal(this.approvedPrincipal);
if (this.loanProduct.isMultiDisburseLoan()) {
for (final LoanDisbursementDetails details : this.disbursementDetails) {
@@ -6092,7 +6046,7 @@ public class Loan extends AbstractPersistableCustom<Long> {
public BigDecimal getDerivedAmountForCharge(final LoanCharge loanCharge) {
BigDecimal amount = BigDecimal.ZERO;
if (isMultiDisburmentLoan() && (loanCharge.getCharge().getChargeTimeType() == ChargeTimeType.DISBURSEMENT.getValue())) {
if (isMultiDisburmentLoan() && (loanCharge.getCharge().getChargeTimeType().equals(ChargeTimeType.DISBURSEMENT.getValue()))) {
amount = getApprovedPrincipal();
} else {
// If charge type is specified due date and loan is multi disburment
@@ -20,6 +20,7 @@ package org.apache.fineract.portfolio.loanaccount.domain;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
@@ -75,6 +76,11 @@ public class LoanDisbursementDetails extends AbstractPersistableCustom<Long> {
return false;
}
@Override
public int hashCode() {
return Objects.hash(expectedDisbursementDate, principal);
}
public void copy(final LoanDisbursementDetails disbursementDetails) {
this.principal = disbursementDetails.principal;
this.expectedDisbursementDate = disbursementDetails.expectedDisbursementDate;
@@ -28,7 +28,7 @@ public class GuarantorConstants {
/***
* Enum of all parameters passed in while creating/updating a loan product
***/
public static enum GUARANTOR_JSON_INPUT_PARAMS {
public enum GUARANTOR_JSON_INPUT_PARAMS {
LOAN_ID("loanId"), CLIENT_RELATIONSHIP_TYPE_ID("clientRelationshipTypeId"), GUARANTOR_TYPE_ID("guarantorTypeId"), ENTITY_ID(
"entityId"), FIRSTNAME("firstname"), LASTNAME("lastname"), ADDRESS_LINE_1("addressLine1"), ADDRESS_LINE_2("addressLine2"), CITY(
"city"), STATE("state"), ZIP("zip"), COUNTRY("country"), MOBILE_NUMBER("mobileNumber"), PHONE_NUMBER("housePhoneNumber"), COMMENT(
@@ -36,7 +36,7 @@ public class GuarantorConstants {
private final String value;
private GUARANTOR_JSON_INPUT_PARAMS(final String value) {
GUARANTOR_JSON_INPUT_PARAMS(final String value) {
this.value = value;
}
@@ -18,29 +18,15 @@
*/
package org.apache.fineract.portfolio.loanaccount.guarantor.domain;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.apache.commons.lang.StringUtils;
import org.apache.fineract.infrastructure.codes.domain.CodeValue;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.guarantor.GuarantorConstants.GUARANTOR_JSON_INPUT_PARAMS;
import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
import javax.persistence.*;
import java.util.*;
@Entity
@Table(name = "m_guarantor")
@@ -208,7 +194,7 @@ public class Guarantor extends AbstractPersistableCustom<Long> {
newValue = command.integerValueOfParameterNamed(paramName);
}
actualChanges.put(paramName, newValue);
propertyToBeUpdated = newValue;
//propertyToBeUpdated = newValue;
// now update actual property
if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID.getValue())) {
@@ -222,7 +208,7 @@ public class Guarantor extends AbstractPersistableCustom<Long> {
if (command.isChangeInStringParameterNamed(paramName, propertyToBeUpdated)) {
final String newValue = command.stringValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
propertyToBeUpdated = newValue;
//propertyToBeUpdated = newValue;
// now update actual property
if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.FIRSTNAME.getValue())) {
@@ -256,7 +242,7 @@ public class Guarantor extends AbstractPersistableCustom<Long> {
if (command.isChangeInDateParameterNamed(paramName, propertyToBeUpdated)) {
final Date newValue = command.DateValueOfParameterNamed(paramName);
actualChanges.put(paramName, newValue);
propertyToBeUpdated = newValue;
//propertyToBeUpdated = newValue;
// now update actual property
if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.DATE_OF_BIRTH.getValue())) {
@@ -18,11 +18,6 @@
*/
package org.apache.fineract.portfolio.loanaccount.guarantor.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.fineract.infrastructure.codes.domain.CodeValue;
import org.apache.fineract.infrastructure.codes.domain.CodeValueRepositoryWrapper;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
@@ -43,11 +38,7 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
import org.apache.fineract.portfolio.loanaccount.guarantor.GuarantorConstants;
import org.apache.fineract.portfolio.loanaccount.guarantor.GuarantorConstants.GUARANTOR_JSON_INPUT_PARAMS;
import org.apache.fineract.portfolio.loanaccount.guarantor.command.GuarantorCommand;
import org.apache.fineract.portfolio.loanaccount.guarantor.domain.Guarantor;
import org.apache.fineract.portfolio.loanaccount.guarantor.domain.GuarantorFundStatusType;
import org.apache.fineract.portfolio.loanaccount.guarantor.domain.GuarantorFundingDetails;
import org.apache.fineract.portfolio.loanaccount.guarantor.domain.GuarantorRepository;
import org.apache.fineract.portfolio.loanaccount.guarantor.domain.GuarantorType;
import org.apache.fineract.portfolio.loanaccount.guarantor.domain.*;
import org.apache.fineract.portfolio.loanaccount.guarantor.exception.DuplicateGuarantorException;
import org.apache.fineract.portfolio.loanaccount.guarantor.exception.GuarantorNotFoundException;
import org.apache.fineract.portfolio.loanaccount.guarantor.exception.InvalidGuarantorException;
@@ -62,6 +53,11 @@ import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Service
public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements GuarantorWritePlatformService {
@@ -229,8 +225,8 @@ public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements Guaranto
}
}
if (changesOnly.containsKey(GUARANTOR_JSON_INPUT_PARAMS.ENTITY_ID)
|| changesOnly.containsKey(GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID)) {
if (changesOnly.containsKey(GUARANTOR_JSON_INPUT_PARAMS.ENTITY_ID.getValue())
|| changesOnly.containsKey(GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID.getValue())) {
validateGuarantorBusinessRules(guarantorForUpdate);
}
@@ -259,7 +259,7 @@ public class LoanScheduleAssembler {
validateRepaymentFrequencyIsSameAsMeetingFrequency(meetingPeriodFrequency.getValue(), repaymentFrequencyType,
CalendarUtils.getInterval(calendar.getRecurrence()), repaymentEvery);
} else {
if (repaymentPeriodFrequencyType == PeriodFrequencyType.MONTHS && nthDay != null && nthDay != NthDayType.INVALID.getValue()) {
if (repaymentPeriodFrequencyType == PeriodFrequencyType.MONTHS && nthDay != null && !nthDay.equals(NthDayType.INVALID.getValue())) {
LocalDate calendarStartDate = repaymentsStartingFromDate;
if (calendarStartDate == null) calendarStartDate = expectedDisbursementDate;
calendar = createLoanCalendar(calendarStartDate, repaymentEvery, CalendarFrequencyType.MONTHLY, dayOfWeek, nthDay);
@@ -19,6 +19,7 @@
package org.apache.fineract.portfolio.loanaccount.rescheduleloan;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@@ -58,8 +59,11 @@ public class RescheduleLoansApiConstants {
// approve action request parameters
public static final String approvedOnDateParam = "approvedOnDate";
public static final Set<String> APPROVE_REQUEST_DATA_PARAMETERS = new HashSet<>(Arrays.asList(localeParamName, dateFormatParamName,
approvedOnDateParam));
public static final Set<String> APPROVE_REQUEST_DATA_PARAMETERS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(localeParamName, dateFormatParamName,
approvedOnDateParam)));
public static final Set<String> commandParams = new HashSet<>(Arrays.asList(allCommandParamName, approveCommandParamName, pendingCommandParamName, rejectCommandParamName));
public static final Set<String> commandParams =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(allCommandParamName, approveCommandParamName,
pendingCommandParamName, rejectCommandParamName)));
}
@@ -1050,7 +1050,7 @@ public final class LoanApplicationCommandFromApiJsonHelper {
"Linked Savings account with id:" + savingsAccount.getId() + " is not in active state", "linkAccountId",
savingsAccount.getId());
dataValidationErrors.add(error);
} else if (loanApplication.getClientId() != savingsAccount.clientId()) {
} else if (!loanApplication.getClientId().equals(savingsAccount.clientId())) {
final ApiParameterError error = ApiParameterError.parameterError(
"validation.msg.loan.linked.savings.account.not.belongs.to.same.client", "Linked Savings account with id:"
+ savingsAccount.getId() + " is not belongs to the same client", "linkAccountId", savingsAccount.getId());
@@ -18,19 +18,11 @@
*/
package org.apache.fineract.portfolio.loanaccount.service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
import org.apache.fineract.portfolio.charge.domain.Charge;
import org.apache.fineract.portfolio.charge.domain.ChargeCalculationType;
import org.apache.fineract.portfolio.charge.domain.ChargePaymentMode;
import org.apache.fineract.portfolio.charge.domain.ChargeRepositoryWrapper;
import org.apache.fineract.portfolio.charge.domain.ChargeTimeType;
import org.apache.fineract.portfolio.charge.domain.*;
import org.apache.fineract.portfolio.charge.exception.LoanChargeCannotBeAddedException;
import org.apache.fineract.portfolio.loanaccount.api.LoanApiConstants;
import org.apache.fineract.portfolio.loanaccount.domain.LoanCharge;
@@ -44,9 +36,8 @@ import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.math.BigDecimal;
import java.util.*;
@Service
public class LoanChargeAssembler {
@@ -231,7 +222,7 @@ public class LoanChargeAssembler {
final Long chargeId = this.fromApiJsonHelper.extractLongNamed("chargeId", loanChargeElement);
if (id == null) {
final Charge chargeDefinition = this.chargeRepository.findOneWithNotFoundDetection(chargeId);
if (chargeDefinition.getChargeTimeType() == ChargeTimeType.TRANCHE_DISBURSEMENT.getValue()) {
if (chargeDefinition.getChargeTimeType().equals(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue())) {
associatedChargesForLoan.add(chargeDefinition);
}
}
@@ -18,9 +18,6 @@
*/
package org.apache.fineract.portfolio.loanaccount.service;
import java.util.*;
import java.util.concurrent.*;
import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
import org.apache.fineract.infrastructure.core.data.ApiParameterError;
import org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException;
@@ -42,6 +39,9 @@ import org.springframework.orm.ObjectOptimisticLockingFailureException;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.concurrent.*;
@Service
public class LoanSchedularServiceImpl implements LoanSchedularService {
@@ -240,14 +240,15 @@ public class LoanSchedularServiceImpl implements LoanSchedularService {
private void recalculateInterest(List<Long> loanIds,
int threadPoolSize, int batchSize, final ExecutorService executorService) {
StringBuilder sb = new StringBuilder();
//StringBuilder sb = new StringBuilder();
List<Callable<Object>> posters = new ArrayList<Callable<Object>>();
int fromIndex = 0;
// get the size of current paginated dataset
int size = loanIds.size();
//calculate the batch size
batchSize = (int) Math.ceil(size / threadPoolSize);
double toGetCeilValue = (double) (size / threadPoolSize);
batchSize = (int) Math.ceil(toGetCeilValue);
if(batchSize == 0)
return;

Some files were not shown because too many files have changed in this diff Show More