Coverage for apps/core_los/management/commands/seed_reports.py: 100%

11 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-11-04 17:24 +0000

1"""Seed the 7 built-in Report Builder reports (ported from reports.mock.ts SEED_REPORTS).""" 

2 

3from django.core.management.base import BaseCommand 

4from django.db import transaction 

5 

6from apps.core_los.models import CustomReport 

7 

8SEED_REPORTS = [ 

9 { 

10 "name": "Pipeline by stage", "columns": [], "filters": [], "group_by": "stage", 

11 "metrics": ["count", "volume", "avg_rate"], "sort": None, 

12 }, 

13 { 

14 "name": "Volume by loan officer", "columns": [], "filters": [], "group_by": "loan_officer", 

15 "metrics": ["count", "volume", "avg_amount"], "sort": None, 

16 }, 

17 { 

18 "name": "Purchases by state", "columns": [], 

19 "filters": [{"field": "purpose", "op": "eq", "value": "Purchase"}], 

20 "group_by": "state_code", "metrics": ["count", "volume"], "sort": None, 

21 }, 

22 { 

23 "name": "Active loan detail", 

24 "columns": ["loan_number", "borrower_name", "stage", "state_code", "amount", "rate", "ltv"], 

25 "filters": [], "group_by": None, "metrics": [], 

26 "sort": {"field": "amount", "dir": "desc"}, 

27 }, 

28 { 

29 "name": "State production report", "columns": [], "filters": [], "group_by": "state_code", 

30 "metrics": ["count", "volume", "avg_rate"], "sort": None, 

31 }, 

32 { 

33 "name": "Monthly production (Call Report)", "columns": [], "filters": [], 

34 "group_by": "month", "metrics": ["count", "volume", "avg_amount"], "sort": None, 

35 }, 

36 { 

37 "name": "Credit pulls by stage", 

38 "columns": ["loan_number", "borrower_name", "stage", "lock"], 

39 "filters": [], "group_by": "lock", "metrics": ["count"], "sort": None, 

40 }, 

41] 

42 

43 

44class Command(BaseCommand): 

45 help = "Seed the 7 built-in Report Builder reports. Idempotent: safe to re-run." 

46 

47 @transaction.atomic 

48 def handle(self, *args, **options): 

49 for report in SEED_REPORTS: 

50 CustomReport.objects.update_or_create( 

51 system=True, name=report["name"], 

52 defaults={ 

53 "columns": report["columns"], 

54 "filters": report["filters"], 

55 "group_by": report["group_by"], 

56 "metrics": report["metrics"], 

57 "sort": report["sort"], 

58 }, 

59 ) 

60 self.stdout.write(self.style.SUCCESS(f"Seeded {len(SEED_REPORTS)} built-in reports."))