public ShipmentCandidates(final Map<Integer, I_C_OrderLine> myOrderLineCache) {
    orderLineCache = new HashMap<Integer, MOrderLine>();

    for (final Integer orderLineId : myOrderLineCache.keySet()) {
      final I_C_OrderLine orderLine = myOrderLineCache.get(orderLineId);
      final MOrderLine orderLinePO = InterfaceWrapperHelper.getPO(orderLine);
      orderLineCache.put(orderLineId, orderLinePO);
    }
  }
 private MInOutLine getPO(final I_M_InOutLine inOutLine) {
   return InterfaceWrapperHelper.getPO(inOutLine);
 }
  @Override
  public void addLine(
      final I_M_InOut inOut,
      final I_M_InOutLine inOutLine,
      final I_M_ShipmentSchedule sched,
      final CompleteStatus completeStatus,
      final I_C_Order order) {
    Check.assumeNotNull(inOut, "inOut not null");
    Check.assumeNotNull(inOutLine, "inOutLine not null");
    Check.assumeNotNull(sched, "sched not null");
    Check.assumeNotNull(completeStatus, "completeStatus not null");

    if (!orderedCandidates.contains(inOut)) {
      throw new IllegalStateException(
          "inOut needs to be added using 'addInOut' first"
              + "\n InOut: "
              + inOut
              + "\n orderedCandidates: "
              + orderedCandidates);
    }
    if (inOutLine.getC_OrderLine_ID() < 1) {
      throw new IllegalStateException(
          "inOutLine needs to have a C_OrderLine_ID > 0" + "\n inOutLine: " + inOutLine);
    }
    if (CompleteStatus.INCOMPLETE_ORDER.equals(completeStatus)) {
      throw new IllegalArgumentException(
          "completeStatus may not be "
              + CompleteStatus.INCOMPLETE_ORDER
              + " (this will be figured out later by this class)");
    }

    final MInOutLine inOutLinePO = getPO(inOutLine);
    final MInOut inOutPO = getPO(inOut);

    inOut2Line.get(inOutPO).add(inOutLinePO);
    line2InOut.put(inOutLinePO, inOutPO);

    // store the inoutLine's orderId and status as well to support our
    // later purge
    line2CompleteStatus.put(inOutLinePO, completeStatus);
    line2PostageFreeStatus.put(inOutLinePO, PostageFreeStatus.OK);

    final MOrder orderPO = InterfaceWrapperHelper.getPO(order);

    Set<MInOutLine> inOutLines = order2InOutLine.get(orderPO);
    if (inOutLines == null) {
      inOutLines = new HashSet<MInOutLine>();
      order2InOutLine.put(orderPO, inOutLines);
    }
    inOutLines.add(inOutLinePO);

    //
    // C_OrderLine_ID to M_InOutLine mapping
    {
      final MInOutLine inOutLinePO_Old =
          orderLineId2InOutLine.put(inOutLine.getC_OrderLine_ID(), inOutLinePO);
      if (inOutLinePO_Old != null && inOutLinePO_Old != inOutLinePO) {
        throw new IllegalArgumentException(
            "An InOutLine was already set for order line in orderLineId2InOutLine mapping"
                + "\n InOutLine: "
                + inOutLinePO
                + "\n InOutLine (old): "
                + inOutLinePO_Old
                + "\n orderLineId2InOutLine (after change): "
                + orderLineId2InOutLine);
      }
    }

    line2sched.put(inOutLinePO, sched);
  }
 private MInOut getPO(final I_M_InOut inOut) {
   final MInOut inOutPO = InterfaceWrapperHelper.getPO(inOut);
   return inOutPO;
 }