use of de.metas.pricing.conditions.PriceSpecification in project metasfresh-webui-api by metasfresh.
the class PricingConditionsView_CopyRowToEditable method createChangeRequest.
private PricingConditionsRowChangeRequest createChangeRequest(@NonNull final PricingConditionsRow templateRow) {
final PricingConditionsBreak templatePricingConditionsBreak = templateRow.getPricingConditionsBreak();
PriceSpecification price = templatePricingConditionsBreak.getPriceSpecification();
if (price.isNoPrice()) {
// In case row does not have a price then use BPartner's pricing system
final BPartnerId bpartnerId = templateRow.getBpartnerId();
final SOTrx soTrx = SOTrx.ofBoolean(templateRow.isCustomer());
price = createBasePricingSystemPrice(bpartnerId, soTrx);
}
final Percent discount = templatePricingConditionsBreak.getDiscount();
final PaymentTermId paymentTermIdOrNull = templatePricingConditionsBreak.getPaymentTermIdOrNull();
final Percent paymentDiscountOverrideOrNull = templatePricingConditionsBreak.getPaymentDiscountOverrideOrNull();
return PricingConditionsRowChangeRequest.builder().priceChange(CompletePriceChange.of(price)).discount(discount).paymentTermId(Optional.ofNullable(paymentTermIdOrNull)).paymentDiscount(Optional.ofNullable(paymentDiscountOverrideOrNull)).sourcePricingConditionsBreakId(templatePricingConditionsBreak.getId()).build();
}
use of de.metas.pricing.conditions.PriceSpecification in project metasfresh-webui-api by metasfresh.
the class PricingConditionsView method updateOrderLineRecord.
private void updateOrderLineRecord(@NonNull final PricingConditionsBreak pricingConditionsBreak, @Nullable final Money basePrice) {
final IOrderDAO ordersRepo = Services.get(IOrderDAO.class);
final IOrderLineBL orderLineBL = Services.get(IOrderLineBL.class);
final I_C_OrderLine orderLineRecord = ordersRepo.getOrderLineById(getOrderLineId());
orderLineRecord.setIsTempPricingConditions(pricingConditionsBreak.isTemporaryPricingConditionsBreak());
if (pricingConditionsBreak.isTemporaryPricingConditionsBreak()) {
orderLineRecord.setM_DiscountSchema_ID(-1);
orderLineRecord.setM_DiscountSchemaBreak_ID(-1);
final PriceSpecification price = pricingConditionsBreak.getPriceSpecification();
final PriceSpecificationType type = price.getType();
if (type == PriceSpecificationType.NONE) {
//
} else if (type == PriceSpecificationType.BASE_PRICING_SYSTEM) {
assumeNotNull(basePrice, "If type={}, then the given basePrice may not be null; pricingConditionsBreak={}", type, pricingConditionsBreak);
final BigDecimal priceEntered = limitPrice(basePrice.toBigDecimal(), orderLineRecord);
orderLineRecord.setIsManualPrice(true);
orderLineRecord.setPriceEntered(priceEntered);
orderLineRecord.setC_Currency_ID(basePrice.getCurrencyId().getRepoId());
orderLineRecord.setBase_PricingSystem_ID(price.getBasePricingSystemId().getRepoId());
} else if (type == PriceSpecificationType.FIXED_PRICE) {
final Money fixedPrice = price.getFixedPrice();
Check.assumeNotNull(fixedPrice, "fixedPrice shall not be null for {}", price);
final BigDecimal priceEntered = limitPrice(fixedPrice.toBigDecimal(), orderLineRecord);
orderLineRecord.setIsManualPrice(true);
orderLineRecord.setPriceEntered(priceEntered);
orderLineRecord.setC_Currency_ID(fixedPrice.getCurrencyId().getRepoId());
orderLineRecord.setBase_PricingSystem_ID(-1);
}
orderLineRecord.setIsManualDiscount(true);
orderLineRecord.setDiscount(pricingConditionsBreak.getDiscount().toBigDecimal());
// make sure it's not overwritten by whatever the system comes up with when we save the orderLine.
orderLineRecord.setIsManualPaymentTerm(true);
orderLineRecord.setC_PaymentTerm_Override_ID(PaymentTermId.toRepoId(pricingConditionsBreak.getDerivedPaymentTermIdOrNull()));
orderLineRecord.setPaymentDiscount(Percent.toBigDecimalOrNull(pricingConditionsBreak.getPaymentDiscountOverrideOrNull()));
//
// PriceActual & Discount
Percent discountEffective = pricingConditionsBreak.getDiscount();
final BigDecimal priceActual = discountEffective.subtractFromBase(orderLineRecord.getPriceEntered(), CurrencyPrecision.TWO.toInt());
final BigDecimal priceActualEffective = limitPrice(priceActual, orderLineRecord);
if (priceActualEffective.compareTo(priceActual) != 0) {
discountEffective = PriceAndDiscount.calculateDiscountFromPrices(orderLineRecord.getPriceEntered(), priceActualEffective, CurrencyPrecision.TWO);
}
//
orderLineRecord.setIsManualDiscount(true);
orderLineRecord.setDiscount(discountEffective.toBigDecimal());
orderLineRecord.setPriceActual(priceActualEffective);
} else {
final PricingConditionsBreakId pricingConditionsBreakId = pricingConditionsBreak.getId();
orderLineRecord.setM_DiscountSchema_ID(pricingConditionsBreakId.getDiscountSchemaId());
orderLineRecord.setM_DiscountSchemaBreak_ID(pricingConditionsBreakId.getDiscountSchemaBreakId());
orderLineRecord.setIsManualDiscount(false);
orderLineRecord.setIsManualPrice(false);
orderLineRecord.setIsManualPaymentTerm(false);
final OrderLinePriceUpdateRequest orderLinePriceUpdateRequest = OrderLinePriceUpdateRequest.prepare(orderLineRecord).pricingConditionsBreakOverride(pricingConditionsBreak).build();
orderLineBL.updatePrices(orderLinePriceUpdateRequest);
}
orderLineBL.updateLineNetAmtFromQtyEntered(orderLineRecord);
orderLineBL.setTaxAmtInfo(orderLineRecord);
InterfaceWrapperHelper.save(orderLineRecord);
}
use of de.metas.pricing.conditions.PriceSpecification in project metasfresh-webui-api by metasfresh.
the class PricingConditionsRowReducers method applyRequestTo.
private PricingConditionsBreak applyRequestTo(@NonNull final PricingConditionsRowChangeRequest request, @NonNull final PricingConditionsBreak rowPricingConditionsBreak) {
final PricingConditionsBreak pricingConditionsBreakEffective = coalesce(request.getPricingConditionsBreak(), rowPricingConditionsBreak);
final PricingConditionsBreakBuilder builder = pricingConditionsBreakEffective.toBuilder();
// Discount%
if (request.getDiscount() != null) {
builder.discount(request.getDiscount());
builder.hasChanges(true);
}
//
// Payment Term
final boolean paymentTermChangeRequested = request.getPaymentTermId() != null;
final boolean paymentDiscountChangeRequested = request.getPaymentDiscount() != null;
if (paymentTermChangeRequested || paymentDiscountChangeRequested) {
final PaymentTermId paymentTermIdOrNull;
if (paymentTermChangeRequested) {
paymentTermIdOrNull = request.getPaymentTermId().orElse(null);
builder.paymentTermIdOrNull(paymentTermIdOrNull);
} else {
// if no payment term change was requested, we use the old paymentTermId to get derivedPaymentTermIdOrNull.
paymentTermIdOrNull = pricingConditionsBreakEffective.getPaymentTermIdOrNull();
}
final Percent paymentDiscountOrNull = paymentDiscountChangeRequested ? request.getPaymentDiscount().orElse(null) : null;
builder.paymentDiscountOverrideOrNull(paymentDiscountOrNull);
final PaymentTermService paymentTermService = SpringContextHolder.instance.getBean(PaymentTermService.class);
final PaymentTermId derivedPaymentTermIdOrNull = paymentTermService.getOrCreateDerivedPaymentTerm(paymentTermIdOrNull, paymentDiscountOrNull);
builder.derivedPaymentTermIdOrNull(derivedPaymentTermIdOrNull);
}
// Price
if (request.getPriceChange() != null) {
final PriceSpecification price = applyPriceChangeTo(request.getPriceChange(), rowPricingConditionsBreak.getPriceSpecification());
builder.priceSpecification(price);
}
PricingConditionsBreak newPricingConditionsBreak = builder.build();
if (!Objects.equals(newPricingConditionsBreak, pricingConditionsBreakEffective)) {
newPricingConditionsBreak = newPricingConditionsBreak.toBuilder().hasChanges(true).build();
}
return newPricingConditionsBreak;
}
Aggregations