mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
add restrict create/edit/delete depletion
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user