From 6d69ca6bac94e2fa97d6cbd3d42dae11584fba5c Mon Sep 17 00:00:00 2001
From: Anand Doshi
Date: Thu, 29 Oct 2015 11:35:16 +0530
Subject: [PATCH 1/6] [fix] don't show expired items in website item list.
Fixes #4210.
---
erpnext/setup/doctype/item_group/item_group.py | 10 ++++++----
erpnext/stock/doctype/item/item.py | 2 +-
erpnext/templates/generators/item.html | 2 +-
erpnext/templates/pages/product_search.py | 8 ++++++--
4 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index 97367013d7..bc2d48f4b2 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -4,6 +4,7 @@
from __future__ import unicode_literals
import frappe
import urllib
+from frappe.utils import nowdate
from frappe.utils.nestedset import NestedSet
from frappe.website.website_generator import WebsiteGenerator
from frappe.website.render import clear_cache
@@ -71,14 +72,15 @@ def get_product_list_for_group(product_group=None, start=0, limit=10):
concat(parent_website_route, "/", page_name) as route
from `tabItem`
where show_in_website = 1
+ and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %(today)s)
and (variant_of = '' or variant_of is null)
- and (item_group in (%s)
- or name in (select parent from `tabWebsite Item Group` where item_group in (%s)))
- """ % (child_groups, child_groups)
+ and (item_group in ({child_groups})
+ or name in (select parent from `tabWebsite Item Group` where item_group in ({child_groups})))
+ """.format(child_groups=child_groups)
query += """order by weightage desc, modified desc limit %s, %s""" % (start, limit)
- data = frappe.db.sql(query, {"product_group": product_group}, as_dict=1)
+ data = frappe.db.sql(query, {"product_group": product_group, "today": nowdate()}, as_dict=1)
return [get_item_for_list_in_html(r) for r in data]
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index c62195767b..db7b50ae9c 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -245,7 +245,7 @@ class Item(WebsiteGenerator):
# loop through previous attributes
for prev_attr in self.attributes[:i]:
- combination_source.append([context.selected_attributes[prev_attr.attribute]])
+ combination_source.append([context.selected_attributes.get(prev_attr.attribute)])
combination_source.append(context.attribute_values[attr.attribute])
diff --git a/erpnext/templates/generators/item.html b/erpnext/templates/generators/item.html
index acbcedfd82..500a11853e 100644
--- a/erpnext/templates/generators/item.html
+++ b/erpnext/templates/generators/item.html
@@ -24,7 +24,7 @@
{{ web_long_description or description or _("No description given") }}
- {{ _("Item Code") }}: {{ name }}
+ {{ _("Item Code") }}: {{ variant and variant.name or name }}
{% if has_variants %}
diff --git a/erpnext/templates/pages/product_search.py b/erpnext/templates/pages/product_search.py
index 897a199ec9..9a6e8d3117 100644
--- a/erpnext/templates/pages/product_search.py
+++ b/erpnext/templates/pages/product_search.py
@@ -3,7 +3,7 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import cstr
+from frappe.utils import cstr, nowdate
from erpnext.setup.doctype.item_group.item_group import get_item_for_list_in_html
no_cache = 1
@@ -14,7 +14,10 @@ def get_product_list(search=None, start=0, limit=10):
# base query
query = """select name, item_name, page_name, website_image, thumbnail, item_group,
web_long_description as website_description, parent_website_route
- from `tabItem` where show_in_website = 1 and (variant_of is null or variant_of = '')"""
+ from `tabItem`
+ where show_in_website = 1
+ and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %(today)s)
+ and (variant_of is null or variant_of = '')"""
# search term condition
if search:
@@ -29,6 +32,7 @@ def get_product_list(search=None, start=0, limit=10):
data = frappe.db.sql(query, {
"search": search,
+ "today": nowdate()
}, as_dict=1)
for d in data:
From 8372c44262fdd0fba1cab94ca78835241c423cc4 Mon Sep 17 00:00:00 2001
From: Nabin Hait
Date: Thu, 29 Oct 2015 11:50:36 +0530
Subject: [PATCH 2/6] [fix] Default cost center as per company
---
erpnext/accounts/doctype/journal_entry/journal_entry.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index 082652143a..a0bf0813de 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -699,13 +699,15 @@ def get_payment_entry_from_purchase_order(purchase_order):
def get_payment_entry(doc):
bank_account = get_default_bank_cash_account(doc.company, "Bank Entry")
+ cost_center = frappe.db.get_value("Company", doc.company, "cost_center")
jv = frappe.new_doc('Journal Entry')
jv.voucher_type = 'Bank Entry'
jv.company = doc.company
jv.fiscal_year = doc.fiscal_year
- jv.append("accounts")
+ d1 = jv.append("accounts")
+ d1.cost_center = cost_center
d2 = jv.append("accounts")
if bank_account:
@@ -715,6 +717,7 @@ def get_payment_entry(doc):
d2.account_type = bank_account["account_type"]
d2.exchange_rate = get_exchange_rate(bank_account["account"],
bank_account["account_currency"], doc.company)
+ d2.cost_center = cost_center
return jv
From 21e09a2bd8cf5c247cb379ac9f687e59228dba55 Mon Sep 17 00:00:00 2001
From: Anand Doshi
Date: Thu, 29 Oct 2015 12:21:41 +0530
Subject: [PATCH 3/6] [enhancement] Ability to disable an Item
---
.../purchase_common/purchase_common.py | 5 +-
erpnext/controllers/queries.py | 9 ++-
.../production_order/production_order.js | 2 +-
.../production_order/production_order.py | 14 ++--
.../production_order/test_production_order.py | 7 +-
.../setup/doctype/item_group/item_group.py | 1 +
erpnext/stock/doctype/item/item.json | 74 ++++++++++++-------
erpnext/stock/doctype/item/item.py | 9 ++-
erpnext/stock/doctype/item/item_list.js | 18 +++--
.../stock/doctype/stock_entry/stock_entry.py | 12 +--
.../stock_reconciliation.py | 2 +-
erpnext/stock/get_item_details.py | 2 +-
erpnext/stock/reorder_item.py | 1 +
.../stock_projected_qty.py | 1 +
erpnext/templates/pages/product_search.py | 1 +
15 files changed, 99 insertions(+), 59 deletions(-)
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.py b/erpnext/buying/doctype/purchase_common/purchase_common.py
index 28ea23ce9a..7ec10a6af0 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.py
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.py
@@ -56,11 +56,11 @@ class PurchaseCommon(BuyingController):
d.set(x, f_lst[x])
item = frappe.db.sql("""select is_stock_item, is_purchase_item,
- is_sub_contracted_item, end_of_life from `tabItem` where name=%s""",
+ is_sub_contracted_item, end_of_life, disabled from `tabItem` where name=%s""",
d.item_code, as_dict=1)[0]
from erpnext.stock.doctype.item.item import validate_end_of_life
- validate_end_of_life(d.item_code, item.end_of_life)
+ validate_end_of_life(d.item_code, item.end_of_life, item.disabled)
# validate stock item
if item.is_stock_item==1 and d.qty and not d.warehouse:
@@ -72,6 +72,7 @@ class PurchaseCommon(BuyingController):
frappe.throw(_("{0} must be a Purchased or Sub-Contracted Item in row {1}").format(d.item_code, d.idx))
items.append(cstr(d.item_code))
+
if items and len(items) != len(set(items)) and \
not cint(frappe.db.get_single_value("Buying Settings", "allow_multiple_items") or 0):
frappe.msgprint(_("Warning: Same item has been entered multiple times."))
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index e2de6c391e..ffc682f03c 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -166,6 +166,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters):
from tabItem
where tabItem.docstatus < 2
and ifnull(tabItem.has_variants, 0)=0
+ and tabItem.disabled=0
and (tabItem.end_of_life > %(today)s or ifnull(tabItem.end_of_life, '0000-00-00')='0000-00-00')
and (tabItem.`{key}` LIKE %(txt)s
or tabItem.item_name LIKE %(txt)s
@@ -303,10 +304,10 @@ def get_income_account(doctype, txt, searchfield, start, page_len, filters):
# Hence the first condition is an "OR"
if not filters: filters = {}
- condition = ""
+ condition = ""
if filters.get("company"):
condition += "and tabAccount.company = %(company)s"
-
+
return frappe.db.sql("""select tabAccount.name from `tabAccount`
where (tabAccount.report_type = "Profit and Loss"
or tabAccount.account_type in ("Income Account", "Temporary"))
@@ -314,6 +315,6 @@ def get_income_account(doctype, txt, searchfield, start, page_len, filters):
and tabAccount.`{key}` LIKE %(txt)s
{condition} {match_condition}"""
.format(condition=condition, match_condition=get_match_cond(doctype), key=searchfield), {
- 'txt': "%%%s%%" % frappe.db.escape(txt),
+ 'txt': "%%%s%%" % frappe.db.escape(txt),
'company': filters.get("company", "")
- })
\ No newline at end of file
+ })
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.js b/erpnext/manufacturing/doctype/production_order/production_order.js
index 00eac9ad7a..7c92f2de9a 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.js
+++ b/erpnext/manufacturing/doctype/production_order/production_order.js
@@ -140,7 +140,7 @@ erpnext.production_order = {
} else msgprint(__("Please enter Production Item first"));
});
},
-
+
set_default_warehouse: function(frm) {
frappe.call({
method: "erpnext.manufacturing.doctype.production_order.production_order.get_default_warehouse",
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index e5e0a964bc..dbd3250386 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import flt, get_datetime, getdate, date_diff, cint
+from frappe.utils import flt, get_datetime, getdate, date_diff, cint, nowdate
from frappe import _
from frappe.model.document import Document
from erpnext.manufacturing.doctype.bom.bom import validate_bom_no
@@ -159,22 +159,22 @@ class ProductionOrder(Document):
def on_cancel(self):
self.validate_cancel()
-
+
frappe.db.set(self,'status', 'Cancelled')
self.update_planned_qty()
self.delete_time_logs()
-
+
def validate_cancel(self):
if self.status == "Stopped":
frappe.throw(_("Stopped Production Order cannot be cancelled, Unstop it first to cancel"))
-
+
# Check whether any stock entry exists against this Production Order
stock_entry = frappe.db.sql("""select name from `tabStock Entry`
where production_order = %s and docstatus = 1""", self.name)
if stock_entry:
frappe.throw(_("Cannot cancel because submitted Stock Entry {0} exists").format(stock_entry[0][0]))
- def update_planned_qty(self):
+ def update_planned_qty(self):
update_bin_qty(self.production_item, self.fg_warehouse, {
"planned_qty": get_planned_qty(self.production_item, self.fg_warehouse)
})
@@ -342,8 +342,8 @@ class ProductionOrder(Document):
@frappe.whitelist()
def get_item_details(item):
res = frappe.db.sql("""select stock_uom, description
- from `tabItem` where (ifnull(end_of_life, "0000-00-00")="0000-00-00" or end_of_life > now())
- and name=%s""", item, as_dict=1)
+ from `tabItem` where disabled=0 and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %s)
+ and name=%s""", (nowdate(), item), as_dict=1)
if not res:
return {}
diff --git a/erpnext/manufacturing/doctype/production_order/test_production_order.py b/erpnext/manufacturing/doctype/production_order/test_production_order.py
index eb26d29896..cfea4e572b 100644
--- a/erpnext/manufacturing/doctype/production_order/test_production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/test_production_order.py
@@ -86,7 +86,7 @@ class TestProductionOrder(unittest.TestCase):
self.assertEqual(prod_order.name, time_log.production_order)
self.assertEqual((prod_order.qty - d.completed_qty), time_log.completed_qty)
self.assertEqual(time_diff_in_hours(d.planned_end_time, d.planned_start_time),time_log.hours)
-
+
manufacturing_settings = frappe.get_doc({
"doctype": "Manufacturing Settings",
"allow_production_on_holidays": 0
@@ -136,6 +136,11 @@ class TestProductionOrder(unittest.TestCase):
self.assertRaises(frappe.ValidationError, prod_order.save)
frappe.db.set_value("Item", "_Test FG Item", "end_of_life", None)
+ frappe.db.set_value("Item", "_Test FG Item", "disabled", 1)
+
+ self.assertRaises(frappe.ValidationError, prod_order.save)
+
+ frappe.db.set_value("Item", "_Test FG Item", "disabled", 0)
prod_order = make_prod_order_test_record(item="_Test Variant Item", qty=1, do_not_save=True)
self.assertRaises(ItemHasVariantError, prod_order.save)
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index bc2d48f4b2..9a4497be48 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -72,6 +72,7 @@ def get_product_list_for_group(product_group=None, start=0, limit=10):
concat(parent_website_route, "/", page_name) as route
from `tabItem`
where show_in_website = 1
+ and disabled=0
and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %(today)s)
and (variant_of = '' or variant_of is null)
and (item_group in ({child_groups})
diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json
index b36e34c022..bef4e25739 100644
--- a/erpnext/stock/doctype/item/item.json
+++ b/erpnext/stock/doctype/item/item.json
@@ -178,31 +178,6 @@
"set_only_once": 0,
"unique": 0
},
- {
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "default": "2099-12-31",
- "depends_on": "is_stock_item",
- "fieldname": "end_of_life",
- "fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "in_filter": 0,
- "in_list_view": 0,
- "label": "End of Life",
- "no_copy": 0,
- "oldfieldname": "end_of_life",
- "oldfieldtype": "Date",
- "permlevel": 0,
- "print_hide": 0,
- "read_only": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
{
"allow_on_submit": 0,
"bold": 0,
@@ -249,6 +224,28 @@
"set_only_once": 0,
"unique": 0
},
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "fieldname": "disabled",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Disabled",
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
{
"allow_on_submit": 0,
"bold": 0,
@@ -436,6 +433,31 @@
"set_only_once": 0,
"unique": 0
},
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "default": "2099-12-31",
+ "depends_on": "is_stock_item",
+ "fieldname": "end_of_life",
+ "fieldtype": "Date",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "End of Life",
+ "no_copy": 0,
+ "oldfieldname": "end_of_life",
+ "oldfieldtype": "Date",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
{
"allow_on_submit": 0,
"bold": 0,
@@ -2113,7 +2135,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 1,
- "modified": "2015-10-20 12:14:43.315827",
+ "modified": "2015-10-29 02:25:26.256373",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item",
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index db7b50ae9c..1d8184559f 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -524,14 +524,17 @@ class Item(WebsiteGenerator):
if variant and self.get("__islocal"):
frappe.throw(_("Item variant {0} exists with same attributes").format(variant), ItemVariantExistsError)
-def validate_end_of_life(item_code, end_of_life=None, verbose=1):
- if not end_of_life:
- end_of_life = frappe.db.get_value("Item", item_code, "end_of_life")
+def validate_end_of_life(item_code, end_of_life=None, disabled=None, verbose=1):
+ if (not end_of_life) or (disabled is None):
+ end_of_life, disabled = frappe.db.get_value("Item", item_code, ["end_of_life", "disabled"])
if end_of_life and end_of_life!="0000-00-00" and getdate(end_of_life) <= now_datetime().date():
msg = _("Item {0} has reached its end of life on {1}").format(item_code, formatdate(end_of_life))
_msgprint(msg, verbose)
+ if disabled:
+ _msgprint(_("Item {0} is disabled").format(item_code), verbose)
+
def validate_is_stock_item(item_code, is_stock_item=None, verbose=1):
if not is_stock_item:
is_stock_item = frappe.db.get_value("Item", item_code, "is_stock_item")
diff --git a/erpnext/stock/doctype/item/item_list.js b/erpnext/stock/doctype/item/item_list.js
index 46a22ea5d5..1074bd0039 100644
--- a/erpnext/stock/doctype/item/item_list.js
+++ b/erpnext/stock/doctype/item/item_list.js
@@ -1,16 +1,18 @@
frappe.listview_settings['Item'] = {
add_fields: ["item_name", "stock_uom", "item_group", "image", "variant_of",
- "has_variants", "end_of_life", "is_sales_item"],
+ "has_variants", "end_of_life", "disabled", "is_sales_item"],
get_indicator: function(doc) {
- if(doc.end_of_life && doc.end_of_life < frappe.datetime.get_today()) {
- return [__("Expired"), "grey", "end_of_life,<,Today"]
- } else if(doc.has_variants) {
- return [__("Template"), "blue", "has_variants,=,Yes"]
- } else if(doc.variant_of) {
- return [__("Variant"), "green", "variant_of,=," + doc.variant_of]
+ if (doc.disabled) {
+ return [__("Disabled"), "grey", "disabled,=,Yes"];
+ } else if (doc.end_of_life && doc.end_of_life < frappe.datetime.get_today()) {
+ return [__("Expired"), "grey", "end_of_life,<,Today"];
+ } else if (doc.has_variants) {
+ return [__("Template"), "blue", "has_variants,=,Yes"];
+ } else if (doc.variant_of) {
+ return [__("Variant"), "green", "variant_of,=," + doc.variant_of];
} else {
- return [__("Active"), "blue", "end_of_life,>=,Today"]
+ return [__("Active"), "blue", "end_of_life,>=,Today"];
}
}
};
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 868053e5a8..79cd8de9df 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -5,7 +5,7 @@ from __future__ import unicode_literals
import frappe
import frappe.defaults
from frappe import _
-from frappe.utils import cstr, cint, flt, comma_or, getdate
+from frappe.utils import cstr, cint, flt, comma_or, getdate, nowdate
from erpnext.stock.utils import get_incoming_rate
from erpnext.stock.stock_ledger import get_previous_sle, NegativeStockError
from erpnext.stock.get_item_details import get_available_qty, get_default_cost_center, get_conversion_factor
@@ -359,7 +359,7 @@ class StockEntry(StockController):
def update_stock_ledger(self):
sl_entries = []
-
+
# make sl entries for source warehouse first, then do for target warehouse
for d in self.get('items'):
if cstr(d.s_warehouse):
@@ -368,7 +368,7 @@ class StockEntry(StockController):
"actual_qty": -flt(d.transfer_qty),
"incoming_rate": 0
}))
-
+
for d in self.get('items'):
if cstr(d.t_warehouse):
sl_entries.append(self.get_sl_entries(d, {
@@ -438,8 +438,10 @@ class StockEntry(StockController):
def get_item_details(self, args=None, for_update=False):
item = frappe.db.sql("""select stock_uom, description, image, item_name,
expense_account, buying_cost_center, item_group from `tabItem`
- where name = %s and (ifnull(end_of_life,'0000-00-00')='0000-00-00' or end_of_life > now())""",
- (args.get('item_code')), as_dict = 1)
+ where name = %s
+ and disabled=0
+ and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %s)""",
+ (args.get('item_code'), nowdate()), as_dict = 1)
if not item:
frappe.throw(_("Item {0} is not active or end of life has been reached").format(args.get("item_code")))
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index a275de5b27..cff004124d 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -130,7 +130,7 @@ class StockReconciliation(StockController):
item = frappe.get_doc("Item", item_code)
# end of life and stock item
- validate_end_of_life(item_code, item.end_of_life, verbose=0)
+ validate_end_of_life(item_code, item.end_of_life, item.disabled, verbose=0)
validate_is_stock_item(item_code, item.is_stock_item, verbose=0)
# item should not be serialized
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 3fa3ea930d..1f0b63727c 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -113,7 +113,7 @@ def validate_item_details(args, item):
throw(_("Please specify Company"))
from erpnext.stock.doctype.item.item import validate_end_of_life
- validate_end_of_life(item.name, item.end_of_life)
+ validate_end_of_life(item.name, item.end_of_life, item.disabled)
if args.transaction_type == "selling":
# validate if sales item or service item
diff --git a/erpnext/stock/reorder_item.py b/erpnext/stock/reorder_item.py
index d4b0a20403..bf06396c34 100644
--- a/erpnext/stock/reorder_item.py
+++ b/erpnext/stock/reorder_item.py
@@ -23,6 +23,7 @@ def _reorder_item():
items_to_consider = frappe.db.sql_list("""select name from `tabItem` item
where is_stock_item=1 and has_variants=0
and (is_purchase_item=1 or is_sub_contracted_item=1)
+ and disabled=0
and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %(today)s)
and ((re_order_level is not null and re_order_level > 0)
or exists (select name from `tabItem Reorder` ir where ir.parent=item.name)
diff --git a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
index 51e383627c..7d3a2ee80a 100644
--- a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
+++ b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
@@ -79,6 +79,7 @@ def get_item_map(item_code):
items = frappe.db.sql("""select * from `tabItem` item
where is_stock_item = 1
+ and disabled=0
{condition}
and (end_of_life > %(today)s or end_of_life is null or end_of_life='0000-00-00')
and exists (select name from `tabBin` bin where bin.item_code=item.name)"""\
diff --git a/erpnext/templates/pages/product_search.py b/erpnext/templates/pages/product_search.py
index 9a6e8d3117..dc2099d53c 100644
--- a/erpnext/templates/pages/product_search.py
+++ b/erpnext/templates/pages/product_search.py
@@ -16,6 +16,7 @@ def get_product_list(search=None, start=0, limit=10):
web_long_description as website_description, parent_website_route
from `tabItem`
where show_in_website = 1
+ and disabled=0
and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %(today)s)
and (variant_of is null or variant_of = '')"""
From f9a974385a2cae98da911327ec3802e2673d3afa Mon Sep 17 00:00:00 2001
From: Nabin Hait
Date: Thu, 29 Oct 2015 14:54:22 +0530
Subject: [PATCH 4/6] [fix] Consider Rejected Qty for Qty validation in
Purchase Receipt
---
erpnext/buying/doctype/purchase_common/purchase_common.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.py b/erpnext/buying/doctype/purchase_common/purchase_common.py
index 7ec10a6af0..030d6a276e 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.py
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.py
@@ -42,6 +42,8 @@ class PurchaseCommon(BuyingController):
items = []
for d in obj.get("items"):
if not d.qty:
+ if obj.doctype == "Purchase Receipt" and d.rejected_qty:
+ continue
frappe.throw(_("Please enter quantity for Item {0}").format(d.item_code))
# udpate with latest quantities
From 7dab3c1f8523823af57403aca7d4f1732da8c12d Mon Sep 17 00:00:00 2001
From: Anand Doshi
Date: Wed, 28 Oct 2015 18:31:21 +0530
Subject: [PATCH 5/6] Show Welcome to ERPNext after completing Setup Wizard
---
.../public/images/YouTube-icon-full_color.png | Bin 0 -> 13530 bytes
.../images/erpnext-video-placeholder.jpg | Bin 0 -> 812686 bytes
.../setup/page/setup_wizard/setup_wizard.js | 3 +-
.../setup/page/welcome_to_erpnext/__init__.py | 0
.../welcome_to_erpnext/welcome_to_erpnext.css | 13 ++++++++
.../welcome_to_erpnext.html | 31 ++++++++++++++++++
.../welcome_to_erpnext/welcome_to_erpnext.js | 10 ++++++
.../welcome_to_erpnext.json | 17 ++++++++++
8 files changed, 73 insertions(+), 1 deletion(-)
create mode 100644 erpnext/public/images/YouTube-icon-full_color.png
create mode 100644 erpnext/public/images/erpnext-video-placeholder.jpg
create mode 100644 erpnext/setup/page/welcome_to_erpnext/__init__.py
create mode 100644 erpnext/setup/page/welcome_to_erpnext/welcome_to_erpnext.css
create mode 100644 erpnext/setup/page/welcome_to_erpnext/welcome_to_erpnext.html
create mode 100644 erpnext/setup/page/welcome_to_erpnext/welcome_to_erpnext.js
create mode 100644 erpnext/setup/page/welcome_to_erpnext/welcome_to_erpnext.json
diff --git a/erpnext/public/images/YouTube-icon-full_color.png b/erpnext/public/images/YouTube-icon-full_color.png
new file mode 100644
index 0000000000000000000000000000000000000000..5322e65a92a0f509155e204cea1af452d3169f02
GIT binary patch
literal 13530
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
literal 0
HcmV?d00001
diff --git a/erpnext/public/images/erpnext-video-placeholder.jpg b/erpnext/public/images/erpnext-video-placeholder.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7a0f8433c101672ca14ffbdb5443357d4c694647
GIT binary patch
literal 812686
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