Merge pull request #20826 from saurabh6790/lead-address-fixes
fix: if mandatory fields are missing do not create address against lead
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
index 39042b8..16061c6 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
@@ -4,15 +4,17 @@
// attach required files
{% include 'erpnext/public/js/controllers/buying.js' %};
-frappe.ui.form.on('Suppier Quotation', {
- setup: function(frm) {
- frm.custom_make_buttons = {
- 'Purchase Order': 'Purchase Order'
- }
- }
-});
-
erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.extend({
+ setup: function() {
+ this.frm.custom_make_buttons = {
+ 'Purchase Order': 'Purchase Order',
+ 'Quotation': 'Quotation',
+ 'Subscription': 'Subscription'
+ }
+
+ this._super();
+ },
+
refresh: function() {
var me = this;
this._super();
diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js
index 4f08bbc..0051ad9 100644
--- a/erpnext/manufacturing/doctype/bom/bom.js
+++ b/erpnext/manufacturing/doctype/bom/bom.js
@@ -43,8 +43,7 @@
frm.set_query("item_code", "items", function() {
return {
- query: "erpnext.controllers.queries.item_query",
- filters: [["Item", "name", "!=", cur_frm.doc.item]]
+ query: "erpnext.controllers.queries.item_query"
};
});
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index f6cdb2e..b3e602b 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -114,10 +114,6 @@
child = self.append('operations', d)
child.hour_rate = flt(d.hour_rate / self.conversion_rate, 2)
- def validate_rm_item(self, item):
- if (item[0]['name'] in [it.item_code for it in self.items]) and item[0]['name'] == self.item:
- frappe.throw(_("BOM #{0}: Raw material cannot be same as main Item").format(self.name))
-
def set_bom_material_details(self):
for item in self.get("items"):
self.validate_bom_currecny(item)
@@ -147,7 +143,6 @@
args = json.loads(args)
item = self.get_item_det(args['item_code'])
- self.validate_rm_item(item)
args['bom_no'] = args['bom_no'] or item and cstr(item[0]['default_bom']) or ''
args['transfer_for_manufacture'] = (cstr(args.get('include_item_in_manufacturing', '')) or
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py
index a79ea0e..358a542 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py
@@ -144,7 +144,7 @@
item_condition = " and mr_item.item_code ={0}".format(frappe.db.escape(self.item_code))
items = frappe.db.sql("""select distinct parent, name, item_code, warehouse, description,
- (qty - ordered_qty) as pending_qty
+ (qty - ordered_qty) * conversion_factor as pending_qty
from `tabMaterial Request Item` mr_item
where parent in (%s) and docstatus = 1 and qty > ordered_qty
and exists (select name from `tabBOM` bom where bom.item=mr_item.item_code
diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py
index a124b1f..84bfab2 100644
--- a/erpnext/manufacturing/doctype/work_order/work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/work_order.py
@@ -552,24 +552,33 @@
d.db_set('transferred_qty', flt(transferred_qty), update_modified = False)
def update_consumed_qty_for_required_items(self):
- '''update consumed qty from submitted stock entries for that item against
- the work order'''
+ '''
+ Update consumed qty from submitted stock entries
+ against a work order for each stock item
+ '''
- for d in self.required_items:
- consumed_qty = frappe.db.sql('''select sum(qty)
- from `tabStock Entry` entry, `tabStock Entry Detail` detail
- where
+ for item in self.required_items:
+ consumed_qty = frappe.db.sql('''
+ SELECT
+ SUM(qty)
+ FROM
+ `tabStock Entry` entry,
+ `tabStock Entry Detail` detail
+ WHERE
entry.work_order = %(name)s
- and (entry.purpose = "Material Consumption for Manufacture"
- or entry.purpose = "Manufacture")
- and entry.docstatus = 1
- and detail.parent = entry.name
- and (detail.item_code = %(item)s or detail.original_item = %(item)s)''', {
- 'name': self.name,
- 'item': d.item_code
- })[0][0]
+ AND (entry.purpose = "Material Consumption for Manufacture"
+ OR entry.purpose = "Manufacture")
+ AND entry.docstatus = 1
+ AND detail.parent = entry.name
+ AND detail.s_warehouse IS NOT null
+ AND (detail.item_code = %(item)s
+ OR detail.original_item = %(item)s)
+ ''', {
+ 'name': self.name,
+ 'item': item.item_code
+ })[0][0]
- d.db_set('consumed_qty', flt(consumed_qty), update_modified = False)
+ item.db_set('consumed_qty', flt(consumed_qty), update_modified=False)
def make_bom(self):
data = frappe.db.sql(""" select sed.item_code, sed.qty, sed.s_warehouse
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 13d2b15..ef2d19a 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -496,7 +496,7 @@
def get_requested_item_qty(sales_order):
return frappe._dict(frappe.db.sql("""
- select sales_order_item, sum(stock_qty)
+ select sales_order_item, sum(qty)
from `tabMaterial Request Item`
where docstatus = 1
and sales_order = %s
@@ -507,16 +507,12 @@
def make_material_request(source_name, target_doc=None):
requested_item_qty = get_requested_item_qty(source_name)
- def postprocess(source, doc):
- doc.material_request_type = "Purchase"
-
def update_item(source, target, source_parent):
# qty is for packed items, because packed items don't have stock_qty field
- qty = source.get("stock_qty") or source.get("qty")
+ qty = source.get("qty")
target.project = source_parent.project
target.qty = qty - requested_item_qty.get(source.name, 0)
- target.conversion_factor = 1
- target.stock_qty = qty - requested_item_qty.get(source.name, 0)
+ target.stock_qty = flt(target.qty) * flt(target.conversion_factor)
doc = get_mapped_doc("Sales Order", source_name, {
"Sales Order": {
@@ -537,14 +533,12 @@
"doctype": "Material Request Item",
"field_map": {
"name": "sales_order_item",
- "parent": "sales_order",
- "stock_uom": "uom",
- "stock_qty": "qty"
+ "parent": "sales_order"
},
"condition": lambda doc: not frappe.db.exists('Product Bundle', doc.item_code) and doc.stock_qty > requested_item_qty.get(doc.name, 0),
"postprocess": update_item
}
- }, target_doc, postprocess)
+ }, target_doc)
return doc
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index 4542847..285643d 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -501,7 +501,7 @@
wo_order = frappe.new_doc("Work Order")
wo_order.update({
"production_item": d.item_code,
- "qty": d.qty - d.ordered_qty,
+ "qty": d.stock_qty - d.ordered_qty,
"fg_warehouse": d.warehouse,
"wip_warehouse": default_wip_warehouse,
"description": d.description,
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 7ac3242..be4c78b 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -238,7 +238,7 @@
if self.purpose == "Manufacture" and self.work_order:
production_item = frappe.get_value('Work Order', self.work_order, 'production_item')
for item in self.items:
- if item.item_code == production_item and item.qty != self.fg_completed_qty:
+ if item.item_code == production_item and item.t_warehouse and item.qty != self.fg_completed_qty:
frappe.throw(_("Finished product quantity <b>{0}</b> and For Quantity <b>{1}</b> cannot be different")
.format(item.qty, self.fg_completed_qty))