diff --git a/hr/doctype/leave_allocation/leave_allocation.py b/hr/doctype/leave_allocation/leave_allocation.py
index 3b8576f..1772f2c 100755
--- a/hr/doctype/leave_allocation/leave_allocation.py
+++ b/hr/doctype/leave_allocation/leave_allocation.py
@@ -8,131 +8,129 @@
 # 
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
 # GNU General Public License for more details.
 # 
 # You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
 
 # Please edit this list and import only required elements
 from __future__ import unicode_literals
 import webnotes
-
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild, getchildren, make_autoname
-from webnotes.model.doclist import getlist, copy_doclist
-from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
-from webnotes import session, form, msgprint, errprint
-
+from webnotes.utils import cint, flt
+from webnotes import msgprint
 set = webnotes.conn.set
 sql = webnotes.conn.sql
-get_value = webnotes.conn.get_value
-in_transaction = webnotes.conn.in_transaction
-convert_to_lists = webnotes.conn.convert_to_lists
-import datetime
 	
-# -----------------------------------------------------------------------------------------
 class DocType:
-  def __init__(self, doc, doclist):
-    self.doc = doc
-    self.doclist = doclist
+	def __init__(self, doc, doclist):
+		self.doc, self.doclist = doc, doclist
+		
+	def validate(self):
+		self.validate_new_leaves_allocated_value()
+		self.check_existing_leave_allocation()
+		self.validate_new_leaves_allocated()
+		
+	def on_update_after_submit(self):
+		self.validate_new_leaves_allocated_value()
+		self.validate_new_leaves_allocated()
 
+	def on_update(self):
+		self.get_total_allocated_leaves()
+		
+	def on_cancel(self):
+		self.check_for_leave_application()
+		
+	def validate_new_leaves_allocated_value(self):
+		"""validate that leave allocation is in multiples of 0.5"""
+		if flt(self.doc.new_leaves_allocated) % 0.5:
+			guess = round(flt(self.doc.new_leaves_allocated) * 2.0) / 2.0
+			
+			msgprint("""New Leaves Allocated should be a multiple of 0.5.
+				Perhaps you should enter %s or %s""" % (guess, guess + 0.5),
+				raise_exception=1)
+		
+	def check_existing_leave_allocation(self):
+		"""check whether leave for same type is already allocated or not"""
+		leave_allocation = sql("""select name from `tabLeave Allocation`
+			where employee=%s and leave_type=%s and fiscal_year=%s and docstatus=1""",
+			(self.doc.employee, self.doc.leave_type, self.doc.fiscal_year))
+		if leave_allocation:
+			msgprint("""%s is already allocated to Employee: %s for Fiscal Year: %s.
+				Please refere Leave Allocation: \
+				<a href="#Form/Leave Allocation/%s">%s</a>""" % \
+				(self.doc.leave_type, self.doc.employee, self.doc.fiscal_year,
+				leave_allocation[0][0], leave_allocation[0][0]), raise_exception=1)
+			
+	def validate_new_leaves_allocated(self):
+		"""check if Total Leaves Allocated >= Leave Applications"""
+		self.doc.total_leaves_allocated = flt(self.doc.carry_forwarded_leaves) + \
+			flt(self.doc.new_leaves_allocated)
+		leaves_applied = self.get_leaves_applied(self.doc.fiscal_year)
+		if leaves_applied > self.doc.total_leaves_allocated:
+			expected_new_leaves = flt(self.doc.new_leaves_allocated) + \
+				(leaves_applied - self.doc.total_leaves_allocated)
+			msgprint("""Employee: %s has already applied for %s leaves.
+				Hence, New Leaves Allocated should be atleast %s""" % \
+				(self.doc.employee, leaves_applied, expected_new_leaves),
+				raise_exception=1)
+		
+	def get_leave_bal(self, prev_fyear):
+		return self.get_leaves_allocated(prev_fyear) - self.get_leaves_applied(prev_fyear)
+		
+	def get_leaves_applied(self, fiscal_year):
+		leaves_applied = sql("""select SUM(ifnull(total_leave_days, 0))
+			from `tabLeave Application` where employee=%s and leave_type=%s
+			and fiscal_year=%s and docstatus=1""", 
+			(self.doc.employee, self.doc.leave_type, fiscal_year))
+		return leaves_applied and flt(leaves_applied[0][0]) or 0
 
-# ************************************************ utilities *************************************************
-  # --------------
-  # get leave bal
-  # --------------
-  def get_leave_bal(self, prev_fyear):
-    # leaves allocates
-    tot_leaves_all = sql("select SUM(total_leaves_allocated) from `tabLeave Allocation` where employee = '%s' and leave_type = '%s' and fiscal_year = '%s' and docstatus = 1 and name != '%s'" % (self.doc.employee, self.doc.leave_type, prev_fyear, self.doc.name))
-    tot_leaves_all = tot_leaves_all and flt(tot_leaves_all[0][0]) or 0
+	def get_leaves_allocated(self, fiscal_year):
+		leaves_allocated = sql("""select SUM(ifnull(total_leaves_allocated, 0))
+			from `tabLeave Allocation` where employee=%s and leave_type=%s
+			and fiscal_year=%s and docstatus=1 and name!=%s""",
+			(self.doc.employee, self.doc.leave_type, fiscal_year, self.doc.name))
+		return leaves_allocated and flt(leaves_allocated[0][0]) or 0
+	
+	def allow_carry_forward(self):
+		"""check whether carry forward is allowed or not for this leave type"""
+		cf = sql("""select is_carry_forward from `tabLeave Type` where name = %s""",
+			self.doc.leave_type)
+		cf = cf and cint(cf[0][0]) or 0
+		if not cf:
+			set(self.doc,'carry_forward',0)
+			msgprint("Sorry! You cannot carry forward %s" % (self.doc.leave_type),
+				raise_exception=1)
 
-    # leaves applied
-    tot_leaves_app = sql("select SUM(total_leave_days) from `tabLeave Application` where employee = '%s' and leave_type = '%s' and fiscal_year = '%s' and docstatus = 1" % (self.doc.employee, self.doc.leave_type, prev_fyear))
-    tot_leaves_app = tot_leaves_app and flt(tot_leaves_app[0][0]) or 0
+	def get_carry_forwarded_leaves(self):
+		if self.doc.carry_forward:
+			self.allow_carry_forward()
+		prev_fiscal_year = sql("""select name from `tabFiscal Year`
+			where name < %s order by name desc limit 1""", self.doc.fiscal_year)
+		prev_fiscal_year = prev_fiscal_year and prev_fiscal_year[0][0] or ''
+		prev_bal = 0
+		if prev_fiscal_year and cint(self.doc.carry_forward) == 1:
+			prev_bal = self.get_leave_bal(prev_fiscal_year)
+		ret = {
+			'carry_forwarded_leaves': prev_bal,
+			'total_leaves_allocated': flt(prev_bal) + flt(self.doc.new_leaves_allocated)
+		}
+		return ret
 
-    return tot_leaves_all - tot_leaves_app
+	def get_total_allocated_leaves(self):
+		leave_det = self.get_carry_forwarded_leaves()
+		set(self.doc,'carry_forwarded_leaves',flt(leave_det['carry_forwarded_leaves']))
+		set(self.doc,'total_leaves_allocated',flt(leave_det['total_leaves_allocated']))
 
- 
-# ******************************************** client triggers ***********************************************
+	def check_for_leave_application(self):
+		exists = sql("""select name from `tabLeave Application`
+			where employee=%s and leave_type=%s and fiscal_year=%s and docstatus=1""",
+			(self.doc.employee, self.doc.leave_type, self.doc.fiscal_year))
+		if exists:
+			msgprint("""Cannot cancel this Leave Allocation as \
+				Employee : %s has already applied for %s. 
+				Please check Leave Application: \
+				<a href="#Form/Leave Application/%s">%s</a>""" % \
+				(self.doc.employee, self.doc.leave_type, exists[0][0], exists[0][0]))
+			raise Exception
 
-  # ------------------------------------------------------------------
-  # check whether carry forward is allowed or not for this leave type
-  # ------------------------------------------------------------------
-  def allow_carry_forward(self):
-    cf = sql("select is_carry_forward from `tabLeave Type` where name = %s" , self.doc.leave_type)
-    cf = cf and cint(cf[0][0]) or 0
-    if not cf:
-      set(self.doc,'carry_forward',0)
-      msgprint("Sorry ! You cannot carry forward %s" % (self.doc.leave_type))
-      raise Exception
-
-  # ---------------------------
-  # get carry forwarded leaves
-  # ---------------------------
-  def get_carry_forwarded_leaves(self):
-    if self.doc.carry_forward: self.allow_carry_forward()
-    prev_fiscal_year = sql("select name from `tabFiscal Year` where name < '%s' order by name desc limit 1" % (self.doc.fiscal_year))
-    prev_fiscal_year = prev_fiscal_year and prev_fiscal_year[0][0] or ''
-    ret = {}
-    prev_bal = 0
-    if prev_fiscal_year and cint(self.doc.carry_forward) == 1:
-      prev_bal = self.get_leave_bal(prev_fiscal_year)
-    ret = {
-      'carry_forwarded_leaves'  :  prev_bal,
-      'total_leaves_allocated'   :  flt(prev_bal) + flt(self.doc.new_leaves_allocated)
-    }
-    return ret
-
-
-# ********************************************** validate *****************************************************
-
-  # ---------------------------
-  # get total allocated leaves
-  # ---------------------------
-  def get_total_allocated_leaves(self):
-    leave_det = self.get_carry_forwarded_leaves()
-    set(self.doc,'carry_forwarded_leaves',flt(leave_det['carry_forwarded_leaves']))
-    set(self.doc,'total_leaves_allocated',flt(leave_det['total_leaves_allocated']))
-
-  # ------------------------------------------------------------------------------------
-  # validate leave (i.e. check whether leave for same type is already allocated or not)
-  # ------------------------------------------------------------------------------------
-  def validate_allocated_leave(self):
-    l = sql("select name from `tabLeave Allocation` where employee = '%s' and leave_type = '%s' and fiscal_year = '%s' and docstatus = 1" % (self.doc.employee, self.doc.leave_type, self.doc.fiscal_year)) 
-    l = l and l[0][0] or ''
-    if l:
-      msgprint("%s is allocated to Employee: %s for Fiscal Year : %s. Please refer Leave Allocation : %s" % (self.doc.leave_type, self.doc.employee, self.doc.fiscal_year, l))
-      raise Exception
-
-  # ---------
-  # validate
-  # ---------
-  def validate(self):
-    self.validate_allocated_leave()
-
-  # ----------
-  # on update
-  # ----------
-  def on_update(self):
-    self.get_total_allocated_leaves()
-
-
-# ********************************************** cancel ********************************************************
-
-  # -------------------------
-  # check for applied leaves
-  # -------------------------
-  def check_for_leave_application(self):
-    chk = sql("select name from `tabLeave Application` where employee = '%s' and leave_type = '%s' and fiscal_year = '%s' and docstatus = 1" % (self.doc.employee, self.doc.leave_type, self.doc.fiscal_year))
-    chk = chk and chk[0][0] or ''
-    if chk:
-      msgprint("Cannot cancel this Leave Allocation as Employee : %s has already applied for %s. Please check Leave Application : %s" % (self.doc.employee, self.doc.leave_type, chk))
-      raise Exception
-
-  # -------
-  # cancel
-  # -------
-  def on_cancel(self):
-    self.check_for_leave_application()
diff --git a/hr/doctype/leave_allocation/leave_allocation.txt b/hr/doctype/leave_allocation/leave_allocation.txt
index 287dc80..ed0e6e3 100644
--- a/hr/doctype/leave_allocation/leave_allocation.txt
+++ b/hr/doctype/leave_allocation/leave_allocation.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		u'creation': '2012-05-15 12:14:45',
+		u'creation': '2012-10-02 18:51:49',
 		u'docstatus': 0,
-		u'modified': '2012-10-02 11:21:31',
+		u'modified': '2012-10-17 12:51:44',
 		u'modified_by': u'Administrator',
 		u'owner': u'Administrator'
 	},
@@ -185,6 +185,7 @@
 
 	# DocField
 	{
+		'allow_on_submit': 1,
 		u'doctype': u'DocField',
 		'fieldname': u'new_leaves_allocated',
 		'fieldtype': u'Currency',
diff --git a/stock/page/stock_ageing/stock_ageing.js b/stock/page/stock_ageing/stock_ageing.js
index 87fbd58..3418e7f 100644
--- a/stock/page/stock_ageing/stock_ageing.js
+++ b/stock/page/stock_ageing/stock_ageing.js
@@ -129,13 +129,15 @@
 			
 			$.each(full_fifo_stack, function(i, batch) {
 				var batch_age = dateutil.get_diff(me.to_date, batch[2]);
-				age_qty += batch_age * batch[1];
-				total_qty += batch[1];
+				age_qty += batch_age * batch[0];
+				total_qty += batch[0];
 				max_age = Math.max(max_age, batch_age);
-				if(min_age===null) min_age=batch_age; else min_age = Math.min(min_age, batch_age)
+				if(min_age===null) min_age=batch_age;
+				else min_age = Math.min(min_age, batch_age);
 			});
 			
-			item.average_age = total_qty.toFixed(2)==0.0 ? 0 : (age_qty / total_qty).toFixed(2);
+			item.average_age = total_qty.toFixed(2)==0.0 ? 0 
+				: (age_qty / total_qty).toFixed(2);
 			item.earliest = max_age || 0.0;
 			item.latest = min_age || 0.0;
 		});
