Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

only consider commission contracts that have the trigger-document's org #10889

Merged
merged 2 commits into from
Mar 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
package de.metas.contracts;

import de.metas.contracts.model.I_C_Flatrate_Conditions;
import de.metas.organization.OrgId;
import de.metas.product.ProductAndCategoryId;
import lombok.Builder;
import lombok.NonNull;
Expand All @@ -41,6 +42,9 @@ public class CreateFlatrateTermRequest
@NonNull
IContextAware context;

@NonNull
OrgId orgId;

/**
* the partner to be used as <code>Bill_BPartner</code> and <code>DropShip_BPartner</code>. Also this partner's sales rep and billto location are used.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import de.metas.contracts.model.I_C_Invoice_Clearing_Alloc;
import de.metas.costing.ChargeId;
import de.metas.invoicecandidate.model.I_C_Invoice_Candidate;
import de.metas.organization.OrgId;
import de.metas.product.ProductCategoryId;
import de.metas.product.ProductId;
import de.metas.uom.UomId;
Expand Down Expand Up @@ -124,18 +125,21 @@ public interface IFlatrateDAO extends ISingletonService
List<I_C_Flatrate_Term> retrieveTerms(I_C_BPartner bPartner, I_C_Flatrate_Conditions flatrateConditions);

/**
* This method calls {@link #retrieveTerms(Properties, int, Timestamp, int, int, int, String)} using the given invoice candidates values as parameters.
* This method calls {@link #retrieveTerms(Properties, OrgId, int, Timestamp, int, int, int, String)} using the given invoice candidates values as parameters.
*/
List<I_C_Flatrate_Term> retrieveTerms(I_C_Invoice_Candidate ic);

List<I_C_Flatrate_Term> retrieveTerms(Properties ctx, int bill_BPartner_ID, Timestamp dateOrdered, int m_Product_Category_ID, int m_Product_ID, int c_Charge_ID, String trxName);
List<I_C_Flatrate_Term> retrieveTerms(Properties ctx, @NonNull OrgId orgId, int bill_BPartner_ID, Timestamp dateOrdered, int m_Product_Category_ID, int m_Product_ID, int c_Charge_ID, String trxName);

List<I_C_Flatrate_Term> retrieveTerms(TermsQuery query);

@Value
@Builder
public static class TermsQuery
class TermsQuery
{
@NonNull
OrgId orgId;

@Singular
List<BPartnerId> billPartnerIds;

Expand Down Expand Up @@ -170,7 +174,7 @@ default I_C_Flatrate_Term retrieveTerm(@NonNull final FlatrateTermId flatrateTer

/**
* Retrieves the flatrate term matching the given invoice candidate (or {@code code>}) by using {@link I_C_Flatrate_Matching} Records.<br>
* Basically calls {@link #retrieveTerms(Properties, int, Timestamp, int, int, int, String)}, but discards all terms that have <code>IsSimulation=Y</code>.
* Basically calls {@link #retrieveTerms(Properties, OrgId, int, Timestamp, int, int, int, String)}, but discards all terms that have <code>IsSimulation=Y</code>.
*
* @return the term or <code>null</code>
* @throws AdempiereException if there is more than one non-simulation-term
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import de.metas.contracts.model.I_C_Flatrate_Term;
import de.metas.logging.LogManager;
import de.metas.logging.TableRecordMDC;
import de.metas.organization.OrgId;
import de.metas.product.IProductDAO;
import de.metas.product.ProductCategoryId;
import de.metas.product.ProductId;
Expand Down Expand Up @@ -93,7 +94,7 @@ public CommissionConfigFactory(@NonNull final CommissionConfigStagingDataService
public ImmutableList<CommissionConfig> createForNewCommissionInstances(@NonNull final ConfigRequestForNewInstance contractRequest)
{
final Hierarchy hierarchy = contractRequest.getCommissionHierarchy();

// Note: we start with the customer which *might* be a sales rep too.
// If that's the case, the contract's C_HierarchyCommissionSettings might indicate that we need a 0% C_CommissionShare for that endcustomer
final Beneficiary beneficiary = Beneficiary.of(contractRequest.getCustomerBPartnerId());
Expand All @@ -108,6 +109,7 @@ public ImmutableList<CommissionConfig> createForNewCommissionInstances(@NonNull
// don't look up the terms via product; instead, get all commission-terms for the respective sales reps that are currently active
final TermsQuery termsQuery = TermsQuery.builder()
.billPartnerIds(allBPartnerIds)
.orgId(contractRequest.getOrgId())
.dateOrdered(contractRequest.getCommissionDate())
.build();
final ImmutableList<I_C_Flatrate_Term> commissionTermRecords = flatrateDAO
Expand Down Expand Up @@ -322,6 +324,9 @@ private boolean settingsLineRecordMatches(
@Value
public static class ConfigRequestForNewInstance
{
@NonNull
OrgId orgId;

@NonNull
BPartnerId salesRepBPartnerId;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ public Optional<CreateCommissionSharesRequest> createRequestFor(@NonNull final C
final Hierarchy hierarchy = commissionHierarchyFactory.createFor(customerBPartnerId);

final ConfigRequestForNewInstance contractRequest = ConfigRequestForNewInstance.builder()
.orgId(commissionTriggerDocument.getOrgId())
.commissionHierarchy(hierarchy)
.customerBPartnerId(customerBPartnerId)
.salesRepBPartnerId(salesRepBPartnerId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import de.metas.contracts.model.I_I_Flatrate_Term;
import de.metas.contracts.model.X_C_Flatrate_Term;
import de.metas.logging.LogManager;
import de.metas.organization.OrgId;
import de.metas.pricing.IPricingResult;
import de.metas.product.IProductBL;
import de.metas.product.IProductDAO;
Expand Down Expand Up @@ -88,6 +89,7 @@ public I_C_Flatrate_Term importRecord(final I_I_Flatrate_Term importRecord)
final ProductAndCategoryId productAndCategoryId = Services.get(IProductDAO.class).retrieveProductAndCategoryIdByProductId(productId);

final CreateFlatrateTermRequest createFlatrateTermRequest = CreateFlatrateTermRequest.builder()
.orgId(OrgId.ofRepoId(importRecord.getAD_Org_ID()))
.context(PlainContextAware.newWithThreadInheritedTrx())
.bPartner(importRecord.getC_BPartner())
.conditions(importRecord.getC_Flatrate_Conditions())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.util.List;
import java.util.Properties;

import de.metas.organization.OrgId;
import org.adempiere.model.InterfaceWrapperHelper;
import org.compiere.model.I_C_Order;
import org.compiere.model.I_M_InOut;
Expand Down Expand Up @@ -76,6 +77,7 @@ public boolean matches(final I_M_InOutLine inoutLine)

final List<I_C_Flatrate_Term> terms = flatrateDB.retrieveTerms(
ctx,
OrgId.ofRepoId(inout.getAD_Org_ID()),
partnerId.getRepoId(),
inout.getDateOrdered(),
product.getM_Product_Category_ID(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1619,6 +1619,7 @@ public I_C_Flatrate_Term createTerm(@NonNull final CreateFlatrateTermRequest req
else
{
if (!flatrateDAO.retrieveTerms(ctx,
request.getOrgId(),
bPartner.getC_BPartner_ID(),
null,
productAndCategoryId.getProductCategoryId().getRepoId(),
Expand All @@ -1639,7 +1640,7 @@ public I_C_Flatrate_Term createTerm(@NonNull final CreateFlatrateTermRequest req
final I_C_Flatrate_Term newTerm = InterfaceWrapperHelper.newInstance(I_C_Flatrate_Term.class, bPartner);
newTerm.setC_Flatrate_Conditions(conditions);
newTerm.setC_UOM_ID(conditions.getC_UOM_ID());
newTerm.setAD_Org_ID(bPartner.getAD_Org_ID());
newTerm.setAD_Org_ID(OrgId.toRepoId(request.getOrgId()));

newTerm.setStartDate(startDate);
newTerm.setEndDate(startDate); // will be updated later
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import de.metas.invoicecandidate.api.IInvoiceCandDAO;
import de.metas.invoicecandidate.model.I_C_Invoice_Candidate;
import de.metas.logging.LogManager;
import de.metas.organization.OrgId;
import de.metas.product.IProductDAO;
import de.metas.product.ProductCategoryId;
import de.metas.product.ProductId;
Expand Down Expand Up @@ -56,6 +57,7 @@
import org.compiere.util.TrxRunnable;
import org.slf4j.Logger;

import javax.annotation.Nullable;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
Expand Down Expand Up @@ -124,7 +126,7 @@ public List<I_C_Flatrate_Term> retrieveTerms(final I_C_Invoice_Candidate ic)
final int m_Product_ID = ic.getM_Product_ID();
final int c_Charge_ID = ic.getC_Charge_ID();

return retrieveTerms(ctx, bill_BPartner_ID, dateOrdered, m_Product_Category_ID, m_Product_ID, c_Charge_ID, trxName);
return retrieveTerms(ctx, OrgId.ofRepoId(ic.getAD_Org_ID()), bill_BPartner_ID, dateOrdered, m_Product_Category_ID, m_Product_ID, c_Charge_ID, trxName);
}

@Override
Expand All @@ -136,25 +138,27 @@ public List<I_C_Flatrate_Term> retrieveTerms(@NonNull final TermsQuery query)
final int m_Product_ID = ProductId.toRepoId(query.getProductId());
final int c_Charge_ID = ChargeId.toRepoId(query.getChargeId());

return retrieveTerms(Env.getCtx(), bPartnerIds, dateOrdered, m_Product_Category_ID, m_Product_ID, c_Charge_ID, ITrx.TRXNAME_None);
return retrieveTerms(Env.getCtx(), query.getOrgId(), bPartnerIds, dateOrdered, m_Product_Category_ID, m_Product_ID, c_Charge_ID, ITrx.TRXNAME_None);
}

@Override
public List<I_C_Flatrate_Term> retrieveTerms(
final @CacheCtx Properties ctx,
@NonNull final OrgId orgId,
final int bill_BPartner_ID,
final Timestamp dateOrdered,
final int m_Product_Category_ID,
final int m_Product_ID,
final int c_Charge_ID,
final @CacheTrx String trxName)
{
return retrieveTerms(ctx, ImmutableList.of(bill_BPartner_ID), dateOrdered, m_Product_Category_ID, m_Product_ID, c_Charge_ID, trxName);
return retrieveTerms(ctx, orgId, ImmutableList.of(bill_BPartner_ID), dateOrdered, m_Product_Category_ID, m_Product_ID, c_Charge_ID, trxName);
}

@Cached
public List<I_C_Flatrate_Term> retrieveTerms(
final @CacheCtx Properties ctx,
@NonNull final OrgId orgId,
final ImmutableList<Integer> bPartnerIds,
final Timestamp dateOrdered,
final int m_Product_Category_ID,
Expand All @@ -166,7 +170,7 @@ public List<I_C_Flatrate_Term> retrieveTerms(
final boolean filterByCharge = c_Charge_ID > 0;
final boolean filterByProduct = m_Product_ID > 0;

boolean filterByMatchingRecord = filterByProductCategory || filterByProduct || filterByCharge;
final boolean filterByMatchingRecord = filterByProductCategory || filterByProduct || filterByCharge;
final IQueryBuilder<I_C_Flatrate_Conditions> fcQueryBuilder;
if (filterByMatchingRecord)
{
Expand Down Expand Up @@ -198,9 +202,10 @@ public List<I_C_Flatrate_Term> retrieveTerms(
.addNotEqualsFilter(I_C_Flatrate_Conditions.COLUMNNAME_Type_Conditions, X_C_Flatrate_Conditions.TYPE_CONDITIONS_Subscription)
.addNotEqualsFilter(I_C_Flatrate_Conditions.COLUMNNAME_Type_Conditions, X_C_Flatrate_Conditions.TYPE_CONDITIONS_HoldingFee)
.create();

return queryBL.createQueryBuilder(I_C_Flatrate_Term.class, ctx, trxName)
.addOnlyActiveRecordsFilter()
.addEqualsFilter(I_C_Flatrate_Term.COLUMN_AD_Org_ID, orgId)
.addInArrayFilter(I_C_Flatrate_Term.COLUMNNAME_Bill_BPartner_ID, bPartnerIds)
.addEqualsFilter(I_C_Flatrate_Term.COLUMNNAME_DocStatus, IDocument.STATUS_Completed)
.addCompareFilter(I_C_Flatrate_Term.COLUMNNAME_StartDate, Operator.LESS_OR_EQUAL, dateOrdered)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import de.metas.contracts.order.model.I_C_OrderLine;
import de.metas.inoutcandidate.spi.ModelWithoutShipmentScheduleVetoer;
import de.metas.logging.LogManager;
import de.metas.organization.OrgId;
import de.metas.product.IProductDAO;
import de.metas.product.ProductCategoryId;
import de.metas.product.ProductId;
Expand Down Expand Up @@ -90,6 +91,7 @@ public boolean hasAtLeastOneFlatrateContract(@NonNull final I_C_OrderLine ol)
final IFlatrateDAO flatrateDB = Services.get(IFlatrateDAO.class);
final List<I_C_Flatrate_Term> termsForOl = flatrateDB.retrieveTerms(
ctx,
OrgId.ofRepoId(o.getAD_Org_ID()),
o.getBill_BPartner_ID(),
o.getDateOrdered(),
ProductCategoryId.toRepoId(productCategoryId),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
import de.metas.contracts.CreateFlatrateTermRequest;
import de.metas.contracts.IFlatrateBL;
import de.metas.contracts.model.I_C_Flatrate_Conditions;
import de.metas.contracts.model.I_C_Flatrate_Term;
import de.metas.logging.LogManager;
import de.metas.logging.TableRecordMDC;
import de.metas.organization.OrgId;
import de.metas.product.ProductAndCategoryId;
import de.metas.util.Loggables;
import de.metas.util.Services;
Expand All @@ -54,7 +54,6 @@
@Value
public class FlatrateTermCreator
{

private static final Logger logger = LogManager.getLogger(FlatrateTermCreator.class);

Properties ctx;
Expand Down Expand Up @@ -119,6 +118,7 @@ private void createTerm(@NonNull final I_C_BPartner partner)
for (final I_M_Product product : products)
{
final CreateFlatrateTermRequest createFlatrateTermRequest = CreateFlatrateTermRequest.builder()
.orgId(OrgId.ofRepoId(conditions.getAD_Org_ID()))
.context(context)
.bPartner(partner)
.conditions(conditions)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@

import java.util.List;

import de.metas.bpartner.service.impl.BPartnerBL;
import de.metas.user.UserRepository;
import de.metas.organization.OrgId;
import org.adempiere.ad.wrapper.POJOLookupMap;
import org.adempiere.test.AdempiereTestHelper;
import org.compiere.SpringContextHolder;
Expand Down Expand Up @@ -88,14 +87,15 @@
class C_InvoiceFacadeServiceTest
{
private C_InvoiceFacadeService invoiceFacadeService;
private OrgId orgId;
private BPartnerId customerId;
private BPartnerId salesRepPartnerId;
private CurrencyId currencyId;
private ProductId salesProductId;
private DocTypeId creditMemoDocTypeId;
private ProductId commissionProductId;
private I_C_UOM commissionUOMRecord;

@BeforeEach
void beforeEach()
{
Expand Down Expand Up @@ -125,6 +125,8 @@ void beforeEach()

LogManager.setLoggerLevel("de.metas.contracts.commission", Level.DEBUG);

orgId = AdempiereTestHelper.createOrgWithTimeZone();

commissionUOMRecord = BusinessTestHelper.createUOM("commissionPoint");
final I_M_Product commissionProductRecord = BusinessTestHelper.createProduct("commissionProduct", commissionUOMRecord);
commissionProductId = ProductId.ofRepoId(commissionProductRecord.getM_Product_ID());
Expand All @@ -133,12 +135,14 @@ void beforeEach()
currencyId = CurrencyId.ofRepoId(currencyRecord.getC_Currency_ID());

final I_M_Product salesProductRecord = BusinessTestHelper.createProduct("salesProduct", BusinessTestHelper.createUomEach());
salesProductRecord.setAD_Org_ID(OrgId.toRepoId(orgId));
salesProductRecord.setM_Product_Category_ID(20);
salesProductRecord.setIsCommissioned(true);
saveRecord(salesProductRecord);
salesProductId = ProductId.ofRepoId(salesProductRecord.getM_Product_ID());

final ConfigData configData = TestCommissionConfig.builder()
.orgId(orgId)
.subtractLowerLevelCommissionFromBase(true)
.pointsPrecision(2)
.commissionProductId(commissionProductId)
Expand All @@ -151,6 +155,7 @@ void beforeEach()
salesRepPartnerId = configData.getName2BPartnerId().get("salesRep");

final I_C_BPartner customerBPartner = BusinessTestHelper.createBPartner("customerBPartner");
customerBPartner.setAD_Org_ID(OrgId.toRepoId(orgId));
customerBPartner.setC_BP_Group_ID(10);
customerBPartner.setC_BPartner_SalesRep_ID(salesRepPartnerId.getRepoId());
saveRecord(customerBPartner);
Expand All @@ -174,6 +179,7 @@ private TestInvoice perform_syncSalesICToCommissionInstance_creditMemo()
{
// given
final TestInvoice testInvoice = TestInvoice.builder()
.orgId(orgId)
.customerId(customerId)
.docTypeId(creditMemoDocTypeId)
.salesRepPartnerId(salesRepPartnerId)
Expand Down Expand Up @@ -218,6 +224,7 @@ void syncSalesICToCommissionInstance_creditMemo_add_contract()
assertThat(POJOLookupMap.get().getRecords(I_C_Flatrate_Term.class)).hasSize(1); // guard

TestCommissionConfig.builder()
.orgId(orgId)
.subtractLowerLevelCommissionFromBase(true)
.pointsPrecision(2)
.commissionProductId(commissionProduct2Id)
Expand Down