diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 164e30aa17..b1fe0bec84 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -790,11 +790,11 @@ def make_delivery_note(source_name, target_doc=None): target.run_method("calculate_taxes_and_totals") def update_item(source_doc, target_doc, source_parent): - target_doc.base_amount = (flt(source_doc.qty) - flt(source_doc.delivered_qty)) * \ - flt(source_doc.base_rate) - target_doc.amount = (flt(source_doc.qty) - flt(source_doc.delivered_qty)) * \ - flt(source_doc.rate) - target_doc.qty = flt(source_doc.qty) - flt(source_doc.delivered_qty) * flt(source_doc.conversion_factor) + target_doc.qty = flt(source_doc.qty) - flt(source_doc.delivered_qty) + target_doc.stock_qty = target_doc.qty * flt(source_doc.conversion_factor) + + target_doc.base_amount = target_doc.qty * flt(source_doc.base_rate) + target_doc.amount = target_doc.qty * flt(source_doc.rate) doclist = get_mapped_doc("Sales Invoice", source_name, { "Sales Invoice": { diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index df6cb3c33a..3c566e9b27 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -254,7 +254,7 @@ class GrossProfitGenerator(object): si.customer, si.customer_group, si.territory, item.item_code, item.item_name, item.description, item.warehouse, item.item_group, item.brand, item.dn_detail, item.delivery_note, - item.qty, item.base_net_rate, item.base_net_amount, item.name as "item_row", + item.stock_qty as qty, item.base_net_rate, item.base_net_amount, item.name as "item_row", sales.sales_person, sales.allocated_amount, sales.incentives from `tabSales Invoice` si inner join `tabSales Invoice Item` item on item.parent = si.name diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 7003618bb6..5f50ae32a2 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -220,7 +220,7 @@ class SellingController(StockController): il.append(frappe._dict({ 'warehouse': d.warehouse, 'item_code': d.item_code, - 'qty': d.qty, + 'qty': d.stock_qty, 'uom': d.uom, 'stock_uom': d.stock_uom, 'conversion_factor': d.conversion_factor, @@ -294,8 +294,6 @@ class SellingController(StockController): if frappe.db.get_value("Item", d.item_code, "is_stock_item") == 1 and flt(d.qty): if flt(d.conversion_factor)==0.0: d.conversion_factor = get_conversion_factor(d.item_code, d.uom).get("conversion_factor") or 1.0 - - qty_in_stock_uom = flt(d.qty * d.conversion_factor) return_rate = 0 if cint(self.is_return) and self.return_against and self.docstatus==1: return_rate = self.get_incoming_rate_for_sales_return(d.item_code, self.return_against) @@ -306,13 +304,13 @@ class SellingController(StockController): if d.warehouse and ((not cint(self.is_return) and self.docstatus==1) or (cint(self.is_return) and self.docstatus==2)): sl_entries.append(self.get_sl_entries(d, { - "actual_qty": -1*qty_in_stock_uom, + "actual_qty": -1*flt(d.qty), "incoming_rate": return_rate })) if d.target_warehouse: target_warehouse_sle = self.get_sl_entries(d, { - "actual_qty": qty_in_stock_uom, + "actual_qty": flt(d.qty), "warehouse": d.target_warehouse }) @@ -338,7 +336,7 @@ class SellingController(StockController): if d.warehouse and ((not cint(self.is_return) and self.docstatus==2) or (cint(self.is_return) and self.docstatus==1)): sl_entries.append(self.get_sl_entries(d, { - "actual_qty": -1*qty_in_stock_uom, + "actual_qty": -1*flt(d.qty), "incoming_rate": return_rate })) diff --git a/erpnext/controllers/trends.py b/erpnext/controllers/trends.py index d991c15b0d..c5db2239b3 100644 --- a/erpnext/controllers/trends.py +++ b/erpnext/controllers/trends.py @@ -147,9 +147,9 @@ def period_wise_columns_query(filters, trans): else: pwc = [_(filters.get("fiscal_year")) + " ("+_("Qty") + "):Float:120", _(filters.get("fiscal_year")) + " ("+ _("Amt") + "):Currency:120"] - query_details = " SUM(t2.qty), SUM(t2.base_net_amount)," + query_details = " SUM(t2.stock_qty), SUM(t2.base_net_amount)," - query_details += 'SUM(t2.qty), SUM(t2.base_net_amount)' + query_details += 'SUM(t2.stock_qty), SUM(t2.base_net_amount)' return pwc, query_details def get_period_wise_columns(bet_dates, period, pwc): @@ -161,7 +161,7 @@ def get_period_wise_columns(bet_dates, period, pwc): _(get_mon(bet_dates[0])) + "-" + _(get_mon(bet_dates[1])) + " (" + _("Amt") + "):Currency:120"] def get_period_wise_query(bet_dates, trans_date, query_details): - query_details += """SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.qty, NULL)), + query_details += """SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.stock_qty, NULL)), SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.base_net_amount, NULL)), """ % {"trans_date": trans_date, "sd": bet_dates[0],"ed": bet_dates[1]} return query_details diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py index b39530097e..af9fff1374 100644 --- a/erpnext/manufacturing/doctype/production_order/production_order.py +++ b/erpnext/manufacturing/doctype/production_order/production_order.py @@ -90,7 +90,7 @@ class ProductionOrder(Document): total_qty = flt(ordered_qty_against_so) + flt(self.qty) # get qty from Sales Order Item table - so_item_qty = frappe.db.sql("""select sum(qty) from `tabSales Order Item` + so_item_qty = frappe.db.sql("""select sum(stock_qty) from `tabSales Order Item` where parent = %s and item_code = %s""", (self.sales_order, self.production_item))[0][0] # get qty from Packing Item table diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py index 4692118cad..3ece5faccb 100644 --- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py +++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py @@ -134,7 +134,7 @@ class ProductionPlanningTool(Document): item_condition = ' and so_item.item_code = "{0}"'.format(frappe.db.escape(self.fg_item)) items = frappe.db.sql("""select distinct parent, item_code, warehouse, - (qty - delivered_qty) as pending_qty + (qty - delivered_qty)*conversion_factor as pending_qty from `tabSales Order Item` so_item where parent in (%s) and docstatus = 1 and qty > delivered_qty and exists (select name from `tabBOM` bom where bom.item=so_item.item_code diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 6f4a19643a..02732d2461 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -274,7 +274,8 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ doctype: me.frm.doc.doctype, name: me.frm.doc.name, project: item.project || me.frm.doc.project, - qty: item.qty + qty: item.qty, + stock_qty: item.stock_qty } }, @@ -318,7 +319,9 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ refresh_field("serial_no", item.name, item.parentfield); if(!doc.is_return) { - frappe.model.set_value(item.doctype, item.name, "qty", sr_no.length); + frappe.model.set_value(item.doctype, item.name, + "qty", sr_no.length / item.conversion_factor); + frappe.model.set_value(item.doctype, item.name, "stock_qty", sr_no.length); } } } diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index ca29f3ecac..4b20ec8d81 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -325,7 +325,7 @@ class SalesOrder(SellingController): item_code= i.item_code, bom = bom, warehouse = i.warehouse, - pending_qty= i.qty - flt(frappe.db.sql('''select sum(qty) from `tabProduction Order` + pending_qty= i.stock_qty - flt(frappe.db.sql('''select sum(qty) from `tabProduction Order` where production_item=%s and sales_order=%s''', (i.item_code, self.name))[0][0]) )) @@ -394,7 +394,8 @@ def make_material_request(source_name, target_doc=None): "doctype": "Material Request Item", "field_map": { "parent": "sales_order", - "stock_uom": "uom" + "stock_uom": "uom", + "stock_qty": "qty" }, "condition": lambda doc: not frappe.db.exists('Product Bundle', doc.item_code), "postprocess": update_item diff --git a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py index 152e5a761e..558a9af061 100644 --- a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py +++ b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py @@ -20,7 +20,7 @@ def execute(filters=None): data.append([ d.name, d.customer, d.territory, d.posting_date, d.item_code, item_details.get(d.item_code, {}).get("item_group"), item_details.get(d.item_code, {}).get("brand"), - d.qty, d.base_net_amount, d.sales_person, d.allocated_percentage, d.contribution_amt + d.stock_qty, d.base_net_amount, d.sales_person, d.allocated_percentage, d.contribution_amt ]) if data: diff --git a/erpnext/selling/report/territory_target_variance_item_group_wise/territory_target_variance_item_group_wise.py b/erpnext/selling/report/territory_target_variance_item_group_wise/territory_target_variance_item_group_wise.py index 5d6396e132..7caed9bc46 100644 --- a/erpnext/selling/report/territory_target_variance_item_group_wise/territory_target_variance_item_group_wise.py +++ b/erpnext/selling/report/territory_target_variance_item_group_wise/territory_target_variance_item_group_wise.py @@ -92,7 +92,7 @@ def get_achieved_details(filters, territory, item_groups): item_details = frappe.db.sql(""" select - soi.item_code, sum(soi.stock_qty) as qty sum(soi.base_net_amount) as amount, + soi.item_code, sum(soi.stock_qty) as qty, sum(soi.base_net_amount) as amount, MONTHNAME(so.transaction_date) as month_name from `tabSales Order Item` soi, `tabSales Order` so diff --git a/erpnext/startup/report_data_map.py b/erpnext/startup/report_data_map.py index 6cdd889add..e4bbd8744e 100644 --- a/erpnext/startup/report_data_map.py +++ b/erpnext/startup/report_data_map.py @@ -121,7 +121,7 @@ data_map = { }, "Purchase Order Item": { "columns": ["item.name as name", "item_code", "warehouse", - "(qty - received_qty) as qty"], + "(qty - received_qty)*conversion_factor as qty"], "from": "`tabPurchase Order Item` item, `tabPurchase Order` main", "conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'", "ifnull(warehouse, '')!=''", "qty > received_qty"], @@ -132,7 +132,7 @@ data_map = { }, "Sales Order Item": { - "columns": ["item.name as name", "item_code", "(qty - delivered_qty) as qty", "warehouse"], + "columns": ["item.name as name", "item_code", "(qty - delivered_qty)*conversion_factor as qty", "warehouse"], "from": "`tabSales Order Item` item, `tabSales Order` main", "conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'", "ifnull(warehouse, '')!=''", "qty > delivered_qty"], @@ -173,7 +173,7 @@ data_map = { } }, "Sales Invoice Item": { - "columns": ["name", "parent", "item_code", "qty", "base_net_amount"], + "columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"], "conditions": ["docstatus=1", "ifnull(parent, '')!=''"], "order_by": "parent", "links": { @@ -191,7 +191,7 @@ data_map = { } }, "Sales Order Item[Sales Analytics]": { - "columns": ["name", "parent", "item_code", "qty", "base_net_amount"], + "columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"], "conditions": ["docstatus=1", "ifnull(parent, '')!=''"], "order_by": "parent", "links": { @@ -209,7 +209,7 @@ data_map = { } }, "Delivery Note Item[Sales Analytics]": { - "columns": ["name", "parent", "item_code", "qty", "base_net_amount"], + "columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"], "conditions": ["docstatus=1", "ifnull(parent, '')!=''"], "order_by": "parent", "links": { @@ -241,7 +241,7 @@ data_map = { } }, "Purchase Invoice Item": { - "columns": ["name", "parent", "item_code", "qty", "base_net_amount"], + "columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"], "conditions": ["docstatus=1", "ifnull(parent, '')!=''"], "order_by": "parent", "links": { @@ -259,7 +259,7 @@ data_map = { } }, "Purchase Order Item[Purchase Analytics]": { - "columns": ["name", "parent", "item_code", "qty", "base_net_amount"], + "columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"], "conditions": ["docstatus=1", "ifnull(parent, '')!=''"], "order_by": "parent", "links": { @@ -277,7 +277,7 @@ data_map = { } }, "Purchase Receipt Item[Purchase Analytics]": { - "columns": ["name", "parent", "item_code", "qty", "base_net_amount"], + "columns": ["name", "parent", "item_code", "stock_qty as qty", "base_net_amount"], "conditions": ["docstatus=1", "ifnull(parent, '')!=''"], "order_by": "parent", "links": { diff --git a/erpnext/stock/dashboard/item_dashboard.js b/erpnext/stock/dashboard/item_dashboard.js index 43bd6d42bf..1f69ad1679 100644 --- a/erpnext/stock/dashboard/item_dashboard.js +++ b/erpnext/stock/dashboard/item_dashboard.js @@ -176,6 +176,8 @@ erpnext.stock.move_item = function(item, source, target, actual_qty, rate, callb row.f_warehouse = dialog.get_value('target'); row.t_warehouse = dialog.get_value('target'); row.qty = dialog.get_value('qty'); + row.conversion_factor = 1; + row.transfer_qty = dialog.get_value('qty'); row.basic_rate = dialog.get_value('rate'); frappe.set_route('Form', doc.doctype, doc.name); }) diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 4fb5f5d639..244ac66ffb 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -46,7 +46,7 @@ class MaterialRequest(BuyingController): docstatus = 1 and parent != %s""", (item, so_no, self.name)) already_indented = already_indented and flt(already_indented[0][0]) or 0 - actual_so_qty = frappe.db.sql("""select sum(qty) from `tabSales Order Item` + actual_so_qty = frappe.db.sql("""select sum(stock_qty) from `tabSales Order Item` where parent = %s and item_code = %s and docstatus = 1""", (so_no, item)) actual_so_qty = actual_so_qty and flt(actual_so_qty[0][0]) or 0 diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 1c0a3d1006..8f6c592a45 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -86,7 +86,7 @@ frappe.ui.form.on('Stock Entry', { var args = { 'item_code' : d.item_code, 'warehouse' : cstr(d.s_warehouse), - 'qty' : d.qty + 'stock_qty' : d.transfer_qty }; frappe.call({ method: "erpnext.stock.get_item_details.get_serial_no", diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 7c279287c3..7854ac45f1 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -510,7 +510,7 @@ def get_valuation_rate(item_code, warehouse=None): ["valuation_rate"], as_dict=True) or {"valuation_rate": 0} elif not item.is_stock_item: - valuation_rate =frappe.db.sql("""select sum(base_net_amount) / sum(qty) + valuation_rate =frappe.db.sql("""select sum(base_net_amount) / sum(stock_qty) from `tabPurchase Invoice Item` where item_code = %s and docstatus=1""", item_code)