59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
package queries
|
|
|
|
import (
|
|
"bssapp-backend/auth"
|
|
"bssapp-backend/internal/authz"
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
func resolvePiyasaScopeInClause(ctx context.Context, column string) (string, error) {
|
|
claims, ok := auth.GetClaimsFromContext(ctx)
|
|
if !ok || claims == nil {
|
|
return "", fmt.Errorf("unauthorized: claims not found")
|
|
}
|
|
if claims.IsAdmin() {
|
|
return "1=1", nil
|
|
}
|
|
|
|
rawCodes := authz.GetPiyasaCodesFromCtx(ctx)
|
|
codes := normalizePiyasaCodes(rawCodes)
|
|
if len(codes) == 0 {
|
|
return "1=0", nil
|
|
}
|
|
return authz.BuildMSSQLPiyasaFilterWithCodes(column, codes), nil
|
|
}
|
|
|
|
func buildPiyasaExistsForCariCode(ctx context.Context, cariCodeExpr string) (string, error) {
|
|
inClause, err := resolvePiyasaScopeInClause(ctx, "PF.CustomerAtt01")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return fmt.Sprintf(`
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM CustomerAttributesFilter PF WITH(NOLOCK)
|
|
WHERE (PF.CurrAccCode = %s OR LEFT(PF.CurrAccCode, 8) = LEFT(%s, 8))
|
|
AND %s
|
|
)`, cariCodeExpr, cariCodeExpr, inClause), nil
|
|
}
|
|
|
|
func normalizePiyasaCodes(codes []string) []string {
|
|
out := make([]string, 0, len(codes))
|
|
seen := make(map[string]struct{}, len(codes))
|
|
for _, c := range codes {
|
|
n := strings.ToUpper(strings.TrimSpace(c))
|
|
if n == "" {
|
|
continue
|
|
}
|
|
if _, ok := seen[n]; ok {
|
|
continue
|
|
}
|
|
seen[n] = struct{}{}
|
|
out = append(out, n)
|
|
}
|
|
return out
|
|
}
|