/** Retrieve the transfer type used for the payment */
 private TransferType validateTransferType(
     final MobileActionContext context, final AccountOwner to) {
   final TransferTypeQuery query = new TransferTypeQuery();
   query.setUniqueResult();
   query.setFromAccountType(context.getCurrentAccountType());
   query.setChannel(context.getChannel());
   query.setContext(TransactionContext.PAYMENT);
   query.setFromOwner(context.getAccountOwner());
   query.setToOwner(to);
   query.setUsePriority(true);
   final List<TransferType> types = transferTypeService.search(query);
   if (types == null || types.isEmpty()) {
     throw new MobileException("mobile.payment.error.noTransferType");
   }
   return types.get(0);
 }
 /** Validate the typed username */
 private Member validateTo(final MobileActionContext context) {
   final MobileDoPaymentForm form = context.getForm();
   final String username = form.getUsername();
   if (StringUtils.isEmpty(username)) {
     throw new MobileException("errors.required", context.message("mobile.payment.username"));
   }
   User user;
   try {
     user = elementService.loadUser(username, User.Relationships.ELEMENT);
     if (!(user instanceof MemberUser) || context.getUser().equals(user)) {
       throw new Exception();
     }
   } catch (final Exception e) {
     throw new MobileException("errors.invalid", context.message("mobile.payment.username"));
   }
   return (Member) user.getElement();
 }
 /** Validate the typed amount */
 private BigDecimal validateAmount(final MobileActionContext context) {
   final MobileDoPaymentForm form = context.getForm();
   final UnitsConverter converter = getUnitsConverter(context);
   BigDecimal amount = null;
   try {
     amount = converter.valueOf(form.getAmount());
   } catch (final Exception e) {
     throw new MobileException("errors.invalid", context.message("mobile.payment.amount"));
   }
   if (amount == null) {
     throw new MobileException("errors.required", context.message("mobile.payment.amount"));
   }
   if (amount.compareTo(paymentService.getMinimumPayment()) == -1) {
     throw new MobileException("errors.invalid", context.message("mobile.payment.amount"));
   }
   return amount;
 }
  @Override
  protected ActionForward executeAction(final MobileActionContext context) throws Exception {
    final HttpServletRequest request = context.getRequest();
    final HttpSession session = request.getSession();
    if (RequestHelper.isGet(request)) {
      if (RequestHelper.isFromMenu(request)) {
        session.removeAttribute("mobileDoPaymentDTO");
      }
      // Form display: store the bookmark so, on errors, we will return to here
      storeBookmark(context);
      return context.getInputForward();
    } else {
      try {
        // Build the payment DTO
        final Member fromMember = context.getMember();
        final Member toMember = validateTo(context);
        final DoPaymentDTO payment = new DoPaymentDTO();
        payment.setChannel(context.getChannel());
        payment.setContext(TransactionContext.PAYMENT);
        payment.setFrom(fromMember);
        payment.setTo(toMember);
        payment.setAmount(validateAmount(context));
        payment.setDescription(validateDescription(context));
        payment.setTransferType(validateTransferType(context, toMember));

        // Check if the payment can be performed
        validatePayment(payment);

        // Store the DTO, so, the confirmation action will access it
        session.setAttribute("mobileDoPaymentDTO", payment);
      } catch (final MobileException e) {
        return MobileHelper.sendException(context.getActionMapping(), request, e);
      }
      return context.getSuccessForward();
    }
  }
 /** Validate the typed description */
 private String validateDescription(final MobileActionContext context) {
   final MobileDoPaymentForm form = context.getForm();
   return StringUtils.trimToNull(form.getDescription());
 }