Merge branch 'develop' of https://github.com/webnotes/erpnext into develop
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index f059451..13aaee6 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -1,11 +1,13 @@
+
 # 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 import msgprint
-from webnotes.utils import flt, getdate
+from webnotes.utils import flt, getdate, add_date
 from webnotes.model.controller import DocListController
+from datetime import date
 
 class DocType(DocListController):
 	def __init__(self, doc, doclist=[]):
@@ -19,30 +21,30 @@
 		validate_warehouse_user(self.doc.warehouse)
 		validate_warehouse_company(self.doc.warehouse, self.doc.company)
 		self.scrub_posting_time()
-		
+
 		from accounts.utils import validate_fiscal_year
 		validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year, self.meta.get_label("posting_date"))
-		
+
 	def on_submit(self):
 		self.check_stock_frozen_date()
 		self.actual_amt_check()
-		
+
 		from stock.doctype.serial_no.serial_no import process_serial_no
 		process_serial_no(self.doc)
-		
+
 	#check for item quantity available in stock
 	def actual_amt_check(self):
 		if self.doc.batch_no:
-			batch_bal_after_transaction = flt(webnotes.conn.sql("""select sum(actual_qty) 
-				from `tabStock Ledger Entry` 
-				where warehouse=%s and item_code=%s and batch_no=%s""", 
+			batch_bal_after_transaction = flt(webnotes.conn.sql("""select sum(actual_qty)
+				from `tabStock Ledger Entry`
+				where warehouse=%s and item_code=%s and batch_no=%s""",
 				(self.doc.warehouse, self.doc.item_code, self.doc.batch_no))[0][0])
-			
+
 			if batch_bal_after_transaction < 0:
 				self.doc.fields.update({
 					'batch_bal': batch_bal_after_transaction - self.doc.actual_qty
 				})
-				
+
 				webnotes.throw("""Not enough quantity (requested: %(actual_qty)s, \
 					current: %(batch_bal)s in Batch <b>%(batch_no)s</b> for Item \
 					<b>%(item_code)s</b> at Warehouse <b>%(warehouse)s</b> \
@@ -60,27 +62,27 @@
 					msgprint("Warehouse: '%s' does not exist in the system. Please check." % self.doc.fields.get(k), raise_exception = 1)
 
 	def validate_item(self):
-		item_det = webnotes.conn.sql("""select name, has_batch_no, docstatus, 
-			is_stock_item, has_serial_no, serial_no_series 
-			from tabItem where name=%s""", 
+		item_det = webnotes.conn.sql("""select name, has_batch_no, docstatus,
+			is_stock_item, has_serial_no, serial_no_series
+			from tabItem where name=%s""",
 			self.doc.item_code, as_dict=True)[0]
 
 		if item_det.is_stock_item != 'Yes':
 			webnotes.throw("""Item: "%s" is not a Stock Item.""" % self.doc.item_code)
-			
+
 		# check if batch number is required
 		if item_det.has_batch_no =='Yes' and self.doc.voucher_type != 'Stock Reconciliation':
 			if not self.doc.batch_no:
 				webnotes.throw("Batch number is mandatory for Item '%s'" % self.doc.item_code)
-		
+
 			# check if batch belongs to item
-			if not webnotes.conn.sql("""select name from `tabBatch` 
+			if not webnotes.conn.sql("""select name from `tabBatch`
 				where item='%s' and name ='%s' and docstatus != 2""" % (self.doc.item_code, self.doc.batch_no)):
 				webnotes.throw("'%s' is not a valid Batch Number for Item '%s'" % (self.doc.batch_no, self.doc.item_code))
-				
+
 		if not self.doc.stock_uom:
 			self.doc.stock_uom = item_det.stock_uom
-					
+
 	def check_stock_frozen_date(self):
 		stock_frozen_upto = webnotes.conn.get_value('Stock Settings', None, 'stock_frozen_upto') or ''
 		if stock_frozen_upto:
@@ -88,13 +90,21 @@
 			if getdate(self.doc.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in webnotes.user.get_roles():
 				msgprint("You are not authorized to do / modify back dated stock entries before %s" % getdate(stock_frozen_upto).strftime('%d-%m-%Y'), raise_exception=1)
 
+		stock_frozen_upto_days = webnotes.conn.get_value('Stock Settings', None, 'stock_frozen_upto_days') or 0
+		if stock_frozen_upto_days:
+			stock_auth_role = webnotes.conn.get_value('Stock Settings', None,'stock_auth_role')
+			older_than_x_days_ago = (add_date(getdate(self.doc.posting_date), stock_frozen_upto_days) <= date.today())
+			if older_than_x_days_ago and not stock_auth_role in webnotes.user.get_roles():
+				msgprint("You are not authorized to do / modify back dated stock entries older than %d days ago" %stock_frozen_upto_days, raise_exception=1)
+
+
 	def scrub_posting_time(self):
 		if not self.doc.posting_time or self.doc.posting_time == '00:0':
 			self.doc.posting_time = '00:00'
 
 def on_doctype_update():
-	if not webnotes.conn.sql("""show index from `tabStock Ledger Entry` 
+	if not webnotes.conn.sql("""show index from `tabStock Ledger Entry`
 		where Key_name="posting_sort_index" """):
 		webnotes.conn.commit()
-		webnotes.conn.sql("""alter table `tabStock Ledger Entry` 
+		webnotes.conn.sql("""alter table `tabStock Ledger Entry`
 			add index posting_sort_index(posting_date, posting_time, name)""")
\ No newline at end of file
diff --git a/stock/doctype/stock_settings/stock_settings.py b/stock/doctype/stock_settings/stock_settings.py
index 48e1ee1..87e940d 100644
--- a/stock/doctype/stock_settings/stock_settings.py
+++ b/stock/doctype/stock_settings/stock_settings.py
@@ -5,18 +5,23 @@
 
 from __future__ import unicode_literals
 import webnotes
-
+from webnotes import _
 
 class DocType:
 	def __init__(self, d, dl):
 		self.doc, self.doclist = d, dl
-	
+
 	def validate(self):
-		for key in ["item_naming_by", "item_group", "stock_uom", 
+		for key in ["item_naming_by", "item_group", "stock_uom",
 			"allow_negative_stock"]:
 			webnotes.conn.set_default(key, self.doc.fields.get(key, ""))
-			
+
 		from setup.doctype.naming_series.naming_series import set_by_naming_series
-		set_by_naming_series("Item", "item_code", 
+		set_by_naming_series("Item", "item_code",
 			self.doc.get("item_naming_by")=="Naming Series", hide_name_field=True)
-			
+
+		stock_frozen_limit = 356
+		submitted_stock_frozen = self.doc.stock_frozen_upto_days
+		if submitted_stock_frozen > stock_frozen_limit:
+			self.doc.stock_frozen_upto_days = stock_frozen_limit
+			webnotes.msgprint (_("`Freeze Stocks Older Than` should be smaller than %d days.") %stock_frozen_limit)
diff --git a/stock/doctype/stock_settings/stock_settings.txt b/stock/doctype/stock_settings/stock_settings.txt
index 634ee3a..a179091 100644
--- a/stock/doctype/stock_settings/stock_settings.txt
+++ b/stock/doctype/stock_settings/stock_settings.txt
@@ -1,128 +1,134 @@
 [
  {
-  "creation": "2013-06-24 16:37:54", 
-  "docstatus": 0, 
-  "modified": "2013-11-02 19:41:56", 
-  "modified_by": "Administrator", 
+  "creation": "2013-06-24 16:37:54",
+  "docstatus": 0,
+  "modified": "2014-01-27 20:00:56",
+  "modified_by": "Administrator",
   "owner": "Administrator"
- }, 
+ },
  {
-  "description": "Settings", 
-  "doctype": "DocType", 
-  "icon": "icon-cog", 
-  "issingle": 1, 
-  "module": "Stock", 
+  "description": "Settings",
+  "doctype": "DocType",
+  "icon": "icon-cog",
+  "issingle": 1,
+  "module": "Stock",
   "name": "__common__"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "name": "__common__", 
-  "parent": "Stock Settings", 
-  "parentfield": "fields", 
-  "parenttype": "DocType", 
+  "doctype": "DocField",
+  "name": "__common__",
+  "parent": "Stock Settings",
+  "parentfield": "fields",
+  "parenttype": "DocType",
   "permlevel": 0
- }, 
+ },
  {
-  "create": 1, 
-  "doctype": "DocPerm", 
-  "name": "__common__", 
-  "parent": "Stock Settings", 
-  "parentfield": "permissions", 
-  "parenttype": "DocType", 
-  "permlevel": 0, 
-  "read": 1, 
-  "role": "Material Manager", 
+  "create": 1,
+  "doctype": "DocPerm",
+  "name": "__common__",
+  "parent": "Stock Settings",
+  "parentfield": "permissions",
+  "parenttype": "DocType",
+  "permlevel": 0,
+  "read": 1,
+  "role": "Material Manager",
   "write": 1
- }, 
+ },
  {
-  "doctype": "DocType", 
+  "doctype": "DocType",
   "name": "Stock Settings"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "item_naming_by", 
-  "fieldtype": "Select", 
-  "label": "Item Naming By", 
+  "doctype": "DocField",
+  "fieldname": "item_naming_by",
+  "fieldtype": "Select",
+  "label": "Item Naming By",
   "options": "Item Code\nNaming Series"
- }, 
+ },
  {
-  "description": "<a href=\"#Sales Browser/Item Group\">Add / Edit</a>", 
-  "doctype": "DocField", 
-  "fieldname": "item_group", 
-  "fieldtype": "Link", 
-  "label": "Default Item Group", 
+  "description": "<a href=\"#Sales Browser/Item Group\">Add / Edit</a>",
+  "doctype": "DocField",
+  "fieldname": "item_group",
+  "fieldtype": "Link",
+  "label": "Default Item Group",
   "options": "Item Group"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "stock_uom", 
-  "fieldtype": "Link", 
-  "label": "Default Stock UOM", 
+  "doctype": "DocField",
+  "fieldname": "stock_uom",
+  "fieldtype": "Link",
+  "label": "Default Stock UOM",
   "options": "UOM"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "column_break_4", 
+  "doctype": "DocField",
+  "fieldname": "column_break_4",
   "fieldtype": "Column Break"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "allow_negative_stock", 
-  "fieldtype": "Check", 
+  "doctype": "DocField",
+  "fieldname": "allow_negative_stock",
+  "fieldtype": "Check",
   "label": "Allow Negative Stock"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "valuation_method", 
-  "fieldtype": "Select", 
-  "label": "Default Valuation Method", 
+  "doctype": "DocField",
+  "fieldname": "valuation_method",
+  "fieldtype": "Select",
+  "label": "Default Valuation Method",
   "options": "FIFO\nMoving Average"
- }, 
+ },
  {
-  "description": "Percentage you are allowed to receive or deliver more against the quantity ordered. For example: If you have ordered 100 units. and your Allowance is 10% then you are allowed to receive 110 units.", 
-  "doctype": "DocField", 
-  "fieldname": "tolerance", 
-  "fieldtype": "Float", 
+  "description": "Percentage you are allowed to receive or deliver more against the quantity ordered. For example: If you have ordered 100 units. and your Allowance is 10% then you are allowed to receive 110 units.",
+  "doctype": "DocField",
+  "fieldname": "tolerance",
+  "fieldtype": "Float",
   "label": "Allowance Percent"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "auto_material_request", 
-  "fieldtype": "Section Break", 
+  "doctype": "DocField",
+  "fieldname": "auto_material_request",
+  "fieldtype": "Section Break",
   "label": "Auto Material Request"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "auto_indent", 
-  "fieldtype": "Check", 
+  "doctype": "DocField",
+  "fieldname": "auto_indent",
+  "fieldtype": "Check",
   "label": "Raise Material Request when stock reaches re-order level"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "reorder_email_notify", 
-  "fieldtype": "Check", 
+  "doctype": "DocField",
+  "fieldname": "reorder_email_notify",
+  "fieldtype": "Check",
   "label": "Notify by Email on creation of automatic Material Request"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "freeze_stock_entries", 
-  "fieldtype": "Section Break", 
+  "doctype": "DocField",
+  "fieldname": "freeze_stock_entries",
+  "fieldtype": "Section Break",
   "label": "Freeze Stock Entries"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "stock_frozen_upto", 
-  "fieldtype": "Date", 
+  "doctype": "DocField",
+  "fieldname": "stock_frozen_upto",
+  "fieldtype": "Date",
   "label": "Stock Frozen Upto"
- }, 
+ },
  {
-  "doctype": "DocField", 
-  "fieldname": "stock_auth_role", 
-  "fieldtype": "Link", 
-  "label": "Role Allowed to edit frozen stock", 
+  "doctype": "DocField",
+  "fieldname": "stock_frozen_upto_days",
+  "fieldtype": "Int",
+  "label": "Freeze Stocks Older Than [Days]"
+ },
+ {
+  "doctype": "DocField",
+  "fieldname": "stock_auth_role",
+  "fieldtype": "Link",
+  "label": "Role Allowed to edit frozen stock",
   "options": "Role"
- }, 
+ },
  {
   "doctype": "DocPerm"
  }
-]
\ No newline at end of file
+]