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

36 lines
3.7 KiB
Python

import frappe
from frappe import _
FIELDS=["name","customer","posting_date","status","grand_total","currency","sales_order","company","modified","makap_dispatch_gate_status","makap_dispatch_gate_blockers","makap_dispatch_gate_checked_by","makap_dispatch_gate_checked_on","makap_dispatch_material_accountability_status","makap_dispatch_accountability_notes","makap_financial_release_status","makap_short_close","makap_short_close_reason","makap_short_close_approved_by","makap_over_delivery_approved_by"]
ITEM_FIELDS=["item_code","item_name","qty","warehouse","sales_order","sales_order_item","makap_packaging_specification","makap_specification_revision","makap_sales_order_item_reference","makap_dispatch_allocation_mode","makap_stock_reservation_entry","makap_work_order","makap_customer_trace_key"]
def _read():
if not frappe.db.exists("DocType","Delivery Note") or not frappe.has_permission("Delivery Note","read"): frappe.throw(_("You do not have permission to view Delivery Notes."),frappe.PermissionError)
def _fields(dt,fs):
a={f.fieldname for f in frappe.get_meta(dt).fields}; return [f for f in fs if f in a or f in {"name","modified"}]
def _ors(s,fs): return [["Delivery Note",f,"like",f"%{s.strip()}%"] for f in fs if f in _fields("Delivery Note",FIELDS)] if s else None
def _state(r):
if r.get("makap_dispatch_gate_status")=="Blocked" or r.get("makap_financial_release_status")=="Blocked" or r.get("makap_dispatch_material_accountability_status")=="Exception": return "Blocked"
if r.get("makap_short_close") or r.get("makap_over_delivery_approved_by"): return "Exception"
if r.get("makap_dispatch_gate_status")=="Ready" and r.get("makap_financial_release_status") in {"Cleared","Not Required","Exception Approved"} and r.get("makap_dispatch_material_accountability_status") in {"Cleared","Not Assessed",None,""}: return "Ready"
return "Not Assessed"
def _rows(filters=None,ors=None,limit=100): return frappe.get_list("Delivery Note",fields=_fields("Delivery Note",FIELDS),filters=filters or {},or_filters=ors,order_by="modified desc",limit_page_length=limit)
@frappe.whitelist()
def get_fulfilment_summary():
_read(); rows=_rows({"docstatus":["!=",2]},limit=0); states=[_state(r) for r in rows]; return {"awaiting":states.count("Not Assessed"),"blocked":states.count("Blocked"),"ready":states.count("Ready"),"exceptions":sum(1 for r in rows if r.get("makap_dispatch_material_accountability_status")=="Exception" or r.get("makap_short_close"))}
@frappe.whitelist()
def list_delivery_notes(search=None,gate_status=None,operational_state=None,limit_page_length=100):
_read(); filters={"docstatus":["!=",2]};
if gate_status and gate_status!="All": filters["makap_dispatch_gate_status"]=gate_status
rows=_rows(filters,_ors(search,["name","customer","sales_order","company"]),min(max(int(limit_page_length or 100),1),200));
for r in rows:r["makap_derived_state"]=_state(r)
return [r for r in rows if not operational_state or operational_state=="All" or r["makap_derived_state"]==operational_state]
@frappe.whitelist()
def get_delivery_note(name):
_read(); doc=frappe.get_doc("Delivery Note",name)
if not frappe.has_permission(doc,"read"): frappe.throw(_("Permission denied."),frappe.PermissionError)
d=doc.as_dict(); d["makap_derived_state"]=_state(d); d["items"]=[{k:r.get(k) for k in ITEM_FIELDS} for r in doc.get("items") or []]; return d
@frappe.whitelist()
def list_fulfilment_exceptions(search=None,limit_page_length=100): return [r for r in list_delivery_notes(search=search,limit_page_length=limit_page_length) if r["makap_derived_state"] in {"Blocked","Exception"}]
@frappe.whitelist()
def list_fulfilment_traceability(search=None,limit_page_length=100):
rows=list_delivery_notes(search=search,limit_page_length=limit_page_length); return [r for r in rows if r.get("sales_order") or r.get("customer")]