private List<SyncProductSupply> createPlannedSyncProductSupplies(
      final I_C_RfQResponseLine rfqResponseLine) {
    final I_C_Flatrate_Term contract = rfqResponseLine.getC_Flatrate_Term();
    Check.assumeNotNull(contract, "contract not null");

    final List<I_C_RfQResponseLineQty> rfqResponseLineQtys =
        pmmRfQDAO.retrieveResponseLineQtys(rfqResponseLine);
    if (rfqResponseLineQtys.isEmpty()) {
      return ImmutableList.of();
    }

    final String bpartner_uuid = SyncUUIDs.toUUIDString(contract.getDropShip_BPartner());
    final String contractLine_uuid = SyncUUIDs.toUUIDString(contract);
    final String product_uuid = SyncUUIDs.toUUIDString(contract.getPMM_Product());

    final List<SyncProductSupply> plannedSyncProductSupplies =
        new ArrayList<>(rfqResponseLineQtys.size());
    for (final I_C_RfQResponseLineQty rfqResponseLineQty : rfqResponseLineQtys) {
      final SyncProductSupply syncProductSupply = new SyncProductSupply();
      syncProductSupply.setBpartner_uuid(bpartner_uuid);
      syncProductSupply.setContractLine_uuid(contractLine_uuid);
      syncProductSupply.setProduct_uuid(product_uuid);

      syncProductSupply.setDay(rfqResponseLineQty.getDatePromised());
      syncProductSupply.setQty(rfqResponseLineQty.getQtyPromised());
      plannedSyncProductSupplies.add(syncProductSupply);
    }

    return plannedSyncProductSupplies;
  }
  private SyncContract createSyncContract(final I_C_Flatrate_Term term) {
    final SyncContract syncContract = new SyncContract();
    syncContract.setUuid(SyncUUIDs.toUUIDString(term));
    syncContract.setDateFrom(term.getStartDate());
    syncContract.setDateTo(term.getEndDate());

    final int rfqResponseLineId = term.getC_RfQResponseLine_ID();
    if (rfqResponseLineId > 0) {
      syncContract.setRfq_uuid(SyncUUIDs.toC_RfQReponseLine_UUID(rfqResponseLineId));
    }

    //
    // Contract Line: 1 line for our PMM_Product
    {
      final I_PMM_Product pmmProduct = term.getPMM_Product();
      if (pmmProduct == null) {
        logger.warn("Contract {} has no PMM_Product. Skip exporting.", term);
        return null;
      }

      final SyncProduct syncProduct = createSyncProduct(pmmProduct);
      if (syncProduct == null) {
        return null;
      }

      final SyncContractLine syncContractLine = new SyncContractLine();
      syncContractLine.setUuid(syncContract.getUuid());
      syncContractLine.setProduct(syncProduct);

      syncContract.getContractLines().add(syncContractLine);
    }

    return syncContract;
  }
  private Multimap<Integer, I_C_Flatrate_Term> getC_Flatrate_Terms_IndexedByBPartnerId() {
    if (_bpartnerId2contract_fullyLoadedRequired && !_bpartnerId2contract_fullyLoaded) {
      _bpartnerId2contract.clear(); // clear all first

      final List<I_C_Flatrate_Term> terms = pmmContractsDAO.retrieveAllRunningContractsOnDate(date);
      for (final I_C_Flatrate_Term term : terms) {
        final int bpartnerId = term.getDropShip_BPartner_ID();
        _bpartnerId2contract.put(bpartnerId, term);
      }

      _bpartnerId2contract_fullyLoaded = true;
    }
    return _bpartnerId2contract;
  }