Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,18 @@ buildscript {
}
repositories {
maven { url 'https://plugins.gradle.org/m2/' }
}

}
configurations.classpath {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.group == 'com.burgstaller' &&
details.requested.name == 'okhttp-digest' &&
details.requested.version == '1.10') {
details.useTarget("io.github.rburgst:${details.requested.name}:1.21")
details.because('Dependency has moved')
}
}
}
dependencies {
classpath 'com.bmuschko:gradle-cargo-plugin:2.9.0'
classpath 'org.eclipse.persistence:eclipselink:4.0.0'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ public final class SearchParameters {
private final Long productId;
private final Long categoryId;
private final boolean isSelfUser;
private final String birthMonth;
private final String birthDay;

public static SearchParameters from(final String sqlSearch, final Long officeId, final String externalId, final String name,
final String hierarchy) {
Expand Down Expand Up @@ -182,7 +184,7 @@ public static SearchParameters forProvisioningEntries(final Long provisioningEnt
}

public static SearchParameters forSavings(final String sqlSearch, final String externalId, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder) {
final String orderBy, final String sortOrder, final String birthMonth, final String birthDay) {

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

return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder,
staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser);
staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser, birthMonth, birthDay);
}

public static SearchParameters forAccountTransfer(final String sqlSearch, final String externalId, final Integer offset,
Expand Down Expand Up @@ -269,7 +271,38 @@ private SearchParameters(final String sqlSearch, final Long officeId, final Stri
this.categoryId = null;
this.isSelfUser = isSelfUser;
this.status = null;
this.birthMonth = null;
this.birthDay = null;
}

private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
final String hierarchy, final String firstname, final String lastname, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder, final Long staffId, final String accountNo, final Long loanId,
final Long savingsId, final Boolean orphansOnly, boolean isSelfUser, String BirthMonth, String BirthDay) {
this.sqlSearch = sqlSearch;
this.officeId = officeId;
this.externalId = externalId;
this.name = name;
this.hierarchy = hierarchy;
this.firstname = firstname;
this.lastname = lastname;
this.offset = offset;
this.limit = limit;
this.orderBy = orderBy;
this.sortOrder = sortOrder;
this.staffId = staffId;
this.accountNo = accountNo;
this.loanId = loanId;
this.savingsId = savingsId;
this.orphansOnly = orphansOnly;
this.currencyCode = null;
this.provisioningEntryId = null;
this.productId = null;
this.categoryId = null;
this.isSelfUser = isSelfUser;
this.status = null;
this.birthMonth = BirthMonth;
this.birthDay = BirthDay;
}

private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
Expand Down Expand Up @@ -298,6 +331,8 @@ private SearchParameters(final String sqlSearch, final Long officeId, final Stri
this.categoryId = null;
this.isSelfUser = isSelfUser;
this.status = status;
this.birthMonth = null;
this.birthDay = null;

}

Expand Down Expand Up @@ -327,6 +362,8 @@ private SearchParameters(final Long officeId, final String externalId, final Str
this.categoryId = null;
this.isSelfUser = isSelfUser;
this.status = null;
this.birthMonth = null;
this.birthDay = null;
}

private SearchParameters(final Long provisioningEntryId, final Long officeId, final Long productId, final Long categoryId,
Expand All @@ -353,6 +390,8 @@ private SearchParameters(final Long provisioningEntryId, final Long officeId, fi
this.categoryId = categoryId;
this.isSelfUser = false;
this.status = null;
this.birthMonth = null;
this.birthDay = null;

}

Expand Down Expand Up @@ -382,7 +421,8 @@ public SearchParameters(final String sqlSearch, final Long officeId, final Strin
this.categoryId = null;
this.isSelfUser = false;
this.status = null;

this.birthMonth = null;
this.birthDay = null;
}

public boolean isOrderByRequested() {
Expand Down Expand Up @@ -544,6 +584,14 @@ public boolean isSelfUser() {
return this.isSelfUser;
}

public String getBirthMonth() {
return birthMonth;
}

public String getBirthDay() {
return birthDay;
}

/**
* creates an instance of the SearchParameters from a request for the report mailing job run history
*
Expand All @@ -569,4 +617,5 @@ public static SearchParameters fromReportMailingJob(final Integer offset, final
return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, null, null, null,
null, null, false);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
import org.apache.fineract.portfolio.savings.data.SavingsAccountChargeData;
import org.apache.fineract.portfolio.savings.data.SavingsAccountData;
import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData;
import org.apache.fineract.portfolio.savings.exception.BirthdayValidationException;
import org.apache.fineract.portfolio.savings.service.SavingsAccountChargeReadPlatformService;
import org.apache.fineract.portfolio.savings.service.SavingsAccountReadPlatformService;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
Expand Down Expand Up @@ -128,18 +129,54 @@ public String retrieveAll(@Context final UriInfo uriInfo,
@QueryParam("offset") @Parameter(description = "offset") final Integer offset,
@QueryParam("limit") @Parameter(description = "limit") final Integer limit,
@QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy,
@QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder) {
@QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder,
@QueryParam("birthMonth") @Parameter(description = "birthMonth") final String birthMonth,
@QueryParam("birthDay") @Parameter(description = "birthDay") final String birthDay
) {

context.authenticatedUser().validateHasReadPermission(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME);

final SearchParameters searchParameters = SearchParameters.forSavings(sqlSearch, externalId, offset, limit, orderBy, sortOrder);
validateBirthday(birthMonth, birthDay);
final SearchParameters searchParameters = SearchParameters.forSavings(sqlSearch, externalId, offset, limit, orderBy, sortOrder, birthMonth, birthDay);

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

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

private void validateBirthday(final String birthMonth, String birthDay) {
if (StringUtils.isBlank(birthMonth) && StringUtils.isBlank(birthDay)) {
return;
}
if (StringUtils.isBlank(birthMonth)) {
throw BirthdayValidationException.incomplete("birthMonth");
}
if (StringUtils.isBlank(birthDay)) {
throw BirthdayValidationException.incomplete("birthDay");
}
final int month;
final int day;
try {
month = Integer.parseInt(birthMonth.trim());
} catch (NumberFormatException e) {
throw BirthdayValidationException.invalidMonth(birthMonth);
}
try {
day = Integer.parseInt(birthDay.trim());
} catch (NumberFormatException e) {
throw BirthdayValidationException.invalidDay(birthDay);
}

if (month < 1 || month > 12) {
throw BirthdayValidationException.invalidMonth(String.valueOf(month));
}

final int maxDayForMonth = java.time.Month.of(month).maxLength();
if (day < 1 || day > maxDayForMonth) {
throw BirthdayValidationException.invalidDayForMonth(String.valueOf(month), String.valueOf(day), String.valueOf(maxDayForMonth));
}
}

@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.portfolio.savings.exception;


import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException;


public class BirthdayValidationException extends UnrecognizedQueryParamException {

private BirthdayValidationException(final String queryParamKey, final String queryParamValue, final Object[] supportedParams) {
super(queryParamKey, queryParamValue, supportedParams);
}

public static BirthdayValidationException invalidMonth(String month) {
return new BirthdayValidationException(
"birthMonth", month, new Object[] { "birthMonth must be a integer between 1 to 12" });
}

public static BirthdayValidationException invalidDay(String day) {
return new BirthdayValidationException(
"birthDay", day, new Object[] { "birthDay must be an integer greater than 0" }
);
}

public static BirthdayValidationException invalidDayForMonth(String month, String day, String maxDay) {
return new BirthdayValidationException(
"birthDay", day, new Object[] { "birthDay for month " + month + " must be between 1 and " + maxDay }
);
}

public static BirthdayValidationException incomplete(String missingField) {
return new BirthdayValidationException(
missingField, "", new Object[] {"Both birthMonth and birthDay must be provided together"}
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ public Page<SavingsAccountData> retrieveAll(final SearchParameters searchParamet
sqlBuilder.append(" join m_office o on o.id = c.office_id");
sqlBuilder.append(" where o.hierarchy like ?");

final Object[] objectArray = new Object[2];
final Object[] objectArray = new Object[4];
objectArray[0] = hierarchySearchString;
int arrayPos = 1;
if (searchParameters != null) {
Expand All @@ -213,6 +213,13 @@ public Page<SavingsAccountData> retrieveAll(final SearchParameters searchParamet
objectArray[arrayPos] = searchParameters.getOfficeId();
arrayPos = arrayPos + 1;
}
if (StringUtils.isNotBlank(searchParameters.getBirthMonth()) && StringUtils.isNotBlank(searchParameters.getBirthDay())) {
sqlBuilder.append(" and MONTH(c.date_of_birth) = ? AND Day(c.date_of_birth) = ?" );
objectArray[arrayPos] = Integer.parseInt(searchParameters.getBirthMonth());
arrayPos++;
objectArray[arrayPos] = Integer.parseInt(searchParameters.getBirthDay());
arrayPos++;
}
if (searchParameters.isOrderByRequested()) {
sqlBuilder.append(" order by ").append(searchParameters.getOrderBy());
this.columnValidator.validateSqlInjection(sqlBuilder.toString(), searchParameters.getOrderBy());
Expand Down
Loading