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) ";
    }

}