< Summary

Information
Class: Intentum.Core.Commerce.CommerceRules
Assembly: Intentum.Core
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Core/Commerce/CommerceRules.cs
Line coverage
98%
Covered lines: 72
Uncovered lines: 1
Coverable lines: 73
Total lines: 109
Line coverage: 98.6%
Branch coverage
84%
Covered branches: 32
Total branches: 38
Branch coverage: 84.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
PurchaseIntent(...)100%88100%
CartAbandonment(...)91.66%1212100%
BrowsingIntent(...)87.5%88100%
SupportIntent(...)60%101092.85%
AllRules()100%11100%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Core/Commerce/CommerceRules.cs

#LineLine coverage
 1using Intentum.Core.Behavior;
 2using Intentum.Core.Models;
 3
 4namespace Intentum.Core.Commerce;
 5
 6/// <summary>
 7/// Pre-built e-commerce intent rules for customer behavior classification.
 8/// </summary>
 9public static class CommerceRules
 10{
 11    /// <summary>
 12    /// Detects purchase intent: product views, cart adds, checkout page visits.
 13    /// </summary>
 14    public static Func<BehaviorSpace, RuleMatch?> PurchaseIntent(
 415        double confidence = 0.85) => space =>
 316    {
 317        var productViews = space.Events.Count(e =>
 918            e.Action.Contains("product.view", StringComparison.OrdinalIgnoreCase) ||
 919            e.Action.Contains("ViewProduct", StringComparison.OrdinalIgnoreCase));
 320        var cartAdds = space.Events.Count(e =>
 921            e.Action.Contains("cart.add", StringComparison.OrdinalIgnoreCase) ||
 922            e.Action.Contains("AddToCart", StringComparison.OrdinalIgnoreCase));
 323        var checkoutVisit = space.Events.Any(e =>
 924            e.Action.Contains("checkout", StringComparison.OrdinalIgnoreCase));
 425
 326        if (cartAdds >= 1 && checkoutVisit)
 127            return new RuleMatch("PurchaseIntent", confidence,
 128                $"Views: {productViews}, cart adds: {cartAdds}, checkout: true");
 229        if (cartAdds >= 2)
 130            return new RuleMatch("PurchaseIntent", confidence * 0.7,
 131                $"Multiple cart adds: {cartAdds}");
 132        return null;
 733    };
 34
 35    /// <summary>
 36    /// Detects cart abandonment: cart activity followed by browsing away or leaving.
 37    /// </summary>
 38    public static Func<BehaviorSpace, RuleMatch?> CartAbandonment(
 339        double confidence = 0.75) => space =>
 240    {
 241        var cartAdds = space.Events.Count(e =>
 642            e.Action.Contains("cart.add", StringComparison.OrdinalIgnoreCase) ||
 643            e.Action.Contains("AddToCart", StringComparison.OrdinalIgnoreCase));
 244        var cartRemoves = space.Events.Count(e =>
 645            e.Action.Contains("cart.remove", StringComparison.OrdinalIgnoreCase));
 246        var hasCheckout = space.Events.Any(e =>
 647            e.Action.Contains("checkout", StringComparison.OrdinalIgnoreCase));
 248        var hasPurchase = space.Events.Any(e =>
 649            e.Action.Contains("purchase", StringComparison.OrdinalIgnoreCase));
 250        var hasBrowseAway = space.Events.Any(e =>
 651            e.Action.Contains("navigate.away", StringComparison.OrdinalIgnoreCase) ||
 652            e.Action.Contains("session.end", StringComparison.OrdinalIgnoreCase));
 353
 254        if (cartAdds >= 1 && !hasPurchase && (cartRemoves >= 1 || hasBrowseAway || !hasCheckout))
 155            return new RuleMatch("CartAbandonment", confidence,
 156                $"Cart adds: {cartAdds}, removes: {cartRemoves}, no purchase, browse away: {hasBrowseAway}");
 157        return null;
 558    };
 59
 60    /// <summary>
 61    /// Detects browsing/research intent: extensive product views without cart activity.
 62    /// </summary>
 63    public static Func<BehaviorSpace, RuleMatch?> BrowsingIntent(
 64        int minViews = 5,
 365        double confidence = 0.7) => space =>
 266    {
 267        var views = space.Events.Count(e =>
 1268            e.Action.Contains("view", StringComparison.OrdinalIgnoreCase) ||
 1269            e.Action.Contains("browse", StringComparison.OrdinalIgnoreCase) ||
 1270            e.Action.Contains("search", StringComparison.OrdinalIgnoreCase));
 271        var cartAdds = space.Events.Count(e =>
 1272            e.Action.Contains("cart", StringComparison.OrdinalIgnoreCase));
 373
 274        if (views >= minViews && cartAdds == 0)
 175            return new RuleMatch("BrowsingIntent", confidence,
 176                $"Views/searches: {views}, no cart activity");
 177        return null;
 578    };
 79
 80    /// <summary>
 81    /// Detects support/help-seeking intent.
 82    /// </summary>
 83    public static Func<BehaviorSpace, RuleMatch?> SupportIntent(
 284        double confidence = 0.8) => space =>
 185    {
 186        var supportActions = space.Events.Count(e =>
 387            e.Action.Contains("support", StringComparison.OrdinalIgnoreCase) ||
 388            e.Action.Contains("help", StringComparison.OrdinalIgnoreCase) ||
 389            e.Action.Contains("faq", StringComparison.OrdinalIgnoreCase) ||
 390            e.Action.Contains("contact", StringComparison.OrdinalIgnoreCase) ||
 391            e.Action.Contains("return", StringComparison.OrdinalIgnoreCase));
 292
 193        if (supportActions >= 2)
 194            return new RuleMatch("SupportIntent", confidence,
 195                $"Support-related actions: {supportActions}");
 096        return null;
 397    };
 98
 99    /// <summary>
 100    /// Returns all standard e-commerce rules in recommended evaluation order.
 101    /// </summary>
 102    public static IReadOnlyList<Func<BehaviorSpace, RuleMatch?>> AllRules() =>
 1103    [
 1104        PurchaseIntent(),
 1105        CartAbandonment(),
 1106        SupportIntent(),
 1107        BrowsingIntent()
 1108    ];
 109}