Adjust risk scoring for established users
This commit is contained in:
@@ -35,21 +35,23 @@ class RiskScoringService:
|
||||
score += 100
|
||||
reasons.append("kyc_not_completed")
|
||||
|
||||
is_new_account = False
|
||||
created_at = user.created_at
|
||||
if created_at is not None:
|
||||
if created_at.tzinfo is None:
|
||||
created_at = created_at.replace(tzinfo=timezone.utc)
|
||||
age = datetime.now(timezone.utc) - created_at
|
||||
if age.total_seconds() < 24 * 60 * 60:
|
||||
is_new_account = True
|
||||
score += 20
|
||||
reasons.append("new_account")
|
||||
|
||||
if total_price >= Decimal("200000.00"):
|
||||
if is_new_account and total_price >= Decimal("200000.00"):
|
||||
score += 30
|
||||
reasons.append("large_amount")
|
||||
elif total_price >= Decimal("50000.00"):
|
||||
reasons.append("new_account_large_amount")
|
||||
elif is_new_account and total_price >= Decimal("50000.00"):
|
||||
score += 15
|
||||
reasons.append("elevated_amount")
|
||||
reasons.append("new_account_elevated_amount")
|
||||
|
||||
if recent_order_count >= 5:
|
||||
score += 20
|
||||
|
||||
@@ -35,9 +35,25 @@ class RiskScoringServiceTests(unittest.TestCase):
|
||||
self.assertEqual(assessment.decision, "manual_review")
|
||||
self.assertGreaterEqual(assessment.score, 60)
|
||||
self.assertIn("new_account", assessment.reasons)
|
||||
self.assertIn("large_amount", assessment.reasons)
|
||||
self.assertIn("new_account_large_amount", assessment.reasons)
|
||||
self.assertIn("velocity_spike", assessment.reasons)
|
||||
|
||||
|
||||
def test_old_verified_individual_can_pay_large_amount_without_risk_penalty(self):
|
||||
service = RiskScoringService()
|
||||
user = UserEntity(
|
||||
id="user_1",
|
||||
account_type="individual",
|
||||
kyc_verified=True,
|
||||
created_at=datetime.now(timezone.utc) - timedelta(days=90),
|
||||
)
|
||||
|
||||
assessment = service.assess_order(user=user, total_price=Decimal("999999.00"), recent_order_count=0)
|
||||
|
||||
self.assertEqual(assessment.decision, "allow")
|
||||
self.assertEqual(assessment.score, 0)
|
||||
self.assertEqual(assessment.reasons, [])
|
||||
|
||||
def test_legal_entity_is_not_scored(self):
|
||||
service = RiskScoringService()
|
||||
user = UserEntity(id="org_1", account_type="legal_entity", kyc_verified=False)
|
||||
|
||||
Reference in New Issue
Block a user