From 00f6d69482d62c87c253370a9f7d3e4b3230e2a7 Mon Sep 17 00:00:00 2001 From: rocketdebris Date: Sat, 24 Jan 2026 17:07:02 -0500 Subject: [PATCH] Added API calls for the Job Dials and a column for the Invoice Status in the datatable. --- custom_ui/api/db/jobs.py | 66 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/custom_ui/api/db/jobs.py b/custom_ui/api/db/jobs.py index 16bd48a..d296fe9 100644 --- a/custom_ui/api/db/jobs.py +++ b/custom_ui/api/db/jobs.py @@ -7,6 +7,64 @@ from frappe.utils import getdate # JOB MANAGEMENT API METHODS # =============================================================================== + +@frappe.whitelist() +def get_jobs_in_queue_count(company): + try: + filters = { + 'company': company, + 'is_scheduled': True, + } + count = frappe.db.count("Project", filters=filters) + return build_success_response([count]) + except Exception as e: + return build_error_response(str(e), 500) + + +@frappe.whitelist() +def get_jobs_in_progress_count(company): + try: + today = getdate() + filters = { + 'company': company, + 'invoice_status': 'Not Ready', + 'expected_start_date': ['<=', today], + 'expected_end_date': ['>=', today], + } + count = frappe.db.count("Project", filters=filters) + return build_success_response([count]) + except Exception as e: + return build_error_response(str(e), 500) + + +@frappe.whitelist() +def get_jobs_late_count(company): + try: + today = getdate() + filters = { + 'company': company, + 'invoice_status': 'Not Ready', + 'expected_end_date': ['<', today] + } + count = frappe.db.count("Project", filters=filters) + return build_success_response([count]) + except Exception as e: + return build_error_response(str(e), 500) + + +@frappe.whitelist() +def get_jobs_to_invoice_count(company): + try: + filters = { + 'company': company, + 'invoice_status': 'Ready to Invoice', + } + count = frappe.db.count("Project", filters=filters) + return build_success_response([count]) + except Exception as e: + return build_error_response(str(e), 500) + + @frappe.whitelist() def get_job_templates(company=None): """Get list of job (project) templates.""" @@ -19,6 +77,7 @@ def get_job_templates(company=None): except Exception as e: return build_error_response(str(e), 500) + @frappe.whitelist() def create_job_from_sales_order(sales_order_name): """Create a Job (Project) from a given Sales Order""" @@ -152,9 +211,10 @@ def get_jobs_table_data(filters={}, sortings=[], page=1, page_size=10): tableRow = {} tableRow["id"] = project["name"] tableRow["name"] = project["name"] - tableRow["installation_address"] = project.get("custom_installation_address", "") + tableRow["job_address"] = project["job_address"] tableRow["customer"] = project.get("customer", "") tableRow["status"] = project.get("status", "") + tableRow["invoice_status"] = project.get("invoice_status") tableRow["percent_complete"] = project.get("percent_complete", 0) tableRows.append(tableRow) @@ -203,7 +263,7 @@ def get_projects_for_calendar(start_date, end_date, company=None, project_templa filters["project_template"] = ["in", project_templates] unscheduled_filters = filters.copy() unscheduled_filters["is_scheduled"] = 0 - + # add to filter for if expected_start_date is between start_date and end_date OR expected_end_date is between start_date and end_date filters["expected_start_date"] = ["<=", getdate(end_date)] filters["expected_end_date"] = [">=", getdate(start_date)] @@ -239,4 +299,4 @@ def update_job_scheduled_dates(job_name: str, new_start_date: str = None, new_en project.save() return build_success_response(project.as_dict()) except Exception as e: - return build_error_response(str(e), 500) \ No newline at end of file + return build_error_response(str(e), 500)