< Summary

Information
Class: Intentum.Core.Finance.FinanceRules
Assembly: Intentum.Core
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Core/Finance/FinanceRules.cs
Line coverage
100%
Covered lines: 113
Uncovered lines: 0
Coverable lines: 113
Total lines: 138
Line coverage: 100%
Branch coverage
75%
Covered branches: 47
Total branches: 62
Branch coverage: 75.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
MoneyLaunderingPattern(...)75%88100%
UnauthorizedAccess(...)75%88100%
HighValueTransaction(...)83.33%66100%
AccountCompromise(...)87.5%88100%
InsiderTrading(...)75%88100%
CreditFraud(...)75%88100%
WireFraud(...)75%88100%
ComplianceViolation(...)62.5%88100%
AllRules()100%11100%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Core/Finance/FinanceRules.cs

#LineLine coverage
 1using Intentum.Core.Behavior;
 2using Intentum.Core.Models;
 3
 4namespace Intentum.Core.Finance;
 5
 6public static class FinanceRules
 7{
 8    public static Func<BehaviorSpace, RuleMatch?> MoneyLaunderingPattern(
 39        double confidence = 0.9) => space =>
 210    {
 211        var signals = space.Events.Count(e =>
 512            e.Action.Contains("transfer.rapid", StringComparison.OrdinalIgnoreCase) ||
 513            e.Action.Contains("structuring.detected", StringComparison.OrdinalIgnoreCase) ||
 514            e.Action.Contains("jurisdiction.high_risk", StringComparison.OrdinalIgnoreCase) ||
 515            e.Action.Contains("transfer.round_amounts", StringComparison.OrdinalIgnoreCase));
 316
 217        if (signals >= 2)
 118            return new RuleMatch("MoneyLaunderingPattern", confidence,
 119                $"Money laundering signals: {signals}");
 120        return null;
 521    };
 22
 23    public static Func<BehaviorSpace, RuleMatch?> UnauthorizedAccess(
 324        double confidence = 0.85) => space =>
 225    {
 226        var signals = space.Events.Count(e =>
 527            e.Action.Contains("login.unusual.time", StringComparison.OrdinalIgnoreCase) ||
 528            e.Action.Contains("device.new", StringComparison.OrdinalIgnoreCase) ||
 529            e.Action.Contains("login.failed.multiple", StringComparison.OrdinalIgnoreCase) ||
 530            e.Action.Contains("location.unusual", StringComparison.OrdinalIgnoreCase));
 331
 232        if (signals >= 2)
 133            return new RuleMatch("UnauthorizedAccess", confidence,
 134                $"Unauthorized access signals: {signals}");
 135        return null;
 536    };
 37
 38    public static Func<BehaviorSpace, RuleMatch?> HighValueTransaction(
 339        double confidence = 0.75) => space =>
 240    {
 241        var signals = space.Events.Count(e =>
 542            e.Action.Contains("transaction.high_value", StringComparison.OrdinalIgnoreCase) ||
 543            e.Action.Contains("recipient.unusual", StringComparison.OrdinalIgnoreCase) ||
 544            e.Action.Contains("transaction.rapid_sequence", StringComparison.OrdinalIgnoreCase));
 345
 246        if (signals >= 2)
 147            return new RuleMatch("HighValueTransaction", confidence,
 148                $"High-value transaction signals: {signals}");
 149        return null;
 550    };
 51
 52    public static Func<BehaviorSpace, RuleMatch?> AccountCompromise(
 353        double confidence = 0.95) => space =>
 254    {
 255        var signals = space.Events.Count(e =>
 556            e.Action.Contains("password.changed", StringComparison.OrdinalIgnoreCase) ||
 557            e.Action.Contains("profile.updated", StringComparison.OrdinalIgnoreCase) ||
 558            e.Action.Contains("login.suspicious", StringComparison.OrdinalIgnoreCase) ||
 559            e.Action.Contains("mfa.disabled", StringComparison.OrdinalIgnoreCase));
 360
 261        if (signals >= 2)
 162            return new RuleMatch("AccountCompromise", confidence,
 163                $"Account compromise signals: {signals}");
 164        return null;
 565    };
 66
 67    public static Func<BehaviorSpace, RuleMatch?> InsiderTrading(
 368        double confidence = 0.9) => space =>
 269    {
 270        var signals = space.Events.Count(e =>
 571            e.Action.Contains("trade.unusual.pattern", StringComparison.OrdinalIgnoreCase) ||
 572            e.Action.Contains("trade.pre.announcement", StringComparison.OrdinalIgnoreCase) ||
 573            e.Action.Contains("trade.timing.suspicious", StringComparison.OrdinalIgnoreCase) ||
 574            e.Action.Contains("trade.volume.anomaly", StringComparison.OrdinalIgnoreCase));
 375
 276        if (signals >= 2)
 177            return new RuleMatch("InsiderTrading", confidence,
 178                $"Insider trading signals: {signals}");
 179        return null;
 580    };
 81
 82    public static Func<BehaviorSpace, RuleMatch?> CreditFraud(
 383        double confidence = 0.85) => space =>
 284    {
 285        var signals = space.Events.Count(e =>
 586            e.Action.Contains("credit.application.rapid", StringComparison.OrdinalIgnoreCase) ||
 587            e.Action.Contains("identity.mismatch", StringComparison.OrdinalIgnoreCase) ||
 588            e.Action.Contains("credit.fabricated.documents", StringComparison.OrdinalIgnoreCase) ||
 589            e.Action.Contains("credit.multiple.inquiries", StringComparison.OrdinalIgnoreCase));
 390
 291        if (signals >= 2)
 192            return new RuleMatch("CreditFraud", confidence,
 193                $"Credit fraud signals: {signals}");
 194        return null;
 595    };
 96
 97    public static Func<BehaviorSpace, RuleMatch?> WireFraud(
 398        double confidence = 0.9) => space =>
 299    {
 2100        var signals = space.Events.Count(e =>
 5101            e.Action.Contains("wire.unusual.pattern", StringComparison.OrdinalIgnoreCase) ||
 5102            e.Action.Contains("wire.beneficiary.changed", StringComparison.OrdinalIgnoreCase) ||
 5103            e.Action.Contains("wire.urgent.request", StringComparison.OrdinalIgnoreCase) ||
 5104            e.Action.Contains("wire.account.mismatch", StringComparison.OrdinalIgnoreCase));
 3105
 2106        if (signals >= 2)
 1107            return new RuleMatch("WireFraud", confidence,
 1108                $"Wire fraud signals: {signals}");
 1109        return null;
 5110    };
 111
 112    public static Func<BehaviorSpace, RuleMatch?> ComplianceViolation(
 3113        double confidence = 0.85) => space =>
 2114    {
 2115        var signals = space.Events.Count(e =>
 3116            e.Action.Contains("compliance.regulatory.flag", StringComparison.OrdinalIgnoreCase) ||
 3117            e.Action.Contains("compliance.reporting.gap", StringComparison.OrdinalIgnoreCase) ||
 3118            e.Action.Contains("compliance.limit.exceeded", StringComparison.OrdinalIgnoreCase) ||
 3119            e.Action.Contains("compliance.approval.missing", StringComparison.OrdinalIgnoreCase));
 3120
 2121        if (signals >= 1)
 1122            return new RuleMatch("ComplianceViolation", confidence,
 1123                $"Compliance violation signals: {signals}");
 1124        return null;
 5125    };
 126
 127    public static IReadOnlyList<Func<BehaviorSpace, RuleMatch?>> AllRules() =>
 1128    [
 1129        AccountCompromise(),
 1130        MoneyLaunderingPattern(),
 1131        UnauthorizedAccess(),
 1132        HighValueTransaction(),
 1133        InsiderTrading(),
 1134        CreditFraud(),
 1135        WireFraud(),
 1136        ComplianceViolation()
 1137    ];
 138}