refactor: rewrite Supplier-Wise Sales Analytics Report queries in QB
This commit is contained in:
parent
c18f13a45b
commit
d3c073dc25
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
|
from frappe.query_builder.functions import IfNull
|
||||||
from frappe.utils import flt
|
from frappe.utils import flt
|
||||||
|
|
||||||
|
|
||||||
@ -70,31 +71,33 @@ def get_columns(filters):
|
|||||||
return columns
|
return columns
|
||||||
|
|
||||||
|
|
||||||
def get_conditions(filters):
|
def get_consumed_details(filters):
|
||||||
conditions = ""
|
item = frappe.qb.DocType("Item")
|
||||||
values = []
|
sle = frappe.qb.DocType("Stock Ledger Entry")
|
||||||
|
|
||||||
|
query = (
|
||||||
|
frappe.qb.from_(sle)
|
||||||
|
.from_(item)
|
||||||
|
.select(
|
||||||
|
sle.item_code,
|
||||||
|
item.item_name,
|
||||||
|
item.description,
|
||||||
|
item.stock_uom,
|
||||||
|
sle.actual_qty,
|
||||||
|
sle.stock_value_difference,
|
||||||
|
sle.voucher_no,
|
||||||
|
sle.voucher_type,
|
||||||
|
)
|
||||||
|
.where((sle.is_cancelled == 0) & (sle.item_code == item.name) & (sle.actual_qty < 0))
|
||||||
|
)
|
||||||
|
|
||||||
if filters.get("from_date") and filters.get("to_date"):
|
if filters.get("from_date") and filters.get("to_date"):
|
||||||
conditions = "and sle.posting_date>=%s and sle.posting_date<=%s"
|
query = query.where(
|
||||||
values = [filters.get("from_date"), filters.get("to_date")]
|
(sle.posting_date >= filters.get("from_date")) & (sle.posting_date <= filters.get("to_date"))
|
||||||
|
)
|
||||||
|
|
||||||
return conditions, values
|
|
||||||
|
|
||||||
|
|
||||||
def get_consumed_details(filters):
|
|
||||||
conditions, values = get_conditions(filters)
|
|
||||||
consumed_details = {}
|
consumed_details = {}
|
||||||
|
for d in query.run(as_dict=True):
|
||||||
for d in frappe.db.sql(
|
|
||||||
"""select sle.item_code, i.item_name, i.description,
|
|
||||||
i.stock_uom, sle.actual_qty, sle.stock_value_difference,
|
|
||||||
sle.voucher_no, sle.voucher_type
|
|
||||||
from `tabStock Ledger Entry` sle, `tabItem` i
|
|
||||||
where sle.is_cancelled = 0 and sle.item_code=i.name and sle.actual_qty < 0 %s"""
|
|
||||||
% conditions,
|
|
||||||
values,
|
|
||||||
as_dict=1,
|
|
||||||
):
|
|
||||||
consumed_details.setdefault(d.item_code, []).append(d)
|
consumed_details.setdefault(d.item_code, []).append(d)
|
||||||
|
|
||||||
return consumed_details
|
return consumed_details
|
||||||
@ -104,24 +107,54 @@ def get_suppliers_details(filters):
|
|||||||
item_supplier_map = {}
|
item_supplier_map = {}
|
||||||
supplier = filters.get("supplier")
|
supplier = filters.get("supplier")
|
||||||
|
|
||||||
for d in frappe.db.sql(
|
item = frappe.qb.DocType("Item")
|
||||||
"""select pr.supplier, pri.item_code from
|
pr = frappe.qb.DocType("Purchase Receipt")
|
||||||
`tabPurchase Receipt` pr, `tabPurchase Receipt Item` pri
|
pr_item = frappe.qb.DocType("Purchase Receipt Item")
|
||||||
where pr.name=pri.parent and pr.docstatus=1 and
|
|
||||||
pri.item_code=(select name from `tabItem` where
|
query = (
|
||||||
is_stock_item=1 and name=pri.item_code)""",
|
frappe.qb.from_(pr)
|
||||||
as_dict=1,
|
.from_(pr_item)
|
||||||
):
|
.select(pr.supplier, pr_item.item_code)
|
||||||
|
.where(
|
||||||
|
(pr.name == pr_item.parent)
|
||||||
|
& (pr.docstatus == 1)
|
||||||
|
& (
|
||||||
|
pr_item.item_code
|
||||||
|
== (
|
||||||
|
frappe.qb.from_(item)
|
||||||
|
.select(item.name)
|
||||||
|
.where((item.is_stock_item == 1) & (item.name == pr_item.item_code))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
for d in query.run(as_dict=True):
|
||||||
item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
|
item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
|
||||||
|
|
||||||
for d in frappe.db.sql(
|
pi = frappe.qb.DocType("Purchase Invoice")
|
||||||
"""select pr.supplier, pri.item_code from
|
pi_item = frappe.qb.DocType("Purchase Invoice Item")
|
||||||
`tabPurchase Invoice` pr, `tabPurchase Invoice Item` pri
|
|
||||||
where pr.name=pri.parent and pr.docstatus=1 and
|
query = (
|
||||||
ifnull(pr.update_stock, 0) = 1 and pri.item_code=(select name from `tabItem`
|
frappe.qb.from_(pi)
|
||||||
where is_stock_item=1 and name=pri.item_code)""",
|
.from_(pi_item)
|
||||||
as_dict=1,
|
.select(pi.supplier, pi_item.item_code)
|
||||||
):
|
.where(
|
||||||
|
(pi.name == pi_item.parent)
|
||||||
|
& (pi.docstatus == 1)
|
||||||
|
& (IfNull(pi.update_stock, 0) == 1)
|
||||||
|
& (
|
||||||
|
pi_item.item_code
|
||||||
|
== (
|
||||||
|
frappe.qb.from_(item)
|
||||||
|
.select(item.name)
|
||||||
|
.where((item.is_stock_item == 1) & (item.name == pi_item.item_code))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
for d in query.run(as_dict=True):
|
||||||
if d.item_code not in item_supplier_map:
|
if d.item_code not in item_supplier_map:
|
||||||
item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
|
item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
|
||||||
|
|
||||||
@ -138,7 +171,11 @@ def get_suppliers_details(filters):
|
|||||||
|
|
||||||
|
|
||||||
def get_material_transfer_vouchers():
|
def get_material_transfer_vouchers():
|
||||||
return frappe.db.sql_list(
|
se = frappe.qb.DocType("Stock Entry")
|
||||||
"""select name from `tabStock Entry` where
|
query = (
|
||||||
purpose='Material Transfer' and docstatus=1"""
|
frappe.qb.from_(se)
|
||||||
|
.select(se.name)
|
||||||
|
.where((se.purpose == "Material Transfer") & (se.docstatus == 1))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
return [r[0] for r in query.run()]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user