com.salesmanager.central.orders.TransactionDetailsAction.java Source code

Java tutorial

Introduction

Here is the source code for com.salesmanager.central.orders.TransactionDetailsAction.java

Source

/*
 * Provided by CSTI Consulting 
 * Following GNU LESSER GENERAL PUBLIC LICENSE
 * You may obtain more details at
 *
 * http://www.csticonsulting.com
 * Copyright (c) 2006-2010 Consultation CS-TI inc. 
 *
 * 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 com.salesmanager.central.orders;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.opensymphony.xwork2.validator.ValidationException;
import com.salesmanager.central.AuthorizationException;
import com.salesmanager.central.BaseAction;
import com.salesmanager.central.profile.Context;
import com.salesmanager.central.profile.ProfileConstants;
import com.salesmanager.core.constants.PaymentConstants;
import com.salesmanager.core.entity.merchant.MerchantStore;
import com.salesmanager.core.entity.orders.Order;
import com.salesmanager.core.entity.payment.MerchantPaymentGatewayTrx;
import com.salesmanager.core.service.ServiceFactory;
import com.salesmanager.core.service.merchant.MerchantService;
import com.salesmanager.core.service.order.OrderService;
import com.salesmanager.core.service.payment.GatewayTransactionVO;
import com.salesmanager.core.service.payment.PaymentService;
import com.salesmanager.core.service.payment.SalesManagerTransactionVO;
import com.salesmanager.core.service.payment.TransactionException;
import com.salesmanager.core.util.CurrencyUtil;
import com.salesmanager.core.util.LabelUtil;
import com.salesmanager.core.util.MessageUtil;

public class TransactionDetailsAction extends BaseAction {

    private Logger log = Logger.getLogger(TransactionDetailsAction.class);

    private Order order = null;

    private List gatewaytransactions = new ArrayList();
    private boolean creditcardtransaction = false;
    private int nextaction = -1;
    private String process;

    private String orderTotal = null;
    private String refundAmount = null;

    private void prepareOrderDetails() throws Exception {

        super.setPageTitle("label.order.paymentdetails.title");

        Context ctx = (Context) super.getServletRequest().getSession().getAttribute(ProfileConstants.context);
        Integer merchantid = ctx.getMerchantid();

        // Get the order
        OrderService oservice = (OrderService) ServiceFactory.getService(ServiceFactory.OrderService);

        Order o = oservice.getOrder(this.getOrder().getOrderId());

        if (o.getTotal().doubleValue() > new BigDecimal("0").doubleValue()) {
            this.setOrderTotal(CurrencyUtil.displayFormatedAmountNoCurrency(o.getTotal(), ctx.getCurrency()));
        }

        // check if that entity realy belongs to merchantid
        if (o == null) {
            throw new AuthorizationException("Order is null for orderId " + this.getOrder().getOrderId());
        }

        // Check if user is authorized (entity belongs to merchant)
        super.authorize(o);

        this.setOrder(o);

    }

    /**
     * Process a new transaction, currently supports refund and capture
     * following a pre-authorize
     * 
     * @return
     * @throws Exception
     */
    public String processTransaction() throws Exception {

        Context ctx = super.getContext();

        MerchantService mservice = (MerchantService) ServiceFactory.getService(ServiceFactory.MerchantService);
        MerchantStore store = mservice.getMerchantStore(ctx.getMerchantid());

        try {

            if (this.getOrder() == null || this.getOrder().getOrderId() == 0) {
                super.setAuthorizationMessage();
                return "AUTHORIZATIONEXCEPTION";
            }

            prepareOrderDetails();

            /** INPUT VALIDATION **/
            // validate the presence of a transaction type in the request
            // parameter
            if (this.getProcess() == null) {
                log.error(
                        "No transaction process id in request parameter. Require &process=1 or &process=2 or &process=3");
                return SUCCESS;
            }

            int process = -1;
            try {
                process = Integer.parseInt(this.getProcess());
            } catch (NumberFormatException nfe) {
                log.error("Can't parse process id in request parameter [" + this.getProcess()
                        + "],  require &process=1 or &process=2 or &process=3");
                return SUCCESS;
            }

            // process 2 and 3 supported
            if (process < 2 || process > 3) {
                log.error("Transaction process type not supported " + this.getProcess());
                return SUCCESS;
            }

            /** END VALIDATION **/

            PaymentService service = (PaymentService) ServiceFactory.getService(ServiceFactory.PaymentService);

            switch (process) {

            case PaymentConstants.CAPTURE:
                service.captureTransaction(store, this.getOrder());
                break;

            case PaymentConstants.REFUND:

                // get amount

                if (StringUtils.isBlank(this.getRefundAmount())) {
                    super.addFieldError("orderTotal", "transaction.error.transactionamount");
                    return INPUT;
                }

                BigDecimal originalAmount = this.getOrder().getTotal();

                BigDecimal newAmount = null;
                try {

                    newAmount = CurrencyUtil.validateCurrency(this.getRefundAmount(), order.getCurrency());
                } catch (ValidationException e) {
                    super.addFieldError("orderTotal", "transaction.error.transactionamount");
                    return INPUT;
                }

                if (newAmount == null || newAmount.floatValue() > originalAmount.floatValue()) {
                    super.addFieldError("orderTotal", "transaction.error.transactionamounttoohigh");
                    return INPUT;
                }

                OrderService oservice = (OrderService) ServiceFactory.getService(ServiceFactory.OrderService);
                oservice.refundOrder(this.getOrder(), newAmount, super.getLocale());

                break;

            default:
                log.error("Transaction process type not supported " + this.getProcess());
                MessageUtil.addErrorMessage(super.getServletRequest(),
                        LabelUtil.getInstance().getText("errors.technical"));

            }

            super.setSuccessMessage();

        } catch (AuthorizationException ae) {
            super.setAuthorizationMessage();
            return "AUTHORIZATIONEXCEPTION";
        } catch (Exception e) {
            if (e instanceof TransactionException) {
                TransactionException te = (TransactionException) e;
                // Display appropriate message to end user
                if (te.getErrorcode() != null && !te.getErrorcode().trim().equals("")) {
                    String textkey = "transaction.errors." + te.getErrorcode();
                    if (te.getReason() != null && !te.getReason().trim().equals("")) {
                        MessageUtil.addErrorMessage(super.getServletRequest(),
                                LabelUtil.getInstance().getText(textkey) + " [" + te.getReason() + "]");
                    } else {
                        MessageUtil.addErrorMessage(super.getServletRequest(),
                                LabelUtil.getInstance().getText(textkey));
                    }
                } else {
                    MessageUtil.addErrorMessage(super.getServletRequest(),
                            te.getMessage() + " [" + te.getErrorcode() + "]");
                    //super.setTechnicalMessage();
                }
            } else {
                log.error(e);
                super.setTechnicalMessage();
            }
        }

        return SUCCESS;
    }

    /**
     * Displays transaction details
     */
    public String displayTransactions() throws Exception {

        try {

            if (this.getOrder() == null || this.getOrder().getOrderId() == 0) {
                super.setTechnicalMessage();
                return "AUTHORIZATIONEXCEPTION";
            }

            prepareOrderDetails();

            PaymentService service = (PaymentService) ServiceFactory.getService(ServiceFactory.PaymentService);

            List smt = service.getTransactions(order);

            MerchantPaymentGatewayTrx lasttransaction = null;
            if (smt != null) {

                Iterator i = smt.iterator();

                while (i.hasNext()) {
                    SalesManagerTransactionVO trx = (SalesManagerTransactionVO) i.next();
                    if (trx instanceof GatewayTransactionVO) {
                        this.creditcardtransaction = true;
                        // downcast to the appropriate object
                        GatewayTransactionVO gtx = (GatewayTransactionVO) trx;
                        // Determines allowed actions
                        MerchantPaymentGatewayTrx transaction = gtx.getTransactionDetails();
                        if (lasttransaction != null) {
                            if (transaction.getDateAdded().after(lasttransaction.getDateAdded())) {
                                lasttransaction = transaction;
                            }
                        } else {
                            lasttransaction = transaction;
                        }
                        gatewaytransactions.add(gtx);
                    }
                }

                nextaction = Integer.parseInt(lasttransaction.getMerchantPaymentGwAuthtype()) + 1;
                int trtype = Integer.parseInt(lasttransaction.getMerchantPaymentGwAuthtype());

                if (trtype == PaymentConstants.PREAUTH) {
                    nextaction = PaymentConstants.CAPTURE;
                } else if (trtype == PaymentConstants.SALE) {
                    nextaction = PaymentConstants.REFUND;
                } else if (trtype == PaymentConstants.CAPTURE) {
                    nextaction = PaymentConstants.REFUND;
                } else if (trtype == PaymentConstants.REFUND) {
                    if (lasttransaction.getAmount().doubleValue() > new BigDecimal("0").doubleValue()) {
                        nextaction = PaymentConstants.REFUND;
                    } else {
                        nextaction = -1;
                    }
                } else {
                    nextaction = -1;
                }
            }

        } catch (AuthorizationException ae) {
            super.setAuthorizationMessage();
            return "AUTHORIZATIONEXCEPTION";
        } catch (Exception e) {
            log.error(e);
            super.setTechnicalMessage();
        }

        return SUCCESS;

    }

    public List getTransactions() {
        return gatewaytransactions;
    }

    public boolean isCreditcardtransaction() {
        return creditcardtransaction;
    }

    public int getNextaction() {
        return nextaction;
    }

    public String getProcess() {
        return process;
    }

    public void setProcess(String process) {
        this.process = process;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    public String getOrderTotal() {
        return orderTotal;
    }

    public void setOrderTotal(String orderTotal) {
        this.orderTotal = orderTotal;
    }

    public String getRefundAmount() {
        return refundAmount;
    }

    public void setRefundAmount(String refundAmount) {
        this.refundAmount = refundAmount;
    }

}