feat(platform): close AI expense value loop
Add tenant-safe value, telemetry, connector, commercial, and production-readiness foundations.
This commit is contained in:
@@ -82,7 +82,9 @@ def _seed_budget_allocation(
|
||||
db.flush()
|
||||
|
||||
|
||||
def _seed_people(db: Session, *, suffix: str) -> tuple[OrganizationUnit, Employee, Employee, Employee]:
|
||||
def _seed_people(
|
||||
db: Session, *, suffix: str
|
||||
) -> tuple[OrganizationUnit, Employee, Employee, Employee]:
|
||||
budget_role = _seed_budget_monitor_role(db)
|
||||
department = OrganizationUnit(
|
||||
unit_code=f"ROUTE-{suffix}",
|
||||
@@ -148,6 +150,7 @@ def test_low_risk_application_skips_budget_manager_and_generates_draft() -> None
|
||||
approved = ExpenseClaimService(db).approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=manager.email,
|
||||
name=manager.name,
|
||||
role_codes=["manager"],
|
||||
@@ -219,6 +222,7 @@ def test_budget_warning_application_still_skips_budget_manager_when_not_over_bud
|
||||
approved = ExpenseClaimService(db).approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=manager.email,
|
||||
name=manager.name,
|
||||
role_codes=["manager"],
|
||||
@@ -279,6 +283,7 @@ def test_application_routes_to_budget_manager_when_usage_reaches_90_percent() ->
|
||||
routed = ExpenseClaimService(db).approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=manager.email,
|
||||
name=manager.name,
|
||||
role_codes=["manager"],
|
||||
@@ -303,6 +308,7 @@ def test_application_routes_to_budget_manager_when_usage_reaches_90_percent() ->
|
||||
ExpenseClaimService(db).approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=budget_manager.email,
|
||||
name=budget_manager.name,
|
||||
role_codes=["budget_monitor"],
|
||||
@@ -355,6 +361,7 @@ def test_high_risk_application_under_90_percent_routes_to_budget_manager() -> No
|
||||
approved = ExpenseClaimService(db).approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=manager.email,
|
||||
name=manager.name,
|
||||
role_codes=["manager"],
|
||||
@@ -570,6 +577,7 @@ def test_application_route_ignores_reimbursement_stage_current_risks() -> None:
|
||||
approved = ExpenseClaimService(db).approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=manager.email,
|
||||
name=manager.name,
|
||||
role_codes=["manager"],
|
||||
@@ -633,6 +641,7 @@ def test_risky_reimbursement_routes_to_budget_then_finance() -> None:
|
||||
routed = service.approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=manager.email,
|
||||
name=manager.name,
|
||||
role_codes=["manager"],
|
||||
@@ -656,6 +665,7 @@ def test_risky_reimbursement_routes_to_budget_then_finance() -> None:
|
||||
budget_approved = service.approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=budget_manager.email,
|
||||
name=budget_manager.name,
|
||||
role_codes=["budget_monitor"],
|
||||
@@ -722,6 +732,7 @@ def test_resolved_high_risk_application_does_not_route_to_budget_manager() -> No
|
||||
routed = ExpenseClaimService(db).approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=manager.email,
|
||||
name=manager.name,
|
||||
role_codes=["manager"],
|
||||
@@ -769,6 +780,7 @@ def test_budget_manager_blank_opinion_defaults_to_agree_when_budget_under_warnin
|
||||
approved = ExpenseClaimService(db).approve_claim(
|
||||
claim.id,
|
||||
CurrentUserContext(
|
||||
tenant_id="default",
|
||||
username=budget_manager.email,
|
||||
name=budget_manager.name,
|
||||
role_codes=["budget_monitor"],
|
||||
|
||||
Reference in New Issue
Block a user