diff --git a/src/application/services/risk_scoring.py b/src/application/services/risk_scoring.py index 10ba90a..c1b9342 100644 --- a/src/application/services/risk_scoring.py +++ b/src/application/services/risk_scoring.py @@ -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 diff --git a/tests/test_risk_scoring.py b/tests/test_risk_scoring.py index 279389d..563ce33 100644 --- a/tests/test_risk_scoring.py +++ b/tests/test_risk_scoring.py @@ -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)