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

Raw Products Sales Computing method #17903

Merged
merged 5 commits into from
Apr 23, 2024
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -173,14 +173,14 @@ public void setAD_Sequence(final org.compiere.model.I_AD_Sequence AD_Sequence)
@Override
public void setAD_Sequence_ID (final int AD_Sequence_ID)
{
if (AD_Sequence_ID < 1)
if (AD_Sequence_ID < 1)
set_Value (COLUMNNAME_AD_Sequence_ID, null);
else
else
set_Value (COLUMNNAME_AD_Sequence_ID, AD_Sequence_ID);
}

@Override
public int getAD_Sequence_ID()
public int getAD_Sequence_ID()
{
return get_ValueAsInt(COLUMNNAME_AD_Sequence_ID);
}
Expand Down Expand Up @@ -493,12 +493,12 @@ public void setIsDLMPartitionBoundary (final boolean IsDLMPartitionBoundary)
}

@Override
public boolean isDLMPartitionBoundary()
public boolean isDLMPartitionBoundary()
{
return get_ValueAsBoolean(COLUMNNAME_IsDLMPartitionBoundary);
}

/**
/**
* IsEncrypted AD_Reference_ID=354
* Reference name: AD_Column Encrypted
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NonNull;
import org.adempiere.ad.dao.IQueryBuilder;
import org.adempiere.ad.dao.IQueryFilter;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.warehouse.WarehouseId;
Expand Down Expand Up @@ -281,5 +280,5 @@ class ContractExtendingRequest
boolean isExistsModularContract(@NonNull IQueryFilter<I_C_Flatrate_Term> selectedContractsFilter);

@NonNull
ImmutableSet<FlatrateTermId> getModularContractIds(@NonNull IQueryBuilder<I_C_Flatrate_Term> queryBuilder);
ImmutableSet<FlatrateTermId> getModularContractIds(@NonNull IQueryFilter<I_C_Flatrate_Term> queryFilter);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import de.metas.bpartner.BPartnerId;
import de.metas.contracts.FlatrateTermRequest.ModularFlatrateTermQuery;
Expand Down Expand Up @@ -50,7 +51,6 @@
import lombok.NonNull;
import lombok.Singular;
import lombok.Value;
import org.adempiere.ad.dao.IQueryBuilder;
import org.adempiere.ad.dao.IQueryFilter;
import org.adempiere.exceptions.AdempiereException;
import org.compiere.model.IQuery;
Expand Down Expand Up @@ -143,6 +143,9 @@ public interface IFlatrateDAO extends ISingletonService

I_C_Flatrate_Term getById(@NonNull FlatrateTermId flatrateTermId);

@NonNull
ImmutableMap<FlatrateTermId, I_C_Flatrate_Term> getByIds(@NonNull Set<FlatrateTermId> flatrateTermIds);

/**
* This method calls {@link #retrieveTerms(Properties, OrgId, int, Timestamp, int, int, int, String)} using the given invoice candidates values as parameters.
*/
Expand Down Expand Up @@ -232,6 +235,9 @@ default I_C_Flatrate_Term retrieveTerm(@NonNull final FlatrateTermId flatrateTer
*/
List<I_C_Flatrate_Conditions> retrieveConditions(Properties ctx);

@NonNull
ImmutableMap<ConditionsId, I_C_Flatrate_Conditions> getTermConditionsByIds(@NonNull Set<ConditionsId> conditionsIds);

int getFlatrateConditionsIdByName(String name);

List<I_C_Flatrate_Transition> retrieveTransitionsForCalendar(I_C_Calendar calendar);
Expand Down Expand Up @@ -283,5 +289,5 @@ I_C_Flatrate_DataEntry retrieveRefundableDataEntry(
boolean isExistsModularContract(@NonNull IQueryFilter<I_C_Flatrate_Term> filter);

@NonNull
ImmutableSet<FlatrateTermId> getModularContractIds(@NonNull IQueryBuilder<I_C_Flatrate_Term> queryBuilder);
ImmutableSet<FlatrateTermId> getModularContractIds(@NonNull IQueryFilter<I_C_Flatrate_Term> queryFilter);
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ protected String doIt() throws Exception
{
final UserId userInChargeId = getUserId();
final ImmutableSet<FlatrateTermId> selectedModularContractIds = flatrateBL
.getModularContractIds(retrieveActiveSelectedRecordsQueryBuilder(I_C_Flatrate_Term.class));
.getModularContractIds(getProcessInfo().getQueryFilterOrElseFalse());

finalInvoiceEnqueuer.enqueueNow(selectedModularContractIds, userInChargeId, getInvoicingParams());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import lombok.NonNull;

import javax.annotation.Nullable;
import java.util.Objects;

import static de.metas.contracts.model.X_C_Flatrate_Conditions.TYPE_CONDITIONS_CallOrder;
import static de.metas.contracts.model.X_C_Flatrate_Conditions.TYPE_CONDITIONS_Commission;
Expand Down Expand Up @@ -98,4 +99,9 @@ public boolean isModularOrInterim()
{
return isModularContractType() || isInterimContractType();
}

public boolean equalsByCode(@Nullable final String code)
{
return Objects.equals(this.code, code);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,6 @@
import lombok.NonNull;
import lombok.Value;
import org.adempiere.ad.dao.IQueryBL;
import org.adempiere.ad.dao.IQueryBuilder;
import org.adempiere.ad.dao.IQueryFilter;
import org.adempiere.ad.dao.impl.CompareQueryFilter;
import org.adempiere.ad.table.api.IADTableDAO;
Expand Down Expand Up @@ -2387,9 +2386,9 @@ public boolean isExistsModularContract(@NonNull final IQueryFilter<I_C_Flatrate_

@Override
@NonNull
public ImmutableSet<FlatrateTermId> getModularContractIds(@NonNull final IQueryBuilder<I_C_Flatrate_Term> queryBuilder)
public ImmutableSet<FlatrateTermId> getModularContractIds(@NonNull final IQueryFilter<I_C_Flatrate_Term> queryFilter)
{
return flatrateDAO.getModularContractIds(queryBuilder);
return flatrateDAO.getModularContractIds(queryFilter);
}

private void setPricingSystemTaxCategAndIsTaxIncluded(@NonNull final I_C_OrderLine ol, @NonNull final I_C_Flatrate_Term newTerm)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.metas.contracts.impl;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import de.metas.bpartner.BPartnerId;
import de.metas.cache.CCache;
Expand Down Expand Up @@ -89,6 +90,7 @@
import java.util.Optional;
import java.util.Properties;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Stream;

import static de.metas.contracts.model.X_C_Flatrate_Term.CONTRACTSTATUS_Quit;
Expand Down Expand Up @@ -154,6 +156,17 @@ public I_C_Flatrate_Term getById(@NonNull final FlatrateTermId flatrateTermId)
return load(flatrateTermId, I_C_Flatrate_Term.class);
}

@Override
@NonNull
public ImmutableMap<FlatrateTermId, I_C_Flatrate_Term> getByIds(@NonNull final Set<FlatrateTermId> flatrateTermIds)
{
return InterfaceWrapperHelper
.loadByRepoIdAwares(flatrateTermIds, I_C_Flatrate_Term.class)
.stream()
.collect(ImmutableMap.toImmutableMap(term -> FlatrateTermId.ofRepoId(term.getC_Flatrate_Term_ID()),
Function.identity()));
}

@Override
public List<I_C_Flatrate_Term> retrieveTerms(final I_C_Invoice_Candidate ic)
{
Expand Down Expand Up @@ -881,6 +894,17 @@ public List<I_C_Flatrate_Conditions> retrieveConditions(final Properties ctx)
.list(I_C_Flatrate_Conditions.class);
}

@Override
@NonNull
public ImmutableMap<ConditionsId, I_C_Flatrate_Conditions> getTermConditionsByIds(@NonNull final Set<ConditionsId> conditionsIds)
{
return InterfaceWrapperHelper
.loadByRepoIdAwares(conditionsIds, I_C_Flatrate_Conditions.class)
.stream()
.collect(ImmutableMap.toImmutableMap(conditions -> ConditionsId.ofRepoId(conditions.getC_Flatrate_Conditions_ID()),
Function.identity()));
}

@Override
public int getFlatrateConditionsIdByName(@NonNull final String name)
{
Expand Down Expand Up @@ -1268,9 +1292,9 @@ public Stream<I_C_Flatrate_Conditions> streamCompletedConditionsBy(@NonNull fina
}

@NonNull
public ImmutableSet<FlatrateTermId> getModularContractIds(@NonNull final IQueryBuilder<I_C_Flatrate_Term> queryBuilder)
public ImmutableSet<FlatrateTermId> getModularContractIds(@NonNull final IQueryFilter<I_C_Flatrate_Term> queryFilter)
{
return createModularContractQuery(queryBuilder)
return createModularContractQuery(getFlatrateTermQueryBuilder(queryFilter))
.listIds(FlatrateTermId::ofRepoId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import de.metas.contracts.FlatrateTermId;
import de.metas.contracts.FlatrateTermRequest.ModularFlatrateTermQuery;
import de.metas.contracts.IFlatrateBL;
import de.metas.contracts.flatrate.TypeConditions;
import de.metas.contracts.model.I_C_Flatrate_Term;
import de.metas.inout.IInOutDAO;
import de.metas.inout.InOutId;
Expand Down Expand Up @@ -64,6 +63,7 @@
import java.util.Optional;
import java.util.stream.Stream;

import static de.metas.contracts.flatrate.TypeConditions.MODULAR_CONTRACT;
import static org.adempiere.model.InterfaceWrapperHelper.getTableId;

@Service
Expand All @@ -87,7 +87,7 @@ public Stream<FlatrateTermId> streamSalesContractsForSalesOrderLine(@NonNull fin
return Stream.empty();
}

return flatrateBL.getByOrderLineId(orderAndLineId.getOrderLineId(), TypeConditions.MODULAR_CONTRACT)
return flatrateBL.getByOrderLineId(orderAndLineId.getOrderLineId(), MODULAR_CONTRACT)
.map(flatrateTerm -> FlatrateTermId.ofRepoId(flatrateTerm.getC_Flatrate_Term_ID()))
.stream();
}
Expand All @@ -110,7 +110,7 @@ public Stream<FlatrateTermId> streamPurchaseContractsForSalesOrderLine(@NonNull
.calendarId(harvestingCalendarId)
.yearId(harvestingYearId)
.soTrx(SOTrx.PURCHASE)
.typeConditions(TypeConditions.MODULAR_CONTRACT)
.typeConditions(MODULAR_CONTRACT)
.build();

return flatrateBL.streamModularFlatrateTermsByQuery(query)
Expand All @@ -121,7 +121,7 @@ public Stream<FlatrateTermId> streamPurchaseContractsForSalesOrderLine(@NonNull
@NonNull
public Stream<FlatrateTermId> streamModularPurchaseContractsForPurchaseOrderLine(@NonNull final OrderLineId purchaseOrderLineId)
{
return flatrateBL.getByOrderLineId(purchaseOrderLineId, TypeConditions.MODULAR_CONTRACT)
return flatrateBL.getByOrderLineId(purchaseOrderLineId, MODULAR_CONTRACT)
.map(I_C_Flatrate_Term::getC_Flatrate_Term_ID)
.map(FlatrateTermId::ofRepoId)
.stream();
Expand All @@ -131,7 +131,13 @@ public Stream<FlatrateTermId> streamModularPurchaseContractsForPurchaseOrderLine
public Stream<FlatrateTermId> streamModularPurchaseContractsForReceiptLine(@NonNull final InOutLineId receiptInOutLineId)
{
final I_M_InOutLine inOutLineRecord = inoutDao.getLineByIdInTrx(receiptInOutLineId);
return Stream.ofNullable(FlatrateTermId.ofRepoIdOrNull(inOutLineRecord.getC_Flatrate_Term_ID()));
final FlatrateTermId contractId = FlatrateTermId.ofRepoIdOrNull(inOutLineRecord.getC_Flatrate_Term_ID());

return Stream.ofNullable(contractId)
.map(flatrateBL::getById)
.filter(contract -> MODULAR_CONTRACT.equalsByCode(contract.getType_Conditions()))
.map(I_C_Flatrate_Term::getC_Flatrate_Term_ID)
.map(FlatrateTermId::ofRepoId);
}

@NonNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,15 @@

package de.metas.contracts.modular;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import de.metas.contracts.FlatrateTermId;
import de.metas.contracts.IFlatrateDAO;
import de.metas.contracts.flatrate.TypeConditions;
import de.metas.contracts.model.I_C_Flatrate_Term;
import de.metas.contracts.modular.computing.IComputingMethodHandler;
import de.metas.contracts.modular.computing.ComputingMethodService;
import de.metas.contracts.modular.computing.DocStatusChangedEvent;
import de.metas.contracts.modular.computing.IComputingMethodHandler;
import de.metas.contracts.modular.log.LogEntryContractType;
import de.metas.contracts.modular.settings.ModularContractModuleId;
import de.metas.contracts.modular.settings.ModularContractSettings;
Expand All @@ -40,6 +42,7 @@
import de.metas.util.Services;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.adempiere.util.lang.impl.TableRecordReference;
import org.springframework.stereotype.Service;

@Service
Expand All @@ -63,9 +66,9 @@ public void scheduleLogCreation(@NonNull final DocStatusChangedEvent event)
{
final ComputingMethodType computingMethodType = handler.getComputingMethodType();

for (final FlatrateTermId flatrateTermId : handler.streamContractIds(event.getTableRecordReference()).toList())
for (final FlatrateTermId contractId : handler.streamContractIds(event.getTableRecordReference()).toList())
{
if (!isApplicableContract(computingMethodType, flatrateTermId))
if (!isApplicableContract(event.getTableRecordReference(), handler, contractId))
{
continue;
}
Expand All @@ -82,22 +85,30 @@ public void scheduleLogCreation(@NonNull final DocStatusChangedEvent event)
.userInChargeId(event.getUserInChargeId())
.logEntryContractType(logEntryContractType)
.computingMethodType(computingMethodType)
.flatrateTermId(flatrateTermId)
.flatrateTermId(contractId)
.build());
}
}
}
}

private boolean isApplicableContract(@NonNull final ComputingMethodType computingMethodType, @NonNull final FlatrateTermId flatrateTermId)
private boolean isApplicableContract(
@NonNull final TableRecordReference tableRecordReference,
@NonNull final IComputingMethodHandler handler,
@NonNull final FlatrateTermId contractId)
{
if (!isModularOrInterimContract(flatrateTermId))
if (!isModularOrInterimContract(contractId))
{
return false;
}

final ModularContractSettings settings = modularContractSettingsDAO.getByFlatrateTermIdOrNull(contractId);
if (settings == null || !settings.isMatching(handler.getComputingMethodType()))
{
return false;
}

final ModularContractSettings settings = modularContractSettingsDAO.getByFlatrateTermIdOrNull(flatrateTermId);
return settings != null && settings.isMatching(computingMethodType);
return handler.isContractIdEligible(tableRecordReference, contractId, settings);
}

private boolean isModularOrInterimContract(@NonNull final FlatrateTermId flatrateTermId)
Expand Down Expand Up @@ -133,4 +144,10 @@ public ProductPrice getContractSpecificPrice(@NonNull final ModularContractModul
.uomId(modCntrSpecificPrice.uomId())
.build();
}

@NonNull
public ImmutableMap<FlatrateTermId, ModularContractSettings> getSettingsByContractIds(@NonNull final ImmutableSet<FlatrateTermId> contractIds)
{
return modularContractSettingsDAO.getOrLoadBy(contractIds);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@

import javax.annotation.Nullable;
import java.util.List;
import java.util.Optional;

import static de.metas.contracts.modular.ModelAction.COMPLETED;
import static de.metas.contracts.modular.ModelAction.RECREATE_LOGS;
Expand Down Expand Up @@ -175,13 +176,18 @@ else if (!action.equals(COMPLETED))
}
}

public void validateLogs(@NonNull final List<ModularContractLogEntry> logs)
@NonNull
public Optional<ProductPrice> getUniqueProductPriceOrError(@NonNull final List<ModularContractLogEntry> logs)
{
if (logs.isEmpty()) {return;}
if (logs.isEmpty())
{
return Optional.empty();
}

final ProductPrice productPriceToMatch = logs.get(0).getPriceActual();
Check.assumeNotNull(productPriceToMatch, PRODUCT_PRICE_NULL_ASSUMPTION_ERROR_MSG);
logs.forEach(log -> validateLog(log.getPriceActual(), productPriceToMatch));
return Optional.of(productPriceToMatch);
}

private void validateLog(@Nullable final ProductPrice productPrice, @NonNull final ProductPrice productPriceToMatch)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import de.metas.contracts.modular.ComputingMethodType;
import de.metas.contracts.modular.ModularContractComputingMethodHandlerRegistry;
import de.metas.contracts.modular.log.LogEntryContractType;
import de.metas.contracts.modular.settings.ModularContractSettings;
import lombok.NonNull;
import org.adempiere.util.lang.impl.TableRecordReference;

Expand Down Expand Up @@ -57,9 +58,12 @@ public interface IComputingMethodHandler
@NonNull
Stream<FlatrateTermId> streamContractIds(@NonNull final TableRecordReference recordRef);

default boolean isContractIdEligible(@NonNull final TableRecordReference recordRef, final FlatrateTermId contractId)
default boolean isContractIdEligible(
@NonNull final TableRecordReference recordRef,
@NonNull final FlatrateTermId contractId,
@NonNull final ModularContractSettings settings)
{
return streamContractIds(recordRef).anyMatch(id -> FlatrateTermId.equals(id, contractId));
return true;
}

@NonNull
Expand Down
Loading
Loading