66 lines
4.5 KiB
Python
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
|