mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-20 21:49:18 +00:00
81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
|
# License: GNU General Public License v3. See license.txt
|
|
|
|
from __future__ import unicode_literals
|
|
import webnotes
|
|
from webnotes.utils import flt
|
|
|
|
def execute(filters=None):
|
|
columns = get_columns(filters)
|
|
consumed_details = get_consumed_details(filters)
|
|
supplier_details = get_suppliers_details(filters)
|
|
material_transfer_vouchers = get_material_transfer_vouchers()
|
|
data = []
|
|
|
|
for item_code, suppliers in supplier_details.items():
|
|
consumed_qty = consumed_amount = 0.0
|
|
if consumed_details.get(item_code):
|
|
for cd in consumed_details.get(item_code):
|
|
if cd.voucher_no not in material_transfer_vouchers:
|
|
consumed_qty += abs(flt(cd.actual_qty))
|
|
consumed_amount += abs(flt(cd.stock_value_difference))
|
|
if consumed_qty or consumed_amount:
|
|
row = [cd.item_code, cd.item_name, cd.description, cd.stock_uom, \
|
|
consumed_qty, consumed_amount, list(set(suppliers))]
|
|
data.append(row)
|
|
|
|
return columns, data
|
|
|
|
def get_columns(filters):
|
|
"""return columns based on filters"""
|
|
|
|
columns = ["Item:Link/Item:100"] + ["Item Name::150"] + ["Description::150"] + \
|
|
["UOM:Link/UOM:100"] + ["Consumed Qty:Float:130"] + ["Consumed Amount:Currency:130"] + \
|
|
["Supplier(s)::250"]
|
|
|
|
return columns
|
|
|
|
def get_conditions(filters):
|
|
conditions = ""
|
|
values = []
|
|
|
|
if filters.get('from_date') and filters.get('to_date'):
|
|
conditions = "and sle.posting_date>=%s and sle.posting_date<=%s"
|
|
values = [filters.get('from_date'), filters.get('to_date')]
|
|
|
|
return conditions, values
|
|
|
|
def get_consumed_details(filters):
|
|
conditions, values = get_conditions(filters)
|
|
consumed_details = {}
|
|
|
|
for d in webnotes.conn.sql("""select sle.item_code, i.item_name, i.description,
|
|
i.stock_uom, sle.actual_qty, sle.stock_value_difference, sle.voucher_no
|
|
from `tabStock Ledger Entry` sle, `tabItem` i
|
|
where sle.item_code=i.name and sle.actual_qty < 0 %s""" % conditions, values, as_dict=1, debug=1):
|
|
consumed_details.setdefault(d.item_code, []).append(d)
|
|
|
|
return consumed_details
|
|
|
|
def get_suppliers_details(filters):
|
|
item_supplier_map = {}
|
|
conditions = ""
|
|
values = []
|
|
|
|
if (filters.get('supplier')):
|
|
conditions = "and pr.supplier=%s"
|
|
values = [filters.get('supplier')]
|
|
|
|
for d in webnotes.conn.sql("""select pr.supplier, pri.item_code from
|
|
`tabPurchase Receipt` pr, `tabPurchase Receipt Item` pri
|
|
where pr.name=pri.parent and pr.docstatus=1 and
|
|
pri.item_code=(select name from `tabItem` where
|
|
ifnull(is_stock_item, 'Yes')='Yes' and name=pri.item_code) %s""" % conditions,
|
|
values, as_dict=1):
|
|
item_supplier_map.setdefault(d.item_code, []).append(d.supplier)
|
|
|
|
return item_supplier_map
|
|
|
|
def get_material_transfer_vouchers():
|
|
return webnotes.conn.sql_list("""select name from `tabStock Entry` where
|
|
purpose='Material Transfer' and docstatus=1""") |