use of org.mifos.platform.validations.ErrorEntry in project head by mifos.
the class InstallmentRulesValidatorTest method shouldValidateMinInstallmentForVariableInstallments.
@Test
public void shouldValidateMinInstallmentForVariableInstallments() {
RepaymentScheduleInstallment installment = installmentBuilder.reset(locale).withInstallment(1).withPrincipal(new Money(rupee, "49")).withTotalValue("50").build();
List<ErrorEntry> errorEntries = installmentRulesValidator.validateForMinimumInstallmentAmount(asList(installment), BigDecimal.valueOf(Double.valueOf("100.0")));
assertErrorEntry(errorEntries.get(0), AccountConstants.INSTALLMENT_AMOUNT_LESS_THAN_MIN_AMOUNT, "1");
}
use of org.mifos.platform.validations.ErrorEntry in project head by mifos.
the class LoanAccountAction method getActionErrors.
private ActionErrors getActionErrors(Errors errors) {
ActionErrors actionErrors = new ActionErrors();
if (errors.hasErrors()) {
for (ErrorEntry errorEntry : errors.getErrorEntries()) {
ActionMessage actionMessage;
if (errorEntry.hasErrorArgs()) {
actionMessage = new ActionMessage(errorEntry.getErrorCode(), errorEntry.getArgs().toArray());
} else {
actionMessage = new ActionMessage(errorEntry.getErrorCode(), errorEntry.getFieldName());
}
actionErrors.add(errorEntry.getErrorCode(), actionMessage);
}
}
return actionErrors;
}
use of org.mifos.platform.validations.ErrorEntry in project head by mifos.
the class XlsLoansAccountImporter method validateDisbursalDate.
private void validateDisbursalDate(Date disbursalDate, CustomerBO customerBO, LoanOfferingBO loanOfferingBO, int currentCell, HSSFRow currentRow, String statusName) throws XlsParsingException {
if (disbursalDate == null) {
throw new XlsParsingException(getCellError(XlsMessageConstants.MISSING_DISBURSAL_DATE, currentRow, currentCell, null));
}
LocalDate localDisbursalDate = new LocalDate(disbursalDate.getTime());
Errors errors = loanAccountServiceFacade.validateLoanDisbursementDate(localDisbursalDate, customerBO.getCustomerId(), loanOfferingBO.getPrdOfferingId().intValue());
if (localDisbursalDate.isAfter(new LocalDate()) && (statusName.equals("Active in good standing") || statusName.equals("Active in bad standing"))) {
String[] args = { "" };
errors.addError("import.loan.account.disbursal.date", args);
}
if (errors.hasErrors()) {
XlsParsingException xlEx = new XlsParsingException(true);
List<Object> tmp = new ArrayList<Object>();
tmp.add(localDisbursalDate);
xlEx.getMessages().add(getCellError(XlsMessageConstants.INVALID_DATE, currentRow, currentCell, tmp));
for (ErrorEntry entry : errors.getErrorEntries()) {
xlEx.getMessages().add(getNestedMessage(entry.getErrorCode(), entry.getArgs()));
}
throw xlEx;
}
}
use of org.mifos.platform.validations.ErrorEntry in project head by mifos.
the class LoanAccountFormBean method validateEnterAccountDetailsStep.
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = { "SIC_INNER_SHOULD_BE_STATIC_ANON" }, justification = "")
public void validateEnterAccountDetailsStep(ValidationContext context) {
MessageContext messageContext = context.getMessageContext();
Errors errors = validator.checkConstraints(this);
// handle data binding errors that may of occurred
if (messageContext.hasErrorMessages()) {
Message[] errorMessages = messageContext.getMessagesByCriteria(new MessageCriteria() {
@Override
public boolean test(@SuppressWarnings("unused") Message message) {
return true;
}
});
messageContext.clearMessages();
for (Message message : errorMessages) {
handleDataMappingError(errors, message);
}
}
if (this.glimApplicable || this.groupLoanWithMembersEnabled) {
int index = 0;
int selectedCount = 0;
for (Boolean clientSelected : this.clientSelectForGroup) {
if (clientSelected != null && clientSelected.booleanValue()) {
Number clientAmount = this.clientAmount[index];
if (clientAmount == null || exceedsMinOrMax(clientAmount, Integer.valueOf(1), this.maxAllowedAmount)) {
String defaultErrorMessage = "Please specify valid Amount.";
rejectGlimClientAmountField(index + 1, errors, defaultErrorMessage);
}
if (clientAmount != null) {
BigDecimal amountAsDecimal = new BigDecimal(clientAmount.toString()).stripTrailingZeros();
int places = amountAsDecimal.scale();
if (places > this.digitsAfterDecimalForMonetaryAmounts) {
String defaultErrorMessage = "The number of digits after the decimal separator exceeds the allowed number.";
rejectInterestRateFieldValue(errors, defaultErrorMessage, "loanAccountFormBean.client.amount.digitsAfterDecimal.invalid", new Object[] { index + 1, this.digitsAfterDecimalForMonetaryAmounts });
}
int digitsBefore = amountAsDecimal.toBigInteger().toString().length();
if (digitsBefore > this.digitsBeforeDecimalForMonetaryAmounts) {
String defaultErrorMessage = "The number of digits before the decimal separator exceeds the allowed number.";
rejectInterestRateFieldValue(errors, defaultErrorMessage, "loanAccountFormBean.client.amount.digitsBeforeDecimal.invalid", new Object[] { index + 1, this.digitsBeforeDecimalForMonetaryAmounts });
}
}
// check error message of loan purpose for each client when its mandatory..
Integer clientLoanPurposeId = this.clientLoanPurposeId[index];
if (this.purposeOfLoanMandatory && isInvalidSelection(clientLoanPurposeId)) {
errors.rejectValue("clientLoanPurposeId", "loanAccountFormBean.glim.purposeOfLoan.invalid", new Object[] { index + 1 }, "Please specify loan purpose.");
this.clientLoanPurposeId[index] = 0;
} else {
// needed so attempt in freemarker(ftl) to display loan purpose doesnt fall over.
if (clientLoanPurposeId == null) {
this.clientLoanPurposeId[index] = 0;
}
}
selectedCount++;
} else {
Number clientAmount = this.clientAmount[index];
Integer clientLoanPurposeId = this.clientLoanPurposeId[index];
if (clientAmount != null || clientLoanPurposeId != null) {
String defaultErrorMessage = "You have entered details for a member you have not selected. Select the checkbox in front of the member's name in order to include him or her in the loan.";
rejectUnselectedGlimClientAmountField(index + 1, errors, defaultErrorMessage);
}
}
index++;
}
if (selectedCount < 2) {
String defaultErrorMessage = "Not enough clients for group loan.";
rejectGroupLoanWithTooFewClients(errors, defaultErrorMessage);
}
}
if (this.amount == null || exceedsMinOrMax(this.amount, this.minAllowedAmount, this.maxAllowedAmount)) {
String defaultErrorMessage = "Please specify valid Amount.";
if (glimApplicable) {
defaultErrorMessage = "The sum of the amounts specified for each member is outside the allowable total amount for this loan product.";
rejectGlimTotalAmountField(errors, defaultErrorMessage);
} else {
rejectAmountField(errors, defaultErrorMessage);
}
}
if (this.amount != null) {
BigDecimal amountAsDecimal = new BigDecimal(this.amount.toString()).stripTrailingZeros();
int places = amountAsDecimal.scale();
if (places > this.digitsAfterDecimalForMonetaryAmounts) {
String defaultErrorMessage = "The number of digits after the decimal separator exceeds the allowed number.";
rejectInterestRateFieldValue(errors, defaultErrorMessage, "loanAccountFormBean.amount.digitsAfterDecimal.invalid", new Object[] { this.digitsAfterDecimalForMonetaryAmounts });
}
int digitsBefore = amountAsDecimal.toBigInteger().toString().length();
if (digitsBefore > this.digitsBeforeDecimalForMonetaryAmounts) {
String defaultErrorMessage = "The number of digits before the decimal separator exceeds the allowed number.";
rejectInterestRateFieldValue(errors, defaultErrorMessage, "loanAccountFormBean.amount.digitsBeforeDecimal.invalid", new Object[] { this.digitsBeforeDecimalForMonetaryAmounts });
}
}
if (this.interestRate == null || exceedsMinOrMax(this.interestRate, this.minAllowedInterestRate, this.maxAllowedInterestRate)) {
String defaultErrorMessage = "Please specify valid Interest rate.";
rejectInterestRateField(errors, defaultErrorMessage);
}
if (this.interestRate != null) {
BigDecimal interestRateAsDecimal = new BigDecimal(this.interestRate.toString()).stripTrailingZeros();
int places = interestRateAsDecimal.scale();
if (places > this.digitsAfterDecimalForInterest) {
String defaultErrorMessage = "The number of digits after the decimal separator exceeds the allowed number.";
rejectInterestRateFieldValue(errors, defaultErrorMessage, "loanAccountFormBean.digitsAfterDecimalForInterest.invalid", new Object[] { this.digitsAfterDecimalForInterest });
}
int digitsBefore = interestRateAsDecimal.toBigInteger().toString().length();
if (digitsBefore > this.digitsBeforeDecimalForInterest) {
String defaultErrorMessage = "The number of digits before the decimal separator exceeds the allowed number.";
rejectInterestRateFieldValue(errors, defaultErrorMessage, "loanAccountFormBean.digitsBeforeDecimalForInterest.invalid", new Object[] { this.digitsBeforeDecimalForInterest });
}
}
if (this.numberOfInstallments == null || exceedsMinOrMax(this.numberOfInstallments, this.minNumberOfInstallments, this.maxNumberOfInstallments)) {
String defaultErrorMessage = "Please specify valid number of installments.";
rejectNumberOfInstallmentsField(errors, defaultErrorMessage);
}
if (this.graceDuration == null || this.graceDuration.intValue() < 0) {
if (!errors.hasFieldErrors("graceDuration")) {
String defaultErrorMessage = "Please specify valid Grace period for repayments. Grace period should be a value less than " + numberOfInstallments.intValue() + ".";
rejectGraceDurationField(errors, defaultErrorMessage);
}
} else {
if (this.graceDuration.intValue() > this.maxGraceDuration.intValue()) {
String defaultErrorMessage = "The Grace period cannot be greater than in loan product definition.";
errors.rejectValue("graceDuration", "loanAccountFormBean.gracePeriodDuration.invalid", defaultErrorMessage);
}
if (this.numberOfInstallments != null && (this.graceDuration.intValue() >= this.numberOfInstallments.intValue())) {
String defaultErrorMessage = "Grace period for repayments must be less than number of loan installments.";
errors.rejectValue("graceDuration", "loanAccountFormBean.gracePeriodDurationInRelationToInstallments.invalid", defaultErrorMessage);
}
}
if (dateValidator == null) {
dateValidator = new DateValidator();
}
if (!dateValidator.formsValidDate(this.disbursementDateDD, this.disbursementDateMM, this.disbursementDateYY)) {
String defaultErrorMessage = "Please specify valid disbursal date.";
rejectDisbursementDateField(errors, defaultErrorMessage, "disbursementDateDD", "loanAccountFormBean.DisbursalDate.invalid", "");
} else {
LocalDate validDate = new DateTime().withDate(disbursementDateYY.intValue(), disbursementDateMM.intValue(), disbursementDateDD.intValue()).toLocalDate();
org.mifos.platform.validations.Errors disbursementDateErrors = new org.mifos.platform.validations.Errors();
if (this.redoLoanAccount) {
disbursementDateErrors = loanDisbursementDateValidationServiceFacade.validateLoanWithBackdatedPaymentsDisbursementDate(validDate, customerId, productId);
} else {
disbursementDateErrors = loanDisbursementDateValidationServiceFacade.validateLoanDisbursementDate(validDate, customerId, productId);
}
for (ErrorEntry entry : disbursementDateErrors.getErrorEntries()) {
String defaultErrorMessage = "The disbursal date is invalid.";
rejectDisbursementDateField(errors, defaultErrorMessage, "disbursementDateDD", entry.getErrorCode(), entry.getArgs().get(0));
}
}
if (this.sourceOfFundsMandatory && isInvalidSelection(this.fundId)) {
errors.rejectValue("fundId", "loanAccountFormBean.SourceOfFunds.invalid", "Please specify source of funds.");
}
if (this.externalIdMandatory && StringUtils.isBlank(this.externalId)) {
errors.rejectValue("externalId", "loanAccountFormBean.externalid.invalid", "Please specify required external id.");
}
if (!this.glimApplicable && this.purposeOfLoanMandatory && isInvalidSelection(this.loanPurposeId)) {
errors.rejectValue("loanPurposeId", "loanAccountFormBean.PurposeOfLoan.invalid", "Please specify loan purpose.");
}
validateAdministrativeAndAdditionalFees(errors);
if (this.repaymentScheduleIndependentOfCustomerMeeting) {
if (isInvalidRecurringFrequency(this.repaymentRecursEvery)) {
errors.rejectValue("repaymentRecursEvery", "loanAccountFormBean.repaymentDay.recursEvery.invalid", "Please specify a valid recurring frequency for repayment day.");
}
if (this.weekly) {
if (isInvalidDayOfWeekSelection()) {
errors.rejectValue("repaymentDayOfWeek", "loanAccountFormBean.repaymentDay.weekly.dayOfWeek.invalid", "Please select a day of the week for repayment day.");
}
} else if (this.monthly) {
if (this.monthlyDayOfMonthOptionSelected) {
if (isInvalidDayOfMonthEntered()) {
errors.rejectValue("repaymentDayOfMonth", "loanAccountFormBean.repaymentDay.monthly.dayOfMonth.invalid", "Please select a day of the month for repayment day.");
}
} else if (this.monthlyWeekOfMonthOptionSelected) {
if (isInvalidWeekOfMonthSelection()) {
errors.rejectValue("repaymentWeekOfMonth", "loanAccountFormBean.repaymentDay.monthly.weekOfMonth.invalid", "Please select a week of the month for repayment day.");
}
if (isInvalidDayOfWeekSelection()) {
errors.rejectValue("repaymentDayOfWeek", "loanAccountFormBean.repaymentDay.monthly.dayOfWeek.invalid", "Please select a day of the week for repayment day.");
}
}
}
if (this.variableInstallmentsAllowed) {
if (this.selectedFeeId != null) {
for (Number feeId : this.selectedFeeId) {
if (feeId != null) {
VariableInstallmentWithFeeValidationResult result = variableInstallmentsFeeValidationServiceFacade.validateFeeCanBeAppliedToVariableInstallmentLoan(feeId.longValue());
if (!result.isFeeCanBeAppliedToVariableInstallmentLoan()) {
errors.rejectValue("selectedFeeId", "loanAccountFormBean.additionalfees.variableinstallments.invalid", new String[] { result.getFeeName() }, "This type of fee cannot be applied to loan with variable installments.");
}
}
}
}
int defaultFeeIndex = 0;
if (this.defaultFeeId != null) {
for (Number feeId : this.defaultFeeId) {
if (feeId != null) {
Boolean feeSelectedForRemoval = this.defaultFeeSelected[defaultFeeIndex];
if (feeSelectedForRemoval == null || !feeSelectedForRemoval) {
VariableInstallmentWithFeeValidationResult result = variableInstallmentsFeeValidationServiceFacade.validateFeeCanBeAppliedToVariableInstallmentLoan(feeId.longValue());
if (!result.isFeeCanBeAppliedToVariableInstallmentLoan()) {
errors.rejectValue("selectedFeeId", "loanAccountFormBean.defaultfees.variableinstallments.invalid", new String[] { result.getFeeName() }, "This type of fee cannot be applied to loan with variable installments.");
}
}
}
defaultFeeIndex++;
}
}
}
}
if (errors.hasErrors()) {
for (FieldError fieldError : errors.getFieldErrors()) {
MessageBuilder builder = new MessageBuilder().error().source(fieldError.getField()).codes(fieldError.getCodes()).defaultText(fieldError.getDefaultMessage()).args(fieldError.getArguments());
messageContext.addMessage(builder.build());
}
}
}
use of org.mifos.platform.validations.ErrorEntry in project head by mifos.
the class LoanScheduleFormBean method prevalidateTotalIsNonNull.
@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = { "DLS_DEAD_LOCAL_STORE" }, justification = "")
private void prevalidateTotalIsNonNull(MessageContext messageContext) {
Integer installmentIndex = 1;
for (Number totalAmount : this.installmentAmounts) {
if (totalAmount == null) {
String defaultMessage = "The total amount field for installment {0} was blank and has been defaulted to zero.";
ErrorEntry fieldError = new ErrorEntry("installment.total.amount.blank.and.invalid", "installmentAmounts", defaultMessage);
fieldError.setArgs(Arrays.asList(installmentIndex.toString()));
this.installmentAmounts.set(installmentIndex - 1, Integer.valueOf(0));
addErrorMessageToContext(messageContext, fieldError);
}
installmentIndex++;
}
}
Aggregations