103 lines
4.0 KiB
Python
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,
|
|
}
|