Adjust risk scoring for established users

This commit is contained in:
Codex
2026-07-05 16:47:24 +03:00
parent c1891e5bf3
commit 688ab1d671
2 changed files with 23 additions and 5 deletions

View File

@@ -35,21 +35,23 @@ class RiskScoringService:
score += 100 score += 100
reasons.append("kyc_not_completed") reasons.append("kyc_not_completed")
is_new_account = False
created_at = user.created_at created_at = user.created_at
if created_at is not None: if created_at is not None:
if created_at.tzinfo is None: if created_at.tzinfo is None:
created_at = created_at.replace(tzinfo=timezone.utc) created_at = created_at.replace(tzinfo=timezone.utc)
age = datetime.now(timezone.utc) - created_at age = datetime.now(timezone.utc) - created_at
if age.total_seconds() < 24 * 60 * 60: if age.total_seconds() < 24 * 60 * 60:
is_new_account = True
score += 20 score += 20
reasons.append("new_account") reasons.append("new_account")
if total_price >= Decimal("200000.00"): if is_new_account and total_price >= Decimal("200000.00"):
score += 30 score += 30
reasons.append("large_amount") reasons.append("new_account_large_amount")
elif total_price >= Decimal("50000.00"): elif is_new_account and total_price >= Decimal("50000.00"):
score += 15 score += 15
reasons.append("elevated_amount") reasons.append("new_account_elevated_amount")
if recent_order_count >= 5: if recent_order_count >= 5:
score += 20 score += 20

View File

@@ -35,9 +35,25 @@ class RiskScoringServiceTests(unittest.TestCase):
self.assertEqual(assessment.decision, "manual_review") self.assertEqual(assessment.decision, "manual_review")
self.assertGreaterEqual(assessment.score, 60) self.assertGreaterEqual(assessment.score, 60)
self.assertIn("new_account", assessment.reasons) 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) 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): def test_legal_entity_is_not_scored(self):
service = RiskScoringService() service = RiskScoringService()
user = UserEntity(id="org_1", account_type="legal_entity", kyc_verified=False) user = UserEntity(id="org_1", account_type="legal_entity", kyc_verified=False)