jruizgit / rules

Durable Rules Engine
MIT License
1.14k stars 209 forks source link

Cumulative amount of events will trigger fraud detection #396

Open jaballe opened 6 months ago

jaballe commented 6 months ago

Hello,

How do I create a rule that can detect that sums up the amount of x number of events and if it hits a certain number threshold, it will be detected for example: like so with ruleset('accumulated_fraud_detection'): @when_all(accumulate(amount_sum=lambda ev: ev.amount) > 1000) def fraud_detected(c): print('Fraud detected! Total amount: {0}'.format(c.events[-1].amount))

post('evnt_amount', { 'amount': 100 })
 post('evnt_amount', { 'amount': 200 })

post('evnt_amount', { 'amount': 500 }) post('evnt_amount', { 'amount': 100 }) post('evnt_amount', { 'amount': 101})

mathrep commented 1 month ago

Do you mean something like the following? ` from durable.lang import *

with ruleset('accumulated_fraud_detection'):

@when_all(+m.amount)
def accumulate_amount(c):
    if c.s.total_amount is None:
        c.s.total_amount = 0

    c.s.total_amount += c.m.amount
    print(f"Current total amount: {c.s.total_amount}")

    if c.s.total_amount > 1000:
        print(f"Fraud detected! Total amount: {c.s.total_amount}")
        # Reset the total amount or some other actions
        c.s.total_amount = 0 

post('accumulated_fraud_detection', { 'amount': 100 }) post('accumulated_fraud_detection', { 'amount': 200 }) post('accumulated_fraud_detection', { 'amount': 500 }) post('accumulated_fraud_detection', { 'amount': 100 }) post('accumulated_fraud_detection', { 'amount': 101 }) ` This code will print out

Current total amount: 100 Current total amount: 300 Current total amount: 800 Current total amount: 900 Current total amount: 1001 Fraud detected! Total amount: 1001