patch function written for illegal cancelled entry
diff --git a/accounts/doctype/fiscal_year/fiscal_year.py b/accounts/doctype/fiscal_year/fiscal_year.py
index 6dd4f2c..6b2dfde 100644
--- a/accounts/doctype/fiscal_year/fiscal_year.py
+++ b/accounts/doctype/fiscal_year/fiscal_year.py
@@ -21,31 +21,34 @@
 	def __init__(self, d, dl):
 		self.doc, self.doclist = d,dl
 		
-	def repost(self):
+	def repost(self, account = ''):
 		if not self.doc.company:
 			msgprint("Please select company", raise_exception=1)
 			
 		if not in_transaction:
 			sql("start transaction")
 				
-		self.clear_account_balances()
-		self.create_account_balances()
-		self.update_opening()
-		self.post_entries()
+		self.clear_account_balances(account)
+		self.create_account_balances(account)
+		self.update_opening(account)
+		self.post_entries(account)
 		sql("commit")
-		msgprint("Account balance reposted")
+		
+		msg_cond = account and " and account: " + account or ""
+		msgprint("Account balance reposted for fiscal year: " + self.doc.name + msg_cond)
 
-	def clear_account_balances(self):
+	def clear_account_balances(self, account = ''):
 		# balances clear - `tabAccount Balance` for fiscal year
-		sql("update `tabAccount Balance` set opening=0, balance=0, debit=0, credit=0 where fiscal_year=%s", self.doc.name)
+		cond = account and (" and account = '" + account + "'") or ''
+		sql("update `tabAccount Balance` set opening=0, balance=0, debit=0, credit=0 where fiscal_year=%s %s", (self.doc.name, cond))
 
-	def create_account_balances(self):
+	def create_account_balances(self, account = ''):
 		# get periods
 		period_list = self.get_period_list()
 		cnt = 0
 		
 		# get accounts
-		al = sql("select name from tabAccount")
+		al = account and [[account]] or sql("select name from tabAccount")
 		
 		for a in al:
 			# check
@@ -80,9 +83,14 @@
 		return periods
 
 	# ====================================================================================
-	def update_opening(self):
-		# set opening from last year closing
-		abl = sql("select t1.account, t1.balance from `tabAccount Balance` t1, tabAccount t2 where t1.period=%s and t2.company=%s and ifnull(t2.is_pl_account, 'No') = 'No' and t1.account = t2.name for update", (self.doc.past_year, self.doc.company))
+	def update_opening(self, account = ''):
+		"""
+			set opening from last year closing
+		
+		"""
+		cond = account and (" and t2.name = '" + account + "'") or ''
+		
+		abl = sql("select t1.account, t1.balance from `tabAccount Balance` t1, tabAccount t2 where t1.period= '%s' and t2.company= '%s' and ifnull(t2.is_pl_account, 'No') = 'No' and t1.account = t2.name %s for update" % (self.doc.past_year, self.doc.company, cond))
 		
 		cnt = 0
 		for ab in abl:
@@ -100,10 +108,11 @@
 		return sql("select debit_or_credit, lft, rgt, is_pl_account from tabAccount where name=%s", account)[0]
 
 	# ====================================================================================
-	def post_entries(self):
+	def post_entries(self, account = ''):
 		sql("LOCK TABLE `tabGL Entry` WRITE")
+		cond = account and (" and account = '" + account + "'") or ''
 		# post each gl entry (batch or complete)
-		gle = sql("select name, account, debit, credit, is_opening, posting_date from `tabGL Entry` where fiscal_year=%s and ifnull(is_cancelled,'No')='No' and company=%s", (self.doc.name, self.doc.company))
+		gle = sql("select name, account, debit, credit, is_opening, posting_date from `tabGL Entry` where fiscal_year=%s and ifnull(is_cancelled,'No')='No' and company=%s %s", (self.doc.name, self.doc.company, cond))
 		account_details = {}
 
 		cnt = 0
@@ -153,7 +162,6 @@
 		sql("UNLOCK TABLES")
 
 
-
 	# Clear PV/RV outstanding
 	# ====================================================================================
 	def clear_outstanding(self):
diff --git a/accounts/doctype/gl_control/gl_control.py b/accounts/doctype/gl_control/gl_control.py
index d88b618..ecbdd29 100644
--- a/accounts/doctype/gl_control/gl_control.py
+++ b/accounts/doctype/gl_control/gl_control.py
@@ -8,7 +8,6 @@
 from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
 from webnotes import session, form, is_testing, msgprint, errprint
 
-set = webnotes.conn.set
 sql = webnotes.conn.sql
 get_value = webnotes.conn.get_value
 in_transaction = webnotes.conn.in_transaction
@@ -18,378 +17,378 @@
 from utilities.transaction_base import TransactionBase
 
 class DocType:
-  def __init__(self,d,dl):
-    self.doc, self.doclist = d, dl
-    self.entries = []
+	def __init__(self,d,dl):
+		self.doc, self.doclist = d, dl
+		self.entries = []
 
-  # Get Company List
-  # ----------------
-  def get_companies(self,arg=''):
-    #d = get_defaults()
-    ret = sql("select name, abbr from tabCompany where docstatus != 2")
-    #pl = {}
-    #for r in ret:
-    #  inc = get_value('Account','Income - '+r[1], 'balance')
-    #  exp = get_value('Account','Expenses - '+r[1], 'balance')
-    #  pl[r[0]] = flt(flt(inc) - flt(exp))    
-    return {'cl':[r[0] for r in ret]}#, 'pl':pl}
-    
-  def get_company_currency(self,arg=''):      
-    dcc = TransactionBase().get_company_currency(arg)    
-    return dcc
+	# Get Company List
+	# ----------------
+	def get_companies(self,arg=''):
+		#d = get_defaults()
+		ret = sql("select name, abbr from tabCompany where docstatus != 2")
+		#pl = {}
+		#for r in ret:
+		#	inc = get_value('Account','Income - '+r[1], 'balance')
+		#	exp = get_value('Account','Expenses - '+r[1], 'balance')
+		#	pl[r[0]] = flt(flt(inc) - flt(exp))		
+		return {'cl':[r[0] for r in ret]}#, 'pl':pl}
+		
+	def get_company_currency(self,arg=''):			
+		dcc = TransactionBase().get_company_currency(arg)		
+		return dcc
 
-  # Get current balance
-  # --------------------
-  def get_bal(self,arg):
-    ac, fy = arg.split('~~~')
-    det = sql("select t1.balance, t2.debit_or_credit from `tabAccount Balance` t1, `tabAccount` t2 where t1.period = %s and t2.name=%s and t1.account = t2.name", (fy, ac))
-    bal = det and flt(det[0][0]) or 0
-    dr_or_cr = det and flt(det[0][1]) or ''
-    return fmt_money(bal) + ' ' + dr_or_cr
+	# Get current balance
+	# --------------------
+	def get_bal(self,arg):
+		ac, fy = arg.split('~~~')
+		det = sql("select t1.balance, t2.debit_or_credit from `tabAccount Balance` t1, `tabAccount` t2 where t1.period = %s and t2.name=%s and t1.account = t2.name", (fy, ac))
+		bal = det and flt(det[0][0]) or 0
+		dr_or_cr = det and flt(det[0][1]) or ''
+		return fmt_money(bal) + ' ' + dr_or_cr
 
-  def get_period_balance(self,arg):
-    acc, f, t = arg.split('~~~')
-    c, fy = '', get_defaults()['fiscal_year']
+	def get_period_balance(self,arg):
+		acc, f, t = arg.split('~~~')
+		c, fy = '', get_defaults()['fiscal_year']
 
-    det = sql("select debit_or_credit, lft, rgt, is_pl_account from tabAccount where name=%s", acc)
-    if f: c += (' and t1.posting_date >= "%s"' % f)
-    if t: c += (' and t1.posting_date <= "%s"' % t)
-    bal = sql("select sum(ifnull(t1.debit,0))-sum(ifnull(t1.credit,0)) from `tabGL Entry` t1 where t1.account='%s' and ifnull(is_opening, 'No') = 'No' %s" % (acc, c))
-    bal = bal and flt(bal[0][0]) or 0
+		det = sql("select debit_or_credit, lft, rgt, is_pl_account from tabAccount where name=%s", acc)
+		if f: c += (' and t1.posting_date >= "%s"' % f)
+		if t: c += (' and t1.posting_date <= "%s"' % t)
+		bal = sql("select sum(ifnull(t1.debit,0))-sum(ifnull(t1.credit,0)) from `tabGL Entry` t1 where t1.account='%s' and ifnull(is_opening, 'No') = 'No' %s" % (acc, c))
+		bal = bal and flt(bal[0][0]) or 0
 
-    if det[0][0] != 'Debit':
-      bal = (-1) * bal
+		if det[0][0] != 'Debit':
+			bal = (-1) * bal
 
-    # add opening for balance sheet accounts
-    if det[0][3] == 'No':
-      opening = flt(sql("select opening from `tabAccount Balance` where account=%s and period=%s", (acc, fy))[0][0])
-      bal = bal + opening
+		# add opening for balance sheet accounts
+		if det[0][3] == 'No':
+			opening = flt(sql("select opening from `tabAccount Balance` where account=%s and period=%s", (acc, fy))[0][0])
+			bal = bal + opening
 
-    return flt(bal)
+		return flt(bal)
 
 
-  def get_period_difference(self,arg, cost_center =''):
-    # used in General Ledger Page Report
-    # used for Budget where cost center passed as extra argument
-    acc, f, t = arg.split('~~~')
-    c, fy = '', get_defaults()['fiscal_year']
+	def get_period_difference(self,arg, cost_center =''):
+		# used in General Ledger Page Report
+		# used for Budget where cost center passed as extra argument
+		acc, f, t = arg.split('~~~')
+		c, fy = '', get_defaults()['fiscal_year']
 
-    det = sql("select debit_or_credit, lft, rgt, is_pl_account from tabAccount where name=%s", acc)
-    if f: c += (' and t1.posting_date >= "%s"' % f)
-    if t: c += (' and t1.posting_date <= "%s"' % t)
-    if cost_center: c += (' and t1.cost_center = "%s"' % cost_center)
-    bal = sql("select sum(ifnull(t1.debit,0))-sum(ifnull(t1.credit,0)) from `tabGL Entry` t1 where t1.account='%s' %s" % (acc, c))
-    bal = bal and flt(bal[0][0]) or 0
+		det = sql("select debit_or_credit, lft, rgt, is_pl_account from tabAccount where name=%s", acc)
+		if f: c += (' and t1.posting_date >= "%s"' % f)
+		if t: c += (' and t1.posting_date <= "%s"' % t)
+		if cost_center: c += (' and t1.cost_center = "%s"' % cost_center)
+		bal = sql("select sum(ifnull(t1.debit,0))-sum(ifnull(t1.credit,0)) from `tabGL Entry` t1 where t1.account='%s' %s" % (acc, c))
+		bal = bal and flt(bal[0][0]) or 0
 
-    if det[0][0] != 'Debit':
-      bal = (-1) * bal
+		if det[0][0] != 'Debit':
+			bal = (-1) * bal
 
-    return flt(bal)
+		return flt(bal)
 
-  # Get Children (for tree)
-  # -----------------------
-  def get_cl(self, arg):
+	# Get Children (for tree)
+	# -----------------------
+	def get_cl(self, arg):
 
-    fy = get_defaults()['fiscal_year']
-    parent, parent_acc_name, company, type = arg.split(',')
-    
-    # get children account details
-    if type=='Account':
+		fy = get_defaults()['fiscal_year']
+		parent, parent_acc_name, company, type = arg.split(',')
+		
+		# get children account details
+		if type=='Account':
 
-      if parent=='Root Node':
+			if parent=='Root Node':
 
-        cl = sql("select t1.name, t1.group_or_ledger, t1.debit_or_credit, t2.balance, t1.account_name from tabAccount t1, `tabAccount Balance` t2 where ifnull(t1.parent_account, '') = '' and t1.docstatus != 2 and t1.company=%s and t1.name = t2.account and t2.period = %s order by t1.name asc", (company, fy),as_dict=1)
-      else:
-        cl = sql("select t1.name, t1.group_or_ledger, t1.debit_or_credit, t2.balance, t1.account_name from tabAccount t1, `tabAccount Balance` t2 where ifnull(t1.parent_account, '')=%s and t1.docstatus != 2 and t1.company=%s and t1.name = t2.account and t2.period = %s order by t1.name asc",(parent, company, fy) ,as_dict=1)
+				cl = sql("select t1.name, t1.group_or_ledger, t1.debit_or_credit, t2.balance, t1.account_name from tabAccount t1, `tabAccount Balance` t2 where ifnull(t1.parent_account, '') = '' and t1.docstatus != 2 and t1.company=%s and t1.name = t2.account and t2.period = %s order by t1.name asc", (company, fy),as_dict=1)
+			else:
+				cl = sql("select t1.name, t1.group_or_ledger, t1.debit_or_credit, t2.balance, t1.account_name from tabAccount t1, `tabAccount Balance` t2 where ifnull(t1.parent_account, '')=%s and t1.docstatus != 2 and t1.company=%s and t1.name = t2.account and t2.period = %s order by t1.name asc",(parent, company, fy) ,as_dict=1)
 
-      # remove Decimals
-      for c in cl: c['balance'] = flt(c['balance'])
-      
-    # get children cost center details
-    elif type=='Cost Center':
-      if parent=='Root Node':
-        cl = sql("select name,group_or_ledger, cost_center_name from `tabCost Center`  where ifnull(parent_cost_center, '')='' and docstatus != 2 and company_name=%s order by name asc",(company),as_dict=1)
-      else:
-        cl = sql("select name,group_or_ledger,cost_center_name from `tabCost Center` where ifnull(parent_cost_center, '')=%s and docstatus != 2 and company_name=%s order by name asc",(parent,company),as_dict=1)
-    return {'parent':parent, 'parent_acc_name':parent_acc_name, 'cl':cl}
-    
-  # Add a new account
-  # -----------------
-  def add_ac(self,arg):
-    arg = eval(arg)
-    ac = Document('Account')
-    for d in arg.keys():
-      ac.fields[d] = arg[d]
-    ac.old_parent = ''      
-    ac_obj = get_obj(doc=ac)
-    ac_obj.validate()
-    ac_obj.doc.save(1)
-    ac_obj.on_update()
+			# remove Decimals
+			for c in cl: c['balance'] = flt(c['balance'])
+			
+		# get children cost center details
+		elif type=='Cost Center':
+			if parent=='Root Node':
+				cl = sql("select name,group_or_ledger, cost_center_name from `tabCost Center`	where ifnull(parent_cost_center, '')='' and docstatus != 2 and company_name=%s order by name asc",(company),as_dict=1)
+			else:
+				cl = sql("select name,group_or_ledger,cost_center_name from `tabCost Center` where ifnull(parent_cost_center, '')=%s and docstatus != 2 and company_name=%s order by name asc",(parent,company),as_dict=1)
+		return {'parent':parent, 'parent_acc_name':parent_acc_name, 'cl':cl}
+		
+	# Add a new account
+	# -----------------
+	def add_ac(self,arg):
+		arg = eval(arg)
+		ac = Document('Account')
+		for d in arg.keys():
+			ac.fields[d] = arg[d]
+		ac.old_parent = ''			
+		ac_obj = get_obj(doc=ac)
+		ac_obj.validate()
+		ac_obj.doc.save(1)
+		ac_obj.on_update()
 
-    return ac_obj.doc.name
-  
-  # Add a new cost center
-  #----------------------
-  def add_cc(self,arg):
-    arg = eval(arg)
-    cc = Document('Cost Center')
-    # map fields
-    for d in arg.keys():
-      cc.fields[d] = arg[d]
-    # map company abbr
-    other_info = sql("select company_abbr from `tabCost Center` where name='%s'"%arg['parent_cost_center'])
-    cc.company_abbr = other_info and other_info[0][0] or arg['company_abbr']
-    
-    cc_obj = get_obj(doc=cc)
-    cc_obj.validate()
-    cc_obj.doc.save(1)
-    cc_obj.on_update()
+		return ac_obj.doc.name
+	
+	# Add a new cost center
+	#----------------------
+	def add_cc(self,arg):
+		arg = eval(arg)
+		cc = Document('Cost Center')
+		# map fields
+		for d in arg.keys():
+			cc.fields[d] = arg[d]
+		# map company abbr
+		other_info = sql("select company_abbr from `tabCost Center` where name='%s'"%arg['parent_cost_center'])
+		cc.company_abbr = other_info and other_info[0][0] or arg['company_abbr']
+		
+		cc_obj = get_obj(doc=cc)
+		cc_obj.validate()
+		cc_obj.doc.save(1)
+		cc_obj.on_update()
 
-    return cc_obj.doc.name
-    
-    
-  # Get field values from the voucher
-  #------------------------------------------
-  def get_val(self, src, d, parent=None):
-    if not src: 
-      return None
-    if src.startswith('parent:'):
-      return parent.fields[src.split(':')[1]]
-    elif src.startswith('value:'):
-      return eval(src.split(':')[1])
-    elif src:
-      return d.fields.get(src)  
-      
-  def check_if_in_list(self, le):
-    for e in self.entries:
-      if e.account == le.account and (cstr(e.against_voucher)==cstr(le.against_voucher)) and (cstr(e.against_voucher_type)==cstr(le.against_voucher_type)) and (cstr(e.cost_center)==cstr(le.cost_center)):
-        return [e]
-    return 0
-  
-  # Make a dictionary(le) for every gl entry and append to a list(self.entries)
-  #----------------------------------------------------------------------------
-  def make_single_entry(self,parent,d,le_map,cancel, merge_entries):
-    if self.get_val(le_map['account'], d, parent) and (self.get_val(le_map['debit'], d, parent) or self.get_val(le_map['credit'], d, parent)):
-      flist = ['account','cost_center','against','debit','credit','remarks','voucher_type','voucher_no','transaction_date','posting_date','fiscal_year','against_voucher','against_voucher_type','company','is_opening', 'aging_date']
+		return cc_obj.doc.name
+		
+		
+	# Get field values from the voucher
+	#------------------------------------------
+	def get_val(self, src, d, parent=None):
+		if not src: 
+			return None
+		if src.startswith('parent:'):
+			return parent.fields[src.split(':')[1]]
+		elif src.startswith('value:'):
+			return eval(src.split(':')[1])
+		elif src:
+			return d.fields.get(src)	
+			
+	def check_if_in_list(self, le):
+		for e in self.entries:
+			if e.account == le.account and (cstr(e.against_voucher)==cstr(le.against_voucher)) and (cstr(e.against_voucher_type)==cstr(le.against_voucher_type)) and (cstr(e.cost_center)==cstr(le.cost_center)):
+				return [e]
+		return 0
+	
+	# Make a dictionary(le) for every gl entry and append to a list(self.entries)
+	#----------------------------------------------------------------------------
+	def make_single_entry(self,parent,d,le_map,cancel, merge_entries):
+		if self.get_val(le_map['account'], d, parent) and (self.get_val(le_map['debit'], d, parent) or self.get_val(le_map['credit'], d, parent)):
+			flist = ['account','cost_center','against','debit','credit','remarks','voucher_type','voucher_no','transaction_date','posting_date','fiscal_year','against_voucher','against_voucher_type','company','is_opening', 'aging_date']
 
-      # Check budget before gl entry
-      #check budget only if account is expense account
-      is_expense_acct = sql("select name from tabAccount where is_pl_account='Yes' and debit_or_credit='Debit' and name=%s",self.get_val(le_map['account'], d, parent))
-      if is_expense_acct and self.get_val(le_map['cost_center'], d, parent):
-        get_obj('Budget Control').check_budget([self.get_val(le_map[k], d, parent) for k in flist if k in ['account','cost_center','debit','credit','posting_date','fiscal_year','company']],cancel)
-      
-      # Create new GL entry object and map values
-      le = Document('GL Entry')
-      for k in flist:
-        le.fields[k] = self.get_val(le_map[k], d, parent)
-            
-      # if there is already an entry in this account then just add it to that entry
-      same_head = self.check_if_in_list(le)
-      if same_head and merge_entries:
-        same_head = same_head[0]
-        same_head.debit  = flt(same_head.debit)  + flt(le.debit)
-        same_head.credit = flt(same_head.credit) + flt(le.credit)
-      else:
-        self.entries.append(le)
-    
-  # Save GL Entries     
-  # ----------------
-  def save_entries(self, cancel, adv_adj, update_outstanding):
-    for le in self.entries:
-      # cancel
-      if cancel or flt(le.debit) < 0 or flt(le.credit) < 0:
-        tmp=le.debit
-        le.debit, le.credit = abs(flt(le.credit)), abs(flt(tmp))
-      
+			# Check budget before gl entry
+			#check budget only if account is expense account
+			is_expense_acct = sql("select name from tabAccount where is_pl_account='Yes' and debit_or_credit='Debit' and name=%s",self.get_val(le_map['account'], d, parent))
+			if is_expense_acct and self.get_val(le_map['cost_center'], d, parent):
+				get_obj('Budget Control').check_budget([self.get_val(le_map[k], d, parent) for k in flist if k in ['account','cost_center','debit','credit','posting_date','fiscal_year','company']],cancel)
+			
+			# Create new GL entry object and map values
+			le = Document('GL Entry')
+			for k in flist:
+				le.fields[k] = self.get_val(le_map[k], d, parent)
+						
+			# if there is already an entry in this account then just add it to that entry
+			same_head = self.check_if_in_list(le)
+			if same_head and merge_entries:
+				same_head = same_head[0]
+				same_head.debit	= flt(same_head.debit)	+ flt(le.debit)
+				same_head.credit = flt(same_head.credit) + flt(le.credit)
+			else:
+				self.entries.append(le)
+		
+	# Save GL Entries		 
+	# ----------------
+	def save_entries(self, cancel, adv_adj, update_outstanding):
+		for le in self.entries:
+			# cancel
+			if cancel or flt(le.debit) < 0 or flt(le.credit) < 0:
+				tmp=le.debit
+				le.debit, le.credit = abs(flt(le.credit)), abs(flt(tmp))
+			
 
-      le_obj = get_obj(doc=le)
-      # validate except on_cancel
-      if not cancel:
-        le_obj.validate()
+			le_obj = get_obj(doc=le)
+			# validate except on_cancel
+			if not cancel:
+				le_obj.validate()
 
-      # save
-      le.save(1)
-      le_obj.on_update(adv_adj, cancel, update_outstanding)
+			# save
+			le.save(1)
+			le_obj.on_update(adv_adj, cancel, update_outstanding)
 
-      # update total debit / credit
-      self.td += flt(le.debit)
-      self.tc += flt(le.credit)
-      
-  # Make Multiple Entries
-  # ---------------------
-  def make_gl_entries(self, doc, doclist, cancel=0, adv_adj = 0, use_mapper='', merge_entries = 1, update_outstanding='Yes'):
-    # get entries  
-    le_map_list = sql("select * from `tabGL Mapper Detail` where parent = %s", use_mapper or doc.doctype, as_dict=1)
-    self.td, self.tc = 0.0, 0.0
-    for le_map in le_map_list:
-      if le_map['table_field']:
-        for d in getlist(doclist,le_map['table_field']):
-          # purchase_tax_details is the table of other charges in purchase cycle
-          if le_map['table_field'] != 'purchase_tax_details' or (le_map['table_field'] == 'purchase_tax_details' and d.fields.get('category') != 'For Valuation'):
-            self.make_single_entry(doc,d,le_map,cancel, merge_entries)
-      else:
-        self.make_single_entry(None,doc,le_map,cancel, merge_entries)
-        
-    # save entries
-    self.save_entries(cancel, adv_adj, update_outstanding)
-    
-    # check total debit / credit
-    # Due to old wrong entries (total debit != total credit) some voucher could be cancelled
-    if abs(self.td - self.tc) > 0.001 and not cancel:
-      msgprint("Debit and Credit not equal for this voucher: Diff (Debit) is %s" % (self.td-self.tc))
-      raise Exception
+			# update total debit / credit
+			self.td += flt(le.debit)
+			self.tc += flt(le.credit)
+			
+	# Make Multiple Entries
+	# ---------------------
+	def make_gl_entries(self, doc, doclist, cancel=0, adv_adj = 0, use_mapper='', merge_entries = 1, update_outstanding='Yes'):
+		# get entries	
+		le_map_list = sql("select * from `tabGL Mapper Detail` where parent = %s", use_mapper or doc.doctype, as_dict=1)
+		self.td, self.tc = 0.0, 0.0
+		for le_map in le_map_list:
+			if le_map['table_field']:
+				for d in getlist(doclist,le_map['table_field']):
+					# purchase_tax_details is the table of other charges in purchase cycle
+					if le_map['table_field'] != 'purchase_tax_details' or (le_map['table_field'] == 'purchase_tax_details' and d.fields.get('category') != 'For Valuation'):
+						self.make_single_entry(doc,d,le_map,cancel, merge_entries)
+			else:
+				self.make_single_entry(None,doc,le_map,cancel, merge_entries)
+				
+		# save entries
+		self.save_entries(cancel, adv_adj, update_outstanding)
+		
+		# check total debit / credit
+		# Due to old wrong entries (total debit != total credit) some voucher could be cancelled
+		if abs(self.td - self.tc) > 0.001 and not cancel:
+			msgprint("Debit and Credit not equal for this voucher: Diff (Debit) is %s" % (self.td-self.tc))
+			raise Exception
 
-    # set as cancelled
-    if cancel:
-      vt, vn = self.get_val(le_map['voucher_type'],  doc, doc), self.get_val(le_map['voucher_no'],  doc, doc)
-      sql("update `tabGL Entry` set is_cancelled='Yes' where voucher_type=%s and voucher_no=%s", (vt, vn))
+		# set as cancelled
+		if cancel:
+			vt, vn = self.get_val(le_map['voucher_type'],	doc, doc), self.get_val(le_map['voucher_no'],	doc, doc)
+			sql("update `tabGL Entry` set is_cancelled='Yes' where voucher_type=%s and voucher_no=%s", (vt, vn))
 
-  # Get account balance on any date
-  # -------------------------------
-  def get_as_on_balance(self, account_name, fiscal_year, as_on, credit_or_debit, lft, rgt):
-    # initialization
-    det = sql("select start_date, opening from `tabAccount Balance` where period = %s and account = %s", (fiscal_year, account_name))
-    from_date, opening, debit_bal, credit_bal, closing_bal = det and det[0][0] or getdate(nowdate()), det and flt(det[0][1]) or 0, 0, 0, det and flt(det[0][1]) or 0
+	# Get account balance on any date
+	# -------------------------------
+	def get_as_on_balance(self, account_name, fiscal_year, as_on, credit_or_debit, lft, rgt):
+		# initialization
+		det = sql("select start_date, opening from `tabAccount Balance` where period = %s and account = %s", (fiscal_year, account_name))
+		from_date, opening, debit_bal, credit_bal, closing_bal = det and det[0][0] or getdate(nowdate()), det and flt(det[0][1]) or 0, 0, 0, det and flt(det[0][1]) or 0
 
-    # prev month closing
-    prev_month_det = sql("select end_date, debit, credit, balance from `tabAccount Balance` where account = %s and end_date <= %s and fiscal_year = %s order by end_date desc limit 1", (account_name, as_on, fiscal_year))
-    if prev_month_det:
-      from_date = getdate(add_days(prev_month_det[0][0].strftime('%Y-%m-%d'), 1))
-      opening = 0
-      debit_bal = flt(prev_month_det[0][1])
-      credit_bal = flt(prev_month_det[0][2])
-      closing_bal = flt(prev_month_det[0][3])
+		# prev month closing
+		prev_month_det = sql("select end_date, debit, credit, balance from `tabAccount Balance` where account = %s and end_date <= %s and fiscal_year = %s order by end_date desc limit 1", (account_name, as_on, fiscal_year))
+		if prev_month_det:
+			from_date = getdate(add_days(prev_month_det[0][0].strftime('%Y-%m-%d'), 1))
+			opening = 0
+			debit_bal = flt(prev_month_det[0][1])
+			credit_bal = flt(prev_month_det[0][2])
+			closing_bal = flt(prev_month_det[0][3])
 
-    # curr month transaction
-    if getdate(as_on) >= from_date:
-      curr_month_bal = sql("select SUM(t1.debit), SUM(t1.credit) from `tabGL Entry` t1, `tabAccount` t2 WHERE t1.posting_date >= %s AND t1.posting_date <= %s and ifnull(t1.is_opening, 'No') = 'No' AND t1.account = t2.name AND t2.lft >= %s AND t2.rgt <= %s and ifnull(t1.is_cancelled, 'No') = 'No'", (from_date, as_on, lft, rgt))
-      curr_debit_amt, curr_credit_amt = flt(curr_month_bal[0][0]), flt(curr_month_bal[0][1])
-      debit_bal = curr_month_bal and debit_bal + curr_debit_amt or debit_bal
-      credit_bal = curr_month_bal and credit_bal + curr_credit_amt or credit_bal
+		# curr month transaction
+		if getdate(as_on) >= from_date:
+			curr_month_bal = sql("select SUM(t1.debit), SUM(t1.credit) from `tabGL Entry` t1, `tabAccount` t2 WHERE t1.posting_date >= %s AND t1.posting_date <= %s and ifnull(t1.is_opening, 'No') = 'No' AND t1.account = t2.name AND t2.lft >= %s AND t2.rgt <= %s and ifnull(t1.is_cancelled, 'No') = 'No'", (from_date, as_on, lft, rgt))
+			curr_debit_amt, curr_credit_amt = flt(curr_month_bal[0][0]), flt(curr_month_bal[0][1])
+			debit_bal = curr_month_bal and debit_bal + curr_debit_amt or debit_bal
+			credit_bal = curr_month_bal and credit_bal + curr_credit_amt or credit_bal
 
-      if credit_or_debit == 'Credit':
-        curr_debit_amt, curr_credit_amt = -1*flt(curr_month_bal[0][0]), -1*flt(curr_month_bal[0][1])
-      closing_bal = closing_bal + curr_debit_amt - curr_credit_amt
+			if credit_or_debit == 'Credit':
+				curr_debit_amt, curr_credit_amt = -1*flt(curr_month_bal[0][0]), -1*flt(curr_month_bal[0][1])
+			closing_bal = closing_bal + curr_debit_amt - curr_credit_amt
 
-    return flt(debit_bal), flt(credit_bal), flt(closing_bal)
+		return flt(debit_bal), flt(credit_bal), flt(closing_bal)
 
 
-  # ADVANCE ALLOCATION
-  #-------------------
-  def get_advances(self, obj, account_head, table_name,table_field_name, dr_or_cr):
-    jv_detail = sql("select t1.name, t1.remark, t2.%s, t2.name, t1.ded_amount from `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2 where t1.name = t2.parent and (t2.against_voucher is null or t2.against_voucher = '') and (t2.against_invoice is null or t2.against_invoice = '') and (t2.against_jv is null or t2.against_jv = '') and t2.account = '%s' and t2.is_advance = 'Yes' and t1.docstatus = 1 order by t1.voucher_date " % (dr_or_cr,account_head))
-    # clear advance table
-    obj.doc.clear_table(obj.doclist,table_field_name)
-    # Create advance table
-    for d in jv_detail:
-      add = addchild(obj.doc, table_field_name, table_name, 1, obj.doclist)
-      add.journal_voucher = d[0]
-      add.jv_detail_no = d[3]
-      add.remarks = d[1]
-      add.advance_amount = flt(d[2])
-      add.allocate_amount = 0
-      if table_name == 'Advance Allocation Detail':
-        add.tds_amount = flt(d[4])
-  
-  # Clear rows which is not adjusted
-  #-------------------------------------
-  def clear_advances(self, obj,table_name,table_field_name):
-    for d in getlist(obj.doclist,table_field_name):
-      if not flt(d.allocated_amount):
-        sql("update `tab%s` set parent = '' where name = '%s' and parent = '%s'" % (table_name, d.name, d.parent))
-        d.parent = ''
-          
-  # Update aginst document in journal voucher
-  #------------------------------------------
-  def update_against_document_in_jv(self, obj, table_field_name, against_document_no, against_document_doctype, account_head, dr_or_cr,doctype):
-    for d in getlist(obj.doclist, table_field_name):
-      self.validate_jv_entry(d, account_head, dr_or_cr)
-      if flt(d.advance_amount) == flt(d.allocated_amount):
-        # cancel JV
-        jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children=1)
-        get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel =1, adv_adj =1)
+	# ADVANCE ALLOCATION
+	#-------------------
+	def get_advances(self, obj, account_head, table_name,table_field_name, dr_or_cr):
+		jv_detail = sql("select t1.name, t1.remark, t2.%s, t2.name, t1.ded_amount from `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2 where t1.name = t2.parent and (t2.against_voucher is null or t2.against_voucher = '') and (t2.against_invoice is null or t2.against_invoice = '') and (t2.against_jv is null or t2.against_jv = '') and t2.account = '%s' and t2.is_advance = 'Yes' and t1.docstatus = 1 order by t1.voucher_date " % (dr_or_cr,account_head))
+		# clear advance table
+		obj.doc.clear_table(obj.doclist,table_field_name)
+		# Create advance table
+		for d in jv_detail:
+			add = addchild(obj.doc, table_field_name, table_name, 1, obj.doclist)
+			add.journal_voucher = d[0]
+			add.jv_detail_no = d[3]
+			add.remarks = d[1]
+			add.advance_amount = flt(d[2])
+			add.allocate_amount = 0
+			if table_name == 'Advance Allocation Detail':
+				add.tds_amount = flt(d[4])
+	
+	# Clear rows which is not adjusted
+	#-------------------------------------
+	def clear_advances(self, obj,table_name,table_field_name):
+		for d in getlist(obj.doclist,table_field_name):
+			if not flt(d.allocated_amount):
+				sql("update `tab%s` set parent = '' where name = '%s' and parent = '%s'" % (table_name, d.name, d.parent))
+				d.parent = ''
+					
+	# Update aginst document in journal voucher
+	#------------------------------------------
+	def update_against_document_in_jv(self, obj, table_field_name, against_document_no, against_document_doctype, account_head, dr_or_cr,doctype):
+		for d in getlist(obj.doclist, table_field_name):
+			self.validate_jv_entry(d, account_head, dr_or_cr)
+			if flt(d.advance_amount) == flt(d.allocated_amount):
+				# cancel JV
+				jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children=1)
+				get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel =1, adv_adj =1)
 
-        # update ref in JV Detail
-        sql("update `tabJournal Voucher Detail` set %s = '%s' where name = '%s'" % (doctype=='Payable Voucher' and 'against_voucher' or 'against_invoice', cstr(against_document_no), d.jv_detail_no))
-        
-        # re-submit JV
-        jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children =1)
-        get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel = 0, adv_adj =1)
+				# update ref in JV Detail
+				sql("update `tabJournal Voucher Detail` set %s = '%s' where name = '%s'" % (doctype=='Payable Voucher' and 'against_voucher' or 'against_invoice', cstr(against_document_no), d.jv_detail_no))
+				
+				# re-submit JV
+				jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children =1)
+				get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel = 0, adv_adj =1)
 
-      elif flt(d.advance_amount) > flt(d.allocated_amount):
-        # cancel JV
-        jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children=1)
-        get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel =1, adv_adj = 1)
-        
-        # add extra entries
-        self.add_extra_entry(jv_obj, d.journal_voucher, d.jv_detail_no, flt(d.allocated_amount), account_head, doctype, dr_or_cr, against_document_no)
-        
-        # re-submit JV
-        jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children =1)
-        get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel = 0, adv_adj = 1)
-      else:
-        msgprint("Allocation amount cannot be greater than advance amount")
-        raise Exception
-  
-  # Add extra row in jv detail for unadjusted amount
-  #--------------------------------------------------
-  def add_extra_entry(self,jv_obj,jv,jv_detail_no, allocate, account_head, doctype, dr_or_cr, against_document_no):
-    # get old entry details
-    
-    jvd = sql("select %s, cost_center, balance, against_account from `tabJournal Voucher Detail` where name = '%s'" % (dr_or_cr,jv_detail_no))
-    advance = jvd and flt(jvd[0][0]) or 0
-    balance = flt(advance) - flt(allocate)
+			elif flt(d.advance_amount) > flt(d.allocated_amount):
+				# cancel JV
+				jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children=1)
+				get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel =1, adv_adj = 1)
+				
+				# add extra entries
+				self.add_extra_entry(jv_obj, d.journal_voucher, d.jv_detail_no, flt(d.allocated_amount), account_head, doctype, dr_or_cr, against_document_no)
+				
+				# re-submit JV
+				jv_obj = get_obj('Journal Voucher', d.journal_voucher, with_children =1)
+				get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel = 0, adv_adj = 1)
+			else:
+				msgprint("Allocation amount cannot be greater than advance amount")
+				raise Exception
+	
+	# Add extra row in jv detail for unadjusted amount
+	#--------------------------------------------------
+	def add_extra_entry(self,jv_obj,jv,jv_detail_no, allocate, account_head, doctype, dr_or_cr, against_document_no):
+		# get old entry details
+		
+		jvd = sql("select %s, cost_center, balance, against_account from `tabJournal Voucher Detail` where name = '%s'" % (dr_or_cr,jv_detail_no))
+		advance = jvd and flt(jvd[0][0]) or 0
+		balance = flt(advance) - flt(allocate)
 
-    # update old entry
-    sql("update `tabJournal Voucher Detail` set %s = '%s', %s = '%s' where name = '%s'" % (dr_or_cr, flt(allocate), doctype == "Payable Voucher" and 'against_voucher' or 'against_invoice',cstr(against_document_no), jv_detail_no))
+		# update old entry
+		sql("update `tabJournal Voucher Detail` set %s = '%s', %s = '%s' where name = '%s'" % (dr_or_cr, flt(allocate), doctype == "Payable Voucher" and 'against_voucher' or 'against_invoice',cstr(against_document_no), jv_detail_no))
 
-    # new entry with balance amount
-    add = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail', 1, jv_obj.doclist)
-    add.account = account_head
-    add.cost_center = cstr(jvd[0][1])
-    add.balance = cstr(jvd[0][2])
-    add.fields[dr_or_cr] = balance
-    add.against_account = cstr(jvd[0][3])
-    add.is_advance = 'Yes'
-    add.save(1)
-  
-  # check if advance entries are still valid
-  # ----------------------------------------
-  def validate_jv_entry(self, d, account_head, dr_or_cr):
-    # 1. check if there is already a voucher reference
-    # 2. check if amount is same
-    # 3. check if is_advance is 'Yes'
-    # 4. check if jv is submitted
-    ret = sql("select t2.%s from `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2 where t1.name = t2.parent and (t2.against_voucher = '' or t2.against_voucher is null) and (t2.against_invoice = '' or t2.against_invoice is null) and t2.account = '%s' and t1.name = '%s' and t2.name = '%s' and t2.is_advance = 'Yes' and t1.docstatus=1 and t2.%s = %s" % ( dr_or_cr, account_head, d.journal_voucher, d.jv_detail_no, dr_or_cr, d.advance_amount))
-    if (not ret):
-      msgprint("Please click on 'Get Advances Paid' button as the advance entries have been changed.")
-      raise Exception
-    return
+		# new entry with balance amount
+		add = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail', 1, jv_obj.doclist)
+		add.account = account_head
+		add.cost_center = cstr(jvd[0][1])
+		add.balance = cstr(jvd[0][2])
+		add.fields[dr_or_cr] = balance
+		add.against_account = cstr(jvd[0][3])
+		add.is_advance = 'Yes'
+		add.save(1)
+	
+	# check if advance entries are still valid
+	# ----------------------------------------
+	def validate_jv_entry(self, d, account_head, dr_or_cr):
+		# 1. check if there is already a voucher reference
+		# 2. check if amount is same
+		# 3. check if is_advance is 'Yes'
+		# 4. check if jv is submitted
+		ret = sql("select t2.%s from `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2 where t1.name = t2.parent and (t2.against_voucher = '' or t2.against_voucher is null) and (t2.against_invoice = '' or t2.against_invoice is null) and t2.account = '%s' and t1.name = '%s' and t2.name = '%s' and t2.is_advance = 'Yes' and t1.docstatus=1 and t2.%s = %s" % ( dr_or_cr, account_head, d.journal_voucher, d.jv_detail_no, dr_or_cr, d.advance_amount))
+		if (not ret):
+			msgprint("Please click on 'Get Advances Paid' button as the advance entries have been changed.")
+			raise Exception
+		return
 
 ##############################################################################
 # Repair Outstanding Amount
 ##############################################################################
-  def repair_voucher_outstanding(self, voucher_obj):
-    msg = []
+	def repair_voucher_outstanding(self, voucher_obj):
+		msg = []
 
-    # Get Balance from GL Entries
-    bal = sql("select sum(debit)-sum(credit) from `tabGL Entry` where against_voucher=%s and against_voucher_type=%s", (voucher_obj.doc.name , voucher_obj.doc.doctype))
-    bal = bal and flt(bal[0][0]) or 0.0
-    if cstr(voucher_obj.doc.doctype) == 'Payable Voucher':
-      bal = -bal
+		# Get Balance from GL Entries
+		bal = sql("select sum(debit)-sum(credit) from `tabGL Entry` where against_voucher=%s and against_voucher_type=%s", (voucher_obj.doc.name , voucher_obj.doc.doctype))
+		bal = bal and flt(bal[0][0]) or 0.0
+		if cstr(voucher_obj.doc.doctype) == 'Payable Voucher':
+			bal = -bal
 
-    # Check outstanding Amount
-    if flt(voucher_obj.doc.outstanding_amount) != flt(bal):
-      msgprint('<div style="color: RED"> Difference found in Outstanding Amount of %s : %s (Before : %s; After : %s) </div>' % (voucher_obj.doc.doctype, voucher_obj.doc.name, voucher_obj.doc.outstanding_amount, bal))
-      msg.append('<div style="color: RED"> Difference found in Outstanding Amount of %s : %s (Before : %s; After : %s) </div>' % (voucher_obj.doc.doctype, voucher_obj.doc.name, voucher_obj.doc.outstanding_amount, bal))
+		# Check outstanding Amount
+		if flt(voucher_obj.doc.outstanding_amount) != flt(bal):
+			msgprint('<div style="color: RED"> Difference found in Outstanding Amount of %s : %s (Before : %s; After : %s) </div>' % (voucher_obj.doc.doctype, voucher_obj.doc.name, voucher_obj.doc.outstanding_amount, bal))
+			msg.append('<div style="color: RED"> Difference found in Outstanding Amount of %s : %s (Before : %s; After : %s) </div>' % (voucher_obj.doc.doctype, voucher_obj.doc.name, voucher_obj.doc.outstanding_amount, bal))
 
-      # set voucher balance
-      #sql("update `tab%s` set outstanding_amount=%s where name='%s'" % (voucher_obj.doc.doctype, bal, voucher_obj.doc.name))
-      set(voucher_obj.doc, 'outstanding_amount', flt(bal))
+			# set voucher balance
+			#sql("update `tab%s` set outstanding_amount=%s where name='%s'" % (voucher_obj.doc.doctype, bal, voucher_obj.doc.name))
+			set(voucher_obj.doc, 'outstanding_amount', flt(bal))
 
-    # Send Mail
-    if msg:
-      email_msg = """ Dear Administrator,
+		# Send Mail
+		if msg:
+			email_msg = """ Dear Administrator,
 
 In Account := %s User := %s has Repaired Outstanding Amount For %s : %s and following was found:-
 
@@ -397,6 +396,34 @@
 
 """ % (get_value('Control Panel', None,'account_id'), session['user'], voucher_obj.doc.doctype, voucher_obj.doc.name, '\n'.join(msg))
 
-      sendmail(['support@iwebnotes.com'], subject='Repair Outstanding Amount', parts = [('text/plain', email_msg)])
-    # Acknowledge User
-    msgprint(cstr(voucher_obj.doc.doctype) + " : " + cstr(voucher_obj.doc.name) + " has been checked" + cstr(msg and " and repaired successfully." or ". No changes Found."))
+			sendmail(['support@iwebnotes.com'], subject='Repair Outstanding Amount', parts = [('text/plain', email_msg)])
+		# Acknowledge User
+		msgprint(cstr(voucher_obj.doc.doctype) + " : " + cstr(voucher_obj.doc.name) + " has been checked" + cstr(msg and " and repaired successfully." or ". No changes Found."))
+		
+		
+	#==============================================================
+	def repost_illegal_cancelled(self, after_date='2011-01-01'):
+		"""
+			Find vouchers that are not cancelled correctly and repost them
+		"""
+		vl = sql("""
+			select voucher_type, voucher_no, account, sum(debit) as sum_debit, sum(credit) as sum_credit
+			from `tabGL Entry` 
+			where is_cancelled='Yes' and creation > %s
+			group by voucher_type, voucher_no, account
+			""", after_date, as_dict=1)
+		
+		ac_list = []
+		for v in vl:
+			if v['sum_debit'] != 0 or v['sum_credit'] != 0:
+				ac_list.append(v['account'])
+		
+		fy_list = sql("""select name from `tabFiscal Year` 
+		where (%s between year_start_date and date_sub(date_add(year_start_date,interval 1 year), interval 1 day)) 
+		or year_start_date > %s 
+		order by year_start_date ASC""", (after_date, after_date))
+
+		for fy in fy_list:
+			fy_obj = get_obj('Fiscal Year', fy[0])
+			for a in set(ac_list):
+				fy_obj.repost(a)
diff --git a/utilities/doctype/bulk_rename_tool/bulk_rename_tool.txt b/utilities/doctype/bulk_rename_tool/bulk_rename_tool.txt
index 0accf93..f15d3a9 100644
--- a/utilities/doctype/bulk_rename_tool/bulk_rename_tool.txt
+++ b/utilities/doctype/bulk_rename_tool/bulk_rename_tool.txt
@@ -3,11 +3,11 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2011-07-07 18:05:53',
+		'creation': '2011-07-08 13:30:05',
 		'docstatus': 0,
-		'modified': '2011-07-07 18:51:19',
+		'modified': '2011-07-08 13:30:05',
 		'modified_by': 'Administrator',
-		'owner': 'Guest'
+		'owner': 'Administrator'
 	},
 
 	# These values are common for all DocType
diff --git a/utilities/doctype/reposting_tool/reposting_tool.py b/utilities/doctype/reposting_tool/reposting_tool.py
index bda9afd..c4f021b 100644
--- a/utilities/doctype/reposting_tool/reposting_tool.py
+++ b/utilities/doctype/reposting_tool/reposting_tool.py
@@ -44,7 +44,7 @@
 	# =============================================================================
 	def get_bin_qty(self, wh, item):
 		# get actual_qty
-		act_qty = sql("select ifnull(actual_qty, 0) from `tabBin` where warehouse = '%s' and item_code = '%s'" % (wh, item))
+		act_qty = sql("select sum(actual_qty) from `tabStock Ledger Entry` where warehouse = '%s' and item_code = '%s' and ifnull(is_cancelled, 'No') = 'No'" % (wh, item))
 		act_qty = act_qty and flt(act_qty[0][0]) or 0
 	
 		# get indented_qty 
@@ -120,6 +120,17 @@
 			self.repair_bin(bin[0])
 
 	# =============================================================================
+	def repair_bins_for_illegal_cancelled(self, after_date = '2011-01-01'):
+		bins = sql("select name from tabBin where modified >= %s", after_date)
+		cnt = 0
+		for bin in bins:
+			if cnt % 20 == 0: 
+				sql("commit")
+				sql("start transaction")
+			cnt += 1
+	
+			self.repair_bin(bin[0])
+	# =============================================================================
 	def repair_opening_bal(self, d, acc_obj, past_yr, fiscal_yr):
 		# check opening balance
 		opbal = sql("select balance from `tabAccount Balance` where account=%s and period = %s", (acc_obj.doc.name, past_yr))