chore: update condition queries in qb
(cherry picked from commit d2af36e1eb)
# Conflicts:
# erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
# erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
This commit is contained in:
@@ -5,14 +5,15 @@
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import flt
|
from frappe.utils import flt
|
||||||
|
from pypika import Order
|
||||||
|
|
||||||
import erpnext
|
import erpnext
|
||||||
from erpnext.accounts.report.item_wise_sales_register.item_wise_sales_register import (
|
from erpnext.accounts.report.item_wise_sales_register.item_wise_sales_register import (
|
||||||
add_sub_total_row,
|
add_sub_total_row,
|
||||||
add_total_row,
|
add_total_row,
|
||||||
|
apply_group_by_conditions,
|
||||||
get_grand_total,
|
get_grand_total,
|
||||||
get_group_by_and_display_fields,
|
get_group_by_and_display_fields,
|
||||||
get_group_by_conditions,
|
|
||||||
get_tax_accounts,
|
get_tax_accounts,
|
||||||
)
|
)
|
||||||
from erpnext.accounts.report.utils import get_query_columns, get_values_for_columns
|
from erpnext.accounts.report.utils import get_query_columns, get_values_for_columns
|
||||||
@@ -287,9 +288,12 @@ def get_columns(additional_table_columns, filters):
|
|||||||
return columns
|
return columns
|
||||||
|
|
||||||
|
|
||||||
def get_conditions(filters):
|
def apply_conditions(query, pi, pii, filters):
|
||||||
conditions = ""
|
for opts in ("company", "supplier", "item_code", "mode_of_payment"):
|
||||||
|
if filters.get(opts):
|
||||||
|
query = query.where(pi[opts] == filters[opts])
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
for opts in (
|
for opts in (
|
||||||
("company", " and `tabPurchase Invoice`.company=%(company)s"),
|
("company", " and `tabPurchase Invoice`.company=%(company)s"),
|
||||||
("supplier", " and `tabPurchase Invoice`.supplier = %(supplier)s"),
|
("supplier", " and `tabPurchase Invoice`.supplier = %(supplier)s"),
|
||||||
@@ -300,15 +304,24 @@ def get_conditions(filters):
|
|||||||
):
|
):
|
||||||
if filters.get(opts[0]):
|
if filters.get(opts[0]):
|
||||||
conditions += opts[1]
|
conditions += opts[1]
|
||||||
|
=======
|
||||||
|
if filters.get("from_date"):
|
||||||
|
query = query.where(pi.posting_date >= filters.get("from_date"))
|
||||||
|
|
||||||
|
if filters.get("to_date"):
|
||||||
|
query = query.where(pi.posting_date <= filters.get("to_date"))
|
||||||
|
|
||||||
|
if filters.get("item_group"):
|
||||||
|
query = query.where(pii.item_group == filters.get("item_group"))
|
||||||
|
>>>>>>> d2af36e1eb (chore: update condition queries in qb)
|
||||||
|
|
||||||
if not filters.get("group_by"):
|
if not filters.get("group_by"):
|
||||||
conditions += (
|
query = query.orderby(pi.posting_date, order=Order.desc)
|
||||||
"ORDER BY `tabPurchase Invoice`.posting_date desc, `tabPurchase Invoice Item`.item_code desc"
|
query = query.orderby(pii.item_group, order=Order.desc)
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
conditions += get_group_by_conditions(filters, "Purchase Invoice")
|
query = apply_group_by_conditions(filters, "Purchase Invoice")
|
||||||
|
|
||||||
return conditions
|
return query
|
||||||
|
|
||||||
|
|
||||||
def get_items(filters, additional_query_columns):
|
def get_items(filters, additional_query_columns):
|
||||||
@@ -413,9 +426,14 @@ def get_items(filters, additional_query_columns):
|
|||||||
if filters.get("company"):
|
if filters.get("company"):
|
||||||
query = query.where(pi.company == filters["company"])
|
query = query.where(pi.company == filters["company"])
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
<<<<<<< HEAD
|
<<<<<<< HEAD
|
||||||
>>>>>>> 1b45ecfcae (fix: Item-wise Sales and Purchase register with no item codes #41373)
|
>>>>>>> 1b45ecfcae (fix: Item-wise Sales and Purchase register with no item codes #41373)
|
||||||
=======
|
=======
|
||||||
|
=======
|
||||||
|
query = apply_conditions(query, pi, pii, filters)
|
||||||
|
|
||||||
|
>>>>>>> d2af36e1eb (chore: update condition queries in qb)
|
||||||
return query.run(as_dict=True)
|
return query.run(as_dict=True)
|
||||||
>>>>>>> 76073ae228 (fix: fixing Item-wise sales register and purchase register #41373)
|
>>>>>>> 76073ae228 (fix: fixing Item-wise sales register and purchase register #41373)
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,12 @@ frappe.query_reports["Item-wise Sales Register"] = {
|
|||||||
label: __("Warehouse"),
|
label: __("Warehouse"),
|
||||||
fieldtype: "Link",
|
fieldtype: "Link",
|
||||||
options: "Warehouse",
|
options: "Warehouse",
|
||||||
|
get_query: function () {
|
||||||
|
const company = frappe.query_report.get_filter_value("company");
|
||||||
|
return {
|
||||||
|
filters: { company: company },
|
||||||
|
};
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
fieldname: "brand",
|
fieldname: "brand",
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from frappe import _
|
|||||||
from frappe.model.meta import get_field_precision
|
from frappe.model.meta import get_field_precision
|
||||||
from frappe.utils import cstr, flt
|
from frappe.utils import cstr, flt
|
||||||
from frappe.utils.xlsxutils import handle_html
|
from frappe.utils.xlsxutils import handle_html
|
||||||
|
from pypika import Order
|
||||||
|
|
||||||
from erpnext.accounts.report.sales_register.sales_register import get_mode_of_payments
|
from erpnext.accounts.report.sales_register.sales_register import get_mode_of_payments
|
||||||
from erpnext.accounts.report.utils import get_query_columns, get_values_for_columns
|
from erpnext.accounts.report.utils import get_query_columns, get_values_for_columns
|
||||||
@@ -333,59 +334,69 @@ def get_columns(additional_table_columns, filters):
|
|||||||
return columns
|
return columns
|
||||||
|
|
||||||
|
|
||||||
def get_conditions(filters, additional_conditions=None):
|
def apply_conditions(query, si, sii, filters, additional_conditions=None):
|
||||||
conditions = ""
|
for opts in ("company", "customer", "item_code"):
|
||||||
|
if filters.get(opts):
|
||||||
|
query = query.where(si[opts] == filters[opts])
|
||||||
|
|
||||||
for opts in (
|
if filters.get("from_date"):
|
||||||
("company", " and `tabSales Invoice`.company=%(company)s"),
|
query = query.where(si.posting_date >= filters.get("from_date"))
|
||||||
("customer", " and `tabSales Invoice`.customer = %(customer)s"),
|
|
||||||
("item_code", " and `tabSales Invoice Item`.item_code = %(item_code)s"),
|
|
||||||
("from_date", " and `tabSales Invoice`.posting_date>=%(from_date)s"),
|
|
||||||
("to_date", " and `tabSales Invoice`.posting_date<=%(to_date)s"),
|
|
||||||
):
|
|
||||||
if filters.get(opts[0]):
|
|
||||||
conditions += opts[1]
|
|
||||||
|
|
||||||
if additional_conditions:
|
if filters.get("to_date"):
|
||||||
conditions += additional_conditions
|
query = query.where(si.posting_date <= filters.get("to_date"))
|
||||||
|
|
||||||
if filters.get("mode_of_payment"):
|
if filters.get("mode_of_payment"):
|
||||||
conditions += """ and exists(select name from `tabSales Invoice Payment`
|
sales_invoice = frappe.db.get_all(
|
||||||
where parent=`tabSales Invoice`.name
|
"Sales Invoice Payment", {"mode_of_payment": filters.get("mode_of_payment")}, pluck="parent"
|
||||||
and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
|
)
|
||||||
|
query = query.where(si.name.isin(sales_invoice))
|
||||||
|
|
||||||
if filters.get("warehouse"):
|
if filters.get("warehouse"):
|
||||||
if frappe.db.get_value("Warehouse", filters.get("warehouse"), "is_group"):
|
if frappe.db.get_value("Warehouse", filters.get("warehouse"), "is_group"):
|
||||||
lft, rgt = frappe.db.get_all(
|
lft, rgt = frappe.db.get_all(
|
||||||
"Warehouse", filters={"name": filters.get("warehouse")}, fields=["lft", "rgt"], as_list=True
|
"Warehouse", filters={"name": filters.get("warehouse")}, fields=["lft", "rgt"], as_list=True
|
||||||
)[0]
|
)[0]
|
||||||
conditions += f"and ifnull(`tabSales Invoice Item`.warehouse, '') in (select name from `tabWarehouse` where lft > {lft} and rgt < {rgt}) "
|
warehouses = frappe.db.get_all("Warehouse", {"lft": (">", lft), "rgt": ("<", rgt)}, pluck="name")
|
||||||
|
query = query.where(sii.warehouse.isin(warehouses))
|
||||||
else:
|
else:
|
||||||
conditions += """and ifnull(`tabSales Invoice Item`.warehouse, '') = %(warehouse)s"""
|
query = query.where(sii.warehouse == filters.get("warehouse"))
|
||||||
|
|
||||||
if filters.get("brand"):
|
if filters.get("brand"):
|
||||||
conditions += """and ifnull(`tabSales Invoice Item`.brand, '') = %(brand)s"""
|
query = query.where(sii.brand == filters.get("brand"))
|
||||||
|
|
||||||
if filters.get("item_group"):
|
if filters.get("item_group"):
|
||||||
conditions += """and ifnull(`tabSales Invoice Item`.item_group, '') = %(item_group)s"""
|
query = query.where(sii.item_group == filters.get("item_group"))
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
if filters.get("income_account"):
|
||||||
|
query = query.where(
|
||||||
|
(sii.income_account == filters.get("income_account"))
|
||||||
|
| (sii.deferred_revenue_account == filters.get("income_account"))
|
||||||
|
| (si.unrealized_profit_loss_account == filters.get("income_account"))
|
||||||
|
)
|
||||||
|
|
||||||
|
>>>>>>> d2af36e1eb (chore: update condition queries in qb)
|
||||||
if not filters.get("group_by"):
|
if not filters.get("group_by"):
|
||||||
conditions += "ORDER BY `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_group desc"
|
query = query.orderby(si.posting_date, order=Order.desc)
|
||||||
|
query = query.orderby(sii.item_group, order=Order.desc)
|
||||||
else:
|
else:
|
||||||
conditions += get_group_by_conditions(filters, "Sales Invoice")
|
query = apply_group_by_conditions(query, si, sii, filters)
|
||||||
|
|
||||||
return conditions
|
return query
|
||||||
|
|
||||||
|
|
||||||
def get_group_by_conditions(filters, doctype):
|
def apply_group_by_conditions(query, si, ii, filters):
|
||||||
if filters.get("group_by") == "Invoice":
|
if filters.get("group_by") == "Invoice":
|
||||||
return f"ORDER BY `tab{doctype} Item`.parent desc"
|
query = query.orderby(ii.parent, order=Order.desc)
|
||||||
elif filters.get("group_by") == "Item":
|
elif filters.get("group_by") == "Item":
|
||||||
return f"ORDER BY `tab{doctype} Item`.`item_code`"
|
query = query.orderby(ii.item_code)
|
||||||
elif filters.get("group_by") == "Item Group":
|
elif filters.get("group_by") == "Item Group":
|
||||||
return "ORDER BY `tab{} Item`.{}".format(doctype, frappe.scrub(filters.get("group_by")))
|
query = query.orderby(ii.item_group)
|
||||||
elif filters.get("group_by") in ("Customer", "Customer Group", "Territory", "Supplier"):
|
elif filters.get("group_by") in ("Customer", "Customer Group", "Territory", "Supplier"):
|
||||||
return "ORDER BY `tab{}`.{}".format(doctype, frappe.scrub(filters.get("group_by")))
|
query = query.orderby(si[frappe.scrub(filters.get("group_by"))])
|
||||||
|
|
||||||
|
return query
|
||||||
|
|
||||||
|
|
||||||
<<<<<<< HEAD
|
<<<<<<< HEAD
|
||||||
@@ -460,16 +471,19 @@ def get_items(filters, additional_query_columns,additional_conditions=None):
|
|||||||
def get_items(filters, additional_query_columns, additional_conditions=None):
|
def get_items(filters, additional_query_columns, additional_conditions=None):
|
||||||
si = frappe.qb.DocType("Sales Invoice")
|
si = frappe.qb.DocType("Sales Invoice")
|
||||||
sii = frappe.qb.DocType("Sales Invoice Item")
|
sii = frappe.qb.DocType("Sales Invoice Item")
|
||||||
|
<<<<<<< HEAD
|
||||||
Item = frappe.qb.DocType("Item")
|
Item = frappe.qb.DocType("Item")
|
||||||
>>>>>>> eafa88b8e9 (fix: fixing Item-wise sales register #41373)
|
>>>>>>> eafa88b8e9 (fix: fixing Item-wise sales register #41373)
|
||||||
|
=======
|
||||||
|
item = frappe.qb.DocType("Item")
|
||||||
|
>>>>>>> d2af36e1eb (chore: update condition queries in qb)
|
||||||
|
|
||||||
query = (
|
query = (
|
||||||
frappe.qb.from_(si)
|
frappe.qb.from_(si)
|
||||||
.join(sii)
|
.join(sii)
|
||||||
.on(si.name == sii.parent)
|
.on(si.name == sii.parent)
|
||||||
# added left join
|
.left_join(item)
|
||||||
.left_join(Item)
|
.on(sii.item_code == item.name)
|
||||||
.on(sii.item_code == Item.name)
|
|
||||||
.select(
|
.select(
|
||||||
sii.name,
|
sii.name,
|
||||||
sii.parent,
|
sii.parent,
|
||||||
@@ -489,8 +503,8 @@ def get_items(filters, additional_query_columns, additional_conditions=None):
|
|||||||
sii.item_group,
|
sii.item_group,
|
||||||
sii.item_name.as_("si_item_name"),
|
sii.item_name.as_("si_item_name"),
|
||||||
sii.item_group.as_("si_item_group"),
|
sii.item_group.as_("si_item_group"),
|
||||||
Item.item_name.as_("i_item_name"),
|
item.item_name.as_("i_item_name"),
|
||||||
Item.item_group.as_("i_item_group"),
|
item.item_group.as_("i_item_group"),
|
||||||
sii.sales_order,
|
sii.sales_order,
|
||||||
sii.delivery_note,
|
sii.delivery_note,
|
||||||
sii.income_account,
|
sii.income_account,
|
||||||
@@ -510,15 +524,24 @@ def get_items(filters, additional_query_columns, additional_conditions=None):
|
|||||||
)
|
)
|
||||||
.where(si.docstatus == 1)
|
.where(si.docstatus == 1)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if additional_query_columns:
|
||||||
|
query = query.select(*additional_query_columns)
|
||||||
|
|
||||||
if filters.get("customer"):
|
if filters.get("customer"):
|
||||||
query = query.where(si.customer == filters["customer"])
|
query = query.where(si.customer == filters["customer"])
|
||||||
|
|
||||||
if filters.get("customer_group"):
|
if filters.get("customer_group"):
|
||||||
query = query.where(si.customer_group == filters["customer_group"])
|
query = query.where(si.customer_group == filters["customer_group"])
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
<<<<<<< HEAD
|
<<<<<<< HEAD
|
||||||
>>>>>>> 1b45ecfcae (fix: Item-wise Sales and Purchase register with no item codes #41373)
|
>>>>>>> 1b45ecfcae (fix: Item-wise Sales and Purchase register with no item codes #41373)
|
||||||
=======
|
=======
|
||||||
|
=======
|
||||||
|
query = apply_conditions(query, si, sii, filters, additional_conditions)
|
||||||
|
|
||||||
|
>>>>>>> d2af36e1eb (chore: update condition queries in qb)
|
||||||
return query.run(as_dict=True)
|
return query.run(as_dict=True)
|
||||||
>>>>>>> eafa88b8e9 (fix: fixing Item-wise sales register #41373)
|
>>>>>>> eafa88b8e9 (fix: fixing Item-wise sales register #41373)
|
||||||
|
|
||||||
@@ -528,16 +551,14 @@ def get_delivery_notes_against_sales_order(item_list):
|
|||||||
so_item_rows = list(set([d.so_detail for d in item_list]))
|
so_item_rows = list(set([d.so_detail for d in item_list]))
|
||||||
|
|
||||||
if so_item_rows:
|
if so_item_rows:
|
||||||
delivery_notes = frappe.db.sql(
|
dn_item = frappe.qb.DocType("Delivery Note Item")
|
||||||
"""
|
delivery_notes = (
|
||||||
select parent, so_detail
|
frappe.qb.from_(dn_item)
|
||||||
from `tabDelivery Note Item`
|
.select(dn_item.parent, dn_item.so_detail)
|
||||||
where docstatus=1 and so_detail in (%s)
|
.where(dn_item.docstatus == 1)
|
||||||
group by so_detail, parent
|
.where(dn_item.so_detail.isin(so_item_rows))
|
||||||
"""
|
.groupby(dn_item.so_detail, dn_item.parent)
|
||||||
% (", ".join(["%s"] * len(so_item_rows))),
|
.run(as_dict=True)
|
||||||
tuple(so_item_rows),
|
|
||||||
as_dict=1,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
for dn in delivery_notes:
|
for dn in delivery_notes:
|
||||||
@@ -547,15 +568,16 @@ def get_delivery_notes_against_sales_order(item_list):
|
|||||||
|
|
||||||
|
|
||||||
def get_grand_total(filters, doctype):
|
def get_grand_total(filters, doctype):
|
||||||
return frappe.db.sql(
|
return flt(
|
||||||
f""" SELECT
|
frappe.db.get_value(
|
||||||
SUM(`tab{doctype}`.base_grand_total)
|
doctype,
|
||||||
FROM `tab{doctype}`
|
{
|
||||||
WHERE `tab{doctype}`.docstatus = 1
|
"docstatus": 1,
|
||||||
and posting_date between %s and %s
|
"posting_date": ("between", [filters.get("from_date"), filters.get("to_date")]),
|
||||||
""",
|
},
|
||||||
(filters.get("from_date"), filters.get("to_date")),
|
"sum(base_grand_total)",
|
||||||
)[0][0] # nosec
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_tax_accounts(
|
def get_tax_accounts(
|
||||||
|
|||||||
@@ -377,7 +377,7 @@ def get_account_columns(invoice_list, include_payments):
|
|||||||
def get_invoices(filters, additional_query_columns):
|
def get_invoices(filters, additional_query_columns):
|
||||||
pi = frappe.qb.DocType("Purchase Invoice")
|
pi = frappe.qb.DocType("Purchase Invoice")
|
||||||
query = (
|
query = (
|
||||||
frappe.qb.from_(pi) # qb
|
frappe.qb.from_(pi)
|
||||||
.select(
|
.select(
|
||||||
ConstantColumn("Purchase Invoice").as_("doctype"),
|
ConstantColumn("Purchase Invoice").as_("doctype"),
|
||||||
pi.name,
|
pi.name,
|
||||||
|
|||||||
@@ -415,7 +415,7 @@ def get_account_columns(invoice_list, include_payments):
|
|||||||
def get_invoices(filters, additional_query_columns):
|
def get_invoices(filters, additional_query_columns):
|
||||||
si = frappe.qb.DocType("Sales Invoice")
|
si = frappe.qb.DocType("Sales Invoice")
|
||||||
query = (
|
query = (
|
||||||
frappe.qb.from_(si) # qb
|
frappe.qb.from_(si)
|
||||||
.select(
|
.select(
|
||||||
ConstantColumn("Sales Invoice").as_("doctype"),
|
ConstantColumn("Sales Invoice").as_("doctype"),
|
||||||
si.name,
|
si.name,
|
||||||
|
|||||||
Reference in New Issue
Block a user