diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index b95adf8..9f2c181 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/templates/core/dashboard.html b/core/templates/core/dashboard.html index 42564b4..fc69151 100644 --- a/core/templates/core/dashboard.html +++ b/core/templates/core/dashboard.html @@ -39,7 +39,7 @@ padding: 1.5rem; border-radius: 12px; border: none; - box-shadow: 0 1px 3px rgba(0,0,0,0.1); + box-shadow: 0 1px 3px rgba(0,0=0,0.1); } .stat-value { font-size: 2rem; @@ -127,6 +127,28 @@ +
+
+
+
Incomplete Folder Breakdown
+ {% if incomplete_folder_breakdown %} + + {% else %} +

All required folders are complete for all jobs, or no required folders are defined.

+ {% endif %} +
+
+
+
Recent Repair Jobs
diff --git a/core/views.py b/core/views.py index bba0cee..4447876 100644 --- a/core/views.py +++ b/core/views.py @@ -16,6 +16,9 @@ from django.core.mail import send_mail from django.conf import settings from django.urls import reverse from django.utils import timezone +from django.contrib.auth import get_user_model + +User = get_user_model() from .models import Company, Profile, JobStatus, RequiredFolder, Job, JobFolderCompletion, JobFile, Invitation from .forms import CompanyForm, JobStatusForm, RequiredFolderForm, JobForm, JobFileForm, ImportJobsForm, InviteUserForm @@ -117,15 +120,34 @@ def dashboard(request): jobs_by_status = jobs.values('status__name').annotate(count=Count('id')).order_by('status__name') - # Jobs with incomplete folders + # Jobs with incomplete folders (overall count, existing logic) jobs_with_incomplete_folders = jobs.filter(folder_completions__is_completed=False).distinct().count() + # NEW LOGIC: Breakdown of incomplete folders per RequiredFolder + incomplete_folder_breakdown = [] + required_folders = company.required_folders.all() + + for folder in required_folders: + # Count jobs where this specific folder is NOT completed + missing_count = Job.objects.filter( + company=company, + folder_completions__folder=folder, + folder_completions__is_completed=False + ).distinct().count() + + if missing_count > 0: # Only include if there are missing jobs for this folder + incomplete_folder_breakdown.append({ + 'folder': folder, + 'missing_count': missing_count + }) + context = { 'company': company, 'total_jobs': total_jobs, 'jobs_by_status': jobs_by_status, - 'jobs_with_incomplete_folders': jobs_with_incomplete_folders, + 'jobs_with_incomplete_folders': jobs_with_incomplete_folders, # Keep existing for now 'jobs': jobs.order_by('-created_at')[:5], + 'incomplete_folder_breakdown': incomplete_folder_breakdown, # NEW CONTEXT VARIABLE } return render(request, 'core/dashboard.html', context) @@ -137,6 +159,19 @@ def job_list(request): company = profile.company jobs = Job.objects.filter(company=company).order_by('-created_at') + + # NEW LOGIC: Filter by missing_folder_id + missing_folder_id = request.GET.get('missing_folder_id') + if missing_folder_id: + # Find all jobs that have this folder as required but it's not completed + jobs = jobs.filter( + folder_completions__folder__id=missing_folder_id, + folder_completions__is_completed=False + ).distinct() + + # Optional: Get the folder name to display in the template + missing_folder = get_object_or_404(RequiredFolder, pk=missing_folder_id, company=company) + messages.info(request, f"Showing jobs missing '{missing_folder.name}' folder completion.") return render(request, 'core/job_list.html', { 'jobs': jobs,