Merge branch 'master' of github.com:webnotes/erpnext
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/selling/doctype/opportunity/opportunity.js b/selling/doctype/opportunity/opportunity.js
index 4a8abd3..17666ec 100644
--- a/selling/doctype/opportunity/opportunity.js
+++ b/selling/doctype/opportunity/opportunity.js
@@ -48,8 +48,6 @@
 		}
 	} 
 
-	// setup fetch
-	cur_frm.cscript.set_fetch();
 	cur_frm.cscript.make_communication_body();
 }
 
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;
 		});