/**
   * {@inheritDoc}
   *
   * @see
   *     edu.hm.lip.pizza.api.communication.request.IOrderService#create(edu.hm.lip.pizza.api.object.resource.Order)
   */
  @Override
  @Interceptors({OrderActiveMQInterceptor.class, OrderStageMailInterceptor.class})
  public Order create(Order order) {
    EntityOrder eOrder = OrderConverter.convertServiceToEntityOrder(order);
    EntityCustomer eCustomer = customerDAOBean.create(eOrder.getCustomer());
    eOrder.setCustomer(eCustomer);

    int i = 0;
    for (EntityOrderLine eOrderLine : eOrder.getOrderLines()) {
      EntityProductConfiguration eProductConfiguration =
          productConfigurationDAOBean.getProductConfiguration(
              order.getOrderLines().get(i++).getProductId(),
              eOrderLine.getProductConfiguration().getSize());

      eOrderLine.setOrder(eOrder);
      eOrderLine.setProductConfiguration(eProductConfiguration);
    }

    List<EntityOrderStage> stages = new ArrayList<EntityOrderStage>();
    EntityOrderStage eOrderStage = OrderStageManager.firstStage();
    eOrderStage.setOrder(eOrder);
    stages.add(eOrderStage);
    eOrder.setStages(stages);

    eOrder = orderDAOBean.create(eOrder);

    asyncGeoEncoder.doGeoEncoding(eCustomer);

    return OrderConverter.convertEntityToServiceOrder(eOrder);
  }
  /**
   * {@inheritDoc}
   *
   * @see edu.hm.lip.pizza.api.communication.request.IOrderService#createPreviousOrderStage(int)
   */
  @Override
  public Order createPreviousOrderStage(int id) {
    EntityOrder eOrder = orderDAOBean.read(id);
    List<EntityOrderStage> eOrderStages = eOrder.getStages();

    EntityOrderStage currentStage = OrderStageManager.current(eOrderStages);
    if (currentStage != null) {
      eOrderStages.remove(currentStage);
      eOrder.setStages(eOrderStages);
      orderDAOBean.update(eOrder);
    }

    return OrderConverter.convertEntityToServiceOrder(eOrder);
  }
  /**
   * {@inheritDoc}
   *
   * @see edu.hm.lip.pizza.api.communication.request.IOrderService#createNextOrderStage(int)
   */
  @Override
  @Interceptors({OrderStageMailInterceptor.class, BillingPrintMailInterceptor.class})
  public Order createNextOrderStage(int id) {
    EntityOrder eOrder = orderDAOBean.read(id);
    List<EntityOrderStage> eOrderStages = eOrder.getStages();

    EntityOrderStage nextStage = OrderStageManager.next(eOrderStages);
    if (nextStage != null) {
      nextStage.setOrder(eOrder);
      eOrderStages.add(nextStage);
      orderDAOBean.update(eOrder);
    }

    return OrderConverter.convertEntityToServiceOrder(eOrder);
  }
  /**
   * {@inheritDoc}
   *
   * @see edu.hm.lip.pizza.api.communication.request.IOrderService#updateOrderToDelivered(int)
   */
  @Override
  @Interceptors(OrderDeliveredActiveMQInterceptor.class)
  public Order updateOrderToDelivered(int id) {
    EntityOrder eOrder = orderDAOBean.read(id);
    List<EntityOrderStage> eOrderStages = eOrder.getStages();

    EntityOrderStage nextStage = OrderStageManager.next(eOrderStages);
    if (nextStage != null && nextStage.getStage() == Stage.DELIVERED) {
      nextStage.setOrder(eOrder);

      eOrderStages.add(nextStage);

      orderDAOBean.update(eOrder);
    }

    return OrderConverter.convertEntityToServiceOrder(eOrder);
  }
 /**
  * {@inheritDoc}
  *
  * @see edu.hm.lip.pizza.api.communication.request.IOrderService#find(int)
  */
 @Override
 public Order find(int id) {
   return OrderConverter.convertEntityToServiceOrder(orderDAOBean.read(id));
 }
 /**
  * {@inheritDoc}
  *
  * @see edu.hm.lip.pizza.api.communication.request.IOrderService#findAll()
  */
 @Override
 public List<Order> findAll() {
   return OrderConverter.convertEntityToServiceOrderList(orderDAOBean.readAll());
 }
 /**
  * {@inheritDoc}
  *
  * @see edu.hm.lip.pizza.api.communication.request.IOrderService#getUndeliveredOrders()
  */
 @Override
 public List<Order> getUndeliveredOrders() {
   return OrderConverter.convertEntityToServiceOrderList(orderDAOBean.getUndeliveredOrders());
 }