/* * Copyright (c) 2005-2011 Grameen Foundation USA * All rights reserved. * * Licensed 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. * * See also http://www.apache.org/licenses/LICENSE-2.0.html for an * explanation of the license and how it is applied. */ package org.mifos.ui.core.controller; import java.io.Serializable; import java.math.BigDecimal; import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; import org.mifos.clientportfolio.loan.ui.DateValidator; import org.springframework.binding.message.Message; import org.springframework.binding.message.MessageBuilder; import org.springframework.binding.message.MessageContext; import org.springframework.binding.message.MessageResolver; import org.springframework.binding.validation.ValidationContext; public class FundTransferFormBean implements Serializable { private static final long serialVersionUID = 1199468781413161456L; private static final String ERROR_MANDATORY = "errors.mandatory"; private static final String ERROR_INVALID_DATE = "errors.invaliddate"; private static final String ERROR_INVALID_AMOUNT = "error.penalty.incorrectDouble"; private static final String ERROR_FUTURE_DATE = "errors.futuredate"; private static final String ERROR_NOT_ENOUGH_BALANCE = "fundTransfer.error.notEnough"; private static final String DATE_OF_TRXN = "Savings.dateOfTrxn"; private static final String RECEIPT_DATE = "Savings.receiptDate"; private static final String AMOUNT = "Amount"; private static final String TRXN_DATE_SOURCE = "trxnDateDD"; private static final String AMOUNT_SOURCE = "amount"; private static final String RECEIPT_DATE_SOURCE = "receiptDateDD"; private BigDecimal amount; private BigDecimal sourceBalance; private BigDecimal targetBalance; private String sourceGlobalAccNum; private String targetGlobalAccNum; private String trxnDateDD; private String trxnDateMM; private String trxnDateYY; private String receiptDateDD; private String receiptDateMM; private String receiptDateYY; private String receiptId; private boolean afterInit; private transient DateValidator dateValidator; private transient boolean amountBindingError = false; public BigDecimal getAmount() { return amount; } public void setAmount(BigDecimal amount) { this.amount = amount; } public String getTrxnDateDD() { return trxnDateDD; } public void setTrxnDateDD(String trxnDateDD) { this.trxnDateDD = trxnDateDD; } public String getTrxnDateMM() { return trxnDateMM; } public void setTrxnDateMM(String trxnDateMM) { this.trxnDateMM = trxnDateMM; } public String getTrxnDateYY() { return trxnDateYY; } public void setTrxnDateYY(String trxnDateYY) { this.trxnDateYY = trxnDateYY; } public String getReceiptDateDD() { return receiptDateDD; } public void setReceiptDateDD(String receiptDateDD) { this.receiptDateDD = receiptDateDD; } public String getReceiptDateMM() { return receiptDateMM; } public void setReceiptDateMM(String receiptDateMM) { this.receiptDateMM = receiptDateMM; } public String getReceiptDateYY() { return receiptDateYY; } public void setReceiptDateYY(String receiptDateYY) { this.receiptDateYY = receiptDateYY; } public String getReceiptId() { return receiptId; } public void setReceiptId(String receiptId) { this.receiptId = receiptId; } public BigDecimal getSourceBalance() { return sourceBalance; } public void setSourceBalance(BigDecimal sourceBalance) { this.sourceBalance = sourceBalance; } public BigDecimal getTargetBalance() { return targetBalance; } public void setTargetBalance(BigDecimal targetBalance) { this.targetBalance = targetBalance; } public boolean isAfterInit() { return afterInit; } public void setAfterInit(boolean afterInit) { this.afterInit = afterInit; } public String getSourceGlobalAccNum() { return sourceGlobalAccNum; } public void setSourceGlobalAccNum(String sourceGlobalAccNum) { this.sourceGlobalAccNum = sourceGlobalAccNum; } public String getTargetGlobalAccNum() { return targetGlobalAccNum; } public void setTargetGlobalAccNum(String targetGlobalAccNum) { this.targetGlobalAccNum = targetGlobalAccNum; } public LocalDate getTrxnDate() { LocalDate date = null; if (isTrxnDateEntered()) { Integer day = Integer.parseInt(trxnDateDD); Integer month = Integer.parseInt(trxnDateMM); Integer year = Integer.parseInt(trxnDateYY); date = new LocalDate(year, month, day); } return date; } public void setTrxnDate(LocalDate date) { if (date == null) { trxnDateDD = ""; trxnDateMM = ""; trxnDateYY = ""; } else { trxnDateDD = String.valueOf(date.getDayOfMonth()); trxnDateMM = String.valueOf(date.getMonthOfYear()); trxnDateYY = String.valueOf(date.getYear()); } } public LocalDate getReceiptDate() { LocalDate date = null; if (isReceiptDateEntered()) { Integer day = Integer.parseInt(receiptDateDD); Integer month = Integer.parseInt(receiptDateMM); Integer year = Integer.parseInt(receiptDateYY); date = new LocalDate(year, month, day); } return date; } public void setReceiptDate(LocalDate date) { if (date == null) { receiptDateDD = ""; receiptDateMM = ""; receiptDateYY = ""; } else { receiptDateDD = String.valueOf(date.getDayOfMonth()); receiptDateMM = String.valueOf(date.getMonthOfYear()); receiptDateYY = String.valueOf(date.getYear()); } } public void validateEnterDetailsStep(ValidationContext context) { amountBindingError = false; MessageContext messageContext = context.getMessageContext(); handleBindingErrors(messageContext); validateTrxnDate(messageContext); validateReceiptDate(messageContext); validateAmount(messageContext); } private void handleBindingErrors(MessageContext context) { if (context.hasErrorMessages()) { Message[] messages = context.getAllMessages(); context.clearMessages(); for (Message message : messages) { if (message.getSource().equals(AMOUNT_SOURCE)) { context.addMessage(getErrorMsg(ERROR_INVALID_AMOUNT, AMOUNT_SOURCE, AMOUNT)); amountBindingError = true; } } } } private void validateTrxnDate(MessageContext context) { if (!isTrxnDateEntered()) { // NOPMD context.addMessage(getErrorMsg(ERROR_MANDATORY, TRXN_DATE_SOURCE, DATE_OF_TRXN)); } else if (!getDateValidator().formsValidDate(trxnDateDD, trxnDateMM, trxnDateYY)) { // NOPMD context.addMessage(getErrorMsg(ERROR_INVALID_DATE, TRXN_DATE_SOURCE, DATE_OF_TRXN)); } else if (getDateValidator().isFutureDate(getTrxnDate())) { context.addMessage(getErrorMsg(ERROR_FUTURE_DATE, TRXN_DATE_SOURCE, DATE_OF_TRXN)); } } private void validateReceiptDate(MessageContext context) { if (isReceiptDateEntered()) { if (!getDateValidator().formsValidDate(receiptDateDD, receiptDateMM, receiptDateYY)) { // NOPMD context.addMessage(getErrorMsg(ERROR_INVALID_DATE, RECEIPT_DATE_SOURCE, RECEIPT_DATE)); } else if (getDateValidator().isFutureDate(getReceiptDate())) { context.addMessage(getErrorMsg(ERROR_FUTURE_DATE, RECEIPT_DATE_SOURCE, RECEIPT_DATE)); } } } private void validateAmount(MessageContext context) { if (!amountBindingError) { if (amount == null) { context.addMessage(getErrorMsg(ERROR_MANDATORY, AMOUNT_SOURCE, AMOUNT)); } else if (amount.max(BigDecimal.ZERO).equals(BigDecimal.ZERO)) { context.addMessage(getErrorMsg(ERROR_INVALID_AMOUNT, AMOUNT_SOURCE, AMOUNT)); } else if (sourceBalance.subtract(amount).doubleValue() < 0) { context.addMessage(getErrorMsg(ERROR_NOT_ENOUGH_BALANCE, AMOUNT_SOURCE)); } } } private MessageResolver getErrorMsg(String messageKey, String source) { return getErrorMsg(messageKey, source, null); } private MessageResolver getErrorMsg(String messageKey, String source, String resolvableArg) { MessageBuilder mb = new MessageBuilder().error().source(source).code(messageKey); if (resolvableArg != null) { mb.resolvableArg(resolvableArg); } return mb.build(); } public boolean isReceiptDateEntered() { return StringUtils.isNotBlank(receiptDateDD) || StringUtils.isNotBlank(receiptDateMM) || StringUtils.isNotBlank(receiptDateYY); } public boolean isTrxnDateEntered() { return StringUtils.isNotBlank(trxnDateDD) || StringUtils.isNotBlank(trxnDateMM) || StringUtils.isNotBlank(trxnDateYY); } private DateValidator getDateValidator() { if (dateValidator == null) { dateValidator = new DateValidator(); } return dateValidator; } }