Files
Makap/makap_backend/makap_backend/quality_api.py
T
2026-10-05 16:04:29 +03:00

66 lines
4.5 KiB
Python

import frappe
from frappe import _
FIELDS = ["name", "item_code", "item_name", "inspection_type", "reference_type", "reference_name", "status", "posting_date", "inspected_by", "customer", "work_order", "makap_packaging_specification", "makap_specification_revision", "makap_work_order", "makap_quality_gate_stage", "makap_inspection_trigger", "makap_quality_eligibility", "makap_inspection_population_quantity", "makap_population_uom", "makap_sampling_unit", "makap_quality_disposition", "makap_disposition_quantity", "makap_disposition_uom", "makap_disposition_by", "makap_disposition_on", "makap_disposition_reason", "makap_defect_failure_category", "makap_quality_exception_type", "makap_reinspection_of", "makap_reinspection_type", "makap_concession_scope", "makap_concession_quantity", "makap_concession_uom", "makap_concession_reference", "makap_customer_approval_required", "makap_customer_approval_reference", "makap_inspection_equipment_reference", "makap_released_not_before", "modified"]
def _read():
if not frappe.db.exists("DocType", "Quality Inspection") or not frappe.has_permission("Quality Inspection", "read"):
frappe.throw(_("You do not have permission to view Quality Inspections."), frappe.PermissionError)
def _available(fields):
available={f.fieldname for f in frappe.get_meta("Quality Inspection").fields}
return [f for f in fields if f in available or f in {"name", "modified"}]
def _rows(filters=None, ors=None, limit=100):
return frappe.get_list("Quality Inspection", fields=_available(FIELDS), filters=filters or {}, or_filters=ors, order_by="modified desc", limit_page_length=limit)
def _search(value):
if not value: return None
like=f"%{value.strip()}%"
return [["Quality Inspection", f, "like", like] for f in ["name", "item_code", "item_name", "inspection_type", "reference_name", "customer"] if f in _available(FIELDS)]
def _state(row):
disposition=row.get("makap_quality_disposition")
eligibility=row.get("makap_quality_eligibility")
exception=row.get("makap_quality_exception_type")
if disposition in {"Hold", "Reject", "Rework", "Scrap"} or eligibility in {"Hold", "Ineligible"}: return "Blocked"
if exception and exception != "None" or disposition == "Concession": return "Exception"
if disposition == "Release" or eligibility == "Eligible": return "Released"
if disposition == "Pending" or eligibility in {None, "", "Not Determined"}: return "Pending"
return "Not assessed"
@frappe.whitelist()
def get_quality_summary():
_read(); rows=_rows({"docstatus":["!=",2]},limit=0); states=[_state(r) for r in rows]
return {"pending":states.count("Pending"),"holds":sum(1 for r in rows if r.get("makap_quality_disposition") in {"Hold"} or r.get("makap_quality_eligibility")=="Hold"),"rejections":sum(1 for r in rows if r.get("makap_quality_disposition") in {"Reject"} or r.get("makap_quality_eligibility")=="Ineligible"),"released":states.count("Released")}
@frappe.whitelist()
def list_inspections(search=None, gate_stage=None, eligibility=None, disposition=None, limit_page_length=100):
_read(); filters={"docstatus":["!=",2]}
if gate_stage and gate_stage!="All": filters["makap_quality_gate_stage"]=gate_stage
if eligibility and eligibility!="All": filters["makap_quality_eligibility"]=eligibility
if disposition and disposition!="All": filters["makap_quality_disposition"]=disposition
rows=_rows(filters,_search(search),min(max(int(limit_page_length or 100),1),200))
for r in rows: r["makap_derived_state"]=_state(r)
return rows
@frappe.whitelist()
def get_inspection(name):
_read(); doc=frappe.get_doc("Quality Inspection",name)
if not frappe.has_permission(doc,"read"): frappe.throw(_("Permission denied."),frappe.PermissionError)
data=doc.as_dict(); data["makap_derived_state"]=_state(data); return data
@frappe.whitelist()
def list_quality_exceptions(search=None, limit_page_length=100):
_read(); rows=_rows({"docstatus":["!=",2]},_search(search),min(max(int(limit_page_length or 100),1),200))
rows=[r for r in rows if _state(r) in {"Blocked","Exception","Pending"}]
for r in rows: r["makap_derived_state"]=_state(r)
return rows
@frappe.whitelist()
def list_quality_traceability(search=None, limit_page_length=100):
_read(); rows=_rows({"docstatus":["!=",2]},_search(search),min(max(int(limit_page_length or 100),1),200))
rows=[r for r in rows if r.get("makap_work_order") or r.get("work_order") or r.get("makap_packaging_specification") or r.get("reference_name")]
for r in rows: r["makap_derived_state"]=_state(r)
return rows