diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java index 832687dde0b..32f5ae9c491 100644 --- a/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java @@ -518,7 +518,7 @@ private static String constructRecurrence(final CalendarFrequencyType frequencyT final StringBuilder recurrenceBuilder = new StringBuilder(200); recurrenceBuilder.append("FREQ="); - recurrenceBuilder.append(frequencyType.toString().toUpperCase()); + recurrenceBuilder.append(frequencyType.toString().toUpperCase(java.util.Locale.ROOT)); if (interval > 1) { recurrenceBuilder.append(";INTERVAL="); recurrenceBuilder.append(interval); @@ -528,7 +528,7 @@ private static String constructRecurrence(final CalendarFrequencyType frequencyT final CalendarWeekDaysType weekDays = CalendarWeekDaysType.fromInt(repeatsOnDay); if (!weekDays.isInvalid()) { recurrenceBuilder.append(";BYDAY="); - recurrenceBuilder.append(weekDays.toString().toUpperCase()); + recurrenceBuilder.append(weekDays.toString().toUpperCase(java.util.Locale.ROOT)); } } } @@ -548,7 +548,7 @@ private static String constructRecurrence(final CalendarFrequencyType frequencyT final CalendarWeekDaysType weekday = CalendarWeekDaysType.fromInt(repeatsOnDay); if (!weekday.isInvalid()) { recurrenceBuilder.append(";BYDAY="); - recurrenceBuilder.append(weekday.toString().toUpperCase()); + recurrenceBuilder.append(weekday.toString().toUpperCase(java.util.Locale.ROOT)); } } } diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java index d6507a51812..743e21366ef 100644 --- a/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java @@ -299,10 +299,11 @@ public static String getRRuleReadable(final LocalDate startDate, final String re NthDayNameEnum nthDayName = NthDayNameEnum.from(nthDayType.toString()); DayNameEnum weekdayType = DayNameEnum.from(weekDay.getDay().name()); if (recur.getInterval() == 1 || recur.getInterval() == -1) { - humanReadable = "Monthly on " + nthDayName.getCode().toLowerCase() + " " + weekdayType.getCode().toLowerCase(); + humanReadable = "Monthly on " + nthDayName.getCode().toLowerCase(java.util.Locale.ROOT) + " " + + weekdayType.getCode().toLowerCase(java.util.Locale.ROOT); } else { - humanReadable = "Every " + recur.getInterval() + " months on " + nthDayName.getCode().toLowerCase() + " " - + weekdayType.getCode().toLowerCase(); + humanReadable = "Every " + recur.getInterval() + " months on " + nthDayName.getCode().toLowerCase(java.util.Locale.ROOT) + + " " + weekdayType.getCode().toLowerCase(java.util.Locale.ROOT); } } else if (monthDay != null) { if (monthDay == -1) { @@ -756,7 +757,8 @@ public static void validateNthDayOfMonthFrequency(DataValidatorBuilder baseDataV if (nthDayType == NthDayType.ONE || nthDayType == NthDayType.TWO || nthDayType == NthDayType.THREE || nthDayType == NthDayType.FOUR) { baseDataValidator.reset().parameter(repeatsOnDayParamName).value(repeatsOnDay).cantBeBlankWhenParameterProvidedIs( - repeatsOnNthDayOfMonthParamName, NthDayNameEnum.from(nthDayType.toString()).getCode().toLowerCase()); + repeatsOnNthDayOfMonthParamName, + NthDayNameEnum.from(nthDayType.toString()).getCode().toLowerCase(java.util.Locale.ROOT)); } } } diff --git a/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUser.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUser.java index 409b05e911c..e3ca9d56c22 100644 --- a/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUser.java +++ b/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUser.java @@ -551,8 +551,9 @@ public void validateHasDeletePermission(final String resourceType) { } private void validateHasPermission(final String prefix, final String resourceType) { - final String authorizationMessage = "User has no authority to " + prefix + " " + resourceType.toLowerCase() + "s"; - final String matchPermission = prefix + "_" + resourceType.toUpperCase(); + final String authorizationMessage = "User has no authority to " + prefix + " " + resourceType.toLowerCase(java.util.Locale.ROOT) + + "s"; + final String matchPermission = prefix + "_" + resourceType.toUpperCase(java.util.Locale.ROOT); if (!hasNotPermissionForAnyOf("ALL_FUNCTIONS", "ALL_FUNCTIONS_READ", matchPermission)) { return; @@ -635,7 +636,7 @@ public void validateHasReadPermission(final String function, final Long userId) } public void validateHasCheckerPermissionTo(final String function) { - final String checkerPermissionName = function.toUpperCase() + "_CHECKER"; + final String checkerPermissionName = function.toUpperCase(java.util.Locale.ROOT) + "_CHECKER"; if (hasNotPermissionTo("CHECKER_SUPER_USER") && hasNotPermissionTo(checkerPermissionName)) { final String authorizationMessage = "User has no authority to be a checker for: " + function; throw new NoAuthorizationException(authorizationMessage); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java index 819a525441b..0c741b61c8d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java @@ -523,7 +523,7 @@ private static String constructRecurrence(final CalendarFrequencyType frequencyT final StringBuilder recurrenceBuilder = new StringBuilder(200); recurrenceBuilder.append("FREQ="); - recurrenceBuilder.append(frequencyType.toString().toUpperCase()); + recurrenceBuilder.append(frequencyType.toString().toUpperCase(java.util.Locale.ROOT)); if (interval > 1) { recurrenceBuilder.append(";INTERVAL="); recurrenceBuilder.append(interval); @@ -533,7 +533,7 @@ private static String constructRecurrence(final CalendarFrequencyType frequencyT final CalendarWeekDaysType weekDays = CalendarWeekDaysType.fromInt(repeatsOnDay); if (!weekDays.isInvalid()) { recurrenceBuilder.append(";BYDAY="); - recurrenceBuilder.append(weekDays.toString().toUpperCase()); + recurrenceBuilder.append(weekDays.toString().toUpperCase(java.util.Locale.ROOT)); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java index 62158bc44b6..00ec993e67d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/service/NoteWritePlatformServiceJpaRepositoryImpl.java @@ -19,12 +19,16 @@ package org.apache.fineract.portfolio.note.service; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.Strings; import org.apache.commons.lang3.tuple.Pair; +import org.apache.fineract.infrastructure.core.api.JsonCommand; +import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.portfolio.group.domain.GroupRepository; import org.apache.fineract.portfolio.group.exception.GroupNotFoundException; +import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper; +import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction; import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository; import org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionNotFoundException; import org.apache.fineract.portfolio.note.data.NoteCreateRequest; @@ -38,6 +42,7 @@ import org.apache.fineract.portfolio.note.domain.NoteType; import org.apache.fineract.portfolio.note.exception.NoteNotFoundException; import org.apache.fineract.portfolio.note.exception.NoteResourceNotSupportedException; +import org.apache.fineract.portfolio.savings.domain.SavingsAccount; import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; import org.apache.fineract.portfolio.savings.exception.SavingsAccountNotFoundException; @@ -110,16 +115,77 @@ public NoteCreateResponse createNote(final NoteCreateRequest request) { @Override public NoteUpdateResponse updateNote(final NoteUpdateRequest request) { - final var result = getNote(request.getType(), request.getResourceId(), request.getId()); - final var note = result.getLeft(); - final var response = NoteUpdateResponse.builder().officeId(result.getRight()).resourceId(request.getResourceId()); + final Note noteForUpdate = this.noteRepository.findById(request.getId()) + .orElseThrow(() -> new NoteNotFoundException(request.getId(), request.getResourceId(), + request.getType().name().toLowerCase(java.util.Locale.ROOT))); - if (!Strings.CI.equals(note.getNote(), request.getNote())) { - response.changes(note.update(request.getNote())); - noteRepository.saveAndFlush(note); + noteForUpdate.update(request.getNote()); + this.noteRepository.saveAndFlush(noteForUpdate); + + return NoteUpdateResponse.builder().build(); + } + + private CommandProcessingResult updateLoanNote(final JsonCommand command) { + final Long resourceId = command.subentityId(); + final Long noteId = command.entityId(); + final NoteType type = NoteType.LOAN; + + final Loan loan = this.loanRepository.findOneWithNotFoundDetection(resourceId); + final Note noteForUpdate = this.noteRepository.findByLoanAndId(loan, noteId); + + if (noteForUpdate == null) { + throw new NoteNotFoundException(noteId, resourceId, type.name().toLowerCase(java.util.Locale.ROOT)); + } + + final String noteContent = command.stringValueOfParameterNamed("note"); + noteForUpdate.update(noteContent); + this.noteRepository.saveAndFlush(noteForUpdate); + + return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(noteForUpdate.getId()) + .withLoanId(loan.getId()).withOfficeId(loan.getOfficeId()).build(); + } + + private CommandProcessingResult updateLoanTransactionNote(final JsonCommand command) { + final Long resourceId = command.subentityId(); + final Long noteId = command.entityId(); + final NoteType type = NoteType.LOAN_TRANSACTION; + + final LoanTransaction loanTransaction = this.loanTransactionRepository.findById(resourceId) + .orElseThrow(() -> new LoanTransactionNotFoundException(resourceId)); + final Loan loan = loanTransaction.getLoan(); + + final Note noteForUpdate = this.noteRepository.findByLoanAndId(loan, noteId); + if (noteForUpdate == null) { + throw new NoteNotFoundException(noteId, resourceId, type.name().toLowerCase(java.util.Locale.ROOT)); } - return response.build(); + final String noteContent = command.stringValueOfParameterNamed("note"); + noteForUpdate.update(noteContent); + this.noteRepository.saveAndFlush(noteForUpdate); + + return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(noteForUpdate.getId()) + .withLoanId(loan.getId()).withOfficeId(loan.getOfficeId()).build(); + } + + private CommandProcessingResult updateSavingAccountNote(final JsonCommand command) { + final Long resourceId = command.subentityId(); + final Long noteId = command.entityId(); + final NoteType type = NoteType.SAVING_ACCOUNT; + + final SavingsAccount savingAccount = this.savingsAccountRepository.findById(resourceId) + .orElseThrow(() -> new SavingsAccountNotFoundException(resourceId)); + + final Note noteForUpdate = this.noteRepository.findBySavingsAccountAndId(savingAccount, noteId); + if (noteForUpdate == null) { + throw new NoteNotFoundException(noteId, resourceId, type.name().toLowerCase(java.util.Locale.ROOT)); + } + + final String noteContent = command.stringValueOfParameterNamed("note"); + noteForUpdate.update(noteContent); + this.noteRepository.saveAndFlush(noteForUpdate); + + return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(noteForUpdate.getId()) + .withSavingsId(savingAccount.getId()).withOfficeId(savingAccount.officeId()).build(); } @Override @@ -173,11 +239,9 @@ private Pair getNote(NoteType type, Long resourceId, Long noteId) { log.error("Not yet implemented: {}", type); break; } - if (note == null) { - throw new NoteNotFoundException(noteId, resourceId, type.name().toLowerCase()); + throw new NoteNotFoundException(noteId, resourceId, type.name().toLowerCase(java.util.Locale.ROOT)); } - return Pair.of(note, officeId); } } diff --git a/fineract-validation/src/main/java/org/apache/fineract/validation/constraints/EnumValueValidator.java b/fineract-validation/src/main/java/org/apache/fineract/validation/constraints/EnumValueValidator.java index c7196514067..53be71dfcb3 100644 --- a/fineract-validation/src/main/java/org/apache/fineract/validation/constraints/EnumValueValidator.java +++ b/fineract-validation/src/main/java/org/apache/fineract/validation/constraints/EnumValueValidator.java @@ -30,12 +30,12 @@ public class EnumValueValidator implements ConstraintValidator e.name().toLowerCase()) + acceptedValues = Arrays.stream(annotation.enumClass().getEnumConstants()).map(e -> e.name().toLowerCase(java.util.Locale.ROOT)) .collect(Collectors.toSet()); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { - return value != null && acceptedValues.contains(value.toLowerCase()); + return value != null && acceptedValues.contains(value.toLowerCase(java.util.Locale.ROOT)); } }