Skip to content

Commit

Permalink
Price Calculation as % of Margin
Browse files Browse the repository at this point in the history
refs: #6045
  • Loading branch information
pvpurcarcosmin committed Jan 15, 2020
1 parent 3539ca4 commit facb87c
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -147,42 +147,34 @@ private void createAndAddFacts(
? tradedCommissionPercent
: Percent.ZERO;

final Optional<SalesCommissionFact> forecastedFact =
createFact(timestamp, contract, SalesCommissionState.FORECASTED, currentForecastedBase, currentTradedCommissionPercent, share.getForecastedPointsSum() );
final Optional<SalesCommissionFact> toInvoiceFact =
createFact(timestamp, contract, SalesCommissionState.INVOICEABLE, currentToInvoiceBase, currentTradedCommissionPercent, share.getInvoiceablePointsSum()) ;
final Optional<SalesCommissionFact> invoicedFact =
createFact(timestamp, contract, SalesCommissionState.INVOICED, currentInvoicedBase, currentTradedCommissionPercent, share.getInvoicedPointsSum() );
final CommissionPoints forecastCP = calculateSalesRepCommissionPoints(contract, currentForecastedBase, currentTradedCommissionPercent);
final CommissionPoints toInvoiceCP = calculateSalesRepCommissionPoints(contract, currentToInvoiceBase, currentTradedCommissionPercent);
final CommissionPoints invoicedCP = calculateSalesRepCommissionPoints(contract, currentInvoicedBase, currentTradedCommissionPercent);

final Optional<SalesCommissionFact> forecastedFact = createFact(timestamp, SalesCommissionState.FORECASTED, forecastCP, share.getForecastedPointsSum() );
final Optional<SalesCommissionFact> toInvoiceFact = createFact(timestamp, SalesCommissionState.INVOICEABLE, toInvoiceCP, share.getInvoiceablePointsSum()) ;
final Optional<SalesCommissionFact> invoicedFact = createFact(timestamp, SalesCommissionState.INVOICED, invoicedCP, share.getInvoicedPointsSum() );

forecastedFact.ifPresent(share::addFact);
toInvoiceFact.ifPresent(share::addFact);
invoicedFact.ifPresent(share::addFact);

if (config.isSubtractLowerLevelCommissionFromBase())
{
currentForecastedBase = currentForecastedBase.subtract(forecastedFact.map(SalesCommissionFact::getPoints).orElse(CommissionPoints.ZERO));
currentToInvoiceBase = currentToInvoiceBase.subtract(toInvoiceFact.map(SalesCommissionFact::getPoints).orElse(CommissionPoints.ZERO));
currentInvoicedBase = currentInvoicedBase.subtract(invoicedFact.map(SalesCommissionFact::getPoints).orElse(CommissionPoints.ZERO));
currentForecastedBase = currentForecastedBase.subtract(forecastCP);
currentToInvoiceBase = currentToInvoiceBase.subtract(toInvoiceCP);
currentInvoicedBase = currentInvoicedBase.subtract(invoicedCP);
}
}
}

private Optional<SalesCommissionFact> createFact(
@NonNull final Instant timestamp,
@NonNull final HierarchyContract contract,
@NonNull final SalesCommissionState state,
@NonNull final CommissionPoints base,
@NonNull final Percent tradedCommissionPercent,
@NonNull final CommissionPoints currentCommissionPoints,
@NonNull final CommissionPoints previousCommissionPoints)
{
final CommissionPoints points = base
.computePercentageOf(
contract.getCommissionPercent(),
contract.getPointsPrecision() )
.computePercentageOf(
Percent.ONE_HUNDRED.subtract(tradedCommissionPercent),
contract.getPointsPrecision()
).subtract( previousCommissionPoints );
final CommissionPoints points = currentCommissionPoints.subtract(previousCommissionPoints);

if ( points.isZero() )
{
Expand All @@ -196,4 +188,18 @@ private Optional<SalesCommissionFact> createFact(
.build();
return Optional.of(fact);
}

private CommissionPoints calculateSalesRepCommissionPoints(
@NonNull final HierarchyContract contract,
@NonNull final CommissionPoints base,
@NonNull final Percent tradedCommissionPercent )
{
return base
.computePercentageOf(
contract.getCommissionPercent(),
contract.getPointsPrecision() )
.computePercentageOf(
Percent.ONE_HUNDRED.subtract(tradedCommissionPercent),
contract.getPointsPrecision() );
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package de.metas.contracts.commission.commissioninstance.businesslogic.sales;

import java.time.Instant;

import javax.annotation.Nullable;

import de.metas.contracts.commission.Beneficiary;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,14 @@
@Service
public class CommissionConfigFactory
{
private final CommissionHierarchyFactory commissionHierarchyFactory;
private CommissionConfigStagingDataService commissionConfigStagingDataService;

private final IFlatrateDAO flatrateDAO = Services.get(IFlatrateDAO.class);
private final IProductDAO productDAO = Services.get(IProductDAO.class);
private final IBPartnerDAO bPartnerDAO = Services.get(IBPartnerDAO.class);

public CommissionConfigFactory(
@NonNull final CommissionHierarchyFactory commissionHierarchyFactory,
@NonNull final CommissionConfigStagingDataService commissionConfigStagingDataService)
public CommissionConfigFactory(@NonNull final CommissionConfigStagingDataService commissionConfigStagingDataService)
{
this.commissionHierarchyFactory = commissionHierarchyFactory;
this.commissionConfigStagingDataService = commissionConfigStagingDataService;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@
package de.metas.contracts.pricing.trade_margin;

import com.google.common.collect.ImmutableList;
import com.sun.istack.internal.NotNull;
import de.metas.bpartner.BPartnerId;
import de.metas.cache.CCache;
import de.metas.contracts.model.I_C_Customer_Trade_Margin;
import de.metas.util.Services;
import lombok.Builder;
import lombok.NonNull;
import lombok.Value;
import org.adempiere.ad.dao.IQueryBL;
import org.adempiere.ad.dao.impl.CompareQueryFilter;
Expand Down Expand Up @@ -90,10 +90,10 @@ private ImmutableList<CustomerTradeMarginSettings> loadRecordsForKey(final Cache
@Value
private static class CacheKey
{
@NotNull
@NonNull
BPartnerId salesRepId;

@NotNull
@NonNull
LocalDate requestedDate;

public static CacheKey of(final CustomerTradeMarginSearchCriteria customerTradeMarginSearchCriteria)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@

class CommissionConfigFactoryTest
{
private CommissionHierarchyFactory commissionHierarchyFactory;
private CommissionConfigFactory commissionConfigFactory;
private I_C_BPartner bpartnerRecord_EndCustomer;

Expand All @@ -70,9 +71,9 @@ void beforeEach()
{
AdempiereTestHelper.get().init();

final CommissionHierarchyFactory commissionHierarchyFactory = new CommissionHierarchyFactory();
commissionHierarchyFactory = new CommissionHierarchyFactory();
final CommissionConfigStagingDataService commissionConfigStagingDataService = new CommissionConfigStagingDataService();
commissionConfigFactory = new CommissionConfigFactory(commissionHierarchyFactory, commissionConfigStagingDataService);
commissionConfigFactory = new CommissionConfigFactory(commissionConfigStagingDataService);

final I_C_BP_Group customerBPGroupRecord = newInstance(I_C_BP_Group.class);
saveRecord(customerBPGroupRecord);
Expand Down Expand Up @@ -116,6 +117,7 @@ void createFor()

// invoke method under test
final ConfigRequestForNewInstance contractRequest = ConfigRequestForNewInstance.builder()
.commissionHierarchy(commissionHierarchyFactory.createFor(salesRepLvl0Id))
.customerBPartnerId(endCustomerId)
.salesRepBPartnerId(salesRepLvl0Id)
.salesProductId(salesProductId)
Expand Down Expand Up @@ -185,6 +187,7 @@ private void assertNoConfigCreated(@NonNull final ConfigData configData)
final BPartnerId salesRepLvl0Id = configData.getName2BPartnerId().get("salesRep");

final ConfigRequestForNewInstance contractRequest = ConfigRequestForNewInstance.builder()
.commissionHierarchy(commissionHierarchyFactory.createFor(salesRepLvl0Id))
.customerBPartnerId(endCustomerId)
.salesRepBPartnerId(salesRepLvl0Id)
.salesProductId(salesProductId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ void beforeEach()
AdempiereTestHelper.get().init();

final CommissionConfigStagingDataService commissionConfigStagingDataService = new CommissionConfigStagingDataService();
final CommissionConfigFactory commissionConfigFactory = new CommissionConfigFactory(new CommissionHierarchyFactory(), commissionConfigStagingDataService);
final CommissionConfigFactory commissionConfigFactory = new CommissionConfigFactory(commissionConfigStagingDataService);
final CommissionRecordStagingService commissionInstanceRecordStagingService = new CommissionRecordStagingService();
commissionInstanceRepository = new CommissionInstanceRepository(commissionConfigFactory, commissionInstanceRecordStagingService);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ de.metas.contracts.commission.commissioninstance.services.repos.CommissionInstan
"timestamp" : "2019-09-17T11:50:55Z",
"forecastedPoints" : 10,
"invoiceablePoints" : 11,
"invoicedPoints" : 12
"invoicedPoints" : 12,
"tradedCommissionPercent" : 0
},
"config" : {
"@type" : "HierarchyConfig",
Expand Down Expand Up @@ -80,4 +81,4 @@ de.metas.contracts.commission.commissioninstance.services.repos.CommissionInstan
"invoiceablePointsSum" : 2.1,
"invoicedPointsSum" : 2.2
} ]
} ]
} ]

0 comments on commit facb87c

Please sign in to comment.