mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 21:41:55 +00:00
105 lines
2.8 KiB
Go
105 lines
2.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"strings"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type FifoPendingPolicyInput struct {
|
|
Lane string
|
|
FlagGroupCode string
|
|
FunctionCode string
|
|
LegacyTypeKey string
|
|
}
|
|
|
|
type FifoPendingPolicyResult struct {
|
|
AllowPending bool
|
|
RuleSource string
|
|
Found bool
|
|
}
|
|
|
|
func ResolveFifoPendingPolicy(ctx context.Context, tx *gorm.DB, input FifoPendingPolicyInput) (*FifoPendingPolicyResult, error) {
|
|
if tx == nil {
|
|
return nil, gorm.ErrInvalidDB
|
|
}
|
|
|
|
lane := strings.ToUpper(strings.TrimSpace(input.Lane))
|
|
flagGroupCode := strings.ToUpper(strings.TrimSpace(input.FlagGroupCode))
|
|
functionCode := strings.ToUpper(strings.TrimSpace(input.FunctionCode))
|
|
legacyTypeKey := strings.ToUpper(strings.TrimSpace(input.LegacyTypeKey))
|
|
if lane == "" {
|
|
return &FifoPendingPolicyResult{
|
|
AllowPending: false,
|
|
RuleSource: "SAFE_DEFAULT_BLOCK",
|
|
Found: false,
|
|
}, nil
|
|
}
|
|
|
|
type overconsumeRuleRow struct {
|
|
Allow bool `gorm:"column:allow_overconsume"`
|
|
}
|
|
var overconsume overconsumeRuleRow
|
|
overconsumeErr := tx.WithContext(ctx).
|
|
Table("fifo_stock_v2_overconsume_rules").
|
|
Select("allow_overconsume").
|
|
Where("is_active = TRUE").
|
|
Where("lane = ?", lane).
|
|
Where("(flag_group_code IS NULL OR flag_group_code = ?)", flagGroupCode).
|
|
Where("(function_code IS NULL OR function_code = ?)", functionCode).
|
|
Order("CASE WHEN flag_group_code IS NULL THEN 1 ELSE 0 END ASC").
|
|
Order("CASE WHEN function_code IS NULL THEN 1 ELSE 0 END ASC").
|
|
Order("priority ASC, id ASC").
|
|
Limit(1).
|
|
Take(&overconsume).Error
|
|
if overconsumeErr == nil {
|
|
return &FifoPendingPolicyResult{
|
|
AllowPending: overconsume.Allow,
|
|
RuleSource: "OVERCONSUME_RULE",
|
|
Found: true,
|
|
}, nil
|
|
}
|
|
if !errors.Is(overconsumeErr, gorm.ErrRecordNotFound) {
|
|
return nil, overconsumeErr
|
|
}
|
|
|
|
type routeRuleRow struct {
|
|
AllowPendingDefault bool `gorm:"column:allow_pending_default"`
|
|
}
|
|
var routeRule routeRuleRow
|
|
routeQuery := tx.WithContext(ctx).
|
|
Table("fifo_stock_v2_route_rules").
|
|
Select("allow_pending_default").
|
|
Where("is_active = TRUE").
|
|
Where("lane = ?", lane).
|
|
Where("flag_group_code = ?", flagGroupCode)
|
|
if legacyTypeKey != "" {
|
|
routeQuery = routeQuery.Where("legacy_type_key = ?", legacyTypeKey)
|
|
}
|
|
if functionCode != "" {
|
|
routeQuery = routeQuery.Where("function_code = ?", functionCode)
|
|
}
|
|
routeErr := routeQuery.
|
|
Order("id ASC").
|
|
Limit(1).
|
|
Take(&routeRule).Error
|
|
if routeErr == nil {
|
|
return &FifoPendingPolicyResult{
|
|
AllowPending: routeRule.AllowPendingDefault,
|
|
RuleSource: "ROUTE_RULE_DEFAULT",
|
|
Found: true,
|
|
}, nil
|
|
}
|
|
if !errors.Is(routeErr, gorm.ErrRecordNotFound) {
|
|
return nil, routeErr
|
|
}
|
|
|
|
return &FifoPendingPolicyResult{
|
|
AllowPending: false,
|
|
RuleSource: "SAFE_DEFAULT_BLOCK",
|
|
Found: false,
|
|
}, nil
|
|
}
|