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

103 lines
4.0 KiB
Python

import frappe
from frappe import _
LIST_FIELDS = [
"name", "customer", "customer_name", "status", "order_type",
"transaction_date", "delivery_date", "grand_total", "currency",
"per_delivered", "per_billed", "contact_person", "modified",
]
def _ensure_read_permission():
if not frappe.has_permission("Sales Order", "read"):
frappe.throw(_("You do not have permission to view Sales Orders."), frappe.PermissionError)
def _number(value):
try:
return float(value or 0)
except (TypeError, ValueError):
return 0
def _order_rows():
return frappe.get_list(
"Sales Order",
fields=["status", "grand_total", "per_delivered", "per_billed", "delivery_date"],
filters={"docstatus": 1},
limit_page_length=0,
)
@frappe.whitelist()
def get_sales_order_summary():
_ensure_read_permission()
rows = _order_rows()
active_statuses = {"To Deliver and Bill", "To Bill", "To Deliver", "Overdue"}
active = [row for row in rows if row.get("status") in active_statuses]
delivery_due = [row for row in active if _number(row.get("per_delivered")) < 100]
billing_due = [row for row in active if _number(row.get("per_billed")) < 100]
return {
"active_count": len(active),
"active_value": sum(_number(row.get("grand_total")) for row in active),
"delivery_due_count": len(delivery_due),
"billing_due_count": len(billing_due),
"completed_count": sum(1 for row in rows if row.get("status") == "Completed"),
"total_count": len(rows),
}
@frappe.whitelist()
def list_sales_orders(search=None, status=None, limit_start=0, limit_page_length=50):
_ensure_read_permission()
search = (search or "").strip()
status = (status or "").strip()
filters = {"docstatus": ["!=", 2]}
if status and status != "All":
filters["status"] = status
or_filters = None
if search:
like = f"%{search}%"
or_filters = [
["Sales Order", "name", "like", like],
["Sales Order", "customer", "like", like],
["Sales Order", "customer_name", "like", like],
["Sales Order", "status", "like", like],
]
return frappe.get_list(
"Sales Order", fields=LIST_FIELDS, filters=filters, or_filters=or_filters,
order_by="modified desc", limit_start=max(int(limit_start or 0), 0),
limit_page_length=min(max(int(limit_page_length or 50), 1), 100),
)
@frappe.whitelist()
def get_sales_order(name):
_ensure_read_permission()
if not name:
frappe.throw(_("Sales Order name is required."))
doc = frappe.get_doc("Sales Order", name)
if not frappe.has_permission(doc, "read"):
frappe.throw(_("You do not have permission to view this Sales Order."), frappe.PermissionError)
items = [{
"item_code": row.item_code, "item_name": row.item_name, "qty": row.qty,
"delivered_qty": row.delivered_qty, "billed_qty": row.billed_qty,
"uom": row.uom, "rate": row.rate, "amount": row.amount,
"delivery_date": row.delivery_date,
} for row in doc.get("items") or []]
return {
"name": doc.name, "customer": doc.customer, "customer_name": doc.customer_name,
"status": doc.status, "order_type": doc.order_type,
"transaction_date": doc.transaction_date, "delivery_date": doc.delivery_date,
"grand_total": doc.grand_total, "net_total": doc.net_total,
"total_taxes_and_charges": doc.total_taxes_and_charges, "currency": doc.currency,
"per_delivered": doc.per_delivered, "per_billed": doc.per_billed,
"contact_person": doc.contact_person, "contact_email": doc.contact_email,
"contact_mobile": doc.contact_mobile, "customer_address": doc.customer_address,
"shipping_address_name": doc.shipping_address_name, "territory": doc.territory,
"sales_partner": doc.sales_partner, "owner": doc.owner,
"po_no": doc.po_no, "po_date": doc.po_date, "modified": doc.modified,
"terms": doc.terms, "items": items,
}