de.hybris.platform.b2bacceleratorfacades.order.impl.DefaultB2BOrderFacade.java Source code

Java tutorial

Introduction

Here is the source code for de.hybris.platform.b2bacceleratorfacades.order.impl.DefaultB2BOrderFacade.java

Source

/*
 * [y] hybris Platform
 *
 * Copyright (c) 2000-2013 hybris AG
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of hybris
 * ("Confidential Information"). You shall not disclose such Confidential
 * Information and shall use it only in accordance with the terms of the
 * license agreement you entered into with hybris.
 * 
 *  
 */
package de.hybris.platform.b2bacceleratorfacades.order.impl;

import de.hybris.platform.b2b.model.B2BCommentModel;
import de.hybris.platform.b2b.model.B2BPermissionResultModel;
import de.hybris.platform.b2b.process.approval.model.B2BApprovalProcessModel;
import de.hybris.platform.b2b.services.B2BCommentService;
import de.hybris.platform.b2b.services.B2BOrderService;
import de.hybris.platform.b2b.services.B2BSaleQuoteService;
import de.hybris.platform.b2b.services.B2BWorkflowIntegrationService;
import de.hybris.platform.b2bacceleratorfacades.order.B2BOrderFacade;
import de.hybris.platform.b2bacceleratorfacades.order.data.B2BOrderApprovalData;
import de.hybris.platform.b2bacceleratorfacades.order.data.B2BOrderHistoryEntryData;
import de.hybris.platform.b2bacceleratorfacades.order.data.ScheduledCartData;
import de.hybris.platform.b2bacceleratorservices.customer.B2BCustomerAccountService;
import de.hybris.platform.b2bacceleratorservices.dao.PagedB2BWorkflowActionDao;
import de.hybris.platform.commercefacades.order.OrderFacade;
import de.hybris.platform.commercefacades.order.data.OrderData;
import de.hybris.platform.commercefacades.order.data.OrderHistoryData;
import de.hybris.platform.commercefacades.order.impl.DefaultOrderFacade;
import de.hybris.platform.converters.Converters;
import de.hybris.platform.commerceservices.search.pagedata.PageableData;
import de.hybris.platform.commerceservices.search.pagedata.SearchPageData;
import de.hybris.platform.core.enums.OrderStatus;
import de.hybris.platform.core.model.order.AbstractOrderModel;
import de.hybris.platform.core.model.order.OrderModel;
import de.hybris.platform.core.model.security.PrincipalModel;
import de.hybris.platform.core.model.user.CustomerModel;
import de.hybris.platform.orderhistory.OrderHistoryService;
import de.hybris.platform.orderhistory.model.OrderHistoryEntryModel;
import de.hybris.platform.orderscheduling.model.CartToOrderCronJobModel;
import de.hybris.platform.servicelayer.dto.converter.Converter;
import de.hybris.platform.servicelayer.exceptions.UnknownIdentifierException;
import de.hybris.platform.servicelayer.model.ModelService;
import de.hybris.platform.servicelayer.user.UserService;
import de.hybris.platform.workflow.enums.WorkflowActionType;
import de.hybris.platform.workflow.model.WorkflowActionModel;

import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.PredicateUtils;
import org.springframework.beans.factory.annotation.Required;

/**
 * Default b2b implementation of {@link OrderFacade}.
 */
public class DefaultB2BOrderFacade extends DefaultOrderFacade implements B2BOrderFacade {
    private B2BOrderService b2bOrderService;
    private Converter<CartToOrderCronJobModel, ScheduledCartData> scheduledCartConverter;
    private ModelService modelService;
    private Converter<WorkflowActionModel, B2BOrderApprovalData> b2bOrderApprovalDataConverter;
    private B2BWorkflowIntegrationService b2bWorkflowIntegrationService;
    private PagedB2BWorkflowActionDao pagedB2BWorkflowActionDao;
    private Converter<OrderHistoryEntryModel, B2BOrderHistoryEntryData> b2bOrderHistoryEntryDataConverter;
    private B2BCommentService<AbstractOrderModel> b2bCommentService;
    private B2BSaleQuoteService b2bQuoteOrderService;
    private OrderHistoryService orderHistoryService;
    private UserService userService;

    @Override
    public OrderData getOrderDetailsForCode(final String code) {
        final OrderModel orderModel = b2bOrderService.getOrderForCode(code);
        if (orderModel == null) {
            throw new UnknownIdentifierException(
                    "Order with code " + code + " not found for current user in current BaseStore");
        }
        return getOrderConverter().convert(orderModel);
    }

    @Override
    public ScheduledCartData getReplenishmentOrderDetailsForCode(final String code, final String user) {
        ScheduledCartData scheduledCartData = null;
        final CartToOrderCronJobModel cronJob = this.<B2BCustomerAccountService>getCustomerAccountService()
                .getCartToOrderCronJobForCode(code, getUserService().getUserForUID(user));
        if (cronJob != null) {
            scheduledCartData = getScheduledCartConverter().convert(cronJob);
        }

        return scheduledCartData;
    }

    @Override
    public List<ScheduledCartData> getReplenishmentHistory() {
        final CustomerModel currentCustomer = (CustomerModel) getUserService().getCurrentUser();
        final List<? extends CartToOrderCronJobModel> jobModels = this
                .<B2BCustomerAccountService>getCustomerAccountService()
                .getCartToOrderCronJobsForUser(currentCustomer);
        return Converters.convertAll(jobModels, getScheduledCartConverter());
    }

    @Override
    public SearchPageData<ScheduledCartData> getPagedReplenishmentHistory(final PageableData pageableData) {
        final CustomerModel currentCustomer = (CustomerModel) getUserService().getCurrentUser();
        final SearchPageData<CartToOrderCronJobModel> jobResults = this
                .<B2BCustomerAccountService>getCustomerAccountService()
                .getPagedCartToOrderCronJobsForUser(currentCustomer, pageableData);
        return convertPageData(jobResults, getScheduledCartConverter());
    }

    @Override
    public void cancelReplenishment(final String jobCode, final String user) {
        final CartToOrderCronJobModel cronJob = this.<B2BCustomerAccountService>getCustomerAccountService()
                .getCartToOrderCronJobForCode(jobCode, getUserService().getUserForUID(user));
        if (cronJob != null) {
            cronJob.setActive(Boolean.FALSE);
            this.getModelService().save(cronJob);
        }
    }

    @Override
    public List<? extends OrderHistoryData> getReplenishmentOrderHistory(final String jobCode, final String user) {
        final CartToOrderCronJobModel cronJob = this.<B2BCustomerAccountService>getCustomerAccountService()
                .getCartToOrderCronJobForCode(jobCode, getUserService().getUserForUID(user));
        if (cronJob != null) {
            return Converters.convertAll(cronJob.getOrders(), getOrderHistoryConverter());
        } else {
            return Collections.emptyList();
        }
    }

    @Override
    public SearchPageData<? extends OrderHistoryData> getPagedReplenishmentOrderHistory(final String jobCode,
            final PageableData pageableData) {
        final SearchPageData<OrderModel> ordersForJob = this.<B2BCustomerAccountService>getCustomerAccountService()
                .getOrdersForJob(jobCode, pageableData);
        return convertPageData(ordersForJob, getOrderHistoryConverter());
    }

    @Override
    public List<B2BOrderApprovalData> getOrdersForApproval() {
        final CustomerModel currentApprover = (CustomerModel) getUserService().getCurrentUser();
        final Collection<WorkflowActionModel> workFlowActionModelList = getB2bWorkflowIntegrationService()
                .getWorkflowActionsForUser(currentApprover);

        return Converters.convertAll(workFlowActionModelList, getB2bOrderApprovalDataConverter());
    }

    @Override
    public SearchPageData<B2BOrderApprovalData> getPagedOrdersForApproval(final WorkflowActionType[] actionTypes,
            final PageableData pageableData) {

        final SearchPageData<WorkflowActionModel> actions = getPagedB2BWorkflowActionDao()
                .findPagedWorkflowActionsByUserAndActionTypes(getUserService().getCurrentUser(), actionTypes,
                        pageableData);
        return convertPageData(actions, getB2bOrderApprovalDataConverter());
    }

    @Override
    public B2BOrderApprovalData getOrderApprovalDetailsForCode(final String code) {
        final WorkflowActionModel workflowActionModel = getB2bWorkflowIntegrationService().getActionForCode(code);
        return getB2bOrderApprovalDataConverter().convert(workflowActionModel);
    }

    @Override
    public B2BOrderApprovalData setOrderApprovalDecision(final B2BOrderApprovalData b2bOrderApprovalData) {
        final WorkflowActionModel workflowActionModel = getB2bWorkflowIntegrationService()
                .getActionForCode(b2bOrderApprovalData.getWorkflowActionModelCode());
        addCommentToWorkflowAction(workflowActionModel, b2bOrderApprovalData.getApprovalComments());
        getB2bWorkflowIntegrationService().decideAction(workflowActionModel,
                B2BWorkflowIntegrationService.DECISIONCODES
                        .valueOf(b2bOrderApprovalData.getSelectedDecision().toUpperCase()).name());

        return getB2bOrderApprovalDataConverter().convert(workflowActionModel);
    }

    protected void addCommentToWorkflowAction(final WorkflowActionModel workflowActionModel, final String comment) {
        final PrincipalModel principalAssigned = workflowActionModel.getPrincipalAssigned();

        final B2BApprovalProcessModel attachment = (B2BApprovalProcessModel) CollectionUtils.find(
                workflowActionModel.getAttachmentItems(),
                PredicateUtils.instanceofPredicate(B2BApprovalProcessModel.class));
        final OrderModel order = attachment.getOrder();
        final Collection<B2BPermissionResultModel> b2bPermissionResults = order.getPermissionResults();
        for (final B2BPermissionResultModel b2bPermissionResultModel : b2bPermissionResults) {
            if (b2bPermissionResultModel.getApprover().getUid().equals(principalAssigned.getUid())) {
                b2bPermissionResultModel.setNote(comment);
                getModelService().save(b2bPermissionResultModel);
            }
        }
    }

    @Override
    public List<B2BOrderHistoryEntryData> getOrderHistoryEntryData(final String code) {
        final OrderModel order = b2bOrderService.getOrderForCode(code);
        return !order.getHistoryEntries().isEmpty()
                ? Converters.convertAll(order.getHistoryEntries(), getB2bOrderHistoryEntryDataConverter())
                : Collections.EMPTY_LIST;
    }

    @Override
    public void createAndSetNewOrderFromRejectedQuote(final String orderCode) {
        final OrderModel order = getB2bOrderService().getOrderForCode(orderCode);
        if (order.getStatus() != null && order.getStatus().equals(OrderStatus.REJECTED_QUOTE)) {
            this.getB2bQuoteOrderService().placeOrderFromRejectedQuote(order);
        }
    }

    @Override
    public void createAndSetNewOrderFromNegotiateQuote(final String orderCode, final String comment) {
        final OrderModel order = getB2bOrderService().getOrderForCode(orderCode);
        if (order.getWorkflow() != null) {
            getModelService().remove(order.getWorkflow());
            getModelService().save(order);
        }
        order.setStatus(OrderStatus.PENDING_QUOTE);
        order.setQuoteExpirationDate(null);
        this.setB2BComment(comment, order);
        this.getB2bQuoteOrderService().placeQuoteOrder(order);
    }

    @Override
    public void createAndSetNewOrderFromApprovedQuote(final String orderCode, final String comment) {
        final OrderModel order = getB2bOrderService().getOrderForCode(orderCode);
        this.setB2BComment(comment, order);
        if (order.getStatus() != null && order.getStatus().equals(OrderStatus.APPROVED_QUOTE)) {
            getB2bQuoteOrderService().placeQuoteOrder(order);
        }
    }

    @Override
    public void cancelOrder(final String orderCode, final String comment) {
        final OrderModel order = getB2bOrderService().getOrderForCode(orderCode);
        if (order == null) {
            throw new UnknownIdentifierException(
                    "Order with code " + orderCode + " not found for current user in current  BaseStore");
        }
        order.setStatus(OrderStatus.CANCELLED);
        if (order.getWorkflow() != null) {
            getModelService().remove(order.getWorkflow());
            getModelService().save(order);
        }
        this.addAdditionalComment(orderCode, comment);
    }

    @Override
    public void addAdditionalComment(final String orderCode, final String comment) {
        final OrderModel order = getB2bOrderService().getOrderForCode(orderCode);
        if (order == null) {
            throw new UnknownIdentifierException(
                    "Order with code " + orderCode + " not found for current user in current  BaseStore");
        }

        this.setB2BComment(comment, order);
        final B2BCommentModel commentModel = getModelService().create(B2BCommentModel.class);
        commentModel.setComment(comment);
        commentModel.setOwner(getUserService().getCurrentUser());

        final OrderModel version = getOrderHistoryService().createHistorySnapshot(order);
        version.setB2bcomments(Collections.singleton(commentModel));
        getOrderHistoryService().saveHistorySnapshot(version);

        final OrderHistoryEntryModel historyEntry = getModelService().create(OrderHistoryEntryModel.class);
        historyEntry.setOrder(order);
        historyEntry.setPreviousOrderVersion(version);
        //TODO: localize the history description.
        historyEntry.setDescription("The status has changed for the quote");
        historyEntry.setTimestamp(new Date());
        historyEntry.setOwner(getUserService().getCurrentUser());
        getModelService().save(historyEntry);
    }

    protected void setB2BComment(final String comment, final AbstractOrderModel order) {
        final B2BCommentModel b2bComment = this.getModelService().create(B2BCommentModel.class);
        b2bComment.setComment(comment);
        b2bComment.setOwner(getUserService().getCurrentUser());
        this.getB2bCommentService().addComment(order, b2bComment);
    }

    protected B2BOrderService getB2bOrderService() {
        return b2bOrderService;
    }

    @Required
    public void setB2bOrderService(final B2BOrderService b2bOrderService) {
        this.b2bOrderService = b2bOrderService;
    }

    protected Converter<CartToOrderCronJobModel, ScheduledCartData> getScheduledCartConverter() {
        return scheduledCartConverter;
    }

    @Required
    public void setScheduledCartConverter(
            final Converter<CartToOrderCronJobModel, ScheduledCartData> scheduledCartConverter) {
        this.scheduledCartConverter = scheduledCartConverter;
    }

    protected ModelService getModelService() {
        return modelService;
    }

    @Required
    public void setModelService(final ModelService modelService) {
        this.modelService = modelService;
    }

    public Converter<WorkflowActionModel, B2BOrderApprovalData> getB2bOrderApprovalDataConverter() {
        return b2bOrderApprovalDataConverter;
    }

    @Required
    public void setB2bOrderApprovalDataConverter(
            final Converter<WorkflowActionModel, B2BOrderApprovalData> b2bOrderApprovalDataConverter) {
        this.b2bOrderApprovalDataConverter = b2bOrderApprovalDataConverter;
    }

    public B2BWorkflowIntegrationService getB2bWorkflowIntegrationService() {
        return b2bWorkflowIntegrationService;
    }

    @Required
    public void setB2bWorkflowIntegrationService(
            final B2BWorkflowIntegrationService b2bWorkflowIntegrationService) {
        this.b2bWorkflowIntegrationService = b2bWorkflowIntegrationService;
    }

    protected PagedB2BWorkflowActionDao getPagedB2BWorkflowActionDao() {
        return pagedB2BWorkflowActionDao;
    }

    @Required
    public void setPagedB2BWorkflowActionDao(final PagedB2BWorkflowActionDao pagedB2BWorkflowActionDao) {
        this.pagedB2BWorkflowActionDao = pagedB2BWorkflowActionDao;
    }

    /**
     * @return the b2bOrderHistoryEntryDataConverter
     */
    protected Converter<OrderHistoryEntryModel, B2BOrderHistoryEntryData> getB2bOrderHistoryEntryDataConverter() {
        return b2bOrderHistoryEntryDataConverter;
    }

    /**
     * @param b2bOrderHistoryEntryDataConverter
     *           the b2bOrderHistoryEntryDataConverter to set
     */
    public void setB2bOrderHistoryEntryDataConverter(
            final Converter<OrderHistoryEntryModel, B2BOrderHistoryEntryData> b2bOrderHistoryEntryDataConverter) {
        this.b2bOrderHistoryEntryDataConverter = b2bOrderHistoryEntryDataConverter;
    }

    /**
     * @return the b2bCommentService
     */
    public B2BCommentService<AbstractOrderModel> getB2bCommentService() {
        return b2bCommentService;
    }

    /**
     * @param b2bCommentService
     *           the b2bCommentService to set
     */
    public void setB2bCommentService(final B2BCommentService<AbstractOrderModel> b2bCommentService) {
        this.b2bCommentService = b2bCommentService;
    }

    /**
     * @return the b2bQuoteOrderService
     */
    public B2BSaleQuoteService getB2bQuoteOrderService() {
        return b2bQuoteOrderService;
    }

    /**
     * @param b2bQuoteOrderService
     *           the b2bQuoteOrderService to set
     */
    public void setB2bQuoteOrderService(final B2BSaleQuoteService b2bQuoteOrderService) {
        this.b2bQuoteOrderService = b2bQuoteOrderService;
    }

    /**
     * @return the orderHistoryService
     */
    public OrderHistoryService getOrderHistoryService() {
        return orderHistoryService;
    }

    /**
     * @param orderHistoryService
     *           the orderHistoryService to set
     */
    public void setOrderHistoryService(final OrderHistoryService orderHistoryService) {
        this.orderHistoryService = orderHistoryService;
    }

    /**
     * @return the userService
     */
    @Override
    public UserService getUserService() {
        return userService;
    }

    /**
     * @param userService
     *           the userService to set
     */
    @Override
    public void setUserService(final UserService userService) {
        this.userService = userService;
    }
}