OrderWorkLoadRuleProcessing.java
package com.tradecloud.repository.workload.impl;
import com.tradecloud.domain.workload.AttributeType;
import com.tradecloud.domain.workload.DateFilter;
import com.tradecloud.domain.workload.WorkLoadRule;
import org.hibernate.Session;
import java.util.Collections;
import java.util.Map;
public class OrderWorkLoadRuleProcessing extends RuleProcessor {
private static final Map<DateFilter, String> dateFilterMappingsRaw = Map.of(
DateFilter.EARLIEST_SHIPMENT_DATE, "s.earliestshipmentdate",
DateFilter.LATEST_SHIPMENT_DATE, "s.latestshipmentdate",
DateFilter.PLANNED_SHIPMENT_DATE, "s.plannedshipmentdate",
DateFilter.REQUIRED_ON_SITE_DATE, "s.requiredonsitedate"
);
private static final Map<DateFilter, String> ORDER_DATE_FILTER_JOINS = Collections.EMPTY_MAP;
private static final Map<AttributeType, String> ATTRIBUTE_TYPE_STRING_MAP = Map.of(
AttributeType.ORDER_NO_PAYMENT, """
AND NOT EXISTS (
select 1 from plannedsettlement ps where ps.order_id=s.id and paymentstate in ('SETTLED','OVER_PAID')
)"""
);
public OrderWorkLoadRuleProcessing(Session session) {
super(session);
}
@Override
protected String addShippingModeFilter(WorkLoadRule rule, String sql) {
sql += " AND si.shippingMode=:shippingMode";
return sql;
}
protected String getBaseTable() {
return " orders s";
}
@Override
protected String getExcludeFilter() {
return " AND (c.id is null OR c.shipment_id is null) AND s.state<>'DELETED' AND s.elc='f'";
}
@Override
protected String getQuery() {
return """
SELECT s.id, s.orderreference as reference,op.supplier_id as supplier,s.number as number, date(%s) as ruledate
FROM %s %s WHERE %s
""";
}
@Override
protected Map<DateFilter, String> dateFilterStringMap() {
return dateFilterMappingsRaw;
}
@Override
protected String addServiceProvideFilter(WorkLoadRule rule, String sql) {
if (rule.getServiceProviderType() != null) {
switch (rule.getServiceProviderType()) {
case FREIGHT_FORWARDER -> {
sql += " AND si.freightforwarder_id=:sp_id";
}
case CLEARING_AGENT -> sql += " AND si.clearingagent_id=:sp_id";
case TRANSPORTER -> sql += " AND si.transporter_id=:sp_id";
case LOCAL_CUSTOMS_AUTHORITY -> sql += " AND p.localCustomsAuthority_id=:sp_id";
case LOCAL_PORT_AUTHORITY -> sql += " AND p.localPortAuthority_id=:sp_id";
default -> throw new IllegalArgumentException("cannot process for order service provider type of:"
+ rule.getServiceProviderType().getDescription());
}
}
return sql;
}
@Override
protected String filterByRuleAttribute(WorkLoadRule rule, String sql) {
var attribute = rule.getAttribute();
return switch (attribute) {
case ORDER_NO_LINKED_SHIPMENT -> sql;
case ORDER_NO_PAYMENT ->
sql + ATTRIBUTE_TYPE_STRING_MAP.getOrDefault(attribute, "");
default -> throw new IllegalArgumentException(String.format(
"Unsupported attribute '%s' (%s) for rule: %s",
attribute, attribute.getDescription(), rule.getName()
));
};
}
@Override
protected String getJoinClause(WorkLoadRule rule) {
StringBuilder joinClause = new StringBuilder(" LEFT JOIN consignment c on (c.id=s.consignment_id) ");
joinClause.append(" JOIN purchaseorder p on (s.id=p.id) join organisationalunitsupplier op on (op.id=p.supplier_id) ");
joinClause.append(" JOIN shippinginformation si ON si.id = s.shippinginformation_id");
return joinClause.toString();
}
@Override
protected String getPriorityFieldsSql(WorkLoadRule rule) {
return "select %s as priorityDate from orders s where s.id=:entityId";
}
@Override
protected String addPaymentTermFilter(WorkLoadRule rule, String sql) {
if(rule.getPaymentTerm()!=null){
sql += " AND s.paymentTerm_code =:paymentTerm ";
return sql;
}
return sql;
}
@Override
protected String addOrderStatesFilter(WorkLoadRule rule, String sql) {
return sql+" AND s.state in (:orderStates) ";
}
}