Adjust risk scoring for established users
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user