mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-28 09:24:45 +00:00
81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
|
|
# For license information, please see license.txt
|
|
|
|
|
|
import frappe
|
|
from frappe.model.meta import get_field_precision
|
|
from frappe.query_builder.functions import IfNull, Round
|
|
|
|
from erpnext import get_default_currency
|
|
|
|
|
|
def get_ordered_to_be_billed_data(args, filters=None):
|
|
doctype, party = args.get("doctype"), args.get("party")
|
|
child_tab = doctype + " Item"
|
|
precision = (
|
|
get_field_precision(
|
|
frappe.get_meta(child_tab).get_field("billed_amt"), currency=get_default_currency()
|
|
)
|
|
or 2
|
|
)
|
|
|
|
doctype = frappe.qb.DocType(doctype)
|
|
child_doctype = frappe.qb.DocType(child_tab)
|
|
item = frappe.qb.DocType("Item")
|
|
|
|
docname = filters.get(args.get("reference_field"), None)
|
|
project_field = get_project_field(doctype, child_doctype, party)
|
|
|
|
query = (
|
|
frappe.qb.from_(doctype)
|
|
.inner_join(child_doctype)
|
|
.on(doctype.name == child_doctype.parent)
|
|
.join(item)
|
|
.on(item.name == child_doctype.item_code)
|
|
.select(
|
|
doctype.name,
|
|
doctype[args.get("date")].as_("date"),
|
|
doctype[party],
|
|
doctype[party + "_name"],
|
|
child_doctype.item_code,
|
|
child_doctype.base_amount.as_("amount"),
|
|
(child_doctype.billed_amt * IfNull(doctype.conversion_rate, 1)).as_("billed_amount"),
|
|
(child_doctype.base_rate * IfNull(child_doctype.returned_qty, 0)).as_("returned_amount"),
|
|
(
|
|
child_doctype.base_amount
|
|
- (child_doctype.billed_amt * IfNull(doctype.conversion_rate, 1))
|
|
- (child_doctype.base_rate * IfNull(child_doctype.returned_qty, 0))
|
|
).as_("pending_amount"),
|
|
child_doctype.item_name,
|
|
child_doctype.description,
|
|
project_field,
|
|
doctype.company,
|
|
)
|
|
.where(
|
|
(doctype.docstatus == 1)
|
|
& (doctype.status.notin(["Closed", "Completed"]))
|
|
& (doctype.company == filters.get("company"))
|
|
& (doctype.posting_date <= filters.get("posting_date"))
|
|
& (child_doctype.amount > 0)
|
|
& (item.is_stock_item == 1)
|
|
& (
|
|
child_doctype.base_amount
|
|
- Round(child_doctype.billed_amt * IfNull(doctype.conversion_rate, 1), precision)
|
|
- (child_doctype.base_rate * IfNull(child_doctype.returned_qty, 0))
|
|
)
|
|
> 0
|
|
)
|
|
.orderby(doctype[args.get("order")], order=args.get("order_by"))
|
|
)
|
|
|
|
if docname:
|
|
query = query.where(doctype.name == docname)
|
|
|
|
return query.run(as_dict=True)
|
|
|
|
|
|
def get_project_field(doctype, child_doctype, party):
|
|
if party == "supplier":
|
|
return child_doctype.project
|
|
return doctype.project
|