private static void setLineItemDomainCostValues(
      LineItem dfpLineItem, LineItemDomain lineItemDomain, OrderDomain orderDomain) {
    removeLineItemFromOrder(lineItemDomain, orderDomain);

    lineItemDomain.setRate(dfpLineItem.getCostPerUnit().getMicroAmount() / 1000000D);
    lineItemDomain.setCostType(dfpLineItem.getCostType().toString());

    if (Objects.equals(dfpLineItem.getCostType(), CostType.CPC)) {
      lineItemDomain.setGrossValue(dfpLineItem.getUnitsBought() * lineItemDomain.getRate());
    } else if (Objects.equals(dfpLineItem.getCostType(), CostType.CPM)) {
      lineItemDomain.setGrossValue(dfpLineItem.getUnitsBought() * lineItemDomain.getRate() / 1000D);
    } else if (Objects.equals(dfpLineItem.getCostType(), CostType.CPD)) {
      final long startTime = toDate(dfpLineItem.getStartDateTime()).getTime();
      final long endTime = toDate(dfpLineItem.getEndDateTime()).getTime();
      final long days = ((endTime - startTime) / 86400000L) + 1;
      lineItemDomain.setGrossValue(days * lineItemDomain.getRate());
    }

    lineItemDomain.setGoal((double) dfpLineItem.getUnitsBought());
    lineItemDomain.setNetValue(dfpLineItem.getBudget().getMicroAmount() / 1000000D);
    lineItemDomain.setGeneralDiscount(
        lineItemDomain.getGrossValue() - lineItemDomain.getNetValue());

    if (Objects.equals(dfpLineItem.getDiscountType(), LineItemDiscountType.PERCENTAGE)) {
      lineItemDomain.setDiscountPercent(dfpLineItem.getDiscount());
    } else {
      lineItemDomain.setDiscountPercent(null);
    }

    addLineItemIntoOrder(lineItemDomain, orderDomain);
  }
  public static void updateCostValues(LineItemDomain item, OrderDomain order, String costType)
      throws Exception {
    final LineItemServiceInterface itemService =
        dfpServiceFactory.newDfpService(LineItemServiceInterface.class);

    LineItem dfpItem = itemService.getLineItem(item.getId());

    setLineItemsCostValues(dfpItem, dfpItem.getCostPerUnit().getCurrencyCode(), costType);

    dfpItem = itemService.updateLineItem(dfpItem);

    setLineItemDomainCostValues(dfpItem, item, order);
  }
  public static void updateCostPerUnit(LineItemDomain item, OrderDomain order, Long rate)
      throws Exception {
    final LineItemServiceInterface itemService =
        dfpServiceFactory.newDfpService(LineItemServiceInterface.class);

    LineItem dfpItem = itemService.getLineItem(item.getId());
    dfpItem.setCostPerUnit(new Money(dfpItem.getCostPerUnit().getCurrencyCode(), rate));
    if (Objects.equals(dfpItem.getDiscountType(), LineItemDiscountType.ABSOLUTE_VALUE)
        && dfpItem.getDiscount() > rate) {
      dfpItem.setDiscount(Math.max(0, dfpItem.getDiscount() - rate - 1));
    }

    try {
      dfpItem = itemService.updateLineItem(dfpItem);
    } catch (ApiException e) {
      if (e.getFaultString().contains("RangeError.TOO_HIGH @ discount")) {
        dfpItem.setDiscount(0D);
        dfpItem = itemService.updateLineItem(dfpItem);
      }
    }

    setLineItemDomainCostValues(dfpItem, item, order);
  }