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 14:06 +0000
« prev ^ index » next coverage.py v7.17.0, created at 2026-11-04 14:06 +0000
1"""Seed the 7 built-in Report Builder reports (ported from reports.mock.ts SEED_REPORTS)."""
3from django.core.management.base import BaseCommand
4from django.db import transaction
6from apps.core_los.models import CustomReport
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]
44class Command(BaseCommand):
45 help = "Seed the 7 built-in Report Builder reports. Idempotent: safe to re-run."
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."))