Subversion Repositories SmartDukaan

Rev

Rev 21249 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.hotspot.dashbaord.client.inbox;

import in.shop2020.hotspot.dashbaord.client.event.AcceptOrderEvent;
import in.shop2020.hotspot.dashbaord.client.event.FlagOrderEvent;
import in.shop2020.hotspot.dashbaord.client.event.LostInTransitEvent;
import in.shop2020.hotspot.dashbaord.client.event.MarkRtoInTransitEvent;
import in.shop2020.hotspot.dashbaord.client.event.NostockOrderEvent;
import in.shop2020.hotspot.dashbaord.client.event.ProvisionalCaptureEvent;
import in.shop2020.hotspot.dashbaord.client.event.ReshipOrderEvent;
import in.shop2020.hotspot.dashbaord.client.event.UnacceptOrderEvent;
import in.shop2020.hotspot.dashbaord.shared.actions.BillingType;
import in.shop2020.hotspot.dashbaord.shared.actions.DetailsMask;
import in.shop2020.hotspot.dashbaord.shared.actions.Order;
import in.shop2020.hotspot.dashbaord.shared.actions.UserType;

import java.util.Map;

import net.customware.gwt.dispatch.client.DispatchAsync;

import org.enunes.gwt.mvp.client.EventBus;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.DialogBox;

public class OrderDetails extends ResizeComposite{

        public interface Listener{
                void onClick();
        }

        interface OrderDetailsUiBinder extends UiBinder<Widget, OrderDetails>{ }

        interface SelectionStyle extends CssResource{
                String blueLabel();
                String greenLabel();
        }

        private static final OrderDetailsUiBinder binder = GWT.create(OrderDetailsUiBinder.class);

        @UiField FlexTable header;
        @UiField FlexTable table;
        @UiField HorizontalPanel orderDetails;
        @UiField VerticalPanel orderDetails1;
        @UiField VerticalPanel orderDetails2;
        @UiField VerticalPanel orderDetails3;
        @UiField VerticalPanel orderDetails4;
        @UiField VerticalPanel orderDetails5;
        @UiField SelectionStyle selectionStyle;

        private final EventBus eventbus;
        private Order order;
        private Order transaction;

        //Buttons for the Warehouse Executive
        //private Button verifyOrder = new Button();
        private Button acceptOrder = new Button();
        private Button rejectOrder = new Button();
        private Button printAllInvoices = new Button();
        private Button notAvailable= new Button();
        private Button addBillingInfo= new Button();
        private Button printInvoice = new Button();
        private Button receiveReturn = new Button();
        private Button validateDOA = new Button();
        private Button validateReturnProduct = new Button();

        //Buttons for the Admin to track order
        private Button flagOrder = new Button();
        private Button requestPickup = new Button();
        private Button authorizePickup = new Button();
        private Button refundOrder = new Button();
        private Button reshipOrder = new Button();
        private Button markLostInTransit = new Button();
        private Button provisionallyCapturePaymentForOrder = new Button();

        //Buttons for the Admin to edit order details
        private Button addWeight = new Button();
        private Button changeColor = new Button();
        private Button addDelayReason = new Button();
        private Button markDelivered = new Button();
        private Button markRtoInTransit = new Button();
        private Button unacceptOrder = new Button();
        //      private Button changeJacketNumber = new Button();
        //      private Button shiftWarehouse = new Button();
        private Button splitFreebieOrder = new Button();
        private Button changeFreebieItem = new Button();
        private Button splitEbayOrder = new Button();

        private String user;
        private DetailsMask mask;
        private long warehouseID;
        private UserType userType;
        private BillingType billingType;
        private Map<Long, String> warehouses;
        private Map<Long, String> providers;

        public OrderDetails(EventBus eventbus, Order order, Order order2, DetailsMask mask, String user, long warehouseID, UserType userType, BillingType billingType, Map<Long, String> warehouses,  Map<Long, String> providers){
                this.eventbus = eventbus;
                this.order = order;
                this.transaction = order2;
                this.mask = mask;
                this.user = user;
                this.warehouseID = warehouseID;
                this.userType = userType;
                this.billingType = billingType;
                this.warehouses = warehouses;
                this.providers = providers;

                initWidget(binder.createAndBindUi(this));
                if(this.userType != UserType.WAREHOUSE_OBSERVER) {
                        initTableForWE();
                }
                if(this.userType == UserType.ADMIN){
                        initTableForAdmin();
                } else if(this.userType == UserType.WAREHOUSE_MONITOR){
                        initTableForWM();
                }
                loadOrderDetails();
        }

        private void initTableForWE() {
                header.getColumnFormatter().setWidth(0, "120px");
                header.getColumnFormatter().setWidth(1, "120px");
                header.getColumnFormatter().setWidth(2, "120px");
                header.getColumnFormatter().setWidth(3, "120px");
                header.getColumnFormatter().setWidth(4, "120px");
                header.getColumnFormatter().setWidth(5, "120px");
                header.getColumnFormatter().setWidth(6, "120px");
                header.getColumnFormatter().setWidth(7, "120px");
                header.getColumnFormatter().setWidth(8, "120px");

                //verifyOrder.setText("Verify");
                acceptOrder.setText("Accept");
                notAvailable.setText("Out Of Stock");
                addBillingInfo.setText("Bill");
                if(billingType == BillingType.OURS || billingType == BillingType.OURS_EXTERNAL)
                        addBillingInfo.setVisible(false);

                printInvoice.setText("Print Invoice");
                receiveReturn.setText("Receive Return");
                validateDOA.setText("Validate DOA");
                validateReturnProduct.setText("Product Usable?");
                rejectOrder.setText("Cancel Order");
                printAllInvoices.setText("Print All Invoices");

                //header.setWidget(0, 0, verifyOrder);
                header.setWidget(0, 0, acceptOrder);
                header.setWidget(0, 1, notAvailable);
                header.setWidget(0, 2, addBillingInfo);

                header.setWidget(0, 3, printInvoice);
                header.setWidget(0, 4, receiveReturn);
                header.setWidget(0, 5, validateDOA);
                header.setWidget(0, 6, rejectOrder);
                header.setWidget(0, 7, printAllInvoices);
                header.setWidget(0, 8, validateReturnProduct);

                markRtoInTransit.setText("Mark RTO");


                header.setWidget(2, 4, markRtoInTransit);

                registerButtonHandlersForWE();
                if(this.userType == UserType.WAREHOUSE_EXECUTIVE || this.userType == UserType.ADMIN){
                        implementMaskForWE();
                } else if(this.userType == UserType.WAREHOUSE_MONITOR){
                        implementMaskForWM();
                }

        }

        private void registerButtonHandlersForWE(){
                /*
            verifyOrder.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                if(verifyOrder.isEnabled()){
                    GWT.log("Verify order event fired");
                    eventbus.fireEvent(new VerifyOrderEvent(order));
                }
            }
        });
                 */

                acceptOrder.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(!acceptOrder.isEnabled())
                                        return;
                                if(order.getAcceptTogetherOrdersMap()!=null && order.getAcceptTogetherOrdersMap().size()==1){
                                        eventbus.fireEvent(new AcceptOrderEvent(order));
                                }
                                if(order.getAcceptTogetherOrdersMap()!=null && order.getAcceptTogetherOrdersMap().size()>1){
                                        AcceptOrderConfirmationBox acceptConfirmBox = new AcceptOrderConfirmationBox(eventbus, order, order.getAcceptTogetherOrdersMap());
                                        acceptConfirmBox.setPopupPosition(Window.getClientWidth()/15, Window.getClientHeight()/15);
                                        acceptConfirmBox.show();
                                }
                        }
                });

                notAvailable.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(notAvailable.isEnabled())
                                        eventbus.fireEvent(new NostockOrderEvent(order));
                        }
                });

                rejectOrder.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(rejectOrder.isEnabled()){
                                        RejectReasonBox box = new RejectReasonBox(eventbus, order, user);
                                        box.center();
                                }
                        }
                });

                addBillingInfo.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(!addBillingInfo.isEnabled())
                                        return;
                                BillingInfoBox box = new BillingInfoBox(eventbus, order, user);
                                box.center();                           
                        }
                });

                printInvoice.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(!printInvoice.isEnabled())
                                        return;
                                if(order.getJacketNumber()==0 && (billingType == BillingType.OURS || billingType == BillingType.OURS_EXTERNAL)) {
                                        long total_quantity_to_bill = 0;
                                        boolean hasNonSerialized = false;
                                        for(Long orderId : order.getBillTogetherOrdersMap().keySet()){
                                                boolean hasSerialized = Boolean.parseBoolean(order.getBillTogetherOrdersMap().get(orderId).get("IsSerialized"));
                                                if (hasSerialized){
                                                        total_quantity_to_bill += (long)Double.parseDouble(order.getBillTogetherOrdersMap().get(orderId).get("Quantity"));
                                                }
                                                else{
                                                        hasNonSerialized = true;
                                                }
                                        }
                                        DialogBox box;
                                        if (total_quantity_to_bill >= 10 && !hasNonSerialized){
                                                box = new BulkBillingInfoBox(eventbus, order, user, billingType, warehouses, order.getBillTogetherOrdersMap());
                                        }
                                        else{
                                                box = new JacketInfoBox(eventbus, order, user, billingType, warehouses, order.getBillTogetherOrdersMap());
                                        }
                                        box.setPopupPosition(Window.getClientWidth()/10, Window.getClientHeight()/10);
                                        box.show();
                                } else{
                                        String invoiceGenerationUrl = null;
                                        if(warehouseID == 0) {
                                                invoiceGenerationUrl = GWT.getHostPageBaseURL() + "invoice/?id=" + order.getOrderId() + "&warehouse=" + order.getWarehouseId() + "&withBill=true" ;
                                                if(order.getLogisticsTransactionId()!=null){
                                                        invoiceGenerationUrl = invoiceGenerationUrl + "&logisticsTxnId=" + order.getLogisticsTransactionId();
                                                }
                                        } else {
                                                invoiceGenerationUrl = GWT.getHostPageBaseURL() + "invoice/?id=" + order.getOrderId() + "&warehouse=" + warehouseID ;
                                                if(order.getLogisticsTransactionId()!=null){
                                                        invoiceGenerationUrl = invoiceGenerationUrl + "&logisticsTxnId=" + order.getLogisticsTransactionId();
                                                }
                                                if(billingType == BillingType.OURS || billingType == BillingType.OURS_EXTERNAL)
                                                        invoiceGenerationUrl += "&withBill=true";
                                                else
                                                        invoiceGenerationUrl += "&withBill=false";
                                        }
                                        Window.open(invoiceGenerationUrl, "newWindowName", "window features.");
                                }
                        }
                });

                printAllInvoices.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(!printAllInvoices.isEnabled()){
                                        return;
                                }else{
                                        String invoiceGenerationUrl = GWT.getHostPageBaseURL() + "invoice/?id=" + order.getOrderId() + "&printAll=true&warehouse=" + warehouseID + "&logisticsTxnId=" + order.getLogisticsTransactionId();
                                        if(billingType == BillingType.OURS || billingType == BillingType.OURS_EXTERNAL)
                                                invoiceGenerationUrl += "&withBill=true";
                                        else
                                                invoiceGenerationUrl += "&withBill=false";
                                        Window.open(invoiceGenerationUrl, "newWindowName", "window features.");
                                }
                        }
                });

                receiveReturn.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(!receiveReturn.isEnabled())
                                        return;
                                ReceiveReturnBox box = new ReceiveReturnBox(eventbus, order);
                                box.center();
                        }
                });

                validateDOA.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(!validateDOA.isEnabled())
                                        return;
                                DoaValidationBox box = new DoaValidationBox(eventbus, order);
                                box.center();
                        }
                });

                validateReturnProduct.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(!validateReturnProduct.isEnabled())
                                        return;
                                ProductValidationBox box = new ProductValidationBox(eventbus, order);
                                box.center();
                        }
                });

                markRtoInTransit.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                eventbus.fireEvent(new MarkRtoInTransitEvent(order));
                        }
                });
        }

        private void implementMaskForWM(){

                /*boolean accept, boolean notavailable, boolean updateColor, boolean reject, 
                boolean printAllInvoice, boolean printInv, boolean splitSourceOrder, boolean markDelivery, 
                boolean reqPickup, boolean authPickup, boolean reship, boolean lostInTransit, boolean acceptdoa,
                boolean validatedoa, boolean validatereturnproduct*/
                //TODO Currently a lot of options have been disabled for this case. This would need a revisit based on discussions and requirements
                printAllInvoices.setEnabled(false);
                addBillingInfo.setEnabled(false);
                printInvoice.setEnabled(false);
                //receiveReturn.setEnabled(false);
                //validateDOA.setEnabled(false);
                //validateReturnProduct.setEnabled(false);
                flagOrder.setEnabled(false);
                //requestPickup.setEnabled(false);
                //authorizePickup.setEnabled(false);
                refundOrder.setEnabled(false);
                //reshipOrder.setEnabled(false);
                //markLostInTransit.setEnabled(false);
                provisionallyCapturePaymentForOrder.setEnabled(false);
                addWeight.setEnabled(false);
                //markDelivered.setEnabled(false);
                //markRtoInTransit.setEnabled(false);
                changeFreebieItem.setEnabled(false);

                switch(mask){
                case CAPTURE_IN_PROCESS:
                        maskButtonsForWM(false, false, false, false, false, false, false, false,
                                        false, false, false, false, false, false, false); 
                        break;
                case VERIFICATION_PENDING:
                case NEW:
                case NO_STOCK:
                case ACCEPT:
                        maskButtonsForWM(true, true, true, true, true, false, true, false,
                                        false, false, false, false, false, false, false); 
                        break;
                case BILL:
                        maskButtonsForWM(false, true, false, true, false, true, false, true, 
                                        false, false, false, false, false, false, false); 
                        break;
                case DELIVERED:
                        maskButtonsForWM(false, false, false, false, false, true, false, false,
                                        false, false, false, false, false, false, false); 
                case DOA_REQUEST_AUTHORIZED:    
                        maskButtonsForWM(false, false, false, false, false, true, false, false,
                                        false, false, false, false, false, false, false); 
                case DOA_PICKUP_REQUESTED:
                        maskButtonsForWM(false, false, false, false, false, true, false, false,
                                        true, true, false, false, false, false, false); 
                case DOA_RETURNED:
                case SALES_RETURNED:
                        maskButtonsForWM(false, false, false, false, false, true, false, false,
                                        false, false, true, false, false, false, false); 

                case SHIP:
                        maskButtonsForWM(false, false, false, false, false, true, false, true,
                                        false, false, false, true, false, false, false); 
                        break;
                default:
                        maskButtonsForWM(false, false, false, false, false, true, false, false, 
                                        false, false, false, false, false, false, false);       //Unknown state. Let's not allow any untoward actions.
                                        break;
                }
        }

        private void implementMaskForWE(){
                switch(mask){
                case VERIFICATION_PENDING:
                        maskButtonsForWE(false, false, false, false, false, false, false, false, false); //Do not allow the WE to verify the order.
                        break;
                case CAPTURE_IN_PROCESS:
                case NEW:
                        maskButtonsForWE(true, false, true, false, false, false, false, false, false);  //Allow the WE to either accept the order or mark it as out of stock.
                        break;
                case ACCEPT:
                        //TODO: Mask buttons based on the billingType
                        if(billingType == BillingType.OURS)
                                maskButtonsForWE(false, false, false, true, true, false, false, false, false); // For our billing, allow the WE to directly print the invoive.
                        else
                                maskButtonsForWE(false, false, false, true, true, false, false, true, false); //For external billing, allow the WE to feed the invoice info.
                        break;
                case REJECT:
                        maskButtonsForWE(false, false, false, false, false, false, false, false, false); //Can't do anything once the order has been rejected.
                        break;
                case BILL:
                        maskButtonsForWE(false, false, false, true, false, false, false, false, false); //Allow WE to print the invoice for a billed order.
                        break;
                case SHIP:
                        maskButtonsForWE(false, false, false, false, false, false, false, false, false);
                        break;
                case NO_STOCK:
                        maskButtonsForWE(true, false, false, false, false, false, false, false, false); //Allow WE to accept a low inventory item. 
                        break;
                case CANCEL_CONFIRMED:
                        maskButtonsForWE(false, true, false, false, false, false, false, false, false); //Allow WE to Cancel a order which is in cancellation pending state. 
                        break;                  
                case DOA_AWAITED:
                case SALES_RETURN_AWAITED:
                        maskButtonsForWE(false, false, false, false, false, true, false, false, false); //Allow WE to accept the packet.
                        break;
                case DOA_RECEIVED:
                        maskButtonsForWE(false, false, false, false, false, false, true, false, false); //Allow WE to validate the DOA certificate.
                        break;
                case RET_RECEIVED:
                        maskButtonsForWE(false, false, false, false, false, false, false, false, true); //Allow WE to validate the DOA certificate.
                        break;

                default:
                        maskButtonsForWE(false, false, false, false, false, false, false, false, false); //Unknown state, let's disallow any untoward actions.
                        break;
                }
        }

        private void maskButtonsForWE(boolean accept, boolean reject, boolean notavailable, boolean printInv, boolean billing, boolean acceptdoa, boolean validatedoa, boolean printAllInvoice, boolean validatereturnproduct){
                //verifyOrder.setEnabled(verify);
                acceptOrder.setEnabled(accept);
                notAvailable.setEnabled(notavailable);
                printInvoice.setEnabled(printInv);
                addBillingInfo.setEnabled(billing);
                receiveReturn.setEnabled(acceptdoa);
                validateDOA.setEnabled(validatedoa);
                rejectOrder.setEnabled(reject);
                printAllInvoices.setEnabled(printAllInvoice);
                validateReturnProduct.setEnabled(validatereturnproduct);
        }

        private void maskButtonsForWM(boolean accept, boolean notavailable, boolean updateColor, boolean reject, 
                        boolean printAllInvoice, boolean printInv, boolean splitSourceOrder, boolean markDelivery, 
                        boolean reqPickup, boolean authPickup, boolean reship, boolean lostInTransit, boolean acceptdoa,
                        boolean validatedoa, boolean validatereturnproduct){
                acceptOrder.setEnabled(accept);
                notAvailable.setEnabled(notavailable);
                changeColor.setEnabled(updateColor);
                rejectOrder.setEnabled(reject);
                printAllInvoices.setEnabled(printAllInvoice);
                printInvoice.setEnabled(printInv);
                splitEbayOrder.setEnabled(splitSourceOrder);
                markDelivered.setEnabled(markDelivery);
                requestPickup.setEnabled(reqPickup);
                authorizePickup.setEnabled(authPickup);
                reshipOrder.setEnabled(reship);
                markLostInTransit.setEnabled(lostInTransit);
                receiveReturn.setEnabled(acceptdoa);
                validateDOA.setEnabled(validatedoa);
                validateReturnProduct.setEnabled(validatereturnproduct);
        }

        private void initTableForWM() {
                if(transaction.isDoaFlag()){
                        flagOrder.setText("Unflag");
                } else {
                        flagOrder.setText("Flag");
                }
                requestPickup.setText("Request Pick-up No");
                authorizePickup.setText("Confirm Pick-up");
                reshipOrder.setText("Reship");
                markLostInTransit.setText("Lost In Transit");
                refundOrder.setText("Refund");
                provisionallyCapturePaymentForOrder.setText("Capture provisionally");
                unacceptOrder.setText("Unaccept");

                header.setWidget(1, 0, flagOrder);
                header.setWidget(1, 1, requestPickup);
                header.setWidget(1, 2, authorizePickup);
                header.setWidget(1, 3, reshipOrder);
                header.setWidget(1, 4, markLostInTransit);
                header.setWidget(1, 5, provisionallyCapturePaymentForOrder);
                header.setWidget(1, 6, refundOrder);
                //header.setWidget(1, 7, unacceptOrder);

                addWeight.setText("Add weight");
                changeColor.setText("Change Color WH Jacket Courier");
                addDelayReason.setText("Add Delay Reason");
                markDelivered.setText("Mark Delivered");
                markRtoInTransit.setText("Mark RTO");
                //              changeJacketNumber.setText("Change Jacket");
                //              shiftWarehouse.setText("Shift Warehouse");
                splitFreebieOrder.setText("Split Freebie Order");
                changeFreebieItem.setText("Change Freebie Item");
                splitEbayOrder.setText("Split Order");

                header.setWidget(2, 0, addWeight);
                header.setWidget(2, 1, changeColor);
                header.setWidget(2, 2, addDelayReason);
                header.setWidget(2, 3, markDelivered);
                header.setWidget(2, 4, markRtoInTransit);
                header.setWidget(2, 5, splitFreebieOrder);
                header.setWidget(2, 6, changeFreebieItem);
                header.setWidget(2, 7, splitEbayOrder);
                if(order.getQuantity()<2) {
                        splitEbayOrder.setEnabled(false);
                }

                if(order.getTotalWeight() != 0)
                        addWeight.setEnabled(false);

                if(order.getFreebieItemId() == 0) {
                        splitFreebieOrder.setEnabled(false);
                        changeFreebieItem.setEnabled(false);
                }

                registerButtonHandlersForAdmin();
                implementMaskForWM();
        }

        private void initTableForAdmin() {
                if(transaction.isDoaFlag()){
                        flagOrder.setText("Unflag");
                } else {
                        flagOrder.setText("Flag");
                }

                requestPickup.setText("Request Pick-up No");
                authorizePickup.setText("Confirm Pick-up");
                reshipOrder.setText("Reship");
                markLostInTransit.setText("Lost In Transit");
                refundOrder.setText("Refund");
                provisionallyCapturePaymentForOrder.setText("Capture provisionally");
                unacceptOrder.setText("Unaccept");

                header.setWidget(1, 0, flagOrder);
                header.setWidget(1, 1, requestPickup);
                header.setWidget(1, 2, authorizePickup);
                header.setWidget(1, 3, reshipOrder);
                header.setWidget(1, 4, markLostInTransit);
                header.setWidget(1, 5, provisionallyCapturePaymentForOrder);
                header.setWidget(1, 6, refundOrder);
                header.setWidget(1, 7, unacceptOrder);

                addWeight.setText("Add weight");
                changeColor.setText("Change Color WH Jacket Courier");
                addDelayReason.setText("Add Delay Reason");
                markDelivered.setText("Mark Delivered");
                markRtoInTransit.setText("Mark RTO");
                //          changeJacketNumber.setText("Change Jacket");
                //          shiftWarehouse.setText("Shift Warehouse");
                splitFreebieOrder.setText("Split Freebie Order");
                changeFreebieItem.setText("Change Freebie Item");
                splitEbayOrder.setText("Split Order");

                header.setWidget(2, 0, addWeight);
                header.setWidget(2, 1, changeColor);
                header.setWidget(2, 2, addDelayReason);
                header.setWidget(2, 3, markDelivered);
                header.setWidget(2, 4, markRtoInTransit);
                //          header.setWidget(2, 5, changeJacketNumber);
                //          header.setWidget(2, 6, shiftWarehouse);
                header.setWidget(2, 5, splitFreebieOrder);
                header.setWidget(2, 6, changeFreebieItem);
                header.setWidget(2, 7, splitEbayOrder);
                if(order.getQuantity()<2) {
                        splitEbayOrder.setEnabled(false);
                }

                if(order.getTotalWeight() != 0)
                        addWeight.setEnabled(false);

                if(order.getFreebieItemId() == 0) {
                        splitFreebieOrder.setEnabled(false);
                        changeFreebieItem.setEnabled(false);
                }

                registerButtonHandlersForAdmin();
                implementMaskForAdmin();
        }

        private void registerButtonHandlersForAdmin(){
                flagOrder.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(flagOrder.isEnabled()){
                                        eventbus.fireEvent(new FlagOrderEvent(order));
                                }
                        }
                });

                requestPickup.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(requestPickup.isEnabled()){
                                        GWT.log("Raising a pickup request for: " + order.getOrderId());
                                        ChoosePickupProviderBox box = new ChoosePickupProviderBox(eventbus, order, providers);
                                        box.center();
                                }
                        }
                });

                authorizePickup.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(!authorizePickup.isEnabled())
                                        return;
                                PickupAuthorizationInfoBox box = new PickupAuthorizationInfoBox(eventbus, order, providers);
                                box.center();
                        }
                });

                reshipOrder.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(reshipOrder.isEnabled()){
                                        GWT.log("Reshipping the order: " + order.getOrderId());
                                        eventbus.fireEvent(new ReshipOrderEvent(order));
                                }
                        }
                });

                markLostInTransit.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(markLostInTransit.isEnabled()){
                                        GWT.log("Mark Lost in Transit to the order: " + order.getOrderId());
                                        eventbus.fireEvent(new LostInTransitEvent(order));
                                }
                        }
                });

                provisionallyCapturePaymentForOrder.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(provisionallyCapturePaymentForOrder.isEnabled()) {
                                        GWT.log("Provisionally capturing payment for order: " + order.getOrderId());
                                        eventbus.fireEvent(new ProvisionalCaptureEvent(order));
                                }
                        }
                });

                refundOrder.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(refundOrder.isEnabled()){
                                        RejectReasonBox box = new RejectReasonBox(eventbus, order, user);
                                        //box.clear();
                                        box.center();
                                }
                        }
                });

                addWeight.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(addWeight.isEnabled()){
                                        AddWeightBox box = new AddWeightBox(eventbus, order);
                                        box.center();
                                }
                        }
                });

                changeColor.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(changeColor.isEnabled()){
                                        ChooseColorBox box = new ChooseColorBox(eventbus, order);
                                        box.center();
                                }
                        }
                });

                addDelayReason.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                AddDelayReasonBox box = new AddDelayReasonBox(eventbus, order);
                                box.center();
                        }
                });

                markDelivered.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                MarkDeliveredBox box = new MarkDeliveredBox(eventbus, order);
                                box.center();
                        }
                });

                markRtoInTransit.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                eventbus.fireEvent(new MarkRtoInTransitEvent(order));
                        }
                });

                //              changeJacketNumber.addClickHandler(new ClickHandler() {
                        //            
                        //            @Override
                        //            public void onClick(ClickEvent event) {
                                //              ChangeJacketBox box = new ChangeJacketBox(eventbus, order);
                                //                box.center();
                                //            }
                        //        });

                unacceptOrder.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(unacceptOrder.isEnabled()){
                                        UnacceptConfirmationBox box = new UnacceptConfirmationBox(eventbus, order);
                                        box.center();                           
                                }
                        }
                });


                //              shiftWarehouse.addClickHandler(new ClickHandler() {
                //            
                //            @Override
                //            public void onClick(ClickEvent event) {
                //                if(shiftWarehouse.isEnabled()){
                //                    ChooseWarehouseBox box = new ChooseWarehouseBox(eventbus, order);
                //                    box.center();
                //                }
                //            }
                //        });

                splitFreebieOrder.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(splitFreebieOrder.isEnabled()){
                                        SplitFreebieOrderBox box = new SplitFreebieOrderBox(eventbus, order);
                                        box.center();
                                }
                        }
                });

                splitEbayOrder.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(splitEbayOrder.isEnabled()){
                                        SplitEbayOrderBox box = new SplitEbayOrderBox(eventbus, order);
                                        box.center();
                                }
                        }
                });

                changeFreebieItem.addClickHandler(new ClickHandler() {

                        @Override
                        public void onClick(ClickEvent event) {
                                if(changeFreebieItem.isEnabled()){
                                        ChangeFreebieItemBox box = new ChangeFreebieItemBox(eventbus, order);
                                        box.center();
                                }
                        }
                });
        }

        private void implementMaskForAdmin(){
                unacceptOrder.setEnabled(false);
                switch(mask){
                case CAPTURE_IN_PROCESS:
                        maskButtonsForAdmin(false, false, false, false, false, true, true, false); //Allow the OM to refund a COD order or an order with low inventory or when a customer calls or writes to cancel an order.
                        break;
                case VERIFICATION_PENDING:
                case NEW:
                case NO_STOCK:
                case BILL:
                        maskButtonsForAdmin(false, false, false, false, false, true, false, false); //Allow the OM to refund a COD order or an order with low inventory or when a customer calls or writes to cancel an order.
                        break;
                case ACCEPT:
                        maskButtonsForAdmin(false, false, false, false, false, true, false, false); //Allow the OM to refund a COD order or an order with low inventory or when a customer calls or writes to cancel an order.
                        unacceptOrder.setEnabled(true);
                        break;
                case DELIVERED:
                        maskButtonsForAdmin(false, false, false, false, false, true, false, false);     //Allow the OM to flag and request pickup.
                        break;
                case DOA_REQUEST_AUTHORIZED:    
                        maskButtonsForAdmin(true, true, false, false, false, true, false, false);       //Allow the OM to flag and request pickup.
                        break;
                case DOA_PICKUP_REQUESTED:
                        maskButtonsForAdmin(true, true, true, false, false, true, false, false);        //Allow the OM to either re-request a pickup no. or authorize pickup by entering one
                        break;
                case DOA_RETURNED:
                case SALES_RETURNED:
                        maskButtonsForAdmin(false, false, false, true, true, true, false, false);       //Allow the OM to either reship the order or refund it
                        break;
                case SHIP:
                        maskButtonsForAdmin(false, false, false, false, false, true, false, true);      //Allow the OM to either reship the order or refund it
                        break;
                default:
                        maskButtonsForAdmin(false, false, false, false, false, true, false, false);     //Unknown state. Let's not allow any untoward actions.
                        break;
                }
        }

        private void maskButtonsForAdmin(boolean flag, boolean reqPickup, boolean authPickup, boolean reship,
                        boolean refund, boolean printInv, boolean provisionallyCapturePayment, boolean lostInTransit)
        {
                flagOrder.setEnabled(flag);
                requestPickup.setEnabled(reqPickup);
                authorizePickup.setEnabled(authPickup);
                reshipOrder.setEnabled(reship);
                provisionallyCapturePaymentForOrder.setEnabled(provisionallyCapturePayment);
                refundOrder.setEnabled(refund);
                printInvoice.setEnabled(printInv);
                markLostInTransit.setEnabled(lostInTransit);
        }

        private void loadOrderDetails(){
                if(transaction.getDealText()!=null &&!transaction.getDealText().isEmpty()) {
                        orderDetails1.add(getHorizontalPanel("DEAL TEXT:    ", transaction.getDealText()));
                }
                orderDetails1.add(getHorizontalPanel("PRODUCT GROUP: ", transaction.getProductGroup()));
                orderDetails1.add(getHorizontalPanel("BRAND:         ", transaction.getBrand()));
                orderDetails1.add(getHorizontalPanel("MODEL:         ", getModelDisplayName(transaction)));
                orderDetails1.add(getHorizontalPanel("Item ID:       ", transaction.getItemId()+""));

                orderDetails1.add(getHorizontalPanel("DELAY REASON:  ", transaction.getDelayReason()));
                orderDetails1.add(getHorizontalPanel("ALERT:         ", transaction.getAlert().toString()));

                orderDetails2.add(getHorizontalPanel("NAME:          ", transaction.getCustomerName()));
                orderDetails2.add(getHorizontalPanel("ADDRESS:       ", getDisplayAddress(transaction)));
                orderDetails2.add(getHorizontalPanel("MOBILE NUMBER: ", transaction.getCustomerMobileNumber()));
                if(transaction.getExtraInfo()!=null && !transaction.getExtraInfo().isEmpty()) {
                        orderDetails2.add(getHorizontalPanel("EXTRA INFO: ", transaction.getExtraInfo()));
                }

                orderDetails3.add(getHorizontalPanel("TOTAL WEIGHT:      ", transaction.getTotalWeight()+""));
                orderDetails3.add(getHorizontalPanel("TOTAL AMOUNT(Rs):  ", transaction.getTotalAmount()+""));
                orderDetails3.add(getHorizontalPanel("FULFIL FROM:       ", transaction.getPickFromWarehouse()+""));
                orderDetails3.add(getHorizontalPanel("ORDER TYPE:       ", transaction.getOrderType()+""));
                if(transaction.getQuantity()>1)
                        orderDetails3.add(getHorizontalPanel("BULK ORDER:          ", transaction.getQuantity()+""));
                if(transaction.getFreebieItemId()>0)
                        orderDetails3.add(getHorizontalPanel("FREEBIE ITEMID:       ", transaction.getFreebieItemId()+""));
                if(transaction.getLogisticsTransactionId()!=null && !transaction.getLogisticsTransactionId().isEmpty()){
                        orderDetails3.add(getHorizontalPanel("MASTER ORDER ID:       ", transaction.getLogisticsTransactionId()+""));
                }

                orderDetails4.add(getHorizontalPanel("AIRWAY BILL NO:  ", transaction.getAirwayBillNo()));
                orderDetails4.add(getHorizontalPanel("INVOICE NUMBER:  ", transaction.getInvoiceNumber()));
                orderDetails4.add(getHorizontalPanel("JACKET NUMBER:   ", transaction.getJacketNumber() + ""));
                orderDetails4.add(getHorizontalPanel("ITEM NO:         ", getDisplayNameForNullableString(transaction.getItemNumber())));
                orderDetails4.add(getHorizontalPanel("IMEI NO:         ", transaction.getImeiNumber() + ""));

                orderDetails4.add(getHorizontalPanel("BILLED BY:       ", transaction.getBilledBy()));          
        }

        private HorizontalPanel getHorizontalPanel(String labelText, String valueText) {
                HorizontalPanel hpanel = new HorizontalPanel();
                hpanel.setSpacing(5);
                hpanel.add(new Label(labelText));
                hpanel.add(new Label(valueText));
                hpanel.setCellWidth(hpanel.getWidget(0), "128px");
                hpanel.setCellWidth(hpanel.getWidget(1), "128px");
                hpanel.getWidget(0).setStyleName(selectionStyle.blueLabel());
                hpanel.getWidget(1).setStyleName(selectionStyle.greenLabel());
                return hpanel;
        }

        private String getModelDisplayName(Order order){
                String modelName = "";
                if(order.getModelName()!=null)
                        modelName = order.getModelName() + " ";
                if(order.getModelNumber()!=null)
                        modelName = modelName + order.getModelNumber();
                if(order.getColor()!=null)
                        modelName = modelName + " (" + order.getColor() + ")";
                return modelName;
        }

        private String getDisplayAddress(Order order){
                StringBuilder displayAddress = new StringBuilder();
                displayAddress.append(order.getCustomerAddress1() + "\n");
                displayAddress.append(order.getCustomerAddress2() + "\n");
                displayAddress.append(order.getCustomerCity() + "\n");
                displayAddress.append(order.getCustomerState() + "   PIN - " +  order.getCustomerPincode());
                return displayAddress.toString();
        }

        private String getDisplayNameForNullableString(String s) {
                if (s == null)
                        return "";
                return s;
        }


}