Skip to content

Commit 5d5611c

Browse files
helengao0helengao0
authored andcommitted
helen fineract
1 parent 477b2fd commit 5d5611c

File tree

8 files changed

+371
-10
lines changed

8 files changed

+371
-10
lines changed

build.gradle

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,18 @@ buildscript {
5151
}
5252
repositories {
5353
maven { url 'https://plugins.gradle.org/m2/' }
54-
}
5554

55+
}
56+
configurations.classpath {
57+
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
58+
if (details.requested.group == 'com.burgstaller' &&
59+
details.requested.name == 'okhttp-digest' &&
60+
details.requested.version == '1.10') {
61+
details.useTarget("io.github.rburgst:${details.requested.name}:1.21")
62+
details.because('Dependency has moved')
63+
}
64+
}
65+
}
5666
dependencies {
5767
classpath 'com.bmuschko:gradle-cargo-plugin:2.9.0'
5868
classpath 'org.eclipse.persistence:eclipselink:4.0.0'

fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public final class SearchParameters {
4949
private final Long productId;
5050
private final Long categoryId;
5151
private final boolean isSelfUser;
52+
private final String birthMonth;
53+
private final String birthDay;
5254

5355
public static SearchParameters from(final String sqlSearch, final Long officeId, final String externalId, final String name,
5456
final String hierarchy) {
@@ -182,7 +184,7 @@ public static SearchParameters forProvisioningEntries(final Long provisioningEnt
182184
}
183185

184186
public static SearchParameters forSavings(final String sqlSearch, final String externalId, final Integer offset, final Integer limit,
185-
final String orderBy, final String sortOrder) {
187+
final String orderBy, final String sortOrder, final String birthMonth, final String birthDay) {
186188

187189
final Integer maxLimitAllowed = getCheckedLimit(limit);
188190
final Long staffId = null;
@@ -193,7 +195,7 @@ public static SearchParameters forSavings(final String sqlSearch, final String e
193195
final boolean isSelfUser = false;
194196

195197
return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder,
196-
staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser);
198+
staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser, birthMonth, birthDay);
197199
}
198200

199201
public static SearchParameters forAccountTransfer(final String sqlSearch, final String externalId, final Integer offset,
@@ -269,7 +271,38 @@ private SearchParameters(final String sqlSearch, final Long officeId, final Stri
269271
this.categoryId = null;
270272
this.isSelfUser = isSelfUser;
271273
this.status = null;
274+
this.birthMonth = null;
275+
this.birthDay = null;
276+
}
272277

278+
private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
279+
final String hierarchy, final String firstname, final String lastname, final Integer offset, final Integer limit,
280+
final String orderBy, final String sortOrder, final Long staffId, final String accountNo, final Long loanId,
281+
final Long savingsId, final Boolean orphansOnly, boolean isSelfUser, String BirthMonth, String BirthDay) {
282+
this.sqlSearch = sqlSearch;
283+
this.officeId = officeId;
284+
this.externalId = externalId;
285+
this.name = name;
286+
this.hierarchy = hierarchy;
287+
this.firstname = firstname;
288+
this.lastname = lastname;
289+
this.offset = offset;
290+
this.limit = limit;
291+
this.orderBy = orderBy;
292+
this.sortOrder = sortOrder;
293+
this.staffId = staffId;
294+
this.accountNo = accountNo;
295+
this.loanId = loanId;
296+
this.savingsId = savingsId;
297+
this.orphansOnly = orphansOnly;
298+
this.currencyCode = null;
299+
this.provisioningEntryId = null;
300+
this.productId = null;
301+
this.categoryId = null;
302+
this.isSelfUser = isSelfUser;
303+
this.status = null;
304+
this.birthMonth = BirthMonth;
305+
this.birthDay = BirthDay;
273306
}
274307

275308
private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
@@ -298,6 +331,8 @@ private SearchParameters(final String sqlSearch, final Long officeId, final Stri
298331
this.categoryId = null;
299332
this.isSelfUser = isSelfUser;
300333
this.status = status;
334+
this.birthMonth = null;
335+
this.birthDay = null;
301336

302337
}
303338

@@ -327,6 +362,8 @@ private SearchParameters(final Long officeId, final String externalId, final Str
327362
this.categoryId = null;
328363
this.isSelfUser = isSelfUser;
329364
this.status = null;
365+
this.birthMonth = null;
366+
this.birthDay = null;
330367
}
331368

332369
private SearchParameters(final Long provisioningEntryId, final Long officeId, final Long productId, final Long categoryId,
@@ -353,6 +390,8 @@ private SearchParameters(final Long provisioningEntryId, final Long officeId, fi
353390
this.categoryId = categoryId;
354391
this.isSelfUser = false;
355392
this.status = null;
393+
this.birthMonth = null;
394+
this.birthDay = null;
356395

357396
}
358397

@@ -382,7 +421,8 @@ public SearchParameters(final String sqlSearch, final Long officeId, final Strin
382421
this.categoryId = null;
383422
this.isSelfUser = false;
384423
this.status = null;
385-
424+
this.birthMonth = null;
425+
this.birthDay = null;
386426
}
387427

388428
public boolean isOrderByRequested() {
@@ -544,6 +584,14 @@ public boolean isSelfUser() {
544584
return this.isSelfUser;
545585
}
546586

587+
public String getBirthMonth() {
588+
return birthMonth;
589+
}
590+
591+
public String getBirthDay() {
592+
return birthDay;
593+
}
594+
547595
/**
548596
* creates an instance of the SearchParameters from a request for the report mailing job run history
549597
*
@@ -569,4 +617,5 @@ public static SearchParameters fromReportMailingJob(final Integer offset, final
569617
return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, null, null, null,
570618
null, null, false);
571619
}
620+
572621
}

fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/SavingsAccountsApiResource.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import org.apache.fineract.portfolio.savings.data.SavingsAccountChargeData;
6969
import org.apache.fineract.portfolio.savings.data.SavingsAccountData;
7070
import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData;
71+
import org.apache.fineract.portfolio.savings.exception.BirthdayValidationException;
7172
import org.apache.fineract.portfolio.savings.service.SavingsAccountChargeReadPlatformService;
7273
import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService;
7374
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
@@ -128,18 +129,54 @@ public String retrieveAll(@Context final UriInfo uriInfo,
128129
@QueryParam("offset") @Parameter(description = "offset") final Integer offset,
129130
@QueryParam("limit") @Parameter(description = "limit") final Integer limit,
130131
@QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy,
131-
@QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder) {
132+
@QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder,
133+
@QueryParam("birthMonth") @Parameter(description = "birthMonth") final String birthMonth,
134+
@QueryParam("birthDay") @Parameter(description = "birthDay") final String birthDay
135+
) {
132136

133137
context.authenticatedUser().validateHasReadPermission(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME);
134-
135-
final SearchParameters searchParameters = SearchParameters.forSavings(sqlSearch, externalId, offset, limit, orderBy, sortOrder);
138+
validateBirthday(birthMonth, birthDay);
139+
final SearchParameters searchParameters = SearchParameters.forSavings(sqlSearch, externalId, offset, limit, orderBy, sortOrder, birthMonth, birthDay);
136140

137141
final Page<SavingsAccountData> products = savingsAccountReadPlatformService.retrieveAll(searchParameters);
138142

139143
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
140144
return toApiJsonSerializer.serialize(settings, products, SavingsApiSetConstants.SAVINGS_ACCOUNT_RESPONSE_DATA_PARAMETERS);
141145
}
142146

147+
private void validateBirthday(final String birthMonth, String birthDay) {
148+
if (StringUtils.isBlank(birthMonth) && StringUtils.isBlank(birthDay)) {
149+
return;
150+
}
151+
if (StringUtils.isBlank(birthMonth)) {
152+
throw BirthdayValidationException.incomplete("birthMonth");
153+
}
154+
if (StringUtils.isBlank(birthDay)) {
155+
throw BirthdayValidationException.incomplete("birthDay");
156+
}
157+
final int month;
158+
final int day;
159+
try {
160+
month = Integer.parseInt(birthMonth.trim());
161+
} catch (NumberFormatException e) {
162+
throw BirthdayValidationException.invalidMonth(birthMonth);
163+
}
164+
try {
165+
day = Integer.parseInt(birthDay.trim());
166+
} catch (NumberFormatException e) {
167+
throw BirthdayValidationException.invalidDay(birthDay);
168+
}
169+
170+
if (month < 1 || month > 12) {
171+
throw BirthdayValidationException.invalidMonth(String.valueOf(month));
172+
}
173+
174+
final int maxDayForMonth = java.time.Month.of(month).maxLength();
175+
if (day < 1 || day > maxDayForMonth) {
176+
throw BirthdayValidationException.invalidDayForMonth(String.valueOf(month), String.valueOf(day), String.valueOf(maxDayForMonth));
177+
}
178+
}
179+
143180
@POST
144181
@Consumes({ MediaType.APPLICATION_JSON })
145182
@Produces({ MediaType.APPLICATION_JSON })
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.fineract.portfolio.savings.exception;
20+
21+
22+
import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException;
23+
24+
25+
public class BirthdayValidationException extends UnrecognizedQueryParamException {
26+
27+
private BirthdayValidationException(final String queryParamKey, final String queryParamValue, final Object[] supportedParams) {
28+
super(queryParamKey, queryParamValue, supportedParams);
29+
}
30+
31+
public static BirthdayValidationException invalidMonth(String month) {
32+
return new BirthdayValidationException(
33+
"birthMonth", month, new Object[] { "birthMonth must be a integer between 1 to 12" });
34+
}
35+
36+
public static BirthdayValidationException invalidDay(String day) {
37+
return new BirthdayValidationException(
38+
"birthDay", day, new Object[] { "birthDay must be an integer greater than 0" }
39+
);
40+
}
41+
42+
public static BirthdayValidationException invalidDayForMonth(String month, String day, String maxDay) {
43+
return new BirthdayValidationException(
44+
"birthDay", day, new Object[] { "birthDay for month " + month + " must be between 1 and " + maxDay }
45+
);
46+
}
47+
48+
public static BirthdayValidationException incomplete(String missingField) {
49+
return new BirthdayValidationException(
50+
missingField, "", new Object[] {"Both birthMonth and birthDay must be provided together"}
51+
);
52+
}
53+
}

fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@
8282
import org.apache.fineract.portfolio.tax.data.TaxDetailsData;
8383
import org.apache.fineract.portfolio.tax.data.TaxGroupData;
8484
import org.apache.fineract.useradministration.domain.AppUser;
85+
import org.slf4j.Logger;
86+
import org.slf4j.LoggerFactory;
8587
import org.springframework.beans.factory.annotation.Autowired;
8688
import org.springframework.dao.DataAccessException;
8789
import org.springframework.dao.EmptyResultDataAccessException;
@@ -118,6 +120,8 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
118120
private final EntityDatatableChecksReadService entityDatatableChecksReadService;
119121
private final ColumnValidator columnValidator;
120122
private final SavingsAccountAssembler savingAccountAssembler;
123+
private static final Logger log = LoggerFactory.getLogger(SavingsAccountReadPlatformServiceImpl.class);
124+
121125

122126
@Autowired
123127
public SavingsAccountReadPlatformServiceImpl(final PlatformSecurityContext context, final JdbcTemplate jdbcTemplate,
@@ -192,7 +196,7 @@ public Page<SavingsAccountData> retrieveAll(final SearchParameters searchParamet
192196
sqlBuilder.append(" join m_office o on o.id = c.office_id");
193197
sqlBuilder.append(" where o.hierarchy like ?");
194198

195-
final Object[] objectArray = new Object[2];
199+
final Object[] objectArray = new Object[4];
196200
objectArray[0] = hierarchySearchString;
197201
int arrayPos = 1;
198202
if (searchParameters != null) {
@@ -213,6 +217,13 @@ public Page<SavingsAccountData> retrieveAll(final SearchParameters searchParamet
213217
objectArray[arrayPos] = searchParameters.getOfficeId();
214218
arrayPos = arrayPos + 1;
215219
}
220+
if (StringUtils.isNotBlank(searchParameters.getBirthMonth()) && StringUtils.isNotBlank(searchParameters.getBirthDay())) {
221+
sqlBuilder.append(" and MONTH(c.date_of_birth) = ? AND Day(c.date_of_birth) = ?" );
222+
objectArray[arrayPos] = Integer.parseInt(searchParameters.getBirthMonth());
223+
arrayPos++;
224+
objectArray[arrayPos] = Integer.parseInt(searchParameters.getBirthDay());
225+
arrayPos++;
226+
}
216227
if (searchParameters.isOrderByRequested()) {
217228
sqlBuilder.append(" order by ").append(searchParameters.getOrderBy());
218229
this.columnValidator.validateSqlInjection(sqlBuilder.toString(), searchParameters.getOrderBy());
@@ -232,6 +243,7 @@ public Page<SavingsAccountData> retrieveAll(final SearchParameters searchParamet
232243
}
233244
}
234245
}
246+
log.info("Test local SQL: {}", sqlBuilder);
235247
final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos);
236248
return this.paginationHelper.fetchPage(this.jdbcTemplate, sqlBuilder.toString(), finalObjectArray, this.savingAccountMapper);
237249
}

0 commit comments

Comments
 (0)